diff --git a/services/web/frontend/js/features/ide-react/context/review-panel/hooks/use-review-panel-state.ts b/services/web/frontend/js/features/ide-react/context/review-panel/hooks/use-review-panel-state.ts index 0b5e4794ad..23cc0a4e61 100644 --- a/services/web/frontend/js/features/ide-react/context/review-panel/hooks/use-review-panel-state.ts +++ b/services/web/frontend/js/features/ide-react/context/review-panel/hooks/use-review-panel-state.ts @@ -14,7 +14,7 @@ import { useConnectionContext } from '@/features/ide-react/context/connection-co import { usePermissionsContext } from '@/features/ide-react/context/permissions-context' import { debugConsole } from '@/utils/debugging' import { useEditorContext } from '@/shared/context/editor-context' -import { getJSON, postJSON } from '@/infrastructure/fetch-json' +import { deleteJSON, getJSON, postJSON } from '@/infrastructure/fetch-json' import ColorManager from '@/ide/colors/ColorManager' // @ts-ignore import RangesTracker from '@overleaf/ranges-tracker' @@ -869,8 +869,27 @@ function useReviewPanelState(): ReviewPanelStateReactIde { [onCommentReopened, projectId] ) - const [deleteThread] = - useScopeValue>('deleteThread') + const onThreadDeleted = useCallback((threadId: ThreadId) => { + setResolvedThreadIds(({ [threadId]: _, ...resolvedThreadIds }) => { + return resolvedThreadIds + }) + setCommentThreads(({ [threadId]: _, ...commentThreads }) => { + return commentThreads + }) + dispatchReviewPanelEvent('comment:remove', threadId) + }, []) + + const deleteThread = useCallback( + (docId: DocId, threadId: ThreadId) => { + onThreadDeleted(threadId) + deleteJSON(`/project/${projectId}/doc/${docId}/thread/${threadId}`).catch( + debugConsole.error + ) + sendMB('rp-comment-delete') + }, + [onThreadDeleted, projectId] + ) + const [refreshResolvedCommentsDropdown] = useScopeValue< ReviewPanel.UpdaterFn<'refreshResolvedCommentsDropdown'> >('refreshResolvedCommentsDropdown') @@ -962,6 +981,7 @@ function useReviewPanelState(): ReviewPanelStateReactIde { ]) useSocketListener(socket, 'reopen-thread', onCommentReopened) + useSocketListener(socket, 'delete-thread', onThreadDeleted) const values = useMemo( () => ({ diff --git a/services/web/frontend/js/features/ide-react/scope-adapters/review-panel-context-adapter.ts b/services/web/frontend/js/features/ide-react/scope-adapters/review-panel-context-adapter.ts index 840f551c3a..c520fc7fa8 100644 --- a/services/web/frontend/js/features/ide-react/scope-adapters/review-panel-context-adapter.ts +++ b/services/web/frontend/js/features/ide-react/scope-adapters/review-panel-context-adapter.ts @@ -18,7 +18,6 @@ export default function populateReviewPanelScope(store: ReactScopeValueStore) { store.set('deleteComment', () => {}) store.set('gotoEntry', () => {}) store.set('saveEdit', () => {}) - store.set('deleteThread', () => {}) store.set('refreshResolvedCommentsDropdown', async () => {}) store.set('acceptChanges', () => {}) store.set('rejectChanges', () => {}) diff --git a/services/web/frontend/js/features/source-editor/components/review-panel/entries/resolved-comment-entry.tsx b/services/web/frontend/js/features/source-editor/components/review-panel/entries/resolved-comment-entry.tsx index 09970de1ad..609bb8fde3 100644 --- a/services/web/frontend/js/features/source-editor/components/review-panel/entries/resolved-comment-entry.tsx +++ b/services/web/frontend/js/features/source-editor/components/review-panel/entries/resolved-comment-entry.tsx @@ -42,7 +42,7 @@ function ResolvedCommentEntry({ } const handleDelete = () => { - deleteThread(undefined, thread.docId, thread.threadId) + deleteThread(thread.docId, thread.threadId) } return ( diff --git a/services/web/frontend/js/features/source-editor/context/review-panel/hooks/use-angular-review-panel-state.ts b/services/web/frontend/js/features/source-editor/context/review-panel/hooks/use-angular-review-panel-state.ts index 66e1246317..d69cf39d0f 100644 --- a/services/web/frontend/js/features/source-editor/context/review-panel/hooks/use-angular-review-panel-state.ts +++ b/services/web/frontend/js/features/source-editor/context/review-panel/hooks/use-angular-review-panel-state.ts @@ -7,6 +7,7 @@ import { SubView, ThreadId, } from '../../../../../../../types/review-panel/review-panel' +import { DocId } from '../../../../../../../types/project-settings' import { dispatchReviewPanelLayout as handleLayoutChange } from '../../../extensions/changes/change-manager' function useAngularReviewPanelState(): ReviewPanelState { @@ -99,8 +100,21 @@ function useAngularReviewPanelState(): ReviewPanelState { ) const [unresolveComment] = useScopeValue>('unresolveComment') - const [deleteThread] = - useScopeValue>('deleteThread') + + const [deleteThreadAngular] = + useScopeValue< + ( + _: unknown, + ...args: [...Parameters>] + ) => ReturnType> + >('deleteThread') + const deleteThread = useCallback( + (docId: DocId, threadId: ThreadId) => { + deleteThreadAngular(undefined, docId, threadId) + }, + [deleteThreadAngular] + ) + const [refreshResolvedCommentsDropdown] = useScopeValue< ReviewPanel.UpdaterFn<'refreshResolvedCommentsDropdown'> >('refreshResolvedCommentsDropdown') diff --git a/services/web/frontend/js/features/source-editor/context/review-panel/types/review-panel-state.ts b/services/web/frontend/js/features/source-editor/context/review-panel/types/review-panel-state.ts index 362c8554c7..d233bdf65c 100644 --- a/services/web/frontend/js/features/source-editor/context/review-panel/types/review-panel-state.ts +++ b/services/web/frontend/js/features/source-editor/context/review-panel/types/review-panel-state.ts @@ -71,7 +71,7 @@ export interface ReviewPanelState { content: string ) => void unresolveComment: (threadId: ThreadId) => void - deleteThread: (_entryId: unknown, docId: DocId, threadId: ThreadId) => void + deleteThread: (docId: DocId, threadId: ThreadId) => void refreshResolvedCommentsDropdown: () => Promise submitNewComment: (content: string) => Promise setEntryHover: React.Dispatch>>