main
import { useState } from 'react'
import { useRegistrationDraft } from '@/entities/registration'
import { markCode, useCodeTimer } from '@/entities/verification-code'
import { t } from '@/shared/i18n'
import { useCountdown, useTask } from '@/shared/lib'
import { createAccount, sendRegisterCode } from '../api/register'
export function useRegisterVerify(onComplete: () => void) {
const draft = useRegistrationDraft()
const [code, setCode] = useState('')
const task = useTask()
const timer = useCodeTimer(`register:${draft?.email || ''}`)
const retry = useCountdown(task.retryUntil)
function submit() {
if (!draft) return
if (!/^\d{6}$/.test(code)) return task.fail({ code: t('registerVerify.codeError') })
void task.run(async (signal) => {
await createAccount(
{
username: draft.username,
email: draft.email,
password_hash: draft.passwordHash,
email_code: code,
birth_date: `${draft.birth.year}-${draft.birth.month.padStart(2, '0')}-${draft.birth.day.padStart(2, '0')}`,
},
signal,
)
onComplete()
})
}
function resend() {
if (!draft) return
void task.run(async (signal) => {
const response = await sendRegisterCode(draft.email, signal)
markCode(`register:${draft.email}`, response.expires_in_secs)
setCode('')
task.setNotice({ kind: 'success', text: t('registerVerify.notice') })
})
}
return { draft, code, setCode, task, timer, retry, submit, resend }
}
export type RegisterVerifyModel = ReturnType<typeof useRegisterVerify>