diff --git a/src/Mentions/index.tsx b/src/Mentions/index.tsx index dbeaa52..0362950 100644 --- a/src/Mentions/index.tsx +++ b/src/Mentions/index.tsx @@ -11,14 +11,15 @@ import React, { useMemo } from 'react'; import { isBrowser } from '@/utils/tools'; +import { OnBlurBlockPlugin } from './plugins/OnBlurBlockPlugin'; import { CustomTextNode } from './plugins/custom-text/node'; +import { EditablePlugin } from './plugins/editable'; import { MentionNode, MentionNodePlugin, MentionNodePluginReplacement, } from './plugins/mention-node'; import { MentionPickerPlugin, type MentionPickerPluginProps } from './plugins/mention-picker'; -import OnBlurBlock from './plugins/on-blur-or-focus-block'; import { MentionsConfigProvider } from './provider'; import { useStyles } from './style'; import type { AutoSize, MentionOption, MentionsOptionsMap } from './types'; @@ -67,8 +68,12 @@ export const Mentions: React.FC = ({ }) => { const { componentDisabled } = ConfigProvider.useConfig(); const { styles, cx } = useStyles({ autoSize }); - const disabled = customDisabled ?? componentDisabled; - const editable = !readOnly && !disabled; + + const disabled = useMemo( + () => customDisabled ?? componentDisabled, + [componentDisabled, customDisabled] + ); + const editable = useMemo(() => !readOnly && !disabled, [disabled, readOnly]); const initialConfig = useMemo( () => ({ namespace: 'mentions', @@ -166,20 +171,23 @@ export const Mentions: React.FC = ({ } /> - + {editable && ( + + )} - + + diff --git a/src/Mentions/plugins/on-blur-or-focus-block.tsx b/src/Mentions/plugins/OnBlurBlockPlugin.tsx similarity index 92% rename from src/Mentions/plugins/on-blur-or-focus-block.tsx rename to src/Mentions/plugins/OnBlurBlockPlugin.tsx index bb378dd..069f172 100644 --- a/src/Mentions/plugins/on-blur-or-focus-block.tsx +++ b/src/Mentions/plugins/OnBlurBlockPlugin.tsx @@ -6,11 +6,11 @@ import { useEffect, useRef } from 'react'; import { CLEAR_HIDE_MENU_TIMEOUT } from './mention-node'; -type OnBlurBlockProps = { +type OnBlurBlockPluginProps = { onBlur?: () => void; onFocus?: () => void; }; -const OnBlurBlock: FC = ({ onBlur, onFocus }) => { +export const OnBlurBlockPlugin: FC = ({ onBlur, onFocus }) => { const [editor] = useLexicalComposerContext(); const ref = useRef(null); @@ -57,5 +57,3 @@ const OnBlurBlock: FC = ({ onBlur, onFocus }) => { return null; }; - -export default OnBlurBlock; diff --git a/src/Mentions/plugins/editable.tsx b/src/Mentions/plugins/editable.tsx new file mode 100644 index 0000000..c4f7be3 --- /dev/null +++ b/src/Mentions/plugins/editable.tsx @@ -0,0 +1,11 @@ +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; +import React, { useEffect } from 'react'; + +export const EditablePlugin: React.FC<{ editable: boolean }> = ({ editable }) => { + const [editor] = useLexicalComposerContext(); + useEffect(() => { + editor.setEditable(editable); + }, [editable, editor]); + + return null; +};