From 808286dea8a96483f761f0751a4ddb937d12bfad Mon Sep 17 00:00:00 2001 From: ilkin-overleaf <100852799+ilkin-overleaf@users.noreply.github.com> Date: Mon, 27 Nov 2023 17:05:58 +0200 Subject: [PATCH] Merge pull request #15968 from overleaf/ii-ide-page-prototype-review-panel-edit-comment [web] React ide page save edit GitOrigin-RevId: 79e6a02fecaa3d8923b503d043a1e0b8cc193f7d --- .../hooks/use-review-panel-state.ts | 27 +++++++++++++++++-- .../review-panel-context-adapter.ts | 1 - 2 files changed, 25 insertions(+), 3 deletions(-) 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', () => {})