"use client"; import { useAuth } from "@/components/AuthProvider"; import { c2api } from "@/lib/c2api"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; interface FeatureFlags { stt_enabled: boolean; correlation_enabled: boolean; summaries_enabled: boolean; vocabulary_learning_enabled: boolean; } const FLAG_META: { key: keyof FeatureFlags; label: string; description: string }[] = [ { key: "stt_enabled", label: "Speech-to-Text (Whisper)", description: "Transcribe call audio via OpenAI Whisper. When off, calls are recorded and stored but no transcript is generated.", }, { key: "correlation_enabled", label: "Incident Correlation", description: "Run scene extraction and incident correlation on each call. When off, calls are logged but not linked to incidents.", }, { key: "summaries_enabled", label: "Incident Summaries", description: "Generate AI summaries for active incidents on each summarizer pass. Auto-resolve sweep is also paused when off.", }, { key: "vocabulary_learning_enabled", label: "Vocabulary Learning", description: "Run the background vocabulary induction loop that proposes new STT terms from recent transcripts.", }, ]; function Toggle({ enabled, onChange, disabled, }: { enabled: boolean; onChange: (val: boolean) => void; disabled: boolean; }) { return ( onChange(!enabled)} disabled={disabled} className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none disabled:opacity-50 ${ enabled ? "bg-indigo-600" : "bg-gray-700" }`} > ); } export default function AdminPage() { const { isAdmin } = useAuth(); const router = useRouter(); const [flags, setFlags] = useState(null); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(null); const [error, setError] = useState(null); useEffect(() => { if (!isAdmin) { router.replace("/dashboard"); return; } c2api.getFeatureFlags() .then((f) => setFlags(f as unknown as FeatureFlags)) .catch((e) => setError(String(e))) .finally(() => setLoading(false)); }, [isAdmin, router]); async function handleToggle(key: keyof FeatureFlags, value: boolean) { if (!flags) return; setSaving(key); setError(null); try { const updated = await c2api.setFeatureFlags({ [key]: value }); setFlags(updated as unknown as FeatureFlags); } catch (e) { setError(String(e)); } finally { setSaving(null); } } if (!isAdmin) return null; return ( Admin AI Features {error && ( {error} )} {loading ? ( Loading… ) : ( {FLAG_META.map(({ key, label, description }) => ( {label} {description} handleToggle(key, val)} disabled={saving === key} /> ))} )} ); }
{error}
Loading…
{label}
{description}