diff --git a/web/app/components/workflow/panel/comments-panel/index.tsx b/web/app/components/workflow/panel/comments-panel/index.tsx index 64a2f39792..4154b772cd 100644 --- a/web/app/components/workflow/panel/comments-panel/index.tsx +++ b/web/app/components/workflow/panel/comments-panel/index.tsx @@ -1,19 +1,27 @@ -import { memo, useCallback, useMemo } from 'react' +import { memo, useCallback, useMemo, useState } from 'react' import { useReactFlow } from 'reactflow' -import { RiCloseLine } from '@remixicon/react' +import { RiCheckboxCircleFill, RiCheckboxCircleLine, RiCloseLine } from '@remixicon/react' import { useStore } from '@/app/components/workflow/store' import type { WorkflowCommentList } from '@/service/workflow-comment' import { useWorkflowComment } from '@/app/components/workflow/hooks/use-workflow-comment' import Avatar from '@/app/components/base/avatar' import cn from '@/utils/classnames' import { ControlMode } from '@/app/components/workflow/types' +import { resolveWorkflowComment } from '@/service/workflow-comment' +import { useParams } from 'next/navigation' +import { useFormatTimeFromNow } from '@/app/components/workflow/hooks' const CommentsPanel = () => { const activeCommentId = useStore(s => s.activeCommentId) const setActiveCommentId = useStore(s => s.setActiveCommentId) const setControlMode = useStore(s => s.setControlMode) - const { comments, loading } = useWorkflowComment() + const { comments, loading, loadComments } = useWorkflowComment() const reactFlow = useReactFlow() + const params = useParams() + const appId = params.appId as string + const { formatTimeFromNow } = useFormatTimeFromNow() + + const [filter, setFilter] = useState<'all' | 'unresolved'>('all') const handleSelect = useCallback((comment: WorkflowCommentList) => { // center viewport on the comment position and activate it @@ -21,15 +29,44 @@ const CommentsPanel = () => { setActiveCommentId(comment.id) }, [reactFlow, setActiveCommentId]) - const sorted = useMemo(() => { - return [...comments].sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime()) - }, [comments]) + const filteredSorted = useMemo(() => { + let data = comments + if (filter === 'unresolved') + data = data.filter(c => !c.resolved) + return data + }, [comments, filter]) + + const handleResolve = useCallback(async (comment: WorkflowCommentList) => { + if (comment.resolved) return + if (!appId) return + try { + await resolveWorkflowComment(appId, comment.id) + await loadComments() + setActiveCommentId(comment.id) + } + catch (e) { + console.error('Resolve comment failed', e) + } + }, [appId, loadComments, setActiveCommentId]) return (