| '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 |
|
|