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