From f239b77df93077e40c27cc5c5909e94266571859 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 3 Sep 2026 18:55:44 -0700 Subject: [PATCH] fix(web): close composer menus when their controls hide (#9541) --- apps/web/src/components/chat/ChatComposer.tsx | 44 +++++++-- .../chat/CompactComposerControlsMenu.tsx | 16 +--- apps/web/src/components/chat/TraitsPicker.tsx | 7 +- .../components/chat/composerProviderState.tsx | 3 + .../chat/useComposerMenuState.test.tsx | 90 +++++++++++++++++++ .../components/chat/useComposerMenuState.ts | 12 +++ 6 files changed, 149 insertions(+), 23 deletions(-) create mode 100644 apps/web/src/components/chat/useComposerMenuState.test.tsx create mode 100644 apps/web/src/components/chat/useComposerMenuState.ts diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index a8d43e7b0a1f0eed09472f60f75f50cd618d6c5b..589ef7350ec13680c1724138d1783296f9fd6121 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -87,6 +87,7 @@ import { } from "../../promptStashStore"; import { ComposerStashBadge } from "./ComposerStashBadge"; import { ComposerStashMenu } from "./ComposerStashMenu"; +import { useComposerMenuState } from "./useComposerMenuState"; import { ComposerTasksBadge, ComposerTasksContent, @@ -911,10 +912,12 @@ const ComposerFooterModeControls = memo(function ComposerFooterModeControls(prop interactionMode: ProviderInteractionMode; runtimeMode: RuntimeMode; size?: "sm" | "xs"; + hidden?: boolean; onToggleInteractionMode: () => void; onRuntimeModeChange: (mode: RuntimeMode) => void; }) { const size = props.size ?? "sm"; + const [open, setOpen] = useComposerMenuState(props.hidden); const runtimeModeOption = runtimeModeConfig[props.runtimeMode]; const RuntimeModeIcon = runtimeModeOption.icon; const interactionModeTooltip = @@ -972,6 +975,8 @@ const ComposerFooterModeControls = memo(function ComposerFooterModeControls(prop