"use client"; import { useEffect, useMemo, useState } from "react"; import { Card, Collapsible, Toggle } from "@/shared/components"; import { useTranslations } from "next-intl"; import { CLAUDE_FAST_MODE_DEFAULT_MODELS, getClaudeFastModeSupportedModels, isClaudeFastModeEnabled, } from "@/lib/providers/claudeFastMode"; const SUPPORTED_MODEL_CHOICES = [...CLAUDE_FAST_MODE_DEFAULT_MODELS]; export default function ClaudeFastModeTab() { const [enabled, setEnabled] = useState(false); const [selectedModels, setSelectedModels] = useState([ ...CLAUDE_FAST_MODE_DEFAULT_MODELS, ]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [status, setStatus] = useState<"" | "saved" | "error">(""); const t = useTranslations("settings"); useEffect(() => { let cancelled = false; fetch("/api/settings") .then((res) => res.json()) .then((data) => { if (cancelled) return; setEnabled(isClaudeFastModeEnabled(data)); setSelectedModels(getClaudeFastModeSupportedModels(data)); setLoading(false); }) .catch(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, []); const modelsCount = selectedModels.length; const subtitle = useMemo( () => t("claudeFastModeModelsLabel", { count: modelsCount }), [t, modelsCount] ); const persist = async (payload: { enabled: boolean; supportedModels: string[] }) => { setSaving(true); setStatus(""); try { const res = await fetch("/api/settings", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ claudeFastMode: payload }), }); if (res.ok) { setStatus("saved"); setTimeout(() => setStatus(""), 2000); } else { setStatus("error"); return false; } } catch { setStatus("error"); return false; } finally { setSaving(false); } return true; }; const saveEnabled = async (next: boolean) => { if (saving || loading) return; const previous = enabled; setEnabled(next); const ok = await persist({ enabled: next, supportedModels: selectedModels }); if (!ok) setEnabled(previous); }; const toggleModel = async (modelId: string, checked: boolean) => { if (saving || loading) return; const previous = selectedModels; const next = checked ? Array.from(new Set([...selectedModels, modelId])) : selectedModels.filter((id) => id !== modelId); setSelectedModels(next); const ok = await persist({ enabled, supportedModels: next }); if (!ok) setSelectedModels(previous); }; return (

{t("claudeFastModeTitle")}

{t("claudeFastModeDesc")}

{status === "saved" && ( check_circle{" "} {t("saved")} )} {status === "error" && ( error{" "} {t("claudeFastModeSaveError")} )} saveEnabled(value)} disabled={loading || saving} ariaLabel={t("claudeFastModeTitle")} />
{enabled && (
{SUPPORTED_MODEL_CHOICES.map((modelId) => { const checked = selectedModels.includes(modelId); return ( ); })}
)}

info {t("claudeFastModeHint")}

); }