import { useEffect } from 'react' import { useCreateBlockNote } from '@blocknote/react' import { uploadImageFile } from '../hooks/useImageDrop' import { useEditorTabSwap } from '../hooks/useEditorTabSwap' import { RUNTIME_STYLE_NONCE } from '../lib/runtimeStyleNonce' import type { AppLocale } from '../lib/i18n' import type { VaultEntry } from '../types' import { createArrowLigaturesExtension } from './arrowLigaturesExtension' import { createMathInputExtension } from './mathInputExtension' import { schema } from './editorSchema' import type { ProbeTarget } from './editorMemoryProbeTypes' import { SingleEditorView } from './SingleEditorView' function useProbeEditor(target: ProbeTarget, vaultPath?: string) { const editor = useCreateBlockNote({ schema, uploadFile: (file: File) => uploadImageFile(file, vaultPath), _tiptapOptions: { injectNonce: RUNTIME_STYLE_NONCE }, extensions: [createArrowLigaturesExtension(), createMathInputExtension()], }) useEditorTabSwap({ tabs: [{ entry: target.entry, content: target.content }], activeTabPath: target.entry.path, editor, rawMode: false, vaultPath, }) return editor } function useProbeReadySignal(target: ProbeTarget, onReady: (path: string) => void): void { useEffect(() => { const handleSwap = (event: Event) => { const detail = (event as CustomEvent<{ path?: string }>).detail if (detail?.path === target.entry.path) onReady(target.entry.path) } window.addEventListener('laputa:editor-tab-swapped', handleSwap) return () => window.removeEventListener('laputa:editor-tab-swapped', handleSwap) }, [onReady, target.entry.path]) } export function HiddenEditorMemoryProbe({ entries, locale, onReady, target, vaultPath, }: { entries: VaultEntry[] locale?: AppLocale onReady: (path: string) => void target: ProbeTarget vaultPath?: string }) { const editor = useProbeEditor(target, vaultPath) useProbeReadySignal(target, onReady) return ( ) }