import { useMutation } from '@tanstack/react-query' import { useEffect, useState } from 'react' import { sendSmsCode } from '@/api' import { SMS_CODE_COOLDOWN_FALLBACK_SECONDS } from '@/constants' import i18n from '@/i18n' import { notify } from '@/lib/notify' import { toAuthSubmitErrorKey } from './auth-error-key' export function useSendSmsCode() { const [remainingSeconds, setRemainingSeconds] = useState(0) const mutation = useMutation({ mutationFn: (mobile: string) => sendSmsCode({ mobile: mobile.trim() }), onError: (error) => { const errorKey = toAuthSubmitErrorKey(error, 'register') notify.error( errorKey ? i18n.t(errorKey) : i18n.t('auth.register.sms.errors.submitFailed'), ) }, onSuccess: (result) => { setRemainingSeconds( result.expiresIn > 0 ? result.expiresIn : SMS_CODE_COOLDOWN_FALLBACK_SECONDS, ) notify.success(i18n.t('auth.register.sms.success')) }, }) useEffect(() => { if (remainingSeconds <= 0) { return } const timer = window.setTimeout(() => { setRemainingSeconds((value) => Math.max(0, value - 1)) }, 1000) return () => window.clearTimeout(timer) }, [remainingSeconds]) return { canSend: !mutation.isPending && remainingSeconds <= 0, isSending: mutation.isPending, remainingSeconds, send: mutation.mutateAsync, } }