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 0d61774df0..60e7dc146d 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 @@ -21,6 +21,7 @@ import ColorManager from '@/ide/colors/ColorManager' import RangesTracker from '@overleaf/ranges-tracker' import * as ReviewPanel from '../types/review-panel-state' import { + CommentId, ReviewPanelCommentThreadMessage, ReviewPanelCommentThreads, ReviewPanelDocEntries, @@ -823,8 +824,6 @@ function useReviewPanelState(): ReviewPanelStateReactIde { useScopeValue>('deleteComment') const [gotoEntry] = useScopeValue>('gotoEntry') - const [saveEdit] = - useScopeValue>('saveEdit') const [submitReplyAngular] = useScopeValue< (entry: { thread_id: ThreadId; replyContent: string }) => void @@ -937,6 +936,29 @@ function useReviewPanelState(): ReviewPanelStateReactIde { [onThreadDeleted, projectId] ) + const onCommentEdited: ReviewPanel.UpdaterFn<'saveEdit'> = ( + threadId: ThreadId, + commentId: CommentId, + content: string + ) => { + setCommentThreads(prevState => { + const thread = { ...getThread(threadId) } + thread.messages = thread.messages.map(message => { + return message.id === commentId ? { ...message, content } : message + }) + return { ...prevState, [threadId]: thread } + }) + } + + const saveEdit = useCallback( + (threadId: ThreadId, commentId: CommentId, content: string) => { + const url = `/project/${projectId}/thread/${threadId}/messages/${commentId}/edit` + postJSON(url, { body: { content } }).catch(debugConsole.error) + handleLayoutChange({ async: true }) + }, + [projectId] + ) + const refreshRanges = useCallback(() => { type Doc = { id: DocId @@ -1068,6 +1090,7 @@ function useReviewPanelState(): ReviewPanelStateReactIde { useSocketListener(socket, 'reopen-thread', onCommentReopened) useSocketListener(socket, 'delete-thread', onThreadDeleted) useSocketListener(socket, 'resolve-thread', onCommentResolved) + useSocketListener(socket, 'edit-message', onCommentEdited) 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 8884f17656..c426d2772b 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 @@ -9,7 +9,6 @@ export default function populateReviewPanelScope(store: ReactScopeValueStore) { store.set('submitNewComment', async () => {}) store.set('deleteComment', () => {}) store.set('gotoEntry', () => {}) - store.set('saveEdit', () => {}) store.set('acceptChanges', () => {}) store.set('rejectChanges', () => {}) store.set('bulkAcceptActions', () => {})