"use client"; import { useState, useEffect, useCallback } from "react"; import { Button } from "@/shared/components"; import { useTranslations } from "next-intl"; interface CacheEntry { id: string; signature: string; model: string; hit_count: number; tokens_saved: number; created_at: string; expires_at: string; } interface Pagination { page: number; limit: number; total: number; totalPages: number; } export default function CacheEntriesTab() { const t = useTranslations("cache"); const [entries, setEntries] = useState([]); const [pagination, setPagination] = useState({ page: 1, limit: 20, total: 0, totalPages: 0, }); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(""); const [deleting, setDeleting] = useState(null); const [error, setError] = useState(null); const fetchEntries = useCallback( async (page = 1) => { setLoading(true); setError(null); try { const params = new URLSearchParams({ page: String(page), limit: String(pagination.limit) }); if (search) params.set("search", search); const res = await fetch(`/api/cache/entries?${params}`); if (res.ok) { const data = await res.json(); setEntries(data.entries); setPagination(data.pagination); } else { setEntries([]); setError(t("entriesLoadError")); } } catch { setEntries([]); setError(t("entriesLoadError")); } finally { setLoading(false); } }, [pagination.limit, search, t] ); useEffect(() => { fetchEntries(); }, [fetchEntries]); const handleDelete = async (signature: string) => { setDeleting(signature); try { await fetch(`/api/cache/entries?signature=${encodeURIComponent(signature)}`, { method: "DELETE", }); await fetchEntries(pagination.page); } finally { setDeleting(null); } }; const formatDate = (dateStr: string) => { return new Date(dateStr).toLocaleString(); }; return (
setSearch(e.target.value)} onKeyDown={(e) => e.key === "Enter" && fetchEntries()} className="flex-1 px-3 py-2 text-sm rounded-lg border border-border bg-surface text-text-main placeholder:text-text-muted" />
{loading ? (
{t("loading")}
) : error ? (
{error}
) : entries.length === 0 ? (
{t("noEntries")}
) : ( <>
{entries.map((entry) => ( ))}
{t("signature")} {t("model")} {t("hits")} {t("tokensSaved")} {t("created")} {t("expires")} {t("actions")}
{entry.signature.slice(0, 12)}... {entry.model} {entry.hit_count} {(entry.tokens_saved ?? 0).toLocaleString()} {formatDate(entry.created_at)} {formatDate(entry.expires_at)}
{/* Pagination */} {pagination.totalPages > 1 && (
{pagination.page} / {pagination.totalPages}
)} )}
); }