From 912ec5ad0534a6a6cec9baa76a7f9f13484889a8 Mon Sep 17 00:00:00 2001 From: karthick-murugan Date: Fri, 8 Nov 2024 19:44:56 +0530 Subject: [PATCH] Scroll editor blocks based on comments --- .../src/components/collab-sidebar/comments.js | 55 +++++++++++++++++-- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/packages/editor/src/components/collab-sidebar/comments.js b/packages/editor/src/components/collab-sidebar/comments.js index c0b4bd3d4dc38..89054abe68bca 100644 --- a/packages/editor/src/components/collab-sidebar/comments.js +++ b/packages/editor/src/components/collab-sidebar/comments.js @@ -52,6 +52,8 @@ export function Comments( { } ) { const [ actionState, setActionState ] = useState( false ); const [ isConfirmDialogOpen, setIsConfirmDialogOpen ] = useState( false ); + const [ activeClientId, setActiveClientId ] = useState( null ); + const [ blocksList, setBlocksList ] = useState( null ); const handleConfirmDelete = () => { onCommentDelete( actionState.id ); @@ -70,14 +72,54 @@ export function Comments( { setIsConfirmDialogOpen( false ); }; - const blockCommentId = useSelect( ( select ) => { + useSelect( ( select ) => { const clientID = select( blockEditorStore ).getSelectedBlockClientId(); - return ( + const clientBlocks = select( blockEditorStore ).getBlocks(); + setBlocksList( clientBlocks ); + + const getBlockCommentId = select( blockEditorStore ).getBlock( clientID )?.attributes - ?.blockCommentId ?? false - ); + ?.blockCommentId ?? false; + + if ( getBlockCommentId ) { + setActiveClientId( getBlockCommentId ); + } }, [] ); + const findBlockByCommentId = ( blocks, commentId ) => { + for ( const block of blocks ) { + if ( block.attributes.blockCommentId === commentId ) { + return block; + } + if ( block.innerBlocks && block.innerBlocks.length > 0 ) { + const foundBlock = findBlockByCommentId( + block.innerBlocks, + commentId + ); + if ( foundBlock ) { + return foundBlock; + } + } + } + return null; + }; + + const handleThreadClick = ( thread ) => { + const block = findBlockByCommentId( blocksList, thread.id ); + + if ( block ) { + const bclientId = block.clientId; + const blockElement = document.getElementById( + 'block-' + bclientId + ); + + if ( blockElement ) { + blockElement.scrollIntoView( { behavior: 'smooth' } ); + setActiveClientId( thread.id ); + } + } + }; + const CommentBoard = ( { thread, parentThread } ) => { return ( <> @@ -201,12 +243,13 @@ export function Comments( { 'editor-collab-sidebar-panel__thread', { 'editor-collab-sidebar-panel__active-thread': - blockCommentId && - blockCommentId === thread.id, + activeClientId && + activeClientId === thread.id, } ) } id={ thread.id } spacing="3" + onClick={ () => handleThreadClick( thread ) } > { 'reply' === actionState?.action &&