"use client"; import { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, Clock, Eye, Filter, Globe, MessageSquare, Search, } from "lucide-react"; import Link from "next/link"; import { useCallback, useEffect, useId, useState } from "react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { formatCategory } from "@/lib/format-enums"; import type { ChatSession } from "../../../lib/types"; interface FilterOptions { categories: string[]; languages: string[]; } interface FilterSectionProps { filtersExpanded: boolean; setFiltersExpanded: (expanded: boolean) => void; searchTerm: string; setSearchTerm: (term: string) => void; selectedCategory: string; setSelectedCategory: (category: string) => void; selectedLanguage: string; setSelectedLanguage: (language: string) => void; startDate: string; setStartDate: (date: string) => void; endDate: string; setEndDate: (date: string) => void; sortKey: string; setSortKey: (key: string) => void; sortOrder: string; setSortOrder: (order: string) => void; filterOptions: FilterOptions; searchHeadingId: string; filtersHeadingId: string; filterContentId: string; categoryFilterId: string; categoryHelpId: string; languageFilterId: string; languageHelpId: string; sortOrderId: string; sortOrderHelpId: string; } function FilterSection({ filtersExpanded, setFiltersExpanded, searchTerm, setSearchTerm, selectedCategory, setSelectedCategory, selectedLanguage, setSelectedLanguage, startDate, setStartDate, endDate, setEndDate, sortKey, setSortKey, sortOrder, setSortOrder, filterOptions, searchHeadingId, filtersHeadingId, filterContentId, categoryFilterId, categoryHelpId, languageFilterId, languageHelpId, sortOrderId, sortOrderHelpId, }: FilterSectionProps) { return (

Search and Filter Sessions

setSearchTerm(e.target.value)} className="pl-10" />
{filtersExpanded && (
Filter and sort options
Filter sessions by category
Filter sessions by language
setStartDate(e.target.value)} className="mt-1" />
setEndDate(e.target.value)} className="mt-1" />
Choose ascending or descending order
)}
); } interface SessionListProps { sessions: ChatSession[]; loading: boolean; error: string | null; resultsHeadingId: string; } function SessionList({ sessions, loading, error, resultsHeadingId, }: SessionListProps) { return (

Session Results

{loading && "Loading sessions..."} {error && `Error loading sessions: ${error}`} {!loading && !error && sessions.length > 0 && `Found ${sessions.length} sessions`} {!loading && !error && sessions.length === 0 && "No sessions found"} {loading && ( )} {error && ( )} {!loading && !error && sessions.length === 0 && (
No sessions found. Try adjusting your search criteria.
)} {!loading && !error && sessions.length > 0 && ( )}
); } interface PaginationProps { currentPage: number; totalPages: number; setCurrentPage: (page: number | ((prev: number) => number)) => void; } function Pagination({ currentPage, totalPages, setCurrentPage, }: PaginationProps) { if (totalPages === 0) return null; return (
Page {currentPage} of {totalPages}
); } export default function SessionsPage() { const [sessions, setSessions] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchTerm, setSearchTerm] = useState(""); const searchHeadingId = useId(); const filtersHeadingId = useId(); const filterContentId = useId(); const categoryFilterId = useId(); const categoryHelpId = useId(); const languageFilterId = useId(); const languageHelpId = useId(); const sortOrderId = useId(); const sortOrderHelpId = useId(); const resultsHeadingId = useId(); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(""); const [selectedCategory, setSelectedCategory] = useState(""); const [selectedLanguage, setSelectedLanguage] = useState(""); const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); const [sortKey, setSortKey] = useState("startTime"); const [sortOrder, setSortOrder] = useState("desc"); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(0); const [pageSize] = useState(10); const [filtersExpanded, setFiltersExpanded] = useState(false); const [filterOptions, setFilterOptions] = useState({ categories: [], languages: [], }); useEffect(() => { const timerId = setTimeout(() => { setDebouncedSearchTerm(searchTerm); }, 500); return () => clearTimeout(timerId); }, [searchTerm]); const fetchFilterOptions = useCallback(async () => { try { const response = await fetch("/api/dashboard/session-filter-options"); if (!response.ok) { throw new Error("Failed to fetch filter options"); } const data = await response.json(); setFilterOptions(data); } catch (err) { setError( err instanceof Error ? err.message : "Failed to load filter options" ); } }, []); const fetchSessions = useCallback(async () => { setLoading(true); setError(null); try { const params = new URLSearchParams(); if (debouncedSearchTerm) params.append("searchTerm", debouncedSearchTerm); if (selectedCategory) params.append("category", selectedCategory); if (selectedLanguage) params.append("language", selectedLanguage); if (startDate) params.append("startDate", startDate); if (endDate) params.append("endDate", endDate); if (sortKey) params.append("sortKey", sortKey); if (sortOrder) params.append("sortOrder", sortOrder); params.append("page", currentPage.toString()); params.append("pageSize", pageSize.toString()); const response = await fetch( `/api/dashboard/sessions?${params.toString()}` ); if (!response.ok) { throw new Error(`Failed to fetch sessions: ${response.statusText}`); } const data = await response.json(); setSessions(data.sessions || []); setTotalPages(Math.ceil((data.totalSessions || 0) / pageSize)); } catch (err) { setError( err instanceof Error ? err.message : "An unknown error occurred" ); setSessions([]); } finally { setLoading(false); } }, [ debouncedSearchTerm, selectedCategory, selectedLanguage, startDate, endDate, sortKey, sortOrder, currentPage, pageSize, ]); useEffect(() => { fetchSessions(); }, [fetchSessions]); useEffect(() => { fetchFilterOptions(); }, [fetchFilterOptions]); return (

Sessions Management

Chat Sessions
); }