diff --git a/surfsense_web/components/assistant-ui/thinking-steps.tsx b/surfsense_web/components/assistant-ui/thinking-steps.tsx index 900fc7b09..2c47b0006 100644 --- a/surfsense_web/components/assistant-ui/thinking-steps.tsx +++ b/surfsense_web/components/assistant-ui/thinking-steps.tsx @@ -20,8 +20,6 @@ export const ThinkingStepsDisplay: FC<{ steps: ThinkingStep[]; isThreadRunning?: steps, isThreadRunning = true, }) => { - const [isOpen, setIsOpen] = useState(true); - const getEffectiveStatus = useCallback( (step: ThinkingStep): "pending" | "in_progress" | "completed" => { if (step.status === "in_progress" && !isThreadRunning) { @@ -38,12 +36,18 @@ export const ThinkingStepsDisplay: FC<{ steps: ThinkingStep[]; isThreadRunning?: !isThreadRunning && steps.every((s) => getEffectiveStatus(s) === "completed"); const isProcessing = isThreadRunning && !allCompleted; + const [isOpen, setIsOpen] = useState(() => isProcessing); useEffect(() => { + if (isProcessing) { + setIsOpen(true); + return; + } + if (allCompleted) { setIsOpen(false); } - }, [allCompleted]); + }, [allCompleted, isProcessing]); if (steps.length === 0) return null; diff --git a/surfsense_web/components/layout/ui/header/Header.tsx b/surfsense_web/components/layout/ui/header/Header.tsx index d2077deb4..c28fecbbe 100644 --- a/surfsense_web/components/layout/ui/header/Header.tsx +++ b/surfsense_web/components/layout/ui/header/Header.tsx @@ -1,20 +1,20 @@ "use client"; -import { useAtom, useAtomValue } from "jotai"; -import { PanelRight } from "lucide-react"; +import { useAtomValue } from "jotai"; import { usePathname } from "next/navigation"; +import { hitlEditPanelAtom } from "@/atoms/chat/hitl-edit-panel.atom"; import { currentThreadAtom } from "@/atoms/chat/current-thread.atom"; import { reportPanelAtom } from "@/atoms/chat/report-panel.atom"; import { documentsSidebarOpenAtom } from "@/atoms/documents/ui.atoms"; +import { editorPanelAtom } from "@/atoms/editor/editor-panel.atom"; import { rightPanelCollapsedAtom } from "@/atoms/layout/right-panel.atom"; import { activeSearchSpaceIdAtom } from "@/atoms/search-spaces/search-space-query.atoms"; -import { activeTabAtom } from "@/atoms/tabs/tabs.atom"; +import { activeTabAtom, tabsAtom } from "@/atoms/tabs/tabs.atom"; import { ChatHeader } from "@/components/new-chat/chat-header"; import { ChatShareButton } from "@/components/new-chat/chat-share-button"; -import { Button } from "@/components/ui/button"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useIsMobile } from "@/hooks/use-mobile"; import type { ChatVisibility, ThreadRecord } from "@/lib/chat/thread-persistence"; +import { cn } from "@/lib/utils"; interface HeaderProps { mobileMenuTrigger?: React.ReactNode; @@ -25,9 +25,20 @@ export function Header({ mobileMenuTrigger }: HeaderProps) { const searchSpaceId = useAtomValue(activeSearchSpaceIdAtom); const isMobile = useIsMobile(); const activeTab = useAtomValue(activeTabAtom); + const tabs = useAtomValue(tabsAtom); + const collapsed = useAtomValue(rightPanelCollapsedAtom); + const documentsOpen = useAtomValue(documentsSidebarOpenAtom); + const reportState = useAtomValue(reportPanelAtom); + const editorState = useAtomValue(editorPanelAtom); + const hitlEditState = useAtomValue(hitlEditPanelAtom); const isChatPage = pathname?.includes("/new-chat") ?? false; const isDocumentTab = activeTab?.type === "document"; + const reportOpen = reportState.isOpen && !!reportState.reportId; + const editorOpen = editorState.isOpen && !!editorState.documentId; + const hitlEditOpen = hitlEditState.isOpen && !!hitlEditState.onSave; + const showExpandButton = !isMobile && collapsed && (documentsOpen || reportOpen || editorOpen || hitlEditOpen); + const hasTabBar = tabs.length > 1; const currentThreadState = useAtomValue(currentThreadAtom); @@ -49,15 +60,8 @@ export function Header({ mobileMenuTrigger }: HeaderProps) { const handleVisibilityChange = (_visibility: ChatVisibility) => {}; - const [collapsed, setCollapsed] = useAtom(rightPanelCollapsedAtom); - const documentsOpen = useAtomValue(documentsSidebarOpenAtom); - const reportState = useAtomValue(reportPanelAtom); - const reportOpen = reportState.isOpen && !!reportState.reportId; - const hasRightPanelContent = documentsOpen || reportOpen; - const showExpandButton = !isMobile && collapsed && hasRightPanelContent; - return ( -
+
{/* Left side - Mobile menu trigger + Model selector */}
{mobileMenuTrigger} @@ -67,26 +71,10 @@ export function Header({ mobileMenuTrigger }: HeaderProps) {
{/* Right side - Actions */} -
+
{hasThread && ( )} - {showExpandButton && ( - - - - - Expand panel - - )}
); diff --git a/surfsense_web/components/layout/ui/right-panel/RightPanel.tsx b/surfsense_web/components/layout/ui/right-panel/RightPanel.tsx index 90cdde127..b92430607 100644 --- a/surfsense_web/components/layout/ui/right-panel/RightPanel.tsx +++ b/surfsense_web/components/layout/ui/right-panel/RightPanel.tsx @@ -55,7 +55,7 @@ export function RightPanelExpandButton() { if (!collapsed || !hasContent) return null; return ( -
+
); })} + {onNewChat && ( +
+ +
+ )}
- - {onNewChat && ( - - )}
); }