Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

mail-and-code-auth.tsx 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { useState } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { useRouter, useSearchParams } from 'next/navigation'
  4. import { useContext } from 'use-context-selector'
  5. import Input from '@/app/components/base/input'
  6. import Button from '@/app/components/base/button'
  7. import { emailRegex } from '@/config'
  8. import Toast from '@/app/components/base/toast'
  9. import { sendWebAppEMailLoginCode } from '@/service/common'
  10. import { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '@/app/components/signin/countdown'
  11. import I18NContext from '@/context/i18n'
  12. import { noop } from 'lodash-es'
  13. export default function MailAndCodeAuth() {
  14. const { t } = useTranslation()
  15. const router = useRouter()
  16. const searchParams = useSearchParams()
  17. const emailFromLink = decodeURIComponent(searchParams.get('email') || '')
  18. const [email, setEmail] = useState(emailFromLink)
  19. const [loading, setIsLoading] = useState(false)
  20. const { locale } = useContext(I18NContext)
  21. const handleGetEMailVerificationCode = async () => {
  22. try {
  23. if (!email) {
  24. Toast.notify({ type: 'error', message: t('login.error.emailEmpty') })
  25. return
  26. }
  27. if (!emailRegex.test(email)) {
  28. Toast.notify({
  29. type: 'error',
  30. message: t('login.error.emailInValid'),
  31. })
  32. return
  33. }
  34. setIsLoading(true)
  35. const ret = await sendWebAppEMailLoginCode(email, locale)
  36. if (ret.result === 'success') {
  37. localStorage.setItem(COUNT_DOWN_KEY, `${COUNT_DOWN_TIME_MS}`)
  38. const params = new URLSearchParams(searchParams)
  39. params.set('email', encodeURIComponent(email))
  40. params.set('token', encodeURIComponent(ret.data))
  41. router.push(`/webapp-signin/check-code?${params.toString()}`)
  42. }
  43. }
  44. catch (error) {
  45. console.error(error)
  46. }
  47. finally {
  48. setIsLoading(false)
  49. }
  50. }
  51. return (<form onSubmit={noop}>
  52. <input type='text' className='hidden' />
  53. <div className='mb-2'>
  54. <label htmlFor="email" className='system-md-semibold my-2 text-text-secondary'>{t('login.email')}</label>
  55. <div className='mt-1'>
  56. <Input id='email' type="email" value={email} placeholder={t('login.emailPlaceholder') as string} onChange={e => setEmail(e.target.value)} />
  57. </div>
  58. <div className='mt-3'>
  59. <Button loading={loading} disabled={loading || !email} variant='primary' className='w-full' onClick={handleGetEMailVerificationCode}>{t('login.signup.verifyMail')}</Button>
  60. </div>
  61. </div>
  62. </form>
  63. )
  64. }