"use client"; import { useEffect, useState } from "react"; import { useTranslations } from "next-intl"; import { Button, Card } from "@/shared/components"; export default function UsageTokenBufferTab() { const t = useTranslations("settings"); const tc = useTranslations("common"); const [usageTokenBuffer, setUsageTokenBuffer] = useState(null); const [bufferInput, setBufferInput] = useState(""); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); useEffect(() => { let cancelled = false; const loadSettings = async () => { setLoading(true); try { const res = await fetch("/api/settings", { cache: "no-store" }); if (!res.ok) return; const data = await res.json(); const buffer = typeof data.usageTokenBuffer === "number" ? data.usageTokenBuffer : 2000; if (!cancelled) { setUsageTokenBuffer(buffer); setBufferInput(String(buffer)); } } catch { // Keep the input disabled if settings cannot be loaded. } finally { if (!cancelled) setLoading(false); } }; void loadSettings(); return () => { cancelled = true; }; }, []); const updateUsageTokenBuffer = async () => { const nextValue = Number.parseInt(bufferInput, 10); if (!Number.isFinite(nextValue) || nextValue < 0 || nextValue > 50000) return; setSaving(true); try { const res = await fetch("/api/settings", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ usageTokenBuffer: nextValue }), }); if (res.ok) { setUsageTokenBuffer(nextValue); } } catch (err) { console.error("Failed to update usageTokenBuffer:", err); } finally { setSaving(false); } }; const parsedInput = Number.parseInt(bufferInput, 10); const isDirty = usageTokenBuffer !== null && parsedInput !== usageTokenBuffer; return (

{t("storageUsageTokenBuffer")}

{t("storageUsageTokenBufferDesc")}

setBufferInput(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") void updateUsageTokenBuffer(); }} className="h-10 w-36 rounded-lg border border-border bg-surface px-3 text-sm text-text-main focus:outline-none focus:border-primary" disabled={loading} /> {usageTokenBuffer !== null && isDirty && ( {t("storageUsageTokenBufferCurrent", { value: usageTokenBuffer })} )}

{t("storageUsageTokenBufferHint")}

); }