'use client' import { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import Link from 'next/link' import { useLocale, useTranslations } from 'next-intl' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Sun, Moon, Monitor, LogOut, Languages, ExternalLink } from 'lucide-react' import { useTheme } from 'next-themes' import { createClient } from '@/lib/supabase/client' import { SecuritySettings } from '@/components/settings/SecuritySettings' import { CalendarFeedSettings } from '@/components/settings/CalendarFeedSettings' import { AccountDangerZone } from '@/components/settings/AccountDangerZone' import { ENABLED_EXTENSION_IDS } from '@/lib/extensions/_generated/enabled-extensions' import { useSettings } from '@/components/settings/useSettings' import { clearRecaptIdentity } from '@/lib/recapt' import { useToast } from '@/components/ui/use-toast' import { SUPPORTED_LOCALES, type Locale } from '@/i18n/config' export function AccountSettingsContent() { const router = useRouter() const supabase = createClient() const { theme, setTheme } = useTheme() const [mounted, setMounted] = useState(false) const hasCalendarExtension = ENABLED_EXTENSION_IDS.has('calendar') const { settings } = useSettings() const { toast } = useToast() const activeLocale = useLocale() as Locale const tCommon = useTranslations('common') const tSettings = useTranslations('settings') const [savingLocale, setSavingLocale] = useState(false) useEffect(() => { setMounted(true) }, []) async function handleLogout() { clearRecaptIdentity() await supabase.auth.signOut() router.push('/login') } async function handleLocaleChange(next: Locale) { if (next === activeLocale || savingLocale) return setSavingLocale(true) try { const res = await fetch('/api/user/locale', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ locale: next }), }) if (!res.ok) throw new Error('Could not save') toast({ title: tSettings('language_saved') }) router.refresh() } catch { toast({ title: tSettings('language_save_failed'), variant: 'destructive', }) } finally { setSavingLocale(false) } } const localeLabels: Record = { sv: tCommon('language_swedish'), en: tCommon('language_english'), } return (
{/* Appearance */}

{tSettings('section_appearance')}

{mounted && (
{([ { value: 'light', labelKey: 'theme_light', icon: Sun }, { value: 'dark', labelKey: 'theme_dark', icon: Moon }, { value: 'system', labelKey: 'theme_system', icon: Monitor }, ] as const).map(({ value, labelKey, icon: Icon }) => ( ))}
)}
{/* Language */}

{tSettings('section_language')}

{tSettings('language_description')}

{SUPPORTED_LOCALES.map((value) => ( ))}
{/* Security */}
{/* Calendar feed */} {hasCalendarExtension && (
)} {/* Logout */}
{tCommon('account_settings')}

{tCommon('logout')}

{tCommon('logout_description')}

{/* Privacy & agreements — surface the otherwise-unlinked DPA + privacy policy */}
{tSettings('legal_title')} {tSettings('legal_privacy')} {tSettings('legal_dpa')}
{/* Delete account — only for non-sandbox */} {!settings?.is_sandbox && }
) }