diff --git a/packages/lexical-devtools/src/entrypoints/devtools-panel/components/EditorInspectorButton.tsx b/packages/lexical-devtools/src/entrypoints/devtools-panel/components/EditorInspectorButton.tsx index d1019b92303..3da34b700eb 100644 --- a/packages/lexical-devtools/src/entrypoints/devtools-panel/components/EditorInspectorButton.tsx +++ b/packages/lexical-devtools/src/entrypoints/devtools-panel/components/EditorInspectorButton.tsx @@ -10,6 +10,7 @@ import {IconButton, Image} from '@chakra-ui/react'; import {getRPCService} from '@webext-pegasus/rpc'; import * as React from 'react'; +import {useExtensionStore} from '../../../store'; import {IInjectedPegasusService} from '../../injected/InjectedPegasusService'; interface Props { @@ -18,6 +19,9 @@ interface Props { } export function EditorInspectorButton({tabID, setErrorMessage}: Props) { + const {isSelecting} = useExtensionStore(); + const isActive = isSelecting[tabID] ?? false; + const handleClick = () => { const injectedPegasusService = getRPCService( 'InjectedPegasusService', @@ -41,6 +45,8 @@ export function EditorInspectorButton({tabID, setErrorMessage}: Props) { size="xs" onClick={handleClick} icon={} + isActive={isActive} + _active={{bg: 'blue.100'}} /> ); } diff --git a/packages/lexical-devtools/src/entrypoints/injected/InjectedPegasusService.ts b/packages/lexical-devtools/src/entrypoints/injected/InjectedPegasusService.ts index 664006f0fb1..be317d046a9 100644 --- a/packages/lexical-devtools/src/entrypoints/injected/InjectedPegasusService.ts +++ b/packages/lexical-devtools/src/entrypoints/injected/InjectedPegasusService.ts @@ -86,18 +86,21 @@ export class InjectedPegasusService } toggleEditorPicker(): void { - if (this.pickerActive != null) { - this.pickerActive?.stop(); - this.pickerActive = null; - - return; + if (this.pickerActive !== null) { + this.deactivatePicker(); + } else { + this.activatePicker(); } + } + + private activatePicker(): void { + this.extensionStore.getState().setIsSelecting(this.tabID, true); this.pickerActive = new ElementPicker({style: ELEMENT_PICKER_STYLE}); this.pickerActive.start({ elementFilter: (el) => { let parent: HTMLElement | null = el; - while (parent != null && parent.tagName !== 'BODY') { + while (parent !== null && parent.tagName !== 'BODY') { if ('__lexicalEditor' in parent) { return parent; } @@ -108,8 +111,7 @@ export class InjectedPegasusService }, onClick: (el) => { - this.pickerActive?.stop(); - this.pickerActive = null; + this.deactivatePicker(); if (isLexicalNode(el)) { this.extensionStore .getState() @@ -120,4 +122,10 @@ export class InjectedPegasusService }, }); } + + private deactivatePicker(): void { + this.pickerActive?.stop(); + this.pickerActive = null; + this.extensionStore.getState().setIsSelecting(this.tabID, false); + } } diff --git a/packages/lexical-devtools/src/store.ts b/packages/lexical-devtools/src/store.ts index 3926e9830a6..ba4524b34ac 100644 --- a/packages/lexical-devtools/src/store.ts +++ b/packages/lexical-devtools/src/store.ts @@ -22,16 +22,21 @@ export interface ExtensionState { selectedEditorKey: { [tabID: number]: string | null; }; + isSelecting: { + [tabID: number]: boolean; + }; markTabAsRestricted: (tabID: number) => void; setStatesForTab: ( id: number, states: {[editorKey: string]: SerializedRawEditorState}, ) => void; setSelectedEditorKey: (tabID: number, editorKey: string | null) => void; + setIsSelecting: (tadID: number, isSelecting: boolean) => void; } export const useExtensionStore = create()( subscribeWithSelector((set) => ({ + isSelecting: {}, lexicalState: {}, markTabAsRestricted: (tabID: number) => set((state) => ({ @@ -41,6 +46,13 @@ export const useExtensionStore = create()( }, })), selectedEditorKey: {}, + setIsSelecting: (tabID: number, isSelecting: boolean) => + set((state) => ({ + isSelecting: { + ...state.isSelecting, + [tabID]: isSelecting, + }, + })), setSelectedEditorKey: (tabID: number, editorKey: string | null) => set((state) => ({ selectedEditorKey: {