'use client' import type { FC } from 'react' import { memo, useMemo } from 'react' import { useReactFlow, useViewport } from 'reactflow' import { RiCloseLine } from '@remixicon/react' import Avatar from '@/app/components/base/avatar' import cn from '@/utils/classnames' import { useFormatTimeFromNow } from '@/app/components/workflow/hooks' import type { WorkflowCommentDetail, WorkflowCommentDetailReply } from '@/service/workflow-comment' type CommentThreadProps = { comment: WorkflowCommentDetail loading?: boolean onClose: () => void } const ThreadMessage: FC<{ authorName: string avatarUrl?: string | null createdAt: number content: string isReply?: boolean }> = ({ authorName, avatarUrl, createdAt, content, isReply }) => { const { formatTimeFromNow } = useFormatTimeFromNow() return (
{authorName} {formatTimeFromNow(createdAt * 1000)}
{content}
) } const renderReply = (reply: WorkflowCommentDetailReply) => ( ) export const CommentThread: FC = memo(({ comment, loading = false, onClose }) => { const { flowToScreenPosition } = useReactFlow() const viewport = useViewport() const screenPosition = useMemo(() => { return flowToScreenPosition({ x: comment.position_x, y: comment.position_y, }) }, [comment.position_x, comment.position_y, viewport.x, viewport.y, viewport.zoom, flowToScreenPosition]) return (
Comment
{comment.replies?.length > 0 && (
{comment.replies.map(renderReply)}
)}
{loading && (
Loading…
)}
) }) CommentThread.displayName = 'CommentThread'