import { useState, type ReactNode } from 'react'; import { LOCALES, languageNames, type Locale, type Messages } from './i18n'; export const SETTINGS_NAV_ITEMS = [ { targetId: 'settings-general', navKey: 'general' }, { targetId: 'settings-models', navKey: 'models' }, { targetId: 'settings-runtime', navKey: 'runtime' }, { targetId: 'settings-moa', navKey: 'moa' }, { targetId: 'settings-codex', navKey: 'codex' }, { targetId: 'settings-accounts', navKey: 'accounts' }, ] as const; export type SettingsSectionId = (typeof SETTINGS_NAV_ITEMS)[number]['targetId']; type SettingsNavKey = (typeof SETTINGS_NAV_ITEMS)[number]['navKey']; function navItem(t: Messages, navKey: SettingsNavKey) { return t.settings.nav[navKey]; } export function SettingsNav({ activeSection, onSelect, t, }: { activeSection: SettingsSectionId; onSelect: (section: SettingsSectionId) => void; t: Messages; }) { return (
{SETTINGS_NAV_ITEMS.map((item) => { const copy = navItem(t, item.navKey); return ( ); })}
); } export function GeneralSettings({ locale, nickname, onLocaleChange, onNicknameChange, t, }: { locale: Locale; nickname: string; onLocaleChange: (locale: Locale) => void; onNicknameChange: (next: string) => void; t: Messages; }) { const section = t.settings.sections.general; return (
); } export function SettingsSectionHeading({ detail, title, description, }: { detail: string; title: string; description: string; }) { return (
{detail}

{title}

{description}

); } export function SettingsCard({ title, description, actions, children, }: { title?: string; description?: string; actions?: ReactNode; children: ReactNode; }) { return (
{title || description || actions ? (
{title ?

{title}

: null} {description ? (

{description}

) : null}
{actions ? (
{actions}
) : null}
) : null} {children}
); } export function SettingsCollapsible({ title, description, defaultOpen = false, children, }: { title: string; description?: string; defaultOpen?: boolean; children: ReactNode; }) { const [open, setOpen] = useState(defaultOpen); return (
{open ? (
{children}
) : null}
); } export function SettingsSaveBar({ busy, dirty, label, savingLabel, onSave, savedHint, showSavedHint, saveDisabled = false, }: { busy: boolean; dirty: boolean; label: string; savingLabel: string; onSave: () => void; savedHint?: string; showSavedHint?: boolean; saveDisabled?: boolean; }) { return (
{showSavedHint && savedHint ? ( {savedHint} ) : null}
); } export function SettingsApplyCard({ onRestartStack, t, }: { onRestartStack: () => void; t: Messages; }) { const apply = t.settings.apply; return (
{apply.kicker} {apply.title} {apply.hint}
); }