countdown.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. 'use client'
  2. import { useCountDown } from 'ahooks'
  3. import { useEffect, useState } from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. export const COUNT_DOWN_TIME_MS = 59000
  6. export const COUNT_DOWN_KEY = 'leftTime'
  7. type CountdownProps = {
  8. onResend?: () => void
  9. }
  10. export default function Countdown({ onResend }: CountdownProps) {
  11. const { t } = useTranslation()
  12. const [leftTime, setLeftTime] = useState(Number(localStorage.getItem(COUNT_DOWN_KEY) || COUNT_DOWN_TIME_MS))
  13. const [time] = useCountDown({
  14. leftTime,
  15. onEnd: () => {
  16. setLeftTime(0)
  17. localStorage.removeItem(COUNT_DOWN_KEY)
  18. },
  19. })
  20. const resend = async function () {
  21. setLeftTime(COUNT_DOWN_TIME_MS)
  22. localStorage.setItem(COUNT_DOWN_KEY, `${COUNT_DOWN_TIME_MS}`)
  23. onResend?.()
  24. }
  25. useEffect(() => {
  26. localStorage.setItem(COUNT_DOWN_KEY, `${time}`)
  27. }, [time])
  28. return <p className='system-xs-regular text-text-tertiary'>
  29. <span>{t('login.checkCode.didNotReceiveCode')}</span>
  30. {time > 0 && <span>{Math.round(time / 1000)}s</span>}
  31. {
  32. time <= 0 && <span className='system-xs-medium text-text-accent-secondary cursor-pointer' onClick={resend}>{t('login.checkCode.resend')}</span>
  33. }
  34. </p>
  35. }