From 0d65a2e4e3b70fef0776487a13f7640624a81860 Mon Sep 17 00:00:00 2001 From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com> Date: Tue, 26 May 2026 13:37:59 +0530 Subject: [PATCH 01/10] feat(web): implement composer suggestion popover and integrate with document mention picker --- .../components/assistant-ui/thread.tsx | 35 +- .../new-chat/composer-suggestion-popup.tsx | 158 ++++++++ .../new-chat/document-mention-picker.tsx | 374 ++++++++---------- .../components/new-chat/prompt-picker.tsx | 135 +++---- 4 files changed, 389 insertions(+), 313 deletions(-) create mode 100644 surfsense_web/components/new-chat/composer-suggestion-popup.tsx diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx index c4f6fed05..990382bfd 100644 --- a/surfsense_web/components/assistant-ui/thread.tsx +++ b/surfsense_web/components/assistant-ui/thread.tsx @@ -65,6 +65,7 @@ import { } from "@/components/assistant-ui/inline-mention-editor"; import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button"; import { UserMessage } from "@/components/assistant-ui/user-message"; +import { ComposerSuggestionPopoverContent } from "@/components/new-chat/composer-suggestion-popup"; import { DocumentMentionPicker, type DocumentMentionPickerRef, @@ -90,6 +91,7 @@ import { DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; +import { Popover, PopoverAnchor } from "@/components/ui/popover"; import { Skeleton } from "@/components/ui/skeleton"; import { Switch } from "@/components/ui/switch"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; @@ -533,6 +535,11 @@ const Composer: FC = () => { } }, [showDocumentPopover]); + const handleDocumentPopoverOpenChange = useCallback((open: boolean) => { + setShowDocumentPopover(open); + if (!open) setMentionQuery(""); + }, []); + const handleActionTrigger = useCallback((query: string) => { setShowPromptPicker(true); setActionQuery(query); @@ -545,6 +552,11 @@ const Composer: FC = () => { } }, [showPromptPicker]); + const handlePromptPickerOpenChange = useCallback((open: boolean) => { + setShowPromptPicker(open); + if (!open) setActionQuery(""); + }, []); + const handleActionSelect = useCallback( (action: { name: string; prompt: string; mode: "transform" | "explore" }) => { let userText = editorRef.current?.getText() ?? ""; @@ -723,8 +735,9 @@ const Composer: FC = () => { currentUserId={currentUser?.id ?? null} members={members ?? []} /> - {showDocumentPopover && ( -
+ {children} +
+No matching documents
-Failed to load prompts
-No matching prompts
-