'use client'; import { useEffect, useState } from 'react'; import { History, RotateCcw, ChevronDown, ChevronUp, Clock, Trash2, Loader2 } from 'lucide-react'; import { useHistoryStore, HistoryItem } from '@/store/history'; import api from '@/lib/axios'; import { cn } from '@/lib/utils'; interface QueryHistoryProps { onSelect: (query: string, item?: HistoryItem) => void; } export function QueryHistory({ onSelect }: QueryHistoryProps) { const { items, loaded, setItems, clear } = useHistoryStore(); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); useEffect(() => { if (loaded) return; setLoading(true); api .get('/query/history/') .then(({ data }) => { const backendItems: HistoryItem[] = (data.results || data || []).map((item: any) => ({ id: String(item.id), query_text: item.query_text, retrieval_mode: item.retrieval_mode, answer_text: item.answer_text, answer_preview: item.answer_preview, response_time: item.response_time, created_at: item.created_at, })); const currentItems = useHistoryStore.getState().items; const merged = [...backendItems, ...currentItems].filter( (item, index, self) => index === self.findIndex( (t) => t.query_text === item.query_text && t.created_at === item.created_at ) ); merged.sort( (a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime() ); setItems(merged.slice(0, 50)); }) .catch(() => {}) .finally(() => setLoading(false)); }, [loaded, setItems]); function handleClear() { clear(); api.delete('/query/history/').catch(() => {}); } function formatTime(dateStr: string) { try { const d = new Date(dateStr); const now = new Date(); const diffMs = now.getTime() - d.getTime(); const diffMins = Math.floor(diffMs / 60000); if (diffMins < 1) return 'just now'; if (diffMins < 60) return `${diffMins}m ago`; const diffHours = Math.floor(diffMins / 60); if (diffHours < 24) return `${diffHours}h ago`; const diffDays = Math.floor(diffHours / 24); return `${diffDays}d ago`; } catch { return ''; } } return (
{items.length > 0 && open && ( )}
{open && (
{items.length === 0 ? (

No queries yet.

) : ( items.map((item) => ( )) )}
)}
); }