import React, { FC, useMemo } from 'react' import { useThreadsContext } from '../context/threads-context' import { useTranslation } from 'react-i18next' import { ReviewPanelResolvedThread } from './review-panel-resolved-thread' import useProjectRanges from '../hooks/use-project-ranges' import { useFileTreeData } from '@/shared/context/file-tree-data-context' import { Change, CommentOperation } from '../../../../../types/change' import { ThreadId } from '../../../../../types/review-panel/review-panel' import LoadingSpinner from '@/shared/components/loading-spinner' export const ReviewPanelResolvedThreadsMenu: FC = () => { const { t } = useTranslation() const threads = useThreadsContext() const { docs } = useFileTreeData() const { projectRanges, loading } = useProjectRanges() const docNameForThread = useMemo(() => { const docNameForThread = new Map() for (const [docId, ranges] of projectRanges?.entries() ?? []) { const docName = docs?.find(doc => doc.doc.id === docId)?.doc.name if (docName !== undefined) { for (const comment of ranges.comments) { const threadId = comment.op.t docNameForThread.set(threadId, docName) } } } return docNameForThread }, [docs, projectRanges]) const allComments = useMemo(() => { const allComments = new Map>() // eslint-disable-next-line no-unused-vars for (const [_, ranges] of projectRanges?.entries() ?? []) { for (const comment of ranges.comments) { allComments.set(comment.op.t, comment) } } return allComments }, [projectRanges]) const resolvedThreads = useMemo(() => { if (!threads) { return [] } const resolvedThreads = [] for (const [id, thread] of Object.entries(threads)) { if (thread.resolved) { resolvedThreads.push({ thread, id }) } } return resolvedThreads }, [threads]) if (loading) { return } if (!resolvedThreads.length) { return (
{t('no_resolved_comments')}
) } return ( <>
{t('resolved_comments')}
{resolvedThreads.length}
{resolvedThreads.map(thread => { const comment = allComments.get(thread.id) if (!comment) { return null } return ( ) })} ) }