@particle-network/authkit
Version:
Auth Core provides MPC (Multi-Party Computation)-based threshold signatures.
5 lines • 53.1 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/pages/login/index.tsx", "../../src/pages/login/components/captcha-input.tsx", "../../src/pages/login/components/email-login.tsx", "../../src/pages/login/components/phone-login.tsx", "../../src/pages/login/components/social-login.tsx"],
"sourcesContent": ["import { LoadingOutlined } from '@ant-design/icons';\nimport {\n AuthType,\n getConnectCaptcha,\n isNullish,\n requireNotNullish,\n type CaptchaRequest,\n type ConnectParam,\n type PhoneCaptchaRequest,\n type SocialAuthType,\n} from '@particle-network/auth-core';\nimport { Image } from 'antd';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport logoImg from '../../common/images/logo.png';\nimport PowerFooter from '../../components/power-footer';\nimport { useParticleAuth, useTranslation } from '../../context';\nimport useLogin from '../../context/hooks/useLogin';\nimport { EmailRegExp, isValidE164PhoneNumber } from '../../utils';\nimport CaptchaInput from './components/captcha-input';\nimport EmailLogin from './components/email-login';\nimport loginStyles from './components/login.less';\nimport PhoneLogin from './components/phone-login';\nimport SocialLogin from './components/social-login';\nimport styles from './index.less';\n\nfunction Login(props?: ConnectParam) {\n // @ts-ignore\n const { email, phone, authorization, chain } = props || {};\n\n const { modalOptions, setLoginAuthorization } = useParticleAuth();\n const { socialAuthLogin } = useLogin();\n\n const getDefaultLoginType = () => {\n const indexPhone = modalOptions.authTypes?.indexOf(AuthType.phone) ?? -1;\n const indexEmail = modalOptions.authTypes?.indexOf(AuthType.email) ?? -1;\n if (\n (!isNullish(phone) && (indexPhone >= 0 || !modalOptions.authTypes?.length)) ||\n (!email &&\n ((indexPhone >= 0 && indexEmail < 0) || (indexPhone >= 0 && indexEmail >= 0 && indexPhone < indexEmail)))\n ) {\n return AuthType.phone;\n } else {\n return AuthType.email;\n }\n };\n\n const [loginType, setLoginType] = useState<AuthType>(getDefaultLoginType()); // email or phone\n\n const { t } = useTranslation();\n\n const [account, setAccount] = useState<string | undefined>('');\n\n const [showInputCaptcha, setShowInputCaptcha] = useState(false);\n\n const [loginWithAccount, setLoginWithAccount] = useState(false);\n\n const [supportAuthTypes, setSupportAuthTypes] = useState<AuthType[]>(modalOptions.authTypes || []);\n\n const displayInputCaptcha = (visible: boolean) => {\n setShowInputCaptcha(visible);\n };\n\n useEffect(() => {\n document.documentElement.setAttribute('data-login-type', loginType || '');\n }, [loginType]);\n\n useEffect(() => {\n if (!loginWithAccount) {\n const allTypes = Object.values(AuthType).filter(\n (authType) => authType !== AuthType.jwt && authType !== AuthType.telegram\n );\n if (!modalOptions.authTypes) {\n setSupportAuthTypes(allTypes);\n } else {\n const types = modalOptions.authTypes.filter(\n (authType) => authType !== AuthType.jwt && authType !== AuthType.telegram && allTypes.includes(authType)\n );\n if (!types.includes(AuthType.email) && !types.includes(AuthType.phone) && types.length > 0) {\n types.unshift(AuthType.email);\n }\n if (types.length === 1 && (types[0] === AuthType.email || types[0] === AuthType.phone)) {\n //clear all\n types.length = 0;\n }\n setSupportAuthTypes(types);\n }\n } else {\n setSupportAuthTypes([]);\n }\n }, [loginWithAccount, modalOptions.authTypes]);\n\n useEffect(() => {\n if (authorization) {\n setLoginAuthorization({ authorization, chain: requireNotNullish(chain) });\n } else {\n setLoginAuthorization(undefined);\n }\n\n loginDirectly();\n }, []);\n\n //\u53D1\u9001\u9A8C\u8BC1\u7801\n const sendCaptcha = async (data: CaptchaRequest): Promise<boolean> => {\n setAccount('email' in data && data.email ? data.email : (data as PhoneCaptchaRequest).phone);\n const result = await getConnectCaptcha(data).then((result) => {\n console.log(`request captcha success: ${result}`);\n return result;\n });\n return result;\n };\n\n // login directly\n const loginDirectly = () => {\n if (email && loginType === AuthType.email) {\n if (EmailRegExp.test(email)) {\n setLoginWithAccount(true);\n setAccount(email);\n }\n } else if (phone && loginType === AuthType.phone) {\n const e164Phone = isValidE164PhoneNumber(phone);\n if (e164Phone) {\n setLoginWithAccount(true);\n setAccount(e164Phone);\n }\n }\n };\n\n const thirdpartyAuthLogin = (authType: AuthType) => {\n setLoginType(authType);\n socialAuthLogin({\n socialType: authType as SocialAuthType,\n prompt: 'select_account',\n authorization,\n chain,\n });\n };\n\n const loginContent = () => {\n if (showInputCaptcha) {\n return (\n <CaptchaInput\n sendCaptcha={sendCaptcha}\n setShowInputCaptcha={displayInputCaptcha}\n account={account}\n loginWithAccount={loginWithAccount}\n chain={chain}\n />\n );\n } else if (loginType === AuthType.email) {\n return (\n <EmailLogin\n sendCaptcha={sendCaptcha}\n setShowInputCaptcha={displayInputCaptcha}\n setLoginType={changeLoginType}\n account={email || account}\n supportAuthTypes={supportAuthTypes}\n loginWithAccount={!!email || loginWithAccount}\n />\n );\n } else if (loginType === AuthType.phone) {\n return (\n <PhoneLogin\n sendCaptcha={sendCaptcha}\n setShowInputCaptcha={displayInputCaptcha}\n setLoginType={changeLoginType}\n account={phone || account}\n supportAuthTypes={supportAuthTypes}\n loginWithAccount={!!phone || loginWithAccount}\n />\n );\n }\n };\n\n const changeLoginType = (type: AuthType) => {\n setLoginType(type);\n };\n\n const authTypeDisplayed = (type: AuthType): string => {\n if (type === AuthType.jwt) {\n return 'JWT';\n } else {\n return type.titleCase();\n }\n };\n\n const loggingHint = (loginType: AuthType): string => {\n if (loginType === AuthType.jwt || loginType === AuthType.telegram) {\n return t('login.create_wallet');\n } else {\n return t('login.social_login').format(authTypeDisplayed(loginType));\n }\n };\n\n const projectLogo: string = useMemo(() => {\n let img = modalOptions.customStyle?.logo;\n if (!img) {\n img = logoImg;\n }\n return (img || '') as string;\n }, [modalOptions.customStyle?.logo]);\n\n return (\n <div className='login-container-box'>\n <style>{loginStyles as unknown as string}</style>\n <style>{styles as unknown as string}</style>\n <div className='wrap'>\n <div className='login-logo'>\n <Image\n className='product-logo'\n preview={false}\n height={64}\n src={projectLogo}\n key={projectLogo}\n placeholder={\n <div className='placeholder-wrap'>\n <LoadingOutlined style={{ fontSize: 24 }} spin />\n </div>\n }\n fallback={logoImg}\n onError={(e) => {\n e.currentTarget.src = logoImg;\n }}\n />\n </div>\n <div className='login-header0'>{modalOptions.customStyle?.projectName ?? t('common.particle_auth')}</div>\n\n {showInputCaptcha ? (\n <div className='login-des'>{account}</div>\n ) : (\n <div className='login-des'>\n {loginType === AuthType.email || loginType === AuthType.phone ? (\n modalOptions.customStyle?.subtitle ?? t('login.to_continue').format('App')\n ) : (\n <div className='third-party-des'>{loggingHint(loginType)}</div>\n )}\n </div>\n )}\n\n {loginContent()}\n\n {!showInputCaptcha && !loginWithAccount && (loginType === AuthType.email || loginType === AuthType.phone) && (\n <SocialLogin\n supportAuthTypes={supportAuthTypes}\n preferredAuthType={loginType}\n onPreferredAuthTypeChange={setLoginType}\n thirdpartyAuthLogin={thirdpartyAuthLogin}\n />\n )}\n </div>\n <PowerFooter className='footer-box-v2' />\n </div>\n );\n}\n\nexport default Login;\n", "import { ApiError, getCloudflareTurnstileResponse, isApiError, type CaptchaRequest } from '@particle-network/auth-core';\nimport { useInterval } from 'ahooks';\nimport { Button } from 'antd';\nimport throttle from 'lodash/throttle.js';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport SVGIcon from '../../../components/icon/svg-icon';\nimport AuthCode from '../../../components/react-auth-code-input';\nimport { useParticleAuth, useTranslation } from '../../../context';\nimport { useCustomize } from '../../../context/hooks/useCustomize';\nimport useLogin from '../../../context/hooks/useLogin';\nimport useMessage from '../../../context/hooks/useMessage';\nimport styles from './captcha-input.less';\n\nfunction CaptchaInput(props: any) {\n const { sendCaptcha, setShowInputCaptcha, account, loginWithAccount, chain } = props;\n\n const [loading, setLoading] = useState(false);\n\n const { themeType, language } = useCustomize();\n const [codeVal, setCodeVal] = useState<string>('');\n const { loginHandler } = useLogin();\n const [noInput, setNoInput] = useState(false);\n const [wrongInput, setWrongInput] = useState(false);\n const [invalidInput, setInvalidInput] = useState(false);\n const [resendTip, setResendTip] = useState(false);\n const [confirmBtn, setConfirmBtn] = useState(false);\n const { authCoreModal } = useParticleAuth();\n const { t } = useTranslation();\n const message = useMessage();\n const codeInput = useRef<any>(null);\n const codePattern = /^\\d{6}$/;\n const [interval, setInterval] = useState<number | undefined>(1000);\n\n const [countdown, setCountdown] = useState(60);\n\n useInterval(() => {\n if (countdown > 0) {\n const result = countdown - 1;\n setCountdown(result);\n if (result === 0) {\n setInterval(undefined);\n }\n }\n }, interval);\n\n const startCountdown = () => {\n setCountdown(60);\n setInterval(1000);\n };\n\n const getCaptcha = () => {\n if (account.includes('@')) {\n sendCaptchaImpl({ email: account });\n } else {\n getCloudflareTurnstileResponse({\n theme: themeType,\n language,\n getContainer: () => {\n return authCoreModal.rootBody as HTMLElement;\n },\n })\n .then((token) => {\n sendCaptchaImpl({\n phone: account,\n // eslint-disable-next-line camelcase\n cf_turnstile_response: token,\n });\n })\n .catch(() => {\n message.error(t('error.server_20112'));\n });\n }\n };\n\n const sendCaptchaImpl = (param: CaptchaRequest) => {\n sendCaptcha(param)\n .then(() => {\n console.log('send captcha success');\n startCountdown();\n setConfirmBtn(false);\n setResendTip(false);\n })\n .catch(() => {\n setCountdown(0);\n setInterval(undefined);\n });\n };\n\n const codeChange = (value: any) => {\n setWrongInput(false);\n // const code = value.join(\"\");\n const code = value;\n const patt = /^[0-9]+$/g;\n if (code.length === 0) {\n setWrongInput(false);\n setNoInput(true);\n } else {\n if (!patt.test(code)) {\n setNoInput(false);\n setWrongInput(true);\n } else {\n setNoInput(false);\n setWrongInput(false);\n }\n }\n };\n\n const login = (code?: string) => {\n setNoInput(false);\n setWrongInput(false);\n setInvalidInput(false);\n code = code || codeVal;\n console.log(`code --> ${code}`);\n if (noInput || wrongInput) {\n return;\n }\n if (codePattern.test(code)) {\n throttleLoginImpl(code);\n } else {\n if ((code.length > 0 && code.length < 6) || !codePattern.test(code)) {\n setWrongInput(true);\n setNoInput(false);\n }\n if (code.length === 0) {\n setWrongInput(false);\n setNoInput(true);\n }\n }\n };\n\n const loginImpl = async (code: string) => {\n if (resendTip) {\n return;\n }\n setLoading(true);\n let data;\n if (account.includes('@')) {\n data = {\n code: code,\n email: account,\n chain,\n };\n } else {\n data = {\n code: code,\n phone: account,\n chain,\n };\n }\n try {\n await loginHandler(data, false);\n } catch (error) {\n handleLoginError(error);\n }\n };\n\n const handleLoginError = (error: any) => {\n console.log('login error', error);\n setLoading(false);\n if (isApiError(error)) {\n const errorCode = error.error_code;\n if (errorCode === ApiError.InvalidCode) {\n setInvalidInput(true);\n } else if (errorCode === ApiError.ResendCode) {\n setResendTip(true);\n setConfirmBtn(true);\n }\n }\n };\n\n const onCodeInputChange = (codeArray: string) => {\n codeChange(codeArray);\n setCodeVal(codeArray);\n setNoInput(false);\n setWrongInput(false);\n setInvalidInput(false);\n setResendTip(false);\n if (codePattern.test(codeArray)) {\n throttleLoginImpl(codeArray);\n }\n };\n\n const throttleLoginImpl = useCallback(\n throttle(\n (code) => {\n loginImpl(code);\n },\n 1000,\n {\n leading: true,\n trailing: false,\n }\n ),\n []\n );\n\n const handleCodeInputFocus = () => {\n const elements = document.getElementsByClassName('input-code-item');\n //@ts-ignore\n elements[Math.min(codeVal.length, 5)]?.focus();\n };\n\n const verifyCodeErrorMessage = useMemo(() => {\n const error = [\n noInput ? t('login.enter_captcha') : '',\n wrongInput ? t('login.captcha_input_error') : '',\n invalidInput ? t('login.invalid_code') : '',\n resendTip ? t('login.please_send_again') : '',\n ]\n .map((val) => val.trim())\n .filter((val) => !!val)\n .join(',');\n\n return error.includes(',') ? error + '.' : error;\n }, [noInput, wrongInput, invalidInput, resendTip, t]);\n\n useEffect(() => {\n const elements = document.getElementsByClassName('react-input-code');\n const contextmenuEvent = (e: any) => e.preventDefault();\n elements[0]?.addEventListener('contextmenu', contextmenuEvent);\n return () => {\n elements[0]?.removeEventListener('contextmenu', contextmenuEvent);\n };\n }, []);\n\n return (\n <div className='captcha-box'>\n <style>{styles as unknown as string}</style>\n <div className='captcha-form'>\n <div className='input-code-content'>\n <div onClick={handleCodeInputFocus}>\n <AuthCode\n containerClassName='react-input-code'\n inputClassName='input-code-item'\n allowedCharacters='numeric'\n length={6}\n ref={codeInput}\n placeholder={' '}\n onChange={onCodeInputChange}\n />\n </div>\n </div>\n </div>\n <div className='error-tip'>{verifyCodeErrorMessage}</div>\n\n <div className='btn-box'>\n <Button\n type='primary'\n htmlType='submit'\n className='primary-antd-btn submit-btn'\n onClick={() => login()}\n disabled={confirmBtn}\n loading={loading}\n >\n {t('common.confirm')}\n </Button>\n\n <Button className='get-btn' disabled={countdown > 0} type='link' onClick={getCaptcha}>\n {t('login.send_again')} {countdown > 0 ? `(${countdown}s)` : ''}\n </Button>\n\n {!loginWithAccount && (\n <div\n className='back-box'\n onClick={() => {\n setShowInputCaptcha(false);\n }}\n >\n <SVGIcon className='arrow1-icon' name='arrow1_icon' />\n <span>{t('login.back')}</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default CaptchaInput;\n", "import { Button, Form, Input } from 'antd';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from '../../../context';\nimport { EmailRegExp } from '../../../utils';\nimport styles from './login.less';\n\nfunction EmailLogin(props: any) {\n const { t } = useTranslation();\n\n const { sendCaptcha, setShowInputCaptcha, account, supportAuthTypes, loginWithAccount } = props;\n\n const [form] = Form.useForm();\n const [errorTip, setErrorTip] = useState(false);\n const [noInputTip, setNoInputTip] = useState(false);\n\n const [loading, setLoading] = useState(false);\n const emailBoxRef = useRef<any>(null);\n const emailInput = useRef<any>(null);\n\n useEffect(() => {\n if (loginWithAccount && account && sendCaptcha) {\n form.setFieldsValue({\n email: account,\n });\n getCaptcha(account);\n }\n }, []);\n\n const getCaptcha = (email: string) => {\n emailInput.current.focus();\n if (!email) {\n setNoInputTip(true);\n setErrorTip(false);\n } else if (!EmailRegExp.test(email)) {\n setErrorTip(true);\n } else {\n sendCaptchaImpl(email);\n }\n };\n\n const sendCaptchaImpl = (email: string) => {\n setLoading(true);\n sendCaptcha({\n email: email,\n })\n .then((result: boolean) => {\n setShowInputCaptcha(result);\n })\n .catch(() => {\n setLoading(false);\n });\n };\n\n return (\n <>\n <style>{styles as unknown as string}</style>\n <div className='login-style'>\n <Form\n name='login-form'\n onFinish={(values) => getCaptcha(values.email.trim())}\n className='form-box'\n requiredMark={false}\n form={form}\n labelCol={{\n style: { textAlign: 'left' },\n }}\n >\n <div className='email-box' ref={emailBoxRef}>\n <Form.Item name='email' label='' className='form-item' initialValue={account?.includes('@') ? account : ''}>\n <Input\n className='email-input'\n placeholder={t('login.email_address') || undefined}\n ref={emailInput}\n onChange={() => {\n setErrorTip(false);\n setNoInputTip(false);\n }}\n readOnly={loginWithAccount}\n onFocus={() => {\n emailBoxRef.current.setAttribute('data-focus', 'true');\n }}\n onBlur={() => {\n emailBoxRef.current.removeAttribute('data-focus');\n }}\n />\n </Form.Item>\n </div>\n\n <div className='error-tip'>{errorTip && t('login.email_format_error')}</div>\n <div className='error-tip'>{noInputTip && t('login.input_email_holder')}</div>\n\n <Form.Item className='form-item'>\n <Button type='primary' htmlType='submit' className='primary-antd-btn submit-btn' loading={loading}>\n {t('login.get_captcha')}\n </Button>\n </Form.Item>\n\n {!loginWithAccount && supportAuthTypes.length > 0 && (\n <div className='login-or'>\n <div className='or-line'></div>\n {t('login.or')}\n <div className='or-line'></div>\n </div>\n )}\n </Form>\n </div>\n </>\n );\n}\n\nexport default EmailLogin;\n", "import { DownOutlined } from '@ant-design/icons';\nimport { getCloudflareTurnstileResponse } from '@particle-network/auth-core';\nimport { Button, Form, Input } from 'antd';\nimport getUnicodeFlagIcon from 'country-flag-icons/unicode';\nimport type { CountryCode } from 'libphonenumber-js/max';\nimport { isValidPhoneNumber, parsePhoneNumber, parsePhoneNumberWithError } from 'libphonenumber-js/max';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { defaultCountriesData } from '../../../api/model/all-countries';\nimport { useAuthCoreModal, useTranslation } from '../../../context';\nimport { useCustomize } from '../../../context/hooks/useCustomize';\nimport useMessage from '../../../context/hooks/useMessage';\nimport { isPhoneValid } from '../../../utils';\nimport styles from './login.less';\n\nfunction PhoneLogin(props: any) {\n const { t } = useTranslation();\n\n const { sendCaptcha, setShowInputCaptcha, account, supportAuthTypes, loginWithAccount } = props;\n\n const [selectVisible, setSelectVisible] = useState(false);\n\n const { themeType, language } = useCustomize();\n\n const [countryData, setCountryData] = useState(['United States', 'us', '1']);\n\n const [form] = Form.useForm();\n\n const clickRef = useRef<any>();\n const { authCoreModal } = useAuthCoreModal();\n const [errorTip, setErrorTip] = useState(false);\n const [noInputTip, setNoInputTip] = useState(false);\n\n const [loading, setLoading] = useState(false);\n const message = useMessage();\n const phoneInput = useRef<any>(null);\n\n const [phoneValue, setPhoneValue] = useState<string>();\n\n useEffect(() => {\n if (selectVisible) {\n document.addEventListener('click', clickCallback, true);\n return () => {\n document.removeEventListener('click', clickCallback, true);\n };\n }\n }, [selectVisible]);\n\n useEffect(() => {\n let currentCountry;\n if (account && !account.includes('@')) {\n if (isValidPhoneNumber(account)) {\n const phoneNumber = parsePhoneNumber(account);\n const countryCode = phoneNumber.countryCallingCode.toString();\n const regionCode = phoneNumber.country;\n form.setFieldsValue({\n phone: phoneNumber.nationalNumber,\n });\n if (countryCode && regionCode) {\n const items = defaultCountriesData.filter(\n (item) => item[2].toString() === countryCode && item[1].toLowerCase() === regionCode.toLowerCase()\n );\n if (items && items.length > 0) {\n currentCountry = items[items.length - 1];\n }\n }\n }\n }\n if (!currentCountry) {\n const language = navigator.languages && navigator.languages.length ? navigator.languages[0] : navigator.language;\n const locales = language.split('-');\n const region = locales.length > 1 ? locales[1] : locales[0];\n if (region && region.length > 0) {\n currentCountry = defaultCountriesData.find((item) => item[1].toUpperCase() === region);\n }\n }\n if (currentCountry) {\n setCountryData(currentCountry);\n }\n\n if (loginWithAccount && account && sendCaptcha && isValidPhoneNumber(account)) {\n getCaptcha(account, currentCountry ? currentCountry[1].toUpperCase() : undefined);\n }\n }, []);\n\n const clickCallback = (event: any) => {\n setTimeout(() => {\n if (clickRef.current?.contains(event.target)) {\n return;\n }\n setSelectVisible(false);\n });\n };\n\n // \u9A8C\u8BC1 form\n const validateForm = (phoneValue: string, regionCode: string, isValidateEmpty = true) => {\n if (!phoneValue && isValidateEmpty) {\n setNoInputTip(true);\n return;\n }\n\n if (phoneValue?.length === 1) {\n setErrorTip(true);\n return;\n }\n\n if (!isPhoneValid(phoneValue, regionCode)) {\n setErrorTip(true);\n return false;\n } else {\n setErrorTip(false);\n return true;\n }\n };\n\n const getCaptcha = (phone: string, regionCode?: string) => {\n phoneInput.current.focus();\n if (!phone) {\n setNoInputTip(true);\n return;\n }\n if (phone.length === 1) {\n setErrorTip(true);\n return;\n }\n\n if (!regionCode) {\n regionCode = countryData[1].toUpperCase();\n }\n if (isPhoneValid(phone, regionCode)) {\n const countryCode = regionCode.toUpperCase() as CountryCode;\n const phoneE164 = parsePhoneNumber(phone, countryCode).format('E.164');\n console.log('login phone: ' + phoneE164);\n setPhoneValue(phoneE164);\n setLoading(true);\n getCloudflareTurnstileResponse({\n theme: themeType,\n language,\n getContainer: () => {\n return authCoreModal.rootBody as HTMLElement;\n },\n })\n .then((token) => {\n sendCaptchaImpl(token, phoneE164);\n })\n .catch(() => {\n setLoading(false);\n message.error(t('error.server_20112'));\n });\n } else {\n setErrorTip(true);\n }\n };\n\n const sendCaptchaImpl = (token: string, phoneValue: string) => {\n setLoading(true);\n sendCaptcha({\n phone: phoneValue,\n // eslint-disable-next-line camelcase\n cf_turnstile_response: token,\n })\n .then((result: boolean) => {\n setShowInputCaptcha(result);\n })\n .catch(() => {\n setLoading(false);\n });\n };\n\n const initialAccountValue = () => {\n try {\n if (account?.includes('@')) {\n return '';\n } else if (account?.length > 0) {\n const phoneNumber = parsePhoneNumberWithError(account);\n return phoneNumber.nationalNumber;\n }\n } catch (error) {\n console.log('initialAccountValue', error);\n }\n return '';\n };\n\n return (\n <>\n <style>{styles as unknown as string}</style>\n <div className='login-style'>\n {selectVisible && (\n <div className='select-country' ref={clickRef}>\n {defaultCountriesData.map((item, index) => {\n return (\n <div\n key={index}\n className='country-item'\n onClick={() => {\n setCountryData(item);\n setSelectVisible(false);\n\n setTimeout(() => {\n const phoneValue = form.getFieldsValue().phone;\n if (phoneValue) {\n validateForm(phoneValue, item[1].toUpperCase(), false);\n }\n });\n }}\n >\n <div className='country-box'>\n <div className='country-flag'>{getUnicodeFlagIcon(`${item[1]}`)}</div>\n <span className='country-name'>{item[0]}</span>\n </div>\n <div className='country-code'>{'+' + item[2]}</div>\n </div>\n );\n })}\n </div>\n )}\n <Form\n name='login-form'\n onFinish={(values) => getCaptcha(values.phone, undefined)}\n className='form-box'\n requiredMark={false}\n form={form}\n labelCol={{\n style: { textAlign: 'left' },\n }}\n >\n <div className='phone-box'>\n <div\n className='phone-select'\n defaultValue={`+${countryData[2]}`}\n onClick={() => {\n if (!loading) {\n setSelectVisible(true);\n }\n }}\n >\n {getUnicodeFlagIcon(`${countryData[1]}`)}\n <DownOutlined className='down-more' />\n </div>\n <div className='country-code'>+{countryData[2]}</div>\n <Form.Item\n name='phone'\n // label={t(\"login.enter_phone\")}\n label=''\n className='form-item'\n getValueFromEvent={(event) => {\n return event.target.value.replace(/\\D+/g, '');\n }}\n initialValue={initialAccountValue()}\n >\n <Input\n type='text'\n className='phone-input'\n placeholder={t('login.mobile_number') || undefined}\n ref={phoneInput}\n onChange={() => {\n setErrorTip(false);\n setNoInputTip(false);\n }}\n readOnly={loginWithAccount}\n onFocus={() => {\n document.querySelector('.phone-box')?.setAttribute('data-focus', 'true');\n }}\n onBlur={() => {\n document.querySelector('.phone-box')?.removeAttribute('data-focus');\n }}\n />\n </Form.Item>\n </div>\n\n <div className='error-tip'>{errorTip && t('login.phone_format_error')}</div>\n <div className='error-tip'>{noInputTip && t('login.input_phone_holder')}</div>\n\n <Form.Item className='form-item'>\n <Button type='primary' htmlType='submit' className='primary-antd-btn submit-btn' loading={loading}>\n {t('login.get_captcha')}\n </Button>\n </Form.Item>\n </Form>\n {!loginWithAccount && supportAuthTypes.length > 0 && (\n <div className='login-or'>\n <div className='or-line'></div>\n {t('login.or')}\n <div className='or-line'></div>\n </div>\n )}\n </div>\n </>\n );\n}\n\nexport default PhoneLogin;\n", "import { AuthType } from '@particle-network/auth-core';\nimport React, { useMemo, useState } from 'react';\nimport apple from '../../../common/images/apple_icon.png';\nimport discord from '../../../common/images/discord_icon.png';\nimport email from '../../../common/images/email_icon.png';\nimport facebook from '../../../common/images/facebook_icon.png';\nimport github from '../../../common/images/github_icon.png';\nimport google from '../../../common/images/google_icon.png';\nimport jwt from '../../../common/images/jwt_icon.png';\nimport linkedin from '../../../common/images/linkedin_icon.png';\nimport microsoft from '../../../common/images/microsoft_icon.png';\nimport passkeys from '../../../common/images/passkeys_icon.png';\nimport phone from '../../../common/images/phone_icon.png';\nimport telegram from '../../../common/images/telegram_icon.png';\nimport twitch from '../../../common/images/twitch_icon.png';\nimport twitter from '../../../common/images/twitter_icon.png';\nimport SVGIcon from '../../../components/icon/svg-icon';\n\ninterface Props {\n supportAuthTypes: AuthType[];\n preferredAuthType?: AuthType;\n onPreferredAuthTypeChange?: (authType: AuthType) => void;\n thirdpartyAuthLogin: (authType: AuthType) => void;\n}\nconst SocialLogin = (props: Props) => {\n const { supportAuthTypes, preferredAuthType, onPreferredAuthTypeChange, thirdpartyAuthLogin } = props;\n\n const [collapse, setCollapse] = useState(true);\n\n const authLogin = (authType: AuthType) => {\n thirdpartyAuthLogin(authType);\n };\n\n const toggleEmailOrPhone = (authType: AuthType) => {\n onPreferredAuthTypeChange?.(authType);\n };\n\n const imgs = {\n email,\n phone,\n facebook,\n google,\n apple,\n twitter,\n discord,\n github,\n twitch,\n microsoft,\n linkedin,\n jwt,\n telegram,\n passkeys,\n };\n\n const items = useMemo(() => {\n const authTypes = supportAuthTypes as AuthType[];\n const hasEmailAndPhone = authTypes.includes(AuthType.email) && authTypes.includes(AuthType.phone);\n const items: React.ReactNode[] = [];\n if (hasEmailAndPhone) {\n if (preferredAuthType === AuthType.phone) {\n items.push(<img key='email-login' src={email} alt='' onClick={() => toggleEmailOrPhone(AuthType.email)} />);\n } else {\n items.push(<img key='phone-login' src={phone} alt='' onClick={() => toggleEmailOrPhone(AuthType.phone)} />);\n }\n }\n const displayAuthTypes = authTypes.filter((authType) => authType !== AuthType.email && authType !== AuthType.phone);\n\n items.push(\n ...displayAuthTypes.map((authType) => (\n <img key={`${authType}-login`} src={imgs[authType]} alt='' onClick={() => authLogin(authType as AuthType)} />\n ))\n );\n\n const collapseIcon = (\n <div\n key='collapse-login'\n className='collapse-login-icon'\n onClick={() => setCollapse(!collapse)}\n data-is-collapse={collapse}\n >\n <SVGIcon className='collapse-icon' name='collapse_icon' />\n </div>\n );\n\n if (items.length > 5) {\n items.splice(4, 0, collapseIcon);\n }\n\n if (collapse) {\n items.splice(5, items.length - 5);\n }\n\n return items;\n }, [collapse, preferredAuthType, supportAuthTypes]);\n\n return (\n <div className='change-login-mode' data-collapse={!!collapse}>\n <div className='change-social'>{items}</div>\n </div>\n );\n};\n\nexport default SocialLogin;\n"],
"mappings": "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