import { useEffect, useMemo, useState } from "react" import type { ComponentProps, ReactNode } from "react" import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext" import { mergeRegister } from "@lexical/utils" import { CAN_REDO_COMMAND, CAN_UNDO_COMMAND, COMMAND_PRIORITY_LOW, SELECTION_CHANGE_COMMAND, } from "lexical" import { TooltipProvider } from "@workspace/ui/components/tooltip" import { cn } from "@workspace/ui/lib/utils" import { defaultActionState, LexicalActionContext } from "./context" import { LexicalActionTree } from "./actions-view" import { useLexicalActions } from "./actions-context" export type LexicalFixedToolbarProps = ComponentProps<"div"> function LexicalActionRuntimeProvider({ children }: { children: ReactNode }) { const [editor] = useLexicalComposerContext() const [state, setState] = useState(defaultActionState) const context = useMemo(() => ({ editor, state }), [editor, state]) useEffect(() => { const update = () => { setState((current) => ({ ...current, revision: current.revision + 1, })) } return mergeRegister( editor.registerUpdateListener(update), editor.registerCommand( SELECTION_CHANGE_COMMAND, () => { update() return false }, COMMAND_PRIORITY_LOW ), editor.registerCommand( CAN_UNDO_COMMAND, (canUndo) => { setState((current) => ({ ...current, canUndo })) return false }, COMMAND_PRIORITY_LOW ), editor.registerCommand( CAN_REDO_COMMAND, (canRedo) => { setState((current) => ({ ...current, canRedo })) return false }, COMMAND_PRIORITY_LOW ) ) }, [editor]) return ( {children} ) } export function LexicalFixedToolbar({ className, children, ...props }: LexicalFixedToolbarProps) { const actions = useLexicalActions("toolbar") if (actions.length === 0 && children == null) return null return (
{children}
) } export { LexicalActionRuntimeProvider }