diff --git a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx index e7bc89f3..af0e5c19 100644 --- a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx +++ b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx @@ -1,7 +1,7 @@ import { BubbleMenu, BubbleMenuProps } from "@tiptap/react/menus"; import { isNodeSelection, useEditorState } from "@tiptap/react"; import type { Editor } from "@tiptap/react"; -import { FC, useEffect, useRef, useState } from "react"; +import { FC, SetStateAction, useCallback, useEffect, useRef, useState } from "react"; import { IconBold, IconCode, @@ -49,6 +49,7 @@ export const EditorBubbleMenu: FC = (props) => { const [, setDraftCommentId] = useAtom(draftCommentIdAtom); const showCommentPopupRef = useRef(showCommentPopup); const showAiMenuRef = useRef(showAiMenu); + const isLinkSelectorOpenRef = useRef(false); useEffect(() => { showCommentPopupRef.current = showCommentPopup; @@ -125,6 +126,10 @@ export const EditorBubbleMenu: FC = (props) => { const bubbleMenuProps: EditorBubbleMenuProps = { ...props, shouldShow: ({ state, editor }) => { + if (isLinkSelectorOpenRef.current) { + return true; + } + const { selection } = state; const { empty } = selection; @@ -155,7 +160,14 @@ export const EditorBubbleMenu: FC = (props) => { const [isNodeSelectorOpen, setIsNodeSelectorOpen] = useState(false); const [isTextAlignmentSelectorOpen, setIsTextAlignmentOpen] = useState(false); - const [isLinkSelectorOpen, setIsLinkSelectorOpen] = useState(false); + const [isLinkSelectorOpen, _setIsLinkSelectorOpen] = useState(false); + const setIsLinkSelectorOpen = useCallback((value: SetStateAction) => { + _setIsLinkSelectorOpen((prev) => { + const next = typeof value === 'function' ? value(prev) : value; + isLinkSelectorOpenRef.current = next; + return next; + }); + }, []); const [isColorSelectorOpen, setIsColorSelectorOpen] = useState(false); // Hide the bubble menu immediately when AI menu is shown