From 78dbdc454acaf177460d0f72bfc018b06308708b Mon Sep 17 00:00:00 2001 From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com> Date: Sat, 13 Jun 2026 03:28:54 +0530 Subject: [PATCH] feat(composer): update ComposerAction to include searchSpaceId and integrate ChatHeader component --- .../components/assistant-ui/thread.tsx | 15 ++++-- .../components/layout/ui/header/Header.tsx | 6 +-- .../components/new-chat/model-selector.tsx | 53 ++++++++++++------- 3 files changed, 47 insertions(+), 27 deletions(-) diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx index 16a89c42c..224d999c7 100644 --- a/surfsense_web/components/assistant-ui/thread.tsx +++ b/surfsense_web/components/assistant-ui/thread.tsx @@ -68,6 +68,7 @@ import { import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button"; import { UserMessage } from "@/components/assistant-ui/user-message"; import { ChatExamplePrompts } from "@/components/new-chat/chat-example-prompts"; +import { ChatHeader } from "@/components/new-chat/chat-header"; import { ComposerSuggestionPopoverContent } from "@/components/new-chat/composer-suggestion-popup"; import { PromptPicker, type PromptPickerRef } from "@/components/new-chat/prompt-picker"; import { Avatar, AvatarFallback, AvatarGroup } from "@/components/ui/avatar"; @@ -931,7 +932,10 @@ const Composer: FC = () => { className="min-h-[48px] sm:min-h-[24px] **:data-slate-placeholder:font-normal" /> - + { interface ComposerActionProps { isBlockedByOtherUser?: boolean; + searchSpaceId: number; } -const ComposerAction: FC = ({ isBlockedByOtherUser = false }) => { +const ComposerAction: FC = ({ isBlockedByOtherUser = false, searchSpaceId }) => { const mentionedDocuments = useAtomValue(mentionedDocumentsAtom); const setConnectorDialogOpen = useSetAtom(connectorDialogOpenAtom); const [toolsPopoverOpen, setToolsPopoverOpen] = useState(false); @@ -1562,6 +1567,10 @@ const ComposerAction: FC = ({ isBlockedByOtherUser = false )}
+ !thread.isRunning}> = ({ isBlockedByOtherUser = false isBlockedByOtherUser ? "Wait for AI to finish responding" : !hasModelConfigured - ? "Please select a model from the header to start chatting" + ? "Please select a model to start chatting" : isComposerEmpty ? "Enter a message or add a screenshot to send" : "Send message" diff --git a/surfsense_web/components/layout/ui/header/Header.tsx b/surfsense_web/components/layout/ui/header/Header.tsx index 79839622d..1bd4ae772 100644 --- a/surfsense_web/components/layout/ui/header/Header.tsx +++ b/surfsense_web/components/layout/ui/header/Header.tsx @@ -6,7 +6,6 @@ import { currentThreadAtom } from "@/atoms/chat/current-thread.atom"; import { activeSearchSpaceIdAtom } from "@/atoms/search-spaces/search-space-query.atoms"; import { activeTabAtom } from "@/atoms/tabs/tabs.atom"; import { ActionLogButton } from "@/components/agent-action-log/action-log-button"; -import { ChatHeader } from "@/components/new-chat/chat-header"; import { ChatShareButton } from "@/components/new-chat/chat-share-button"; import type { ThreadRecord } from "@/lib/chat/thread-persistence"; @@ -66,12 +65,9 @@ export function Header({ mobileMenuTrigger }: HeaderProps) { return (
- {/* Left side - Mobile menu trigger + Model selector */} + {/* Left side - Mobile menu trigger */}
{mobileMenuTrigger} - {isChatPage && !isDocumentTab && searchSpaceId && ( - - )}
{/* Right side - Actions */} diff --git a/surfsense_web/components/new-chat/model-selector.tsx b/surfsense_web/components/new-chat/model-selector.tsx index dd1bcb431..0f5f50849 100644 --- a/surfsense_web/components/new-chat/model-selector.tsx +++ b/surfsense_web/components/new-chat/model-selector.tsx @@ -14,6 +14,7 @@ import { Button } from "@/components/ui/button"; import { Drawer, DrawerContent, + DrawerHandle, DrawerHeader, DrawerTitle, DrawerTrigger, @@ -127,23 +128,28 @@ export function ModelSelector({ setOpen(false); } + function manageModelConnections() { + setOpen(false); + onAddNewLLM(); + } + const content = ( -
-
+
+
- + setSearch(event.target.value)} - placeholder="Search chat models..." - className="pl-9" + placeholder="Search chat models" + className="h-8 border-0 bg-transparent pl-6 text-sm shadow-none" />
-
+
@@ -217,17 +226,22 @@ export function ModelSelector({ type="button" variant="ghost" size="sm" - className={cn("h-8 gap-2 rounded-full px-3 text-muted-foreground", className)} + className={cn( + "h-8 min-w-0 gap-2 rounded-md px-3 text-muted-foreground transition-colors", + "hover:bg-foreground/10 hover:text-foreground", + "data-[state=open]:bg-foreground/10 data-[state=open]:text-foreground", + className + )} > {selected ? ( - getProviderIcon(selected.provider, { className: "size-4" }) + getProviderIcon(selected.provider, { className: "size-4 shrink-0" }) ) : ( - + )} - + {selected ? modelName(selected) : "Auto"} - + ); @@ -235,7 +249,8 @@ export function ModelSelector({ return ( {trigger} - + + Select Chat Model @@ -248,7 +263,7 @@ export function ModelSelector({ return ( {trigger} - + {content}