'use client' import { createContext, memo, useRef, } from 'react' import { LexicalComposer } from '@lexical/react/LexicalComposer' import { LinkNode } from '@lexical/link' import { ListItemNode, ListNode, } from '@lexical/list' import { createNoteEditorStore } from './store' import theme from './theme' type NoteEditorStore = ReturnType<typeof createNoteEditorStore> const NoteEditorContext = createContext<NoteEditorStore | null>(null) type NoteEditorContextProviderProps = { value: string children: JSX.Element | string | (JSX.Element | string)[] } export const NoteEditorContextProvider = memo(({ value, children, }: NoteEditorContextProviderProps) => { const storeRef = useRef<NoteEditorStore>() if (!storeRef.current) storeRef.current = createNoteEditorStore() let initialValue = null try { initialValue = JSON.parse(value) } catch (e) { } const initialConfig = { namespace: 'note-editor', nodes: [ LinkNode, ListNode, ListItemNode, ], editorState: !initialValue?.root.children.length ? null : JSON.stringify(initialValue), onError: (error: Error) => { throw error }, theme, } return ( <NoteEditorContext.Provider value={storeRef.current}> <LexicalComposer initialConfig={{ ...initialConfig }}> {children} </LexicalComposer> </NoteEditorContext.Provider> ) }) NoteEditorContextProvider.displayName = 'NoteEditorContextProvider' export default NoteEditorContext