diff --git a/packages/block-editor/src/hooks/content-lock-ui.js b/packages/block-editor/src/hooks/content-lock-ui.js
index eff6cc9a2d8af..7cca4b325b09d 100644
--- a/packages/block-editor/src/hooks/content-lock-ui.js
+++ b/packages/block-editor/src/hooks/content-lock-ui.js
@@ -20,7 +20,6 @@ import { unlock } from '../lock-unlock';
// also includes artifacts on the store (actions, reducers, and selector).
function ContentLockControlsPure( { clientId, isSelected } ) {
- const { getBlockListSettings, getSettings } = useSelect( blockEditorStore );
const { templateLock, isLockedByParent, isEditingAsBlocks } = useSelect(
( select ) => {
const {
@@ -37,16 +36,11 @@ function ContentLockControlsPure( { clientId, isSelected } ) {
[ clientId ]
);
- const {
- updateSettings,
- updateBlockListSettings,
- __unstableSetTemporarilyEditingAsBlocks,
- } = useDispatch( blockEditorStore );
- const { stopEditingAsBlocks } = unlock( useDispatch( blockEditorStore ) );
+ const { stopEditingAsBlocks, modifyContentLockBlock } = unlock(
+ useDispatch( blockEditorStore )
+ );
const isContentLocked =
! isLockedByParent && templateLock === 'contentOnly';
- const { __unstableMarkNextChangeAsNotPersistent, updateBlockAttributes } =
- useDispatch( blockEditorStore );
const stopEditingAsBlockCallback = useCallback( () => {
stopEditingAsBlocks( clientId );
@@ -73,30 +67,19 @@ function ContentLockControlsPure( { clientId, isSelected } ) {
) }
{ showStartEditingAsBlocks && (
- { ( { onClose } ) => (
-
- ) }
+ { ( { selectedClientIds, onClose } ) =>
+ selectedClientIds.length === 1 &&
+ selectedClientIds[ 0 ] === clientId && (
+
+ )
+ }
) }
>
diff --git a/packages/block-editor/src/store/private-actions.js b/packages/block-editor/src/store/private-actions.js
index 6cfccb17287ff..fea2dd7306adc 100644
--- a/packages/block-editor/src/store/private-actions.js
+++ b/packages/block-editor/src/store/private-actions.js
@@ -391,3 +391,22 @@ export function expandBlock( clientId ) {
clientId,
};
}
+
+export const modifyContentLockBlock =
+ ( clientId ) =>
+ ( { select, dispatch } ) => {
+ dispatch.__unstableMarkNextChangeAsNotPersistent();
+ dispatch.updateBlockAttributes( clientId, {
+ templateLock: undefined,
+ } );
+ dispatch.updateBlockListSettings( clientId, {
+ ...select.getBlockListSettings( clientId ),
+ templateLock: false,
+ } );
+ const focusModeToRevert = select.getSettings().focusMode;
+ dispatch.updateSettings( { focusMode: true } );
+ dispatch.__unstableSetTemporarilyEditingAsBlocks(
+ clientId,
+ focusModeToRevert
+ );
+ };
diff --git a/packages/editor/src/components/block-settings-menu/content-only-settings-menu.js b/packages/editor/src/components/block-settings-menu/content-only-settings-menu.js
index 43f73867611b0..833f1601aeef7 100644
--- a/packages/editor/src/components/block-settings-menu/content-only-settings-menu.js
+++ b/packages/editor/src/components/block-settings-menu/content-only-settings-menu.js
@@ -131,7 +131,11 @@ function TemplateLockContentOnlyMenuItems( { clientId, onClose } ) {
);
const blockDisplayInformation =
useBlockDisplayInformation( contentLockingParent );
- const { updateBlockAttributes } = useDispatch( blockEditorStore );
+ // Disable reason: We're using a hook here so it has to be on top-level.
+ // eslint-disable-next-line @wordpress/no-unused-vars-before-return
+ const { modifyContentLockBlock, selectBlock } = unlock(
+ useDispatch( blockEditorStore )
+ );
if ( ! blockDisplayInformation?.title ) {
return null;
@@ -156,15 +160,14 @@ function TemplateLockContentOnlyMenuItems( { clientId, onClose } ) {