Spaces:
Building
Building
'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 | |