import { useState, type ReactNode } from 'react'; import { api } from '../api/client'; import { usePublicConfig } from '../api/hooks'; import { useI18n } from '../i18n'; import { useSession } from '../state/session'; import { useToasts } from '../state/toasts'; import { Modal } from './Modal'; export function AccountDialog({ onClose }: { onClose(): void }): ReactNode { const session = useSession(); const toasts = useToasts(); const install = usePublicConfig(); const { t } = useI18n(); const [current, setCurrent] = useState(''); const [next, setNext] = useState(''); const [confirm, setConfirm] = useState(''); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [sending, setSending] = useState(false); // Only worth asking about where a confirmation could actually be delivered. const askToConfirm = install.data?.emailEnabled === true && session.account?.verified === false; async function sendConfirmation() { setSending(true); try { await api.sendVerification(); toasts.push(t('account.confirmationSent', session.account?.email ?? ''), 'success'); } catch (err) { toasts.fail(err); } finally { setSending(false); } } const mismatch = confirm.length > 0 && next !== confirm; const canSave = !busy && current.length > 0 && next.length >= 10 && next === confirm; async function save() { setBusy(true); setError(null); try { await api.changePassword(current, next); toasts.push(t('account.passwordChanged'), 'success'); onClose(); } catch (err) { setError(err instanceof Error ? err.message : t('account.passwordChangeFailed')); } finally { setBusy(false); } } return ( } >
{t('account.signedInAs')} {session.account?.email} {session.workspace && t('account.roleIn', t(`role.${session.workspace.role}`), session.workspace.name)} .
{session.workspaces.length > 1 && (
{t('account.otherWorkspaces', session.workspaces.length - 1)}
)} {askToConfirm && (
{t('account.unconfirmed')}
)} {error &&
{error}
}
{t('account.signsOutOthers')}
); }