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 f95093891e..0d61774df0 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 @@ -47,6 +47,7 @@ import { ReviewPanelCommentThreadsApi, } from '../../../../../../../types/review-panel/api' import { Document } from '@/features/ide-react/editor/document' +import { DateString } from '../../../../../../../types/helpers/date' const dispatchReviewPanelEvent = (type: string, payload?: any) => { window.dispatchEvent( @@ -816,8 +817,6 @@ function useReviewPanelState(): ReviewPanelStateReactIde { applyTrackChangesStateToClient ) - const [resolveComment] = - useScopeValue>('resolveComment') const [submitNewComment] = useScopeValue>('submitNewComment') const [deleteComment] = @@ -841,6 +840,53 @@ function useReviewPanelState(): ReviewPanelStateReactIde { }) }, [reviewPanelOpen, setReviewPanelOpen, trackChangesVisible]) + const onCommentResolved = useCallback( + (threadId: ThreadId, user: any) => { + setCommentThreads(prevState => { + const thread = { ...getThread(threadId) } + thread.resolved = true + thread.resolved_by_user = formatUser(user) + thread.resolved_at = new Date().toISOString() as DateString + return { ...prevState, [threadId]: thread } + }) + setResolvedThreadIds(prevState => ({ ...prevState, [threadId]: true })) + dispatchReviewPanelEvent('comment:resolve_threads', [threadId]) + }, + [getThread] + ) + + const resolveComment = useCallback( + (docId: DocId, entryId: ThreadId) => { + const docEntries = getDocEntries(docId) + const entry = docEntries[entryId] as ReviewPanelCommentEntry + + setEntries(prevState => ({ + ...prevState, + [docId]: { + ...prevState[docId], + [entryId]: { + ...prevState[docId][entryId], + focused: false, + }, + }, + })) + + postJSON(`/project/${projectId}/thread/${entry.thread_id}/resolve`) + onCommentResolved(entry.thread_id, user) + sendMB('rp-comment-resolve', { + view: reviewPanelOpen ? subView : 'mini', + }) + }, + [ + getDocEntries, + onCommentResolved, + projectId, + reviewPanelOpen, + subView, + user, + ] + ) + const onCommentReopened = useCallback( (threadId: ThreadId) => { setCommentThreads(prevState => { @@ -1021,6 +1067,7 @@ function useReviewPanelState(): ReviewPanelStateReactIde { useSocketListener(socket, 'reopen-thread', onCommentReopened) useSocketListener(socket, 'delete-thread', onThreadDeleted) + useSocketListener(socket, 'resolve-thread', onCommentResolved) 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 0d6f2779df..8884f17656 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 @@ -3,16 +3,9 @@ import { ReactScopeValueStore } from '@/features/ide-react/scope-value-store/rea export default function populateReviewPanelScope(store: ReactScopeValueStore) { store.set('reviewPanel.overview.loading', false) store.set('reviewPanel.nVisibleSelectedChanges', 0) - store.set('permissions', { - read: false, - write: false, - admin: false, - comment: false, - }) store.set('users', {}) store.set('reviewPanel.layoutToLeft', false) store.set('reviewPanel.rendererData.lineHeight', 0) - store.set('resolveComment', () => {}) store.set('submitNewComment', async () => {}) store.set('deleteComment', () => {}) store.set('gotoEntry', () => {})