diff --git a/src/components/block-editor-toolbar/header-toolbar/index.js b/src/components/block-editor-toolbar/header-toolbar/index.js index 4bdb73e69..76f9ca4cd 100644 --- a/src/components/block-editor-toolbar/header-toolbar/index.js +++ b/src/components/block-editor-toolbar/header-toolbar/index.js @@ -26,26 +26,32 @@ function HeaderToolbar( props ) { const inserterButton = useRef(); const { setIsInserterOpened } = useDispatch( 'isolated/editor' ); const isMobileViewport = useViewportMatch( 'medium', '<' ); - const { hasFixedToolbar, isInserterEnabled, isTextModeEnabled, previewDeviceType, isInserterOpened } = useSelect( - ( select ) => { - const { hasInserterItems, getBlockRootClientId, getBlockSelectionEnd } = select( 'core/block-editor' ); + const { + hasFixedToolbar, + hasPeers, + isInserterEnabled, + isTextModeEnabled, + previewDeviceType, + isInserterOpened, + } = useSelect( ( select ) => { + const { hasInserterItems, getBlockRootClientId, getBlockSelectionEnd } = select( 'core/block-editor' ); - return { - hasFixedToolbar: select( 'isolated/editor' ).isFeatureActive( 'fixedToolbar' ), - // This setting (richEditingEnabled) should not live in the block editor's setting. - isInserterEnabled: - select( 'isolated/editor' ).getEditorMode() === 'visual' && - select( 'core/editor' ).getEditorSettings().richEditingEnabled && - hasInserterItems( getBlockRootClientId( getBlockSelectionEnd() ) ), - isTextModeEnabled: select( 'isolated/editor' ).getEditorMode() === 'text', - previewDeviceType: 'Desktop', - isInserterOpened: select( 'isolated/editor' ).isInserterOpened(), - }; - }, - [] - ); + return { + hasFixedToolbar: select( 'isolated/editor' ).isFeatureActive( 'fixedToolbar' ), + hasPeers: select( 'isolated/editor' ).hasPeers(), + // This setting (richEditingEnabled) should not live in the block editor's setting. + isInserterEnabled: + select( 'isolated/editor' ).getEditorMode() === 'visual' && + select( 'core/editor' ).getEditorSettings().richEditingEnabled && + hasInserterItems( getBlockRootClientId( getBlockSelectionEnd() ) ), + isTextModeEnabled: select( 'isolated/editor' ).getEditorMode() === 'text', + previewDeviceType: 'Desktop', + isInserterOpened: select( 'isolated/editor' ).isInserterOpened(), + }; + }, [] ); const isLargeViewport = useViewportMatch( 'medium' ); - const { inserter, toc, navigation, undo } = props.settings.iso.toolbar; + const { inserter, toc, navigation, undo: undoSetting } = props.settings.iso.toolbar; + const undo = undoSetting && ! hasPeers; const displayBlockToolbar = ! isLargeViewport || previewDeviceType !== 'Desktop' || hasFixedToolbar; const toolbarAriaLabel = displayBlockToolbar ? /* translators: accessibility text for the editor toolbar when Top Toolbar is on */ diff --git a/src/components/block-editor/index.js b/src/components/block-editor/index.js index da6ddb8a4..1c0527211 100644 --- a/src/components/block-editor/index.js +++ b/src/components/block-editor/index.js @@ -66,11 +66,26 @@ function BlockEditor( props ) { ); } -export default withDispatch( ( dispatch ) => { +export default withDispatch( ( dispatch, _ownProps, { select } ) => { + const hasPeers = select( 'isolated/editor' ).hasPeers; const { redo, undo } = dispatch( 'isolated/editor' ); + const maybeUndo = ( actionCreator ) => () => { + if ( hasPeers() ) { + const noticeId = 'isolated/undo-disabled'; + dispatch( 'core/notices' ).removeNotice( noticeId ); + return dispatch( 'core/notices' ).createNotice( + 'warning', + 'Undo/redo is disabled while editing with other users.', + { id: noticeId } + ); + } else { + return actionCreator(); + } + }; + return { - redo, - undo, + redo: maybeUndo( redo ), + undo: maybeUndo( undo ), }; } )( BlockEditor ); diff --git a/src/store/peers/selectors.js b/src/store/peers/selectors.js index 1de714372..dd9274ae8 100644 --- a/src/store/peers/selectors.js +++ b/src/store/peers/selectors.js @@ -1,3 +1,7 @@ export function getPeers( state ) { return state.peers; } + +export function hasPeers( state ) { + return Object.keys( state.peers ).length > 0; +}