"use client"; import { useQuery } from "@tanstack/react-query"; import { ArrowLeft, MessageSquare, Bot } from "lucide-react"; import { cn } from "@multica/ui/lib/utils"; import { Button } from "@multica/ui/components/ui/button"; import { Tooltip, TooltipTrigger, TooltipContent } from "@multica/ui/components/ui/tooltip"; import { Avatar, AvatarFallback, AvatarImage } from "@multica/ui/components/ui/avatar"; import { useWorkspaceId } from "@multica/core/hooks"; import { agentListOptions } from "@multica/core/workspace/queries"; import { allChatSessionsOptions } from "@multica/core/chat/queries"; import { useChatStore } from "@multica/core/chat"; import { createLogger } from "@multica/core/logger"; import type { ChatSession, Agent } from "@multica/core/types"; const logger = createLogger("chat.ui"); export function ChatSessionHistory() { const wsId = useWorkspaceId(); const setShowHistory = useChatStore((s) => s.setShowHistory); const setActiveSession = useChatStore((s) => s.setActiveSession); const activeSessionId = useChatStore((s) => s.activeSessionId); const { data: sessions = [] } = useQuery(allChatSessionsOptions(wsId)); const { data: agents = [] } = useQuery(agentListOptions(wsId)); const agentMap = new Map(agents.map((a) => [a.id, a])); const handleSelectSession = (session: ChatSession) => { logger.info("selectSession", { from: activeSessionId, to: session.id, agentId: session.agent_id, status: session.status, }); // Changing activeSessionId flips the query keys for messages + // pending-task; no manual clear needed. setActiveSession(session.id); setShowHistory(false); }; return (
{/* Header */}
setShowHistory(false)} /> } > Back Chat History
{/* Session list */}
{sessions.length === 0 ? (
No chat sessions yet
) : (
{sessions.map((session) => ( handleSelectSession(session)} /> ))}
)}
); } function SessionItem({ session, agent, isActive, onSelect, }: { session: ChatSession; agent: Agent | null; isActive: boolean; onSelect: () => void; }) { const timeAgo = formatTimeAgo(session.updated_at); return ( ); } function formatTimeAgo(dateStr: string): string { const date = new Date(dateStr); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMs / 3600000); const diffDays = Math.floor(diffMs / 86400000); if (diffMins < 1) return "just now"; if (diffMins < 60) return `${diffMins}m ago`; if (diffHours < 24) return `${diffHours}h ago`; if (diffDays < 7) return `${diffDays}d ago`; return date.toLocaleDateString(); }