Skip to content
Clone
main
25 lines 982 B
import { useState } from 'react'
import type { LoginComplete } from '@/entities/session'
import { t } from '@/shared/i18n'
import { useCountdown, useTask } from '@/shared/lib'
import { verifyMfaCode } from '../api/verify-mfa'
export function useVerifyMfa(challenge: string, onComplete: LoginComplete) {
const [recovery, setRecovery] = useState(false)
const [code, setCode] = useState('')
const task = useTask()
const retry = useCountdown(task.retryUntil)
function toggleRecovery() {
setRecovery(!recovery)
setCode('')
task.setNotice(undefined)
}
function submit() {
if (recovery ? !code.trim() : !/^\d{6}$/.test(code))
return task.fail({ code: recovery ? t('mfa.recoveryError') : t('mfa.codeError') })
void task.run(async (signal) => onComplete(await verifyMfaCode(challenge, code.trim(), signal)))
}
return { recovery, code, setCode, task, retry, toggleRecovery, submit }
}
export type VerifyMfaModel = ReturnType<typeof useVerifyMfa>