'use client'; import { Button } from "@/components/ui/button" import { FolderOpen, Link, PanelRightOpen, Check, X, Menu, Share2, Book } from "lucide-react" import { usePathname } from "next/navigation" import { toast } from "sonner" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip" import { useState, useRef, KeyboardEvent } from "react" import { Input } from "@/components/ui/input" import { useUpdateProject } from "@/hooks/react-query" import { Skeleton } from "@/components/ui/skeleton" import { useIsMobile } from "@/hooks/use-mobile" import { cn } from "@/lib/utils" import { useSidebar } from "@/components/ui/sidebar" import { ShareModal } from "@/components/sidebar/share-modal" import { useQueryClient } from "@tanstack/react-query"; import { projectKeys } from "@/hooks/react-query/sidebar/keys"; import { threadKeys } from "@/hooks/react-query/threads/keys"; import { KnowledgeBaseManager } from "@/components/thread/knowledge-base/knowledge-base-manager"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { useFeatureFlags } from "@/lib/feature-flags"; interface ThreadSiteHeaderProps { threadId: string; projectId: string; projectName: string; onViewFiles: () => void; onToggleSidePanel: () => void; onProjectRenamed?: (newName: string) => void; isMobileView?: boolean; debugMode?: boolean; } export function SiteHeader({ threadId, projectId, projectName, onViewFiles, onToggleSidePanel, onProjectRenamed, isMobileView, debugMode, }: ThreadSiteHeaderProps) { const pathname = usePathname() const [isEditing, setIsEditing] = useState(false) const [editName, setEditName] = useState(projectName) const inputRef = useRef(null) const [showShareModal, setShowShareModal] = useState(false); const [showKnowledgeBase, setShowKnowledgeBase] = useState(false); const queryClient = useQueryClient(); const { flags, loading: flagsLoading } = useFeatureFlags(['knowledge_base']); const knowledgeBaseEnabled = flags.knowledge_base; const isMobile = useIsMobile() || isMobileView const { setOpenMobile } = useSidebar() const updateProjectMutation = useUpdateProject() const openShareModal = () => { setShowShareModal(true) } const openKnowledgeBase = () => { setShowKnowledgeBase(true) } const startEditing = () => { setEditName(projectName); setIsEditing(true); setTimeout(() => { inputRef.current?.focus(); inputRef.current?.select(); }, 0); }; const cancelEditing = () => { setIsEditing(false); setEditName(projectName); }; const saveNewName = async () => { if (editName.trim() === '') { setEditName(projectName); setIsEditing(false); return; } if (editName !== projectName) { try { if (!projectId) { toast.error('Cannot rename: Project ID is missing'); setEditName(projectName); setIsEditing(false); return; } const updatedProject = await updateProjectMutation.mutateAsync({ projectId, data: { name: editName } }) if (updatedProject) { onProjectRenamed?.(editName); queryClient.invalidateQueries({ queryKey: threadKeys.project(projectId) }); } else { throw new Error('Failed to update project'); } } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Failed to rename project'; console.error('Failed to rename project:', errorMessage); toast.error(errorMessage); setEditName(projectName); } } setIsEditing(false) } const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Enter') { saveNewName(); } else if (e.key === 'Escape') { cancelEditing(); } }; return ( <>
{isMobile && ( )}
{isEditing ? (
setEditName(e.target.value)} onKeyDown={handleKeyDown} onBlur={saveNewName} className="h-8 w-auto min-w-[180px] text-base font-medium" maxLength={50} />
) : !projectName || projectName === 'Project' ? ( ) : (
{projectName}
)}
{/* Debug mode indicator */} {debugMode && (
Debug
)} {isMobile ? ( // Mobile view - only show the side panel toggle ) : ( // Desktop view - show all buttons with tooltips

View Files in Task

{knowledgeBaseEnabled && (

Knowledge Base

)}

Share Chat

{/*

Toggle Computer Preview (CMD+I)

*/}
)}
setShowShareModal(false)} threadId={threadId} projectId={projectId} />
Knowledge Base
) }