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