UNPKG

@wordpress/editor

Version:
8 lines (7 loc) 15.1 kB
{ "version": 3, "sources": ["../../../src/components/collab-sidebar/note-thread.js"], "sourcesContent": ["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { useEffect, useRef } from '@wordpress/element';\nimport { Button } from '@wordpress/components';\nimport { Stack } from '@wordpress/ui';\nimport { useDebounce } from '@wordpress/compose';\nimport { __, _n, sprintf } from '@wordpress/i18n';\nimport { useDispatch } from '@wordpress/data';\nimport { __unstableStripHTML as stripHTML } from '@wordpress/dom';\nimport {\n\tstore as blockEditorStore,\n\tprivateApis as blockEditorPrivateApis,\n} from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport { AddNote } from './add-note';\nimport { Note } from './note';\nimport { NoteCard } from './note-card';\nimport { NoteForm } from './note-form';\nimport { FloatingContainer } from './floating-container';\nimport { focusNoteThread, getNoteExcerpt } from './utils';\nimport { store as editorStore } from '../../store';\nimport { unlock } from '../../lock-unlock';\n\nconst { useBlockElement } = unlock( blockEditorPrivateApis );\n\nexport function NoteThread( {\n\tnote,\n\tonEditNote,\n\tonAddReply,\n\tonDeleteNote,\n\tisSelected,\n\tsidebarRef,\n\tfloating,\n\tonKeyDown,\n} ) {\n\tconst isFloating = !! floating;\n\tconst { toggleBlockHighlight, selectBlock, toggleBlockSpotlight } = unlock(\n\t\tuseDispatch( blockEditorStore )\n\t);\n\tconst { selectNote } = unlock( useDispatch( editorStore ) );\n\tconst relatedBlockElement = useBlockElement( note.blockClientId );\n\tconst debouncedToggleBlockHighlight = useDebounce(\n\t\ttoggleBlockHighlight,\n\t\t50\n\t);\n\tconst floatingRef = useRef( null );\n\tconst isKeyboardTabbingRef = useRef( false );\n\n\tconst registerThread = floating?.registerThread;\n\tconst unregisterThread = floating?.unregisterThread;\n\n\t// Register block + floating elements with the board.\n\t// The board's ResizeObserver and autoUpdate track changes automatically.\n\tuseEffect( () => {\n\t\tconst floatingEl = floatingRef.current;\n\t\tif ( floatingEl && registerThread ) {\n\t\t\tregisterThread( note.id, relatedBlockElement, floatingEl );\n\t\t}\n\t\treturn () => unregisterThread?.( note.id );\n\t}, [ relatedBlockElement, note.id, registerThread, unregisterThread ] );\n\n\tconst onMouseEnter = () => {\n\t\tdebouncedToggleBlockHighlight( note.blockClientId, true );\n\t};\n\n\tconst onMouseLeave = () => {\n\t\tdebouncedToggleBlockHighlight( note.blockClientId, false );\n\t};\n\n\tconst onFocus = () => {\n\t\ttoggleBlockHighlight( note.blockClientId, true );\n\t};\n\n\tconst onBlur = ( event ) => {\n\t\t// Don't deselect notes when the browser window/tab loses focus.\n\t\tif ( ! document.hasFocus() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isNoteFocused = event.relatedTarget?.closest(\n\t\t\t'.editor-collab-sidebar-panel__thread'\n\t\t);\n\t\tconst isDialogFocused =\n\t\t\tevent.relatedTarget?.closest( '[role=\"dialog\"]' );\n\t\tconst isTabbing = isKeyboardTabbingRef.current;\n\n\t\t// When another note is clicked, do nothing because the current note is automatically closed.\n\t\tif ( isNoteFocused && ! isTabbing ) {\n\t\t\treturn;\n\t\t}\n\t\t// When deleting a note, a dialog appears, but the note should not be collapsed.\n\t\tif ( isDialogFocused ) {\n\t\t\treturn;\n\t\t}\n\t\t// When tabbing, do nothing if the focus is within the current note.\n\t\tif (\n\t\t\tisTabbing &&\n\t\t\tevent.currentTarget.contains( event.relatedTarget )\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Closes a note that has lost focus when any of the following conditions are met:\n\t\t// - An element other than a note is clicked.\n\t\t// - Focus was lost by tabbing.\n\t\ttoggleBlockHighlight( note.blockClientId, false );\n\t\tunselectNote();\n\t};\n\n\tconst handleNoteSelect = () => {\n\t\tselectNote( note.id );\n\t\ttoggleBlockSpotlight( note.blockClientId, true );\n\t\tif ( !! note.blockClientId ) {\n\t\t\t// Pass `null` as the second parameter to prevent focusing the block.\n\t\t\tselectBlock( note.blockClientId, null );\n\t\t}\n\t};\n\n\tconst unselectNote = () => {\n\t\tselectNote( undefined );\n\t\ttoggleBlockSpotlight( note.blockClientId, false );\n\t};\n\n\tconst handleResolve = () => {\n\t\tonEditNote( { id: note.id, status: 'approved' } );\n\t\tunselectNote();\n\t\tif ( isFloating ) {\n\t\t\trelatedBlockElement?.focus();\n\t\t} else {\n\t\t\tfocusNoteThread( note.id, sidebarRef.current );\n\t\t}\n\t};\n\n\tconst allReplies = note?.reply || [];\n\tconst lastReply =\n\t\tallReplies.length > 0 ? allReplies[ allReplies.length - 1 ] : undefined;\n\tconst restReplies = allReplies.length > 0 ? allReplies.slice( 0, -1 ) : [];\n\n\tconst noteExcerpt = getNoteExcerpt(\n\t\tstripHTML( note.content?.rendered ),\n\t\t10\n\t);\n\tconst ariaLabel = !! note.blockClientId\n\t\t? sprintf(\n\t\t\t\t// translators: %s: note excerpt\n\t\t\t\t__( 'Note: %s' ),\n\t\t\t\tnoteExcerpt\n\t\t )\n\t\t: sprintf(\n\t\t\t\t// translators: %s: note excerpt\n\t\t\t\t__( 'Original block deleted. Note: %s' ),\n\t\t\t\tnoteExcerpt\n\t\t );\n\n\tif ( isFloating && note.id === 'new' ) {\n\t\treturn (\n\t\t\t<AddNote\n\t\t\t\tonSubmit={ onAddReply }\n\t\t\t\tsidebarRef={ sidebarRef }\n\t\t\t\tfloating={ { y: floating.y, ref: floatingRef } }\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<FloatingContainer\n\t\t\tfloating={\n\t\t\t\tisFloating ? { y: floating.y, ref: floatingRef } : undefined\n\t\t\t}\n\t\t\tclassName={ clsx( 'editor-collab-sidebar-panel__thread', {\n\t\t\t\t'is-selected': isSelected,\n\t\t\t} ) }\n\t\t\tid={ `note-thread-${ note.id }` }\n\t\t\tgap=\"md\"\n\t\t\tonClick={ handleNoteSelect }\n\t\t\tonMouseEnter={ onMouseEnter }\n\t\t\tonMouseLeave={ onMouseLeave }\n\t\t\tonFocus={ onFocus }\n\t\t\tonBlur={ onBlur }\n\t\t\tonKeyUp={ ( event ) => {\n\t\t\t\tif ( event.key === 'Tab' ) {\n\t\t\t\t\tisKeyboardTabbingRef.current = false;\n\t\t\t\t}\n\t\t\t} }\n\t\t\tonKeyDown={ ( event ) => {\n\t\t\t\tif ( event.key === 'Tab' ) {\n\t\t\t\t\tisKeyboardTabbingRef.current = true;\n\t\t\t\t} else {\n\t\t\t\t\tonKeyDown( event );\n\t\t\t\t}\n\t\t\t} }\n\t\t\ttabIndex={ 0 }\n\t\t\trole=\"treeitem\"\n\t\t\taria-label={ ariaLabel }\n\t\t\taria-expanded={ isSelected }\n\t\t>\n\t\t\t<Button\n\t\t\t\tclassName=\"editor-collab-sidebar-panel__skip-to-note\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\tsize=\"compact\"\n\t\t\t\tonClick={ () => {\n\t\t\t\t\tfocusNoteThread( note.id, sidebarRef.current, 'textarea' );\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t{ __( 'Add new reply' ) }\n\t\t\t</Button>\n\t\t\t{ ! note.blockClientId && (\n\t\t\t\t<p className=\"editor-collab-sidebar-panel__deleted-block-notice\">\n\t\t\t\t\t{ __( 'Original block deleted.' ) }\n\t\t\t\t</p>\n\t\t\t) }\n\t\t\t<Note\n\t\t\t\tnote={ note }\n\t\t\t\tisSelected={ isSelected }\n\t\t\t\tonEditNote={ onEditNote }\n\t\t\t\tonDeleteNote={ onDeleteNote }\n\t\t\t\tonResolve={ handleResolve }\n\t\t\t/>\n\t\t\t{ isSelected &&\n\t\t\t\tallReplies.map( ( reply ) => (\n\t\t\t\t\t<Note\n\t\t\t\t\t\tkey={ reply.id }\n\t\t\t\t\t\tnote={ reply }\n\t\t\t\t\t\tparentNote={ note }\n\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t\tonEditNote={ onEditNote }\n\t\t\t\t\t\tonDeleteNote={ onDeleteNote }\n\t\t\t\t\t/>\n\t\t\t\t) ) }\n\t\t\t{ ! isSelected && restReplies.length > 0 && (\n\t\t\t\t<Stack\n\t\t\t\t\tdirection=\"row\"\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tjustify=\"space-between\"\n\t\t\t\t\tclassName=\"editor-collab-sidebar-panel__more-reply-separator\"\n\t\t\t\t>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\tclassName=\"editor-collab-sidebar-panel__more-reply-button\"\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tselectNote( note.id );\n\t\t\t\t\t\t\tfocusNoteThread( note.id, sidebarRef.current );\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ sprintf(\n\t\t\t\t\t\t\t// translators: %s: number of replies.\n\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t'%s more reply',\n\t\t\t\t\t\t\t\t'%s more replies',\n\t\t\t\t\t\t\t\trestReplies.length\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\trestReplies.length\n\t\t\t\t\t\t) }\n\t\t\t\t\t</Button>\n\t\t\t\t</Stack>\n\t\t\t) }\n\t\t\t{ ! isSelected && lastReply && (\n\t\t\t\t<Note\n\t\t\t\t\tnote={ lastReply }\n\t\t\t\t\tparentNote={ note }\n\t\t\t\t\tisSelected={ false }\n\t\t\t\t\tonEditNote={ onEditNote }\n\t\t\t\t\tonDeleteNote={ onDeleteNote }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ isSelected && (\n\t\t\t\t<NoteCard role=\"treeitem\">\n\t\t\t\t\t<NoteForm\n\t\t\t\t\t\tonSubmit={ ( inputComment ) => {\n\t\t\t\t\t\t\tif ( 'approved' === note.status ) {\n\t\t\t\t\t\t\t\t// For reopening, include the content in the reopen action.\n\t\t\t\t\t\t\t\tonEditNote( {\n\t\t\t\t\t\t\t\t\tid: note.id,\n\t\t\t\t\t\t\t\t\tstatus: 'hold',\n\t\t\t\t\t\t\t\t\tcontent: inputComment,\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// For regular replies, add as separate comment.\n\t\t\t\t\t\t\t\tonAddReply( {\n\t\t\t\t\t\t\t\t\tcontent: inputComment,\n\t\t\t\t\t\t\t\t\tparent: note.id,\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tonCancel={ ( event ) => {\n\t\t\t\t\t\t\t// Prevent the parent onClick from being triggered.\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\tunselectNote();\n\t\t\t\t\t\t\tfocusNoteThread( note.id, sidebarRef.current );\n\t\t\t\t\t\t} }\n\t\t\t\t\t\tlabels={ {\n\t\t\t\t\t\t\tsubmit:\n\t\t\t\t\t\t\t\t'approved' === note.status\n\t\t\t\t\t\t\t\t\t? __( 'Reopen & Reply' )\n\t\t\t\t\t\t\t\t\t: __( 'Reply' ),\n\t\t\t\t\t\t\tinput: sprintf(\n\t\t\t\t\t\t\t\t// translators: %1$s: note identifier, %2$s: author name\n\t\t\t\t\t\t\t\t__( 'Reply to note %1$s by %2$s' ),\n\t\t\t\t\t\t\t\tnote.id,\n\t\t\t\t\t\t\t\tnote.author_name\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t</NoteCard>\n\t\t\t) }\n\t\t\t{ !! note.blockClientId && (\n\t\t\t\t<Button\n\t\t\t\t\tclassName=\"editor-collab-sidebar-panel__skip-to-block\"\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tsize=\"compact\"\n\t\t\t\t\tonClick={ ( event ) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\trelatedBlockElement?.focus();\n\t\t\t\t\t} }\n\t\t\t\t>\n\t\t\t\t\t{ __( 'Back to block' ) }\n\t\t\t\t</Button>\n\t\t\t) }\n\t\t</FloatingContainer>\n\t);\n}\n"], "mappings": "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", "names": [] }