'use client' import * as React from 'react' import { Loader2 } from 'lucide-react' import { useT } from '@open-mercato/shared/lib/i18n/context' import { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall' import { flash } from '@open-mercato/ui/backend/FlashMessages' import { Button } from '@open-mercato/ui/primitives/button' import { Input } from '@open-mercato/ui/primitives/input' type SetupResponse = { setupId?: string clientData?: Record } type ConfirmResponse = { ok?: boolean recoveryCodes?: string[] } type GenericProviderSetupProps = { providerType: string providerLabel: string onComplete?: (recoveryCodes: string[]) => void onCancel?: () => void } function parseJsonRecord(value: string): Record { if (!value.trim()) return {} try { const parsed = JSON.parse(value) if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {} return parsed as Record } catch { return {} } } export default function GenericProviderSetup({ providerType, providerLabel, onComplete, onCancel, }: GenericProviderSetupProps) { const t = useT() const [setupId, setSetupId] = React.useState(null) const [clientData, setClientData] = React.useState>({}) const [setupPayload, setSetupPayload] = React.useState('{}') const [verifyCode, setVerifyCode] = React.useState('') const [working, setWorking] = React.useState(false) const setupMode = setupId == null const handleSetup = React.useCallback(async () => { if (working) return setWorking(true) try { const payload = parseJsonRecord(setupPayload) const response = await readApiResultOrThrow( `/api/security/mfa/provider/${encodeURIComponent(providerType)}`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(payload), }, ) if (!response?.setupId) { throw new Error('Missing setupId') } setSetupId(response.setupId) setClientData(response.clientData ?? {}) flash( t('security.profile.mfa.generic.setupStarted', 'Provider setup started.'), 'success', ) } finally { setWorking(false) } }, [providerType, setupPayload, t, working]) const handleConfirm = React.useCallback(async () => { if (!setupId || working) return setWorking(true) try { const payload = verifyCode.trim() ? { code: verifyCode.trim() } : parseJsonRecord(setupPayload) const response = await readApiResultOrThrow( `/api/security/mfa/provider/${encodeURIComponent(providerType)}`, { method: 'PUT', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ setupId, payload }), }, ) const codes = Array.isArray(response?.recoveryCodes) ? response.recoveryCodes : [] onComplete?.(codes) setSetupId(null) setClientData({}) setVerifyCode('') flash( t('security.profile.mfa.generic.setupComplete', 'MFA method enabled.'), 'success', ) } finally { setWorking(false) } }, [onComplete, providerType, setupId, setupPayload, t, verifyCode, working]) return (

{t('security.profile.mfa.generic.setupTitle', 'Configure {provider}', { provider: providerLabel })}

{setupMode ? ( <>