| 'use client' | |
| import { useCountDown } from 'ahooks' | |
| import { useEffect, useState } from 'react' | |
| import { useTranslation } from 'react-i18next' | |
| export const COUNT_DOWN_TIME_MS = 59000 | |
| export const COUNT_DOWN_KEY = 'leftTime' | |
| type CountdownProps = { | |
| onResend?: () => void | |
| } | |
| export default function Countdown({ onResend }: CountdownProps) { | |
| const { t } = useTranslation() | |
| const [leftTime, setLeftTime] = useState(Number(localStorage.getItem(COUNT_DOWN_KEY) || COUNT_DOWN_TIME_MS)) | |
| const [time] = useCountDown({ | |
| leftTime, | |
| onEnd: () => { | |
| setLeftTime(0) | |
| localStorage.removeItem(COUNT_DOWN_KEY) | |
| }, | |
| }) | |
| const resend = async function () { | |
| setLeftTime(COUNT_DOWN_TIME_MS) | |
| localStorage.setItem(COUNT_DOWN_KEY, `${COUNT_DOWN_TIME_MS}`) | |
| onResend?.() | |
| } | |
| useEffect(() => { | |
| localStorage.setItem(COUNT_DOWN_KEY, `${time}`) | |
| }, [time]) | |
| return <p className='system-xs-regular text-text-tertiary'> | |
| <span>{t('login.checkCode.didNotReceiveCode')}</span> | |
| {time > 0 && <span>{Math.round(time / 1000)}s</span>} | |
| { | |
| time <= 0 && <span className='system-xs-medium text-text-accent-secondary cursor-pointer' onClick={resend}>{t('login.checkCode.resend')}</span> | |
| } | |
| </p> | |
| } | |