'use client'; import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { useAuth } from '@/contexts/AuthContext'; import type { AgentSettings } from '@/lib/types'; import toast from 'react-hot-toast'; const SECONDARY_LANGUAGES = ['Spanish', 'Catalan', 'German', 'French']; const getFallbackSettings = (userId: string): AgentSettings => ({ userId, agentName: 'HolaCompi', appLanguage: 'English', primaryCallLanguage: 'English (UK)', secondaryCallLanguages: [], tone: 'Friendly', agentInstructions: 'You are HolaCompi, a helpful Spanish friend who makes phone calls on behalf of users.', createdAt: null as unknown as AgentSettings['createdAt'], updatedAt: null as unknown as AgentSettings['updatedAt'], }); export default function AgentSettingsPage() { const { user, isLoading } = useAuth(); const router = useRouter(); const [settings, setSettings] = useState(null); const [isSaving, setIsSaving] = useState(false); useEffect(() => { if (!isLoading && !user) { router.push('/auth'); } }, [user, isLoading, router]); const fetchSettings = async () => { try { const response = await fetch('/api/agent-settings'); if (!response.ok) { toast.error('Unable to load agent settings.'); setSettings(getFallbackSettings(user?.uid ?? 'test-user-id')); return; } const data = await response.json(); setSettings(data.settings ?? getFallbackSettings(user?.uid ?? 'test-user-id')); } catch (error) { toast.error('Unable to load agent settings.'); setSettings(getFallbackSettings(user?.uid ?? 'test-user-id')); } }; useEffect(() => { if (user) { fetchSettings(); } }, [user]); const updateSettings = (patch: Partial) => { setSettings((prev) => prev ? { ...prev, ...patch, secondaryCallLanguages: patch.secondaryCallLanguages ?? prev.secondaryCallLanguages ?? [], } : prev ); }; const toggleSecondaryLanguage = (language: string) => { if (!settings) return; const current = settings.secondaryCallLanguages || []; const next = current.includes(language) ? current.filter((item) => item !== language) : [...current, language]; updateSettings({ secondaryCallLanguages: next }); }; const handleSave = async () => { if (!settings || isSaving) return; setIsSaving(true); try { const payload = { agentName: settings.agentName, appLanguage: settings.appLanguage, primaryCallLanguage: settings.primaryCallLanguage, secondaryCallLanguages: settings.secondaryCallLanguages ?? [], tone: settings.tone, agentInstructions: settings.agentInstructions, }; const response = await fetch('/api/agent-settings', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); if (!response.ok) { throw new Error('Failed to save'); } await fetchSettings(); toast.success('Agent settings saved.'); } catch (error) { console.error('Error saving agent settings', error); toast.error('Unable to save agent settings.'); } finally { setIsSaving(false); } }; if (isLoading || !settings) { return (
Loading...
); } return (

Voice Agent Settings

Agent Identity

updateSettings({ agentName: event.target.value })} className="mt-2 w-full rounded-xl bg-[#0f0b1a] border border-purple-500/20 px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-[#8b5cf6]" placeholder="HolaCompi" />

Linguistics

English (fixed)
{SECONDARY_LANGUAGES.map((language) => { const active = settings.secondaryCallLanguages?.includes(language); return ( ); })}

Voice Persona

{(['Professional', 'Friendly'] as const).map((tone) => { const active = settings.tone === tone; return ( ); })}