diff --git a/site/src/pages/AgentsPage/components/ChatMessageInput/ChatMessageInput.stories.tsx b/site/src/pages/AgentsPage/components/ChatMessageInput/ChatMessageInput.stories.tsx index fe13c013b1..b28bd912ac 100644 --- a/site/src/pages/AgentsPage/components/ChatMessageInput/ChatMessageInput.stories.tsx +++ b/site/src/pages/AgentsPage/components/ChatMessageInput/ChatMessageInput.stories.tsx @@ -219,3 +219,18 @@ export const OutsideClickClosesWithoutReplacing: Story = { expect(editor.textContent).toBe("/"); }, }; + +export const OutsideClickDismissesTriggerOnRefocus: Story = { + play: async ({ canvasElement }) => { + const editor = await typeInEditor(canvasElement, "/"); + await findVisibleText("/reviewer"); + const canvas = within(canvasElement); + await userEvent.click( + canvas.getByRole("button", { name: "Outside target" }), + ); + await expectNoVisibleText("/reviewer"); + await userEvent.click(editor); + await expectNoVisibleText("/reviewer"); + expect(editor.textContent).toBe("/"); + }, +}; diff --git a/site/src/pages/AgentsPage/components/ChatMessageInput/SkillsTriggerPlugin.tsx b/site/src/pages/AgentsPage/components/ChatMessageInput/SkillsTriggerPlugin.tsx index 67194f11e4..cc230d9535 100644 --- a/site/src/pages/AgentsPage/components/ChatMessageInput/SkillsTriggerPlugin.tsx +++ b/site/src/pages/AgentsPage/components/ChatMessageInput/SkillsTriggerPlugin.tsx @@ -11,7 +11,7 @@ import { KEY_TAB_COMMAND, type NodeKey, } from "lexical"; -import { useEffect, useEffectEvent, useRef } from "react"; +import { useEffect, useEffectEvent, useLayoutEffect, useRef } from "react"; import type * as TypesGen from "#/api/typesGenerated"; import { parsePersonalSkillTrigger } from "../../utils/personalSkills"; import type { CaretAnchorRect } from "./PersonalSkillsTriggerMenu"; @@ -121,6 +121,16 @@ export const SkillsTriggerPlugin = ({ const [editor] = useLexicalComposerContext(); const dismissedTriggerRef = useRef(null); + const prevOpenRef = useRef(open); + useLayoutEffect(() => { + if (prevOpenRef.current && !open) { + dismissedTriggerRef.current = editor + .getEditorState() + .read(() => activeTriggerFromSelection()); + } + prevOpenRef.current = open; + }, [open, editor]); + const refreshTrigger = useEffectEvent(() => { const trigger = editor.getEditorState().read(() => { return editor.isEditable() ? activeTriggerFromSelection() : null;