"use client"; import { useState } from "react"; import Link from "next/link"; import { Search, X, Plus } from "lucide-react"; import { useSessions, useSessionSearch } from "@/lib/hooks"; import { SessionCard } from "@/components/SessionCard"; const PLATFORMS = [ { id: null, label: "All" }, { id: "cli", label: "CLI" }, { id: "telegram", label: "Telegram" }, { id: "discord", label: "Discord" }, { id: "web", label: "Web" }, ] as const; function highlightMatch(text: string, query: string): string { if (!query) return text; const escaped = query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); return text.replace(new RegExp("(" + escaped + ")", "gi"), '$1'); } export default function HistoryPage() { const [filter, setFilter] = useState(null); const [query, setQuery] = useState(""); const [searching, setSearching] = useState(false); const [limit, setLimit] = useState(20); const { data: sessionsData, isLoading } = useSessions(limit, filter || undefined); const hasMore = (sessionsData?.total || 0) > (sessionsData?.items?.length || 0); const { data: searchData, isFetching: searchLoading } = useSessionSearch(searching ? query : ""); const showSearch = searching && query.length >= 2; return ( History { setQuery(e.target.value); setSearching(true); }} onFocus={() => setSearching(true)} placeholder="Search sessions..." className="w-full pl-9 pr-9 py-2.5 rounded-xl text-sm outline-none transition-colors" style={{ background: "var(--bg-raised)", border: "1px solid var(--border)", color: "var(--text-1)" }} /> {query && ( { setQuery(""); setSearching(false); }} className="absolute right-3 top-1/2 -translate-y-1/2" style={{ color: "var(--text-3)" }}> )} {showSearch ? ( {searchLoading ? "Searching..." : (searchData?.count || 0) + " results"} {searchData?.results?.map((r) => ( {r.session_title || r.session_id.slice(0, 8)} ))} ) : ( <> {PLATFORMS.map((p) => ( setFilter(p.id)} className="px-3 py-1.5 rounded-lg text-xs font-medium whitespace-nowrap shrink-0 transition-all" style={{ background: filter === p.id ? "var(--accent-dim)" : "var(--bg-raised)", color: filter === p.id ? "var(--accent)" : "var(--text-3)", }} > {p.label} ))} {isLoading ? ( {[...Array(5)].map((_, i) => ( ))} ) : ( {sessionsData?.items?.map((s) => ( ))} {sessionsData?.items?.length === 0 && ( No sessions found )} {hasMore && ( setLimit((l) => l + 20)} className="w-full py-3 mt-2 text-[13px] font-medium rounded-xl transition-colors" style={{ color: "var(--accent)", background: "var(--accent-dim)" }} > Load more )} )} > )} ); }
No sessions found