@authing/react-ui-components 3.1.4-rc.7 → 3.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["components/_utils/appendConfig.ts","reportWebVitals.ts","components/version/version.tsx","components/version/index.tsx","components/Guard/core/useAppendConfig.tsx","components/_utils/locales/index.ts","components/_utils/http.ts","components/context/base.tsx","components/context/global/context.tsx","components/context/global/reducer.tsx","components/_utils/popupCenter.ts","components/_utils/index.ts","components/Guard/module.ts","components/Guard/authClient.ts","components/AuthingGuard/types/GuardConfig.ts","components/Guard/event.ts","components/Type/index.ts","components/Login/interface.ts","components/Register/interface.ts","components/ShieldSpin/loading.svg","components/Guard/GuardModule/stateMachine.ts","components/ShieldSpin/index.tsx","components/Guard/config.tsx","components/_utils/logger/interface.ts","components/Guard/sso.ts","components/_utils/corsVerification.ts","components/_utils/logger/index.ts","components/_utils/config/index.ts","components/_utils/context.tsx","components/_utils/GuardErrorCode.ts","components/_utils/guardPageConfig.ts","components/IconFont/useGuardIconfont.ts","components/IconFont/iconfont.js","components/Guard/core/renderContext.tsx","components/AuthingGuard/constants.ts","components/IconFont/index.tsx","components/context/module/context.tsx","components/BindTotp/businessRequest.ts","components/_utils/hooks/index.ts","components/SubmitButton/index.tsx","components/MFA/interface.ts","components/BindTotp/index.tsx","components/BindTotp/core/bindSuccess.tsx","components/ImagePro/index.tsx","components/MFA/VerifyCodeInput/VerifyCodeFormItem.tsx","components/MFA/VerifyCodeInput/index.tsx","components/BindTotp/core/securityCode.tsx","components/ValidatorRules/ValidatorFormItem.tsx","components/ValidatorRules/useCheckRepeat.ts","components/ValidatorRules/index.ts","components/ValidatorRules/PasswordFormItem.tsx","components/AuthingGuard/IconFont/iconfont.js","components/AuthingGuard/IconFont/svg.js","components/ChangePassword/businessRequest.ts","components/AuthingGuard/IconFont/index.tsx","components/InputPassword/index.tsx","components/CompleteInfo/interface.ts","components/ChangePassword/core/firstLoginReset.tsx","components/ChangePassword/core/rotateReset.tsx","components/ChangePassword/index.tsx","components/AuthingGuard/Forms/UploadImage/index.tsx","components/CompleteInfo/businessRequest.ts","components/InputNumber/index.tsx","components/SendCode/SendCodeBtn.tsx","components/SendCode/index.tsx","components/SendCode/SendCodeByEmail.tsx","components/SendCode/SendCodeByPhone.tsx","components/_utils/countryList.ts","components/Login/core/withVerifyCode/VirtualDropdown.tsx","components/Login/core/withVerifyCode/InputInternationPhone.tsx","components/CompleteInfo/core/completeInfo.tsx","components/DownloadAuthenticator/index.tsx","components/CompleteInfo/utils.tsx","components/CompleteInfo/index.tsx","components/ForgetPassword/core/resetPassword.tsx","components/Error/index.tsx","components/Login/core/withVerifyCode/FormItemIdentify.tsx","components/Login/core/withVerifyCode/inputIdentify.tsx","components/AuthingGuard/hooks/useScreenSize.tsx","components/ForgetPassword/index.tsx","components/Login/core/withPassword/FormItemAccount.tsx","components/Login/core/withPassword/InputAccount.tsx","components/Login/core/withPassword/GraphicVerifyCode.tsx","components/Register/components/Agreements/index.tsx","components/Login/core/withPassword/index.tsx","components/Login/core/withLDAP.tsx","components/Login/core/withAD.tsx","components/Login/core/withAppQrcode.tsx","components/Login/core/withWechatMiniQrcode.tsx","components/Login/core/withWechatmpQrcode.tsx","components/Login/codemap.ts","components/MFA/businessRequest.ts","components/Login/socialLogin/IdpButton/index.tsx","components/Login/socialLogin/index.tsx","components/Login/socialLogin/postMessage.ts","components/ChangeLanguage/index.tsx","components/Login/core/withVerifyCode/index.tsx","components/Login/index.tsx","components/_utils/facePlugin/index.ts","components/_utils/errorFace.ts","components/MFA/core/email.tsx","components/MFA/core/sms.tsx","components/MFA/core/face_deps.tsx","components/RecoveryCode/businessRequest.ts","components/MFA/core/face.tsx","components/MFA/core/totp.tsx","components/MFA/mfaMethods/index.tsx","components/MFA/codemap.ts","components/MFA/index.tsx","components/NeedHelpView/core/describeQuestions.tsx","components/NeedHelpView/index.tsx","components/RecoveryCode/core/saveCode.tsx","components/IdentityBinding/businessRequest.ts","components/RecoveryCode/core/useCode.tsx","components/RecoveryCode/index.tsx","components/Register/utils.ts","components/Register/core/WithEmail.tsx","components/Register/core/WithPhone.tsx","components/Register/index.tsx","components/SubmitSuccess/index.tsx","components/Guard/core/renderModule.tsx","components/IdentityBinding/IdentityBinding.tsx","components/IdentityBindingAsk/IdentityBindingAsk.tsx","components/_utils/responseManagement/interface.ts","components/Guard/core/usePlugin.ts","components/Guard/core/index.tsx","components/Guard/Guard.tsx","components/_utils/guardHttp.ts","components/_utils/responseManagement/index.ts","components/AuthingGuard/MfaLayout/Steps.ts","components/_utils/config.ts","components/AuthingGuard/api/appConfig.ts","components/AuthingGuard/LoginLayout/index.tsx","components/AuthingGuard/api/userPoolConfig.ts","components/AuthingGuard/index.tsx","examples.tsx"],"names":["appendConfigMapping","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","version","getAppendConfig","getGuardWindow","window","appendConfig","useInitGuardAppendConfig","guardProps","appId","console","log","initAppendConfig","publicConfig","setPublicConfig","pageConfig","setPageConfig","langChangeFN","changeLang","lang","i18n","changeLanguage","initI18n","localesConfig","initLang","guardWindow","navigator","language","split","Boolean","use","LanguageDetector","initReactI18next","init","detection","order","resources","translation","enUsTrans","zhCnTrans","fallbackLng","debug","interpolation","escapeValue","onChange","requestClient","a","fetch","res","json","get","path","query","headers","langHeader","tenantId","tenantHeader","baseUrl","qs","stringify","addQueryPrefix","credentials","post","data","config","method","body","JSON","postForm","formData","status","error","t","setBaseUrl","base","replace","DEFAULT_LANG_HEADER","setLangHeader","key","setTenantHeader","setTenantId","createBaseContext","ctx","React","createContext","undefined","ctxConst","useContext","Error","state","payloads","value","useBaseContext","useGuardContext","popupCenter","url","w","h","dualScreenLeft","screenLeft","screenX","dualScreenTop","screenTop","screenY","width","innerWidth","document","documentElement","clientWidth","screen","height","innerHeight","clientHeight","systemZoom","availWidth","left","top","newWindow","open","focus","VALIDATE_PATTERN","email","phone","ip","host","username","validate","type","val","test","fieldRequiredRule","fieldRequiredRuleMessage","required","validateTrigger","message","name","whitespace","getDeviceName","userAgent","platform","os","indexOf","insertedRecord","appConfig","userConfig","insertStyles","styles","recordKey","styleElt","styleSheet","createStyleSheet","head","getElementsByTagName","createElement","appendChild","styleSheets","length","innerHTML","cssText","i","selector","insertRule","rule","addRule","getClassnames","classnames","filter","join","PasswordStrength","getUserRegisterParams","parse","location","search","ignoreQueryPrefix","Object","keys","map","isWeChatBrowser","isLarkBrowser","isSpecialBrowser","GuardModuleType","PASSWORD_STRENGTH_TEXT_MAP","NoCheck","placeholder","validateMessage","Low","Middle","High","AUTO","SYMBOL_TYPE_PATTERNS","getSymbolTypeLength","pwd","pattern","item","getPasswordValidate","strength","customPasswordStrength","validator","_","Promise","reject","resolve","validateMap","r","v","regex","authClient","GuardMode","LoginMethods","RegisterMethods","GuardScenes","ResetPwdMethods","SocialConnections","Protocol","getGuardAuthClient","useGuardAuthClient","eventsMapping","onLogin","success","props","onRegister","guardEventsHijacking","events","openEventsMapping","newEvents","forEach","eventsKey","InputMethod","GuardPageSene","defaultG2Config","langRange","escCloseable","clickCloseable","mode","Normal","getDefaultG2Config","LanguageMap","en","ja","defaultConfig","getDefaultRegisterConfig","_extends","assign","target","arguments","source","prototype","hasOwnProperty","call","apply","this","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","id","transform","fillRule","strokeWidth","d","SvgLoading","_ref","svgRef","title","titleId","viewBox","xmlns","xmlnsXlink","ref","ActionType","ForwardRef","ShieldSpin","size","style","Spin","className","isSSO","defaultInitData","showLoading","loadingComponent","LoggerType","GuardStateMachine","changeModuleEvent","initData","moduleStateHistory","stateMachineLog","globalWindow","next","nextModule","moduleData","moduleName","prevModuleData","slice","isEqual","back","historyPush","backModule","splice","end","actionType","ChangeModule","unshift","action","date","Date","getTime","dataSource","historyBack","Back","setConfig","Init","trackSession","getGuardHttp","isOriginMatched","whitelist","corsWhitelist","origin","wildcard","require","includes","some","allowedOrigin","corsVerification","allowedOrigins","allowed","Logger","INFO","WARN","ERROR","printType","publicConfigMap","getPublicConfig","requestPublicConfig","httpClient","code","assembledRequestHost","__internalRequest__","requestHostname","configHost","identifier","hostUrl","URL","splitHost","hostname","shift","port","protocol","utilAssembledRequestHost","useMergePublicConfig","serError","useState","initPublicConfig","useCallback","useEffect","logo","loginMethods","loginTabs","list","passwordLoginMethods","passwordTabConfig","enabledLoginMethods","defaultLoginMethod","default","disableResetPwd","ssoPageComponentDisplay","forgetPasswordBtn","autoRegister","autoRegisterThenLoginHintInfo","registerMethods","registerTabs","defaultRegisterMethod","disableRegister","registerBtn","publicKey","agreementEnabled","agreements","contentCss","css","mergedPublicConfig","DefaultGuardX","finallyConfig","defaultMergedConfig","currentModule","isAuthFlow","contextLoaded","guardPageConfig","GuardXContext","useGuardPublicConfig","useGuardHttpClient","useGuardAppId","useGuardInitData","ErrorCode","useGuardEvents","useGuardModule","guardX","changeModule","useGuardFinallyConfig","useGuardIsAuthFlow","pageConfigMap","getPageConfig","requestGuardPageConfig","useGuardIconfont","svgString","setSvgString","loaded","setLoaded","loadSvgString","cdnBase","text","c","l","e","o","m","getAttribute","__iconfont__svg__cssinject__","write","n","setAttribute","position","overflow","firstChild","parentNode","insertBefore","addEventListener","readyState","setTimeout","removeEventListener","attachEvent","doScroll","onreadystatechange","RenderContext","initState","children","setEvents","authClint","setAuthClint","setHttpClient","setError","setIsAuthFlow","guardStateMachine","setGuardStateMachine","Provider","Consumer","createGuardXContext","onPopstate","history","pushState","href","useHistoryHijack","historyNext","useReducer","payload","moduleState","onChangeModule","mergedConfig","setMergedConfig","useMergeDefaultConfig","initGuardHttp","setAppId","useGuardPageConfig","iconfontLoaded","sessionData","typedData","userInfo","websocketHost","AuthenticationClient","appHost","requestFrom","onError","msg","initGuardAuthClient","websocket","eventsNameWhiteList","startsWith","eventName","guardEventsFilter","__unAuthFlow__","moduleEvents","useMemo","__singleComponent__","__changeModule","onBeforeChangeModule","onLoad","contextValues","renderContext","renderLoadingContext","renderErrorContext","ApplicationMfaType","IconFont","xlinkHref","LOGIN_METHODS_MAP","Password","PhoneCode","AppQr","WxMinQr","LDAP","AD","WechatMpQrcode","HIDE_SOCIALS","HIDE_SOCIALS_SHOWIN_ENTERPRISE","Login","Email","Phone","BindTotpBusinessAction","useMediaSize","isPhoneMedia","useMediaQuery","maxWidth","defaultAreaCode","parsePhone","isInternationSms","fieldValue","areaCode","countryCode","phoneNumber","country","isValid","SubmitButton","spin","setSpin","shaking","setShaking","inputs","getElementsByClassName","saftyCode","bindTotpSecretSave","MountShaking","Array","from","input","classList","add","agreement","UnMountShaking","remove","useShaking","timeOut","clearTimeout","useImperativeHandle","onSpin","sp","propsCls","htmlType","loading","onClick","forwardRef","MFAType","BindTotpType","authFlow","content","Paragraph","BindSuccess","secret","onBind","submitButtonRef","useRef","useForm","form","useTranslation","bindSuccess","current","validateFields","ConfirmTotpRecoveryCode","isFlowEnd","onGuardHandling","copyable","onFinish","onFinishFailed","Item","rules","valuePropName","ImagePro","borderRadius","noSpin","alt","imgProps","draggable","VerifyCodeFormItem","codeLength","ruleKeyword","formItemProps","validateFirst","min","VerifyCodeInput","gutter","onEenter","showDivider","onChangeProps","rest","inputRef","codeInputRef","verifyCode","setVerifyCode","focusIndex","setFocusIndex","codes","handleChange","index","num","parseInt","isNaN","String","el","pasteEvent","preventDefault","stopPropagation","paste","clipboardData","getData","_i","fill","minWidth","minHeight","lineHeight","marginLeft","autoFocus","onKeyDown","evt","currentVal","handleKeyDown","maxLength","persist","nativeEvent","isComposing","Math","floor","SecurityCode","mfaToken","qrcode","onNext","useGuardHttp","useAsyncFn","getFieldValue","VerifyTotpFirstTime","totp","statusCode","authenticator_type","authorization","bindTotp","textAlign","color","cursor","DOWNLOAD_AT","src","onSubmitCapture","GuardBindTotpView","setSecret","setQrcode","user","setUser","SECURITY_CODE","bindTotpType","setBindTotpType","LOGIN_INVALID","LOGIN","recovery_code","qrcode_data_url","bindInfo","fetchBindInfo","renderContent","BIND_SUCCESS","display","MFA","TOTP","fontSize","resUser","ValidatorFormItem","checkRepeat","checkInternationalSms","internationalSmsConfig","enabled","methodContent","field","checkErrorMessage","formatErrorMessage","checkRepeatFn","checkFn","timer","setTimer","timeout","useCheckRepeat","userPoolId","formatRules","push","CustomFormItem","FormItem","fromItemProos","passwordStrength","UserName","ChangePasswordBusinessAction","InputPassword","iconRender","visible","alignItems","FormValidateRule","CompleteInfoBaseControls","CompleteInfoExtendsControls","OmitCompleteInfo","FirstLoginReset","onReset","client","encrypt","options","encryptFunction","values","newPassword","password","apiCode","ApiCode","ABORT_FLOW","resetPasswordByFirstLoginToken","token","autoComplete","prefix","RotateReset","oldPassword","ResetPassword","resetPasswordByForceResetToken","GuardChangePassword","explain","typeContent","GuardFirstLoginPasswordResetView","coreForm","GuardForcedPasswordResetView","number","forcedCycle","UploadImage","uploading","setUploading","apiHost","uploadButton","PlusOutlined","marginTop","accept","listType","showUploadList","info","file","response","errMsg","spinning","CompleteInfoAuthFlowAction","InputNumber","propsValue","inputProps","setValue","valueChange","SendCodeBtn","sendDesc","beforeSend","btnRef","setSent","buttonProps","effect","countDown","setCountDown","timerRef","clearInterval","send","setInterval","prev","useSentCounter","setLoading","disabled","time","SendCode","autoSubmit","justify","align","span","submit","offset","SendCodeByEmail","scene","onSendCodeBefore","fieldName","remainProps","sendEmail","b","catch","SendCodeByPhone","sendPhone","sendSmsCode","isoInfo","iso","regions","regions_en","phoneCountryCode","VirtualDropdown","label","showSearch","dropdownClassName","bordered","listHeight","optionLabelProp","dropdownMatchSelectWidth","filterOption","option","toLowerCase","suffixIcon","InputInternationPhone","onAreaCodeChange","formValue","CompleteInfo","metaData","businessRequest","verifyCodeLength","countryList","setCountryList","setAreaCode","loadInitCountryList","countryMap","zh","entries","PhoneAccount","baseControlMap","gender","image","datetime","select","dropdown","boolean","string","internalControlMap","SceneType","SCENE_TYPE_COMPLETE_PHONE","EmailScene","VerifyCode","generateRules","formRules","validateRules","errorMessage","RegExp","replaceAll","inputElement","userFormItem","marginBottom","formFieldsV2","fieldValues","baseData","phoneCode","emailCode","layout","DownloadType","registerMethod","fnName","profile","registerByEmail","phoneToken","registerByPhoneCode","emailToken","registerRequest","registerFnName","registerContent","registerProfile","Skip","Complete","fieldValuesToRegisterProfile","extendsFields","udf","fieldType","find","GuardCompleteInfo","skipComplateFileds","setDisabled","onSkip","GuardLoginCompleteInfoView","skip","resData","GuardRegisterCompleteInfoView","selectOptions","setSelectOptions","setMetaData","businessRequestName","loadSelectOptions","inputType","extendsFieldsToMetaData","InputMethodMap","GuardDownloadATView","downloadConfig","IOS","google","microsoft","Android","renderTab","TabPane","tab","defaultActiveKey","GuardErrorView","messages","justifyContent","dangerouslySetInnerHTML","__html","FormItemIdentify","methods","currentMethod","renderTemplate","InputIdentify","verifyCodeMethodsText","sort","renderInput","ScreenSize","identify","setIdentify","codeMethod","setCodeMethod","context","resetPasswordByEmailCode","resetPasswordByPhoneCode","onSend","onSendError","SCENE_TYPE_RESET","GuardForgetPassword","onPwdResetError","onPwdReset","SUBMIT_SUCCESS","onPwdPhoneSend","onPwdEmailSend","onPwdPhoneSendError","onPwdEmailSendError","FormItemAccount","formItemPtops","runderTemplate","InputAccount","loginMethodsText","runderInput","GraphicVerifyCode","verifyCodeUrl","changeCode","Agreements","showError","acceptList","setAcceptList","isAccept","every","nodeName","checked","LoginWithPassword","onLoginFailed","onLoginSuccess","acceptedAgreements","setAcceptedAgreements","validated","setValidated","showCaptcha","setShowCaptcha","setVerifyCodeUrl","remainCount","setRemainCount","accountLock","setAccountLock","getCaptchaUrl","pathname","loginRequest","loginInfo","onLoginRequest","loginData","account","identity","trim","captchaCode","customData","withCustomData","onBeforeLogin","onLoginRes","INPUT_CAPTCHACODE","PASSWORD_ERROR","ACCOUNT_LOCK","MULTIPLE_ERROR_LOCK","CodeAction","RENDER_MESSAGE","loginWay","submitText","submitButText","LoginWithLDAP","captchaUrl","addonAfter","LoginWithAD","responseIntercept","firstLevelDomain","api","fetchRes","userPasswordInput","LoginWithAppQrcode","appQrcodeClient","canLoop","startScanning","autoExchangeUserInfo","qrCodeScanOptions","onCodeShow","onStart","onSuccess","ms","onCodeLoadFailed","mes","onRetry","onAuthFlow","scannedResult","LoginWithWechatMiniQrcode","wxqrcode","domId","extIdpConnId","LoginWithWechatmpQrcode","wechatmpqrcode","codeMap","APP_MFA_CODE","module","OTP_MFA_CODE","totpMfaEnabled","IDENTITY_BINDING","IDENTITY_BINDING_ASK","LOGIN_COMPLETE_INFO","inRange","start","MfaBusinessAction","SCREEN_SIZE_RANG","Mobile","range","Desktop","Infinity","getScreenSize","viewportWidth","useScreenSize","screenSize","setScreenSize","onResize","fn","delay","immediate","args","debounce","IdpButton","provider","iconType","social","authorize","guardVersion","block","icon","marginRight","displayName","OIDC","configItem","shortid","generate","client_id","clientId","redirect_uri","redirectUri","scope","scopes","response_type","responseType","nonce","authorizationEdpoint","referer","connection","providerIentifier","SAML","samlRequest","CAS","casConnectionLoginUrl","OAUTH","authUrl","AZURE_AD","authorizationUrl","renderBtn","SocialLogin","enterpriseConnectionObjs","socialConnectionObjs","noLoginMethods","onMessage","event","localStorage","setItem","parsedMessage","authingCode","authingMessage","authingResData","usePostMessage","onPostMessage","idpButtons","socialLoginButtons","authorization_params","SocialConnectionProvider","BAIDU","isHost","targetUrl","querystring","relayMethod","RelayMethodEnum","FORM_POST","WEB_MESSAGE","shape","socialConnectionsBtnShape","name_en","tooltip","trigger","overlayStyle","fontFamily","idp","socialLogin","direction","flex","idpBtns","socialLoginBtns","ChangeLanguage","global","showChangeLanguage","switchText","onLangChange","LoginWithVerifyCode","setCurrentMethod","isOnlyInternationSms","setInternationSms","SCENE_TYPE_LOGIN","EmailCode","loginByPhoneCode","reqContent","loginByEmailCode","AreaCodePhoneAccount","inputWays","qrcodeWays","GuardLoginView","dlm","propsMethods","intersection","useMethods","defaultMethod","renderInputWay","renderQrcodeWay","setLoginWay","setCanLoop","qrcodeTabsSettings","errorNumber","setErrorNumber","firstInputWay","way","firstQRcodeWay","useDisables","verifyCodeLogin","verifyCodeTabConfig","hiddenTab","scanLogins","defaultQrCodeWay","isDefault","onLoginError","inputNone","qrcodeNone","useSwitchStates","agree","availableAt","verifyLoginMethods","enterpriseConnections","identityProviders","socialConnections","socials","WECHATMP","LARK_INTERNAL","LARK_PUBLIC","postMessage","isNoMethod","useMethod","useLayoutEffect","containerDOM","innerContainer","querySelector","welcomeMessage","placement","overlayClassName","getPopupContainer","node","parentElement","destroy","k","onLoginTabChange","activeKey","FORGET_PWD","margin","ANY_QUESTIONS","REGISTER","destroyInactiveTabPane","tips","expired","facePluginInstance","FaceErrorName","VerifyEmail","VerifySms","VerifyTotp","VerifyFace","photo","AssociateFace","photoA","photoB","isExternalPhoto","useMfaBusinessRequest","isFlow","BindMFAEmail","VerifyMFAEmail","onVerify","sendCodeRef","sent","sendVerifyCode","MfaVerify","mfaCode","requestData","mail","mailArr","substr","mailName","mailDesensitization","MFAEmail","userEmail","mfaLogin","setEmail","click","BindMFASms","VerifyMFASms","userPhone","phoneDesensitization","SCENE_TYPE_MFA_VERIFY","MFASms","setPhone","getFacePlugin","devicesConstraints","video","getCurrentFaceDetectionNet","nets","tinyFaceDetector","dataURItoBlob","base64Data","byteString","atob","unescape","mimeString","ia","Uint8Array","charCodeAt","Blob","TotpRecoveryCodeBusinessAction","MFAFace","mfaBackContext","MFABackStateContext","faceState","setFaceState","percent","setPercent","mfaBusinessRequest","verifyRequest","bindRequest","videoRef","canvasRef","interval","p1","p2","cooldown","dashStyle","useDashoffset","loadFromUri","mediaDevices","getUserMedia","stream","srcObject","NotAllowedError","SecurityError","OverconstrainedError","faceErrorMessage","mfaBackState","setShowMethods","uploadImage","blob","FormData","append","result","getBase64","videoDom","canvas","getContext","clearRect","drawImage","toDataURL","faceBind","faceCheck","quitIdentifying","faceMfaEnabled","goToCheckScene","goToBindScene","autoShoot","paused","ended","params","TinyFaceDetectorOptions","inputSize","scoreThreshold","detectSingleFace","score","setMfaBackState","autoPlay","muted","playsInline","strokeDasharray","strokeDashoffset","cx","cy","opacity","BindMFATotp","BIND_TOTP","VerifyMFATotp","RECOVERY_CODE","MFATotp","methodTitleMapping","EMAIL","SMS","FACE","MFAMethods","onChangeMethod","applicationMfa","otherMethods","mfaPolicy","2021","1700","1701","1702","500","6001","602","ComponentsMapping","GuardMFAView","showMethods","__codePaser","callback","__message","DescribeQuestions","typeProblemMap","0","1","2","3","4","5","6","typeOperations","uploadUrl","setUploadUrl","previewVisible","setPreviewVisible","previewImage","setPreviewImage","fileList","setFileList","typeProblem","setTypeProblem","textMap","handlePreview","reader","FileReader","readAsDataURL","originFileObj","onload","description","images","initialValue","Option","TextArea","showCount","rows","onPreview","imgUrl","beforeUpload","itemRender","padding","border","showInfo","footer","onCancel","GuardNeedHelpView","IdentityBindingBusinessAction","SaveCode","UseCode","onSubmit","RecoveryTotp","recoveryCode","RecoveryCode","setCode","RecoveryCodeAuthFlow","setRecoveryCode","GuardRecoveryCodeView","useIsChangeComplete","currentMode","complateFiledsPlace","omit","RegisterWithEmail","onRegisterSuccess","onRegisterFailed","onBeforeRegister","registeContext","isChangeComplete","browser","device","generateToken","REGISTER_COMPLETE_INFO","onValuesChange","RegisterWithPhone","PhoenAccount","SCENE_TYPE_REGISTER","GuardRegisterView","registerContextProps","onRegisterError","registerContext","tabMapping","component","defaultValue","tabList","element","tabSort","onRegisterTabChange","GuardSubmitSuccessView","countDesc","LangMAP","useIdentityBindingBusinessRequest","GuardIdentityBindingView","phoneCodeRequest","emailCodeRequest","PasswordRequest","bindMethodsMap","encryptPassword","onBinding","onBindingError","loginMethodsBase","codeLoginMethods","GuardIdentityBindingAskView","onCreate","onCreateError","createLoading","createAccount","PREFIX_CLS","prefixCls","langMap","zhCn","zhCN","enUs","enUS","RenderModule","FIRST_LOGIN_PASSWORD","FORCED_PASSWORD_RESET","initErrorCodeInterceptor","codeAction","CHANGE_MODULE","ChangeModuleApiCodeMapping","nextData","FLOW_END","newData","renderModule","toString","locale","Modal","closeIcon","onClose","keyboard","maskClosable","getContainer","useGuardFacePlugin","facePlugin","guardFace","initFacePlugin","useRenderGuardCore","plugin","useGuardPlugin","propsAreEqual","pre","preAttribute","currentAttribute","GuardPropsFilter","Guard","memo","defaultScenes","InterceptorName","APP_MFA","COMPLETE_INFO","errorCodeInterceptor","callBack","Steps","GuardHttp","responseInterceptorMap","Map","getHeaders","has","ERROR_CODE","set","reduce","acc","cur","getRequestClient","userpoolId","guardHttp","OIDCConnectionMode","App","setShow","setNum","WebkitUserSelect","background","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.d421c226.chunk.js","sourcesContent":["import { GuardAppendConfig } from '..'\n\nlet appendConfigMapping: GuardAppendConfig\n\nexport const getAppendConfig = (): GuardAppendConfig => {\n return appendConfigMapping\n}\n\nexport const useAppendConfig = getAppendConfig\n\nexport const initAppendConfig = (appendConfig: GuardAppendConfig = {}) => {\n appendConfigMapping = appendConfig\n}\n","import { ReportHandler } from 'web-vitals'\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","export default '3.1.3'","import version from './version'\n\nexport default version\n","import { GuardProps, setPublicConfig } from '../..'\nimport { getAppendConfig, initAppendConfig } from '../../_utils/appendConfig'\nimport { setPageConfig } from '../../_utils/config'\n\nexport const getGuardWindow = () => {\n if (typeof window === 'undefined') {\n return undefined\n }\n\n const appendConfig = getAppendConfig()\n\n if (appendConfig?.window) return appendConfig.window\n\n return window\n}\n\nexport const useGuardWindow = getGuardWindow\n\nexport const useInitGuardAppendConfig = (guardProps: GuardProps) => {\n const { appendConfig, appId } = guardProps\n\n console.log('================')\n console.log(appendConfig)\n console.log('eeee')\n console.log('================')\n\n initAppendConfig(appendConfig)\n\n if (appendConfig?.publicConfig) {\n setPublicConfig(appId, appendConfig.publicConfig)\n }\n\n if (appendConfig?.pageConfig) {\n setPageConfig(appId, appendConfig.pageConfig)\n }\n}\n","import i18n from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport LanguageDetector from 'i18next-browser-languagedetector'\n\nimport * as enUsTrans from './en'\nimport * as zhCnTrans from './zh'\nimport { LocalesConfig, Lang } from '../../AuthingGuard/types'\nimport { getGuardWindow } from '../../Guard/core/useAppendConfig'\n\nlet langChangeFN: (lang: Lang) => void = () => {}\n\nexport const changeLang = (lang: Lang) => {\n i18n.changeLanguage(lang)\n langChangeFN && langChangeFN(lang)\n}\n\nconst initI18n = (localesConfig: LocalesConfig = {}, lang?: Lang) => {\n let initLang: 'zh-CN' | 'en-US' = 'zh-CN'\n\n const guardWindow = getGuardWindow()\n\n if (guardWindow) {\n initLang =\n guardWindow.navigator.language.split('-')[0] === 'zh' ? 'zh-CN' : 'en-US'\n }\n\n if (Boolean(i18n.language)) {\n i18n.changeLanguage(lang)\n } else {\n i18n\n .use(LanguageDetector) // 监测当前浏览器语言\n .use(initReactI18next) // 初始化 i18n\n .init({\n detection: {\n order: [],\n },\n resources: {\n 'en-US': {\n translation: enUsTrans,\n },\n 'zh-CN': {\n translation: zhCnTrans,\n },\n },\n fallbackLng: lang ?? initLang,\n debug: false,\n interpolation: {\n escapeValue: false, // react already safes from xss\n },\n })\n if (localesConfig.onChange) {\n langChangeFN = localesConfig.onChange\n }\n }\n}\n\nexport { i18n, initI18n }\n","import { message } from 'antd'\nimport qs from 'qs'\nimport { i18n } from './locales'\nimport { CodeAction } from './responseManagement/interface'\n\nexport const requestClient = async (...rest: Parameters<typeof fetch>) => {\n const res = await fetch(...rest)\n return res.json()\n}\n\nexport interface AuthingResponse<T = any> {\n code?: number\n statusCode?: number\n apiCode?: number\n data?: T\n messages?: string\n message?: string\n}\n\nexport interface AuthingGuardResponse<T = any> extends AuthingResponse<T> {\n onGuardHandling?: () => CodeAction\n isFlowEnd?: boolean\n}\n\nrequestClient.get = async <T>(\n path: string,\n query: Record<string, any> = {},\n init?: RequestInit\n): Promise<AuthingResponse<T>> => {\n const headers: Record<string, any> = {\n ...init?.headers,\n 'Content-Type': 'application/json',\n [requestClient.langHeader]: i18n.language,\n }\n\n if (requestClient.tenantId !== '')\n headers[requestClient.tenantHeader] = requestClient.tenantId\n\n const res = await fetch(\n `${requestClient.baseUrl}${path}${qs.stringify(query, {\n addQueryPrefix: true,\n })}`,\n {\n ...init,\n credentials: 'include',\n headers,\n }\n )\n\n return res.json()\n}\n\nrequestClient.post = async <T>(\n path: string,\n data: any,\n config?: {\n headers: any\n }\n): Promise<AuthingResponse<T>> => {\n const headers: Record<string, any> = {\n ...config?.headers,\n 'Content-Type': 'application/json',\n [requestClient.langHeader]: i18n.language,\n }\n\n if (requestClient.tenantId !== '')\n headers[requestClient.tenantHeader] = requestClient.tenantId\n\n const res = await fetch(`${requestClient.baseUrl}${path}`, {\n method: 'POST',\n body: JSON.stringify(data),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...config?.headers,\n [requestClient.langHeader]: i18n.language,\n },\n })\n\n return res.json()\n}\n\nrequestClient.postForm = async <T>(\n path: string,\n formData: any,\n config?: {\n headers: any\n }\n): Promise<AuthingResponse<T>> => {\n const res = await fetch(`${requestClient.baseUrl}${path}`, {\n method: 'post',\n body: formData,\n credentials: 'include',\n headers: {\n ...config?.headers,\n [requestClient.langHeader]: i18n.language,\n },\n })\n if (res.status === 500) {\n message.error(i18n.t('common.unknownError'))\n }\n return res.json()\n}\n\nrequestClient.baseUrl = ''\nrequestClient.setBaseUrl = (base: string) => {\n requestClient.baseUrl = base.replace(/\\/$/, '')\n}\n\nconst DEFAULT_LANG_HEADER = 'x-authing-lang'\nconst DEFAULT_TENANT_HEADER = 'x-authing-app-tenant-idåå'\nrequestClient.langHeader = DEFAULT_LANG_HEADER\nrequestClient.tenantHeader = DEFAULT_TENANT_HEADER\nrequestClient.tenantId = ''\n\nrequestClient.setLangHeader = (key: string | undefined) => {\n requestClient.langHeader = key || DEFAULT_LANG_HEADER\n}\n\nrequestClient.setTenantHeader = (key: string | undefined) => {\n requestClient.tenantHeader = key || DEFAULT_LANG_HEADER\n}\n\nrequestClient.setTenantId = (tenantId: string) => {\n requestClient.tenantId = tenantId\n}\n","import React from 'react'\n\n// create context with no upfront defaultValue\n// without having to do undefined check all the time\nexport function createBaseContext<C>() {\n const ctx = React.createContext<C | undefined>(undefined)\n function useBaseContext() {\n const ctxConst = React.useContext(ctx)\n if (!ctxConst)\n throw new Error('useBaseContext must be inside a Provider with a value')\n return ctxConst\n }\n // make TypeScript infer a tuple, not an array of union types\n return [ctx, useBaseContext] as const\n}\n\nexport interface IBaseAction<ActionType = string> {\n type: ActionType & string\n payload?: any\n [key: string]: string\n}\n\nexport interface IBaseContext<S> {\n state: S\n [k: string]: any\n}\n\nexport type BaseContextComponent<Props> = React.PropsWithChildren<Props>\n","import React, { useCallback, useReducer } from 'react'\nimport { createBaseContext, IBaseContext, BaseContextComponent } from '../base'\nimport { reducer, IState } from './reducer'\n\n// 页面上下文,除了状态外还有公开的方法\nexport interface IGuardContext extends IBaseContext<IState> {\n dispatch: Function\n getValue: (key: keyof IState) => any\n setValue: (key: keyof IState, value: any) => void\n}\n\n// 实例化上下文,这里避免了为空检查\nconst [Context, useBaseContext] = createBaseContext<IGuardContext>()\n\nexport function useGuardContext(): IGuardContext {\n const guardContext = useBaseContext()\n // TODO: custom some\n return guardContext\n}\n\nexport function GuardContext({\n children = null,\n value,\n}: BaseContextComponent<Record<string, any>>) {\n const [state, dispatch] = useReducer(reducer, value)\n const getValue = (key: keyof IState) => state[key]\n const setValue = useCallback((key: keyof IState, value: any) => {\n dispatch({ type: 'SET_VALUE', key, value })\n }, [])\n\n let ctx: IGuardContext = {\n state,\n dispatch,\n getValue,\n setValue,\n }\n\n return <Context.Provider value={ctx}>{children}</Context.Provider>\n}\n","import {\n GuardConfig,\n ActiveTabs,\n GuardScenes,\n UserConfig,\n GuardEventsHandler,\n LocalesConfig,\n Lang,\n} from '../../AuthingGuard/types'\nimport { AuthenticationClient } from 'authing-js-sdk'\nimport { IBaseAction } from '../base'\nimport { ApplicationMfaType } from '../../AuthingGuard/api/appConfig'\n\nexport type IState = {\n config: GuardConfig // 处理后的 Guard 配置\n userConfig: UserConfig // 用户传入的配置\n authClient: AuthenticationClient\n activeTabs: ActiveTabs // 登录、注册方式\n guardScenes: GuardScenes // 当前在哪个界面\n guardTitle: string\n // 需要 mfa 登录时后端返回的错误信息\n mfaData: {\n mfaToken: string\n phone?: string\n email?: string\n applicationMfa?: {\n status: 0 | 1\n mfaPolicy: ApplicationMfaType\n sort: number\n }[]\n }\n userPoolId: string\n appId: string\n guardEvents: GuardEventsHandler\n localesConfig: LocalesConfig\n lang?: Lang\n realHost: string\n}\n\nconst handlers: any = {\n // eslint-disable-next-line\n ['SET_VALUE']: (state: IState, payloads: any) => {\n return {\n ...state,\n [payloads.key]: payloads.value,\n }\n },\n}\n\nexport const reducer = (state: IState, { type, ...payloads }: IBaseAction) => {\n const handler = handlers[type]\n if (handler) {\n return handler(state, payloads)\n }\n return state\n}\n","import { getGuardWindow } from '../Guard/core/useAppendConfig'\n\n/**\n * 在屏幕中心弹出新窗口加载 url\n * @param url\n * @param param1\n */\nexport const popupCenter = (\n url: string,\n { w, h }: { w: number; h: number } = { w: 585, h: 649 }\n) => {\n const guardWindow = getGuardWindow()\n\n if (!guardWindow) return\n\n // Fixes dual-screen position Most browsers Firefox\n const dualScreenLeft =\n guardWindow.screenLeft !== undefined\n ? guardWindow.screenLeft\n : guardWindow.screenX\n const dualScreenTop =\n guardWindow.screenTop !== undefined\n ? guardWindow.screenTop\n : guardWindow.screenY\n\n const width = guardWindow.innerWidth\n ? guardWindow.innerWidth\n : document.documentElement.clientWidth\n ? document.documentElement.clientWidth\n : guardWindow.screen.width\n const height = guardWindow.innerHeight\n ? guardWindow.innerHeight\n : document.documentElement.clientHeight\n ? document.documentElement.clientHeight\n : guardWindow.screen.height\n\n const systemZoom = width / guardWindow.screen.availWidth\n const left = (width - w) / 2 / systemZoom + dualScreenLeft\n const top = (height - h) / 2 / systemZoom + dualScreenTop\n const newWindow = guardWindow.open(\n url,\n '_blank',\n `\n toolbar=no,\n menubar=no,\n scrollbars=no,\n resizable=no,\n location=no,\n status=no\n width=${w / systemZoom}, \n height=${h / systemZoom}, \n top=${top}, \n left=${left}\n `\n )\n\n newWindow?.focus()\n}\n","import { useEffect } from 'react'\nimport { Rule } from 'antd/lib/form'\nimport qs from 'qs'\nimport { useGuardContext } from '../context/global/context'\nimport { i18n } from './locales'\nimport { RegisterMethods, User } from 'authing-js-sdk'\nimport { ApplicationConfig, ComplateFiledsPlace } from '../AuthingGuard/api'\nimport { GuardProps } from '../Guard'\nimport isEqual from 'lodash/isEqual'\nimport omit from 'lodash/omit'\nimport { getGuardWindow } from '../Guard/core/useAppendConfig'\nexport * from './popupCenter'\nexport * from './clipboard'\n\nexport const VALIDATE_PATTERN = {\n // https://emailregex.com/\n // eslint-disable-next-line no-control-regex\n email: /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n // https://cloud.tencent.com/developer/article/1751120\n // email: /^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$/,\n // 以下的来自 authing-user-portal 项目\n phone: /^1[3-9]\\d{9}$/,\n ip: /^((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}$/,\n host: /^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.?$/,\n username: /.?/,\n} as const\n\nexport const validate = (type: keyof typeof VALIDATE_PATTERN, val: string) => {\n return VALIDATE_PATTERN[type].test(val)\n}\n\nexport const getRequiredRules = (msg: string): Rule[] => {\n return [\n {\n required: true,\n message: msg,\n },\n ]\n}\n\nexport const fieldRequiredRule = (\n fieldRequiredRule: string,\n fieldRequiredRuleMessage?: string\n): Rule[] => {\n return [\n {\n required: true,\n validateTrigger: ['onChange'],\n message:\n fieldRequiredRuleMessage ||\n i18n.t('common.isMissing', {\n name: fieldRequiredRule,\n }),\n whitespace: true,\n },\n ]\n}\n\nexport function getDeviceName() {\n const guardWindow = getGuardWindow()\n\n if (!guardWindow) return\n\n const userAgent = guardWindow.navigator.userAgent\n const platform = guardWindow.navigator.platform\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K']\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE']\n const iosPlatforms = ['iPhone', 'iPad', 'iPod']\n\n let os = null\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS'\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS'\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows'\n } else if (/Android/.test(userAgent)) {\n os = 'Android'\n } else if (!os && /Linux/.test(platform)) {\n os = 'Linux'\n }\n\n return os\n}\n\nexport type STYLE_RECORD_KEY = 'appConfig' | 'userConfig'\n\n/**\n * 传对象 {'background-color': 'red'}\n * 传字符串 \"CSS 样式\"\n */\nconst insertedRecord: Record<STYLE_RECORD_KEY, any> = {\n appConfig: null,\n userConfig: null,\n}\nexport const insertStyles = (\n styles: string | any,\n recordKey?: STYLE_RECORD_KEY\n) => {\n let styleElt, styleSheet\n if ((document as any).createStyleSheet) {\n // IE\n styleSheet = (document as any).createStyleSheet()\n } else {\n let head = document.getElementsByTagName('head')[0]\n styleElt = document.createElement('style')\n head.appendChild(styleElt)\n styleSheet = document.styleSheets[document.styleSheets.length - 1]\n }\n if (typeof styles === 'string') {\n if (styleElt) styleElt.innerHTML = styles\n else styleSheet.cssText = styles // IE\n } else {\n let i = 0\n for (let selector in styles) {\n if (styleSheet.insertRule) {\n let rule = selector + ' {' + styles[selector] + '}'\n styleSheet.insertRule(rule, i++)\n } else {\n styleSheet.addRule(selector, styles[selector], i++)\n }\n }\n }\n\n if (recordKey) {\n insertedRecord[recordKey] = styleElt\n }\n}\n\nexport const removeStyles = (recordKey: STYLE_RECORD_KEY) => {\n if (!insertedRecord[recordKey]) {\n return\n }\n\n const styleElt = insertedRecord[recordKey]\n\n styleElt.parentNode?.removeChild(styleElt)\n\n insertedRecord[recordKey] = null\n}\n\nexport const useTitle = (title: string, prefix?: string) => {\n const {\n state: { config },\n } = useGuardContext()\n\n useEffect(() => {\n document.title = `${prefix ?? `${config.title} `} ${title}`\n }, [config.title, prefix, title])\n}\n\nexport const getClassnames = (classnames: (string | boolean | undefined)[]) => {\n return classnames.filter(Boolean).join(' ')\n}\n\n/**\n * https://www.itranslater.com/qa/details/2115518846294557696\n * Simple object check.\n * @param item\n * @returns {boolean}\n */\nexport function isObject(item: any) {\n return item && typeof item === 'object' && !Array.isArray(item)\n}\n\n/**\n * https://www.itranslater.com/qa/details/2115518846294557696\n * Deep merge two objects.\n * @param target\n * @param ...sources\n */\nexport function deepMerge<T extends any = any>(\n target: T,\n ...sources: any[]\n): T {\n if (!sources.length) return target\n const source = sources.shift()\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n // @ts-ignore\n if (!target[key]) {\n Object.assign(target, { [key]: {} })\n }\n // @ts-ignore\n deepMerge(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n\n return deepMerge(target, ...sources)\n}\n\nexport const getUserRegisterParams = () => {\n const query = qs.parse(window.location.search, {\n ignoreQueryPrefix: true,\n })\n return Object.keys(query).map((key) => ({\n key,\n value: query[key],\n }))\n}\n\nexport const isWeChatBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return /MicroMessenger/i.test(navigator?.userAgent)\n}\n\nexport const isLarkBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return /Lark/i.test(navigator.userAgent)\n}\n\nexport const isQtWebEngine = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return /QtWebEngine/i.test(navigator.userAgent)\n}\n\nexport const isXiaomiBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return /MiuiBrowser/i.test(navigator.userAgent)\n}\nexport const isDingtalkBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return /dingtalk/i.test(navigator.userAgent)\n}\n\nexport const isQQBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return / QQ/i.test(navigator.userAgent)\n}\n// 特殊浏览器 后续可能会增加\nexport const isSpecialBrowser = () => {\n return (\n isWeChatBrowser() ||\n isLarkBrowser() ||\n isQtWebEngine() ||\n isXiaomiBrowser() ||\n isDingtalkBrowser() ||\n isQQBrowser()\n )\n}\nexport const assembledAppHost = (identifier: string, host: string) => {\n const hostUrl = new URL(host)\n\n const splitHost = hostUrl.hostname.split('.')\n\n const port = hostUrl.port\n\n splitHost.shift()\n\n return `${hostUrl.protocol}//${identifier}.${splitHost.join('.')}${\n port && `:${port}`\n }`\n}\n\n// 拼接请求链接\nexport const assembledRequestHost = (\n requestHostname: string,\n configHost: string\n) => {\n const identifier = requestHostname.split('.')[0]\n\n const hostUrl = new URL(configHost)\n const splitHost = hostUrl.hostname.split('.')\n\n splitHost.shift()\n\n // 看看是否有端口号\n const port = hostUrl.port\n\n return `${hostUrl.protocol}//${identifier}.${splitHost.join('.')}${\n port && `:${port}`\n }`\n}\n\nexport enum PasswordStrength {\n NoCheck,\n Low,\n Middle,\n High,\n AUTO,\n}\n\nexport const PASSWORD_STRENGTH_TEXT_MAP: Record<\n PasswordStrength,\n {\n placeholder: () => string\n validateMessage: () => string\n }\n> = {\n [PasswordStrength.NoCheck]: {\n placeholder: () => i18n.t('login.inputPwd'),\n validateMessage: () => i18n.t('login.inputPwd'),\n },\n [PasswordStrength.Low]: {\n placeholder: () => i18n.t('login.setPwdLimit1'),\n validateMessage: () => i18n.t('login.setPwdLimitMsg1'),\n },\n [PasswordStrength.Middle]: {\n placeholder: () => i18n.t('login.login.setPwdLimit2'),\n validateMessage: () => i18n.t('login.setPwdLimitMsg2'),\n },\n [PasswordStrength.High]: {\n placeholder: () => i18n.t('login.login.setPwdLimit3'),\n validateMessage: () => i18n.t('login.setPwdLimitMsg3'),\n },\n [PasswordStrength.AUTO]: {\n placeholder: () => i18n.t('login.inputPwd'),\n validateMessage: () => i18n.t('login.inputPwd'),\n },\n}\n\nconst SYMBOL_TYPE_PATTERNS = [\n /\\d+/,\n /[a-zA-Z]/,\n /[-!$%^&*()_+|~=`{}[\\]:\";'<>?,@./]/,\n]\n\nexport const getSymbolTypeLength = (pwd: string) => {\n return SYMBOL_TYPE_PATTERNS.map((pattern) => pattern.test(pwd)).filter(\n (item) => item\n ).length\n}\n\nexport const getPasswordValidate = (\n strength: PasswordStrength = PasswordStrength.NoCheck,\n customPasswordStrength: any = {},\n fieldRequiredRuleMessage?: string\n): Rule[] => {\n const required = [\n ...fieldRequiredRule(i18n.t('common.password'), fieldRequiredRuleMessage),\n {\n validateTrigger: 'onBlur',\n validator(_: any, value: any) {\n if ((value ?? '').indexOf(' ') !== -1) {\n return Promise.reject(i18n.t('common.checkPasswordHasSpace'))\n }\n return Promise.resolve()\n },\n },\n ]\n\n const validateMap: Record<PasswordStrength, Rule[]> = {\n [PasswordStrength.NoCheck]: [...required],\n [PasswordStrength.Low]: [\n ...required,\n {\n validateTrigger: 'onBlur',\n validator(r, v) {\n if (v && v.length < 6) {\n return Promise.reject(\n PASSWORD_STRENGTH_TEXT_MAP[PasswordStrength.Low].validateMessage()\n )\n }\n return Promise.resolve()\n },\n },\n ],\n [PasswordStrength.Middle]: [\n ...required,\n {\n validateTrigger: 'onBlur',\n validator(r, v) {\n if (v && (v.length < 6 || getSymbolTypeLength(v) < 2)) {\n return Promise.reject(\n PASSWORD_STRENGTH_TEXT_MAP[\n PasswordStrength.Middle\n ].validateMessage()\n )\n }\n return Promise.resolve()\n },\n },\n ],\n [PasswordStrength.High]: [\n ...required,\n {\n validateTrigger: 'onBlur',\n validator(r, v) {\n if (v && (v.length < 6 || getSymbolTypeLength(v) < 3)) {\n return Promise.reject(\n PASSWORD_STRENGTH_TEXT_MAP[\n PasswordStrength.High\n ].validateMessage()\n )\n }\n return Promise.resolve(true)\n },\n },\n ],\n [PasswordStrength.AUTO]: [\n ...required,\n {\n validateTrigger: 'onBlur',\n pattern: customPasswordStrength?.regex,\n message: customPasswordStrength?.message,\n },\n ],\n }\n\n return validateMap[strength]\n}\n\nexport const sleep = (delay: number) =>\n new Promise((resolve) => setTimeout(resolve, delay))\n\nexport const shoudGoToComplete = (\n user: User,\n contextType: ComplateFiledsPlace,\n config: ApplicationConfig | undefined,\n autoRegister?: boolean //是否登录注册合并\n) => {\n // console.log('需要补全吗?', user, contextType, config)\n // 先判断开关,再对比字段。\n let needGo = false\n // 判断新版本\n if (\n config?.complateFiledsPlace?.length &&\n config.complateFiledsPlace.includes(contextType) &&\n config?.extendsFields &&\n config?.extendsFields?.length > 0\n ) {\n needGo = true\n }\n\n //autoRegister 开启注册登录合并后 就不区分登录注册场景 只要 complateFiledsPlace 有值即可\n\n if (\n autoRegister &&\n config?.complateFiledsPlace?.length &&\n config?.extendsFields &&\n config?.extendsFields?.length > 0\n ) {\n needGo = true\n }\n // 兼容老版本\n if (\n !config?.complateFiledsPlace?.length &&\n config?.extendsFieldsEnabled &&\n config?.extendsFields &&\n config?.extendsFields?.length > 0\n ) {\n needGo = true\n }\n // 对比字段\n const allFieldsToComp = config?.extendsFields\n if (\n needGo &&\n contextType === 'register' &&\n allFieldsToComp &&\n allFieldsToComp.length > 0\n ) {\n if (\n user.email &&\n allFieldsToComp?.length === 1 &&\n allFieldsToComp[0]?.type === 'internal' &&\n allFieldsToComp[0]?.name === 'email'\n ) {\n return false\n }\n if (\n user.phone &&\n allFieldsToComp?.length === 1 &&\n allFieldsToComp[0]?.type === 'internal' &&\n allFieldsToComp[0]?.name === 'phone'\n ) {\n return false\n }\n if (\n allFieldsToComp\n .filter((item) => item.type === 'user')\n .map((i) => i.name)\n //@ts-ignore\n .map((i) => user[i])\n .filter((i) => Boolean(i)).length === 0\n )\n return false\n\n return true\n }\n if (\n needGo &&\n contextType === 'login' &&\n allFieldsToComp &&\n allFieldsToComp.length > 0\n ) {\n // console.log('判断补全')\n // TODO 自动注册登录\n needGo = false\n const userFields = allFieldsToComp.filter(\n (item) => item.type === 'internal'\n )\n const udvs = allFieldsToComp.filter((item) => item.type !== 'internal')\n for (const f of userFields) {\n const currKey = f.name\n // gender 特例\n if (currKey === 'gender' && user['gender'] === 'U') {\n needGo = true\n break\n }\n //@ts-ignore\n if (!user[currKey] || user[currKey] === '') {\n needGo = true\n break\n }\n }\n if (!needGo) {\n const { customData } = user\n if (customData) {\n for (const f of udvs) {\n if (!customData[f.name] || customData[f.name] === '') {\n needGo = true\n break\n }\n }\n }\n }\n }\n return needGo\n}\n\nexport const tabSort = (\n defaultValue: RegisterMethods,\n tabList: RegisterMethods[]\n): RegisterMethods[] => {\n const index = tabList.indexOf(defaultValue)\n const element = tabList.splice(index, 1)[0]\n tabList.unshift(element)\n return tabList\n}\n\nexport const mailDesensitization = (mail: string) => {\n const mailArr = mail.split('@')\n const mailName = mailArr[0].substr(0, 1) + '***'\n return mailName + '@' + mailArr[1]\n}\n\nexport const phoneDesensitization = (phone: string) => {\n return phone.replace(/(\\d{3})\\d*(\\d{4})/, '$1****$2')\n}\n\nexport const getHundreds = (num: number) => {\n return Math.floor(num / 100)\n}\n\nexport const GuardPropsFilter = (pre: GuardProps, current: GuardProps) => {\n const preAttribute = Object.keys(pre).filter((name) => name.startsWith('on'))\n\n const currentAttribute = Object.keys(current).filter((name) =>\n name.startsWith('on')\n )\n\n return isEqual(omit(pre, preAttribute), omit(current, currentAttribute))\n}\n","export enum GuardModuleType {\n ERROR = 'error',\n LOGIN = 'login',\n REGISTER = 'register',\n MFA = 'mfa',\n FORGET_PWD = 'forgetPassword',\n FORCED_PASSWORD_RESET = 'forcedPasswordReset',\n FIRST_LOGIN_PASSWORD = 'firstLoginPassword',\n DOWNLOAD_AT = 'downloadAT',\n BIND_TOTP = 'bindTotp',\n ANY_QUESTIONS = 'anyQuestions',\n LOGIN_COMPLETE_INFO = 'loginCompleteInfo',\n REGISTER_COMPLETE_INFO = 'registerCompleteInfo',\n RECOVERY_CODE = 'recoveryCode',\n SUBMIT_SUCCESS = 'submitSuccess',\n IDENTITY_BINDING_ASK = 'identityBindingAsk',\n IDENTITY_BINDING = 'identityBinding',\n}\nexport interface GuardModuleAction {\n action: string\n module?: GuardModuleType\n message?: string\n initData?: any\n}\n","import { AuthenticationClient } from 'authing-js-sdk'\nimport version from '../version'\nimport { GuardLocalConfig } from './config'\n\nlet authClient: AuthenticationClient\n\nexport const initGuardAuthClient = (\n config: GuardLocalConfig,\n appId: string,\n websocketHost: string,\n tenantId?: string\n) => {\n const host = config.host\n const lang = config.lang\n\n if (!authClient) {\n try {\n authClient = new AuthenticationClient({\n appHost: host,\n tenantId: tenantId,\n appId,\n lang,\n requestFrom: `Guard@${version}`,\n onError: (code, msg: any) => {\n console.error(code, msg)\n },\n websocketHost: websocketHost,\n })\n } catch (error: any) {\n throw error\n }\n }\n\n return authClient\n}\n\nexport const getGuardAuthClient = () => {\n if (!authClient) {\n throw new Error('Please initialize GuardAuthClient')\n }\n\n return authClient\n}\n\nexport const useGuardAuthClient = () => getGuardAuthClient()\n","import {\n AuthenticationClient,\n AuthenticationClientOptions,\n CommonMessage,\n SocialConnectionProvider,\n User,\n} from 'authing-js-sdk'\nimport { QrCodeAuthenticationClient } from 'authing-js-sdk/build/main/lib/authentication/QrCodeAuthenticationClient'\n\nimport {\n SocialConnectionItem,\n EnterpriseConnectionItem,\n ApplicationConfig,\n PasswordLoginMethods,\n Agreement,\n QrcodeTabsSettings,\n} from '../../../components/AuthingGuard/api'\nimport { Lang } from './Locales'\n\nexport type { AuthenticationClient, CommonMessage, User } from 'authing-js-sdk'\n\nexport enum GuardMode {\n Modal = 'modal',\n Normal = 'normal',\n}\n\nexport enum LoginMethods {\n LDAP = 'ldap',\n AppQr = 'app-qrcode',\n Password = 'password',\n PhoneCode = 'phone-code',\n WxMinQr = 'wechat-miniprogram-qrcode', // 对应社会化登录的 wechat:miniprogram:qrconnect(小程序扫码登录)\n AD = 'ad', // 对应企业身份源的 Windows AD 登录\n WechatMpQrcode = 'wechatmp-qrcode', // 微信扫码关注登录\n}\n\nexport enum RegisterMethods {\n Email = 'email',\n Phone = 'phone',\n}\n\nexport enum GuardScenes {\n Login = 'login',\n Register = 'register',\n MfaVerify = 'mfaVerify',\n AppMfaVerify = 'appMfaVerify',\n RestPassword = 'restPassword',\n CompleteUserInfo = 'completeUserInfo',\n}\n\nexport enum ResetPwdMethods {\n Email = 'email',\n Phone = 'phone',\n}\n\nexport enum SocialConnections {\n Qq = 'qq',\n Weibo = 'weibo',\n Github = 'github',\n Google = 'google',\n WxPc = 'wechat:pc',\n Dingtalk = 'dingtalk',\n WxWCorpQr = 'wechatwork:corp:qrconnect',\n WxWSPQr = 'wechatwork:service-provider:qrconnect',\n WxWSPAuth = 'wechatwork:service-provider:authorization',\n AlipayWeb = 'alipay:web',\n AppleWeb = 'apple:web',\n Baidu = 'baidu',\n LarkInternalApp = 'lark-internal',\n LarkMarketPlaceApp = 'lark-public',\n}\n\nexport enum Protocol {\n AD = 'ad',\n CAS = 'cas',\n LDAP = 'ldap',\n OIDC = 'oidc',\n SAML = 'saml',\n OAUTH = 'oauth',\n AZURE_AD = 'azure-ad',\n}\n\n// export enum GuardEventsKebab {\n// // 加载完成,userPool 配置和应用配置(如果有 appId)加载完成\n// Load = 'load',\n// // 加载失败\n// LoadError = 'load-error',\n// // 用户登录成功\n// Login = 'login',\n// // 用户登录失败\n// LoginError = 'login-error',\n// // 注册成功\n// Register = 'register',\n// // 注册失败\n// RegisterError = 'register-error',\n// // 忘记密码邮件发送成功\n// PwdEmailSend = 'pwd-email-send',\n// // 忘记密码邮件发送失败\n// PwdEmailSendError = 'pwd-email-send-error',\n// // 忘记密码手机验证码发送成功\n// PwdPhoneSend = 'pwd-phone-send',\n// // 忘记密码手机验证码发送失败\n// PwdPhoneSendError = 'pwd-phone-send-error',\n// // 重置密码成功\n// PwdReset = 'pwd-reset',\n// // 重置密码失败\n// PwdResetError = 'pwd-reset-error',\n// // 表单关闭事件\n// Close = 'close',\n// }\n\n// export interface GuardEventsCamelCase {\n// // 加载完成,userPool 配置和应用配置(如果有 appId)加载完成\n// [GuardEvents.Load]: 'onLoad'\n// // 加载失败\n// [GuardEvents.LoadError]: 'onLoadError'\n// // 用户登录成功\n// [GuardEvents.Login]: 'onLogin'\n// // 用户登录失败\n// [GuardEvents.LoginError]: 'onLoginError'\n// // 注册成功\n// [GuardEvents.Register]: 'onRegister'\n// // 注册失败\n// [GuardEvents.RegisterError]: 'onRegisterError'\n// // 忘记密码邮件发送成功\n// [GuardEvents.PwdEmailSend]: 'onPwdEmailSend'\n// // 忘记密码邮件发送失败\n// [GuardEvents.PwdEmailSendError]: 'onPwdEmailSendError'\n// // 忘记密码手机验证码发送成功\n// [GuardEvents.PwdPhoneSend]: 'onPwdPhoneSend'\n// // 忘记密码手机验证码发送失败\n// [GuardEvents.PwdPhoneSendError]: 'onPwdPhoneSendError'\n// // 重置密码成功\n// [GuardEvents.PwdReset]: 'onPwdReset'\n// // 重置密码失败\n// [GuardEvents.PwdResetError]: 'onPwdResetError'\n// // 表单关闭事件\n// [GuardEvents.Close]: 'onClose'\n// }\n\n// export enum GuardEvents {\n// // 加载完成,userPool 配置和应用配置(如果有 appId)加载完成\n// Load = 'onLoad',\n// // 加载失败\n// LoadError = 'onLoadError',\n// // 用户登录成功\n// Login = 'onLogin',\n// // 用户登录失败\n// LoginError = 'onLoginError',\n// // 注册成功\n// Register = 'onRegister',\n// // 注册失败\n// RegisterError = 'onRegisterError',\n// // 忘记密码邮件发送成功\n// PwdEmailSend = 'onPwdEmailSend',\n// // 忘记密码邮件发送失败\n// PwdEmailSendError = 'onPwdEmailSendError',\n// // 忘记密码手机验证码发送成功\n// PwdPhoneSend = 'onPwdPhoneSend',\n// // 忘记密码手机验证码发送失败\n// PwdPhoneSendError = 'onPwdPhoneSendError',\n// // 重置密码成功\n// PwdReset = 'onPwdReset',\n// // 重置密码失败\n// PwdResetError = 'onPwdResetError',\n// // 表单关闭事件\n// Close = 'onClose',\n// }\n\nexport const GuardEventsCamelToKebabMap = {\n onLoad: 'load',\n onLoadError: 'load-error',\n onLogin: 'login',\n onBeforeLogin: 'before-login',\n onLoginError: 'login-error',\n onRegister: 'register',\n onBeforeRegister: 'before-register',\n onRegisterError: 'register-error',\n onPwdEmailSend: 'pwd-email-send',\n onPwdEmailSendError: 'pwd-email-send-error',\n onPwdPhoneSend: 'pwd-phone-send',\n onPwdPhoneSendError: 'pwd-phone-send-error',\n onPwdReset: 'pwd-reset',\n onPwdResetError: 'pwd-reset-error',\n onClose: 'close',\n onLoginTabChange: 'login-tab-change',\n onRegisterTabChange: 'register-tab-change',\n onRegisterInfoCompleted: 'register-info-completed',\n onRegisterInfoCompletedError: 'register-info-completed-error',\n} as const\n\nexport interface GuardEventsHandlerKebab {\n // 加载完成,userPool 配置和应用配置(如果有 appId)加载完成\n load: GuardEventsHandler['onLoad']\n // 加载失败\n 'load-error': GuardEventsHandler['onLoadError']\n // 登录前,即表单校验完成,请求接口前\n 'before-login': GuardEventsHandler['onBeforeLogin']\n // 用户登录成功\n login: GuardEventsHandler['onLogin']\n // 用户登录失败\n 'login-error': GuardEventsHandler['onLoginError']\n // 注册前,即表单校验完成,请求接口前\n 'before-register': GuardEventsHandler['onBeforeRegister']\n // 注册成功\n register: GuardEventsHandler['onRegister']\n // 注册失败\n 'register-error': GuardEventsHandler['onRegisterError']\n // 忘记密码邮件发送成功\n 'pwd-email-send': GuardEventsHandler['onPwdEmailSend']\n // 忘记密码邮件发送失败\n 'pwd-email-send-error': GuardEventsHandler['onPwdEmailSendError']\n // 忘记密码手机验证码发送成功\n 'pwd-phone-send': GuardEventsHandler['onPwdPhoneSend']\n // 忘记密码手机验证码发送失败\n 'pwd-phone-send-error': GuardEventsHandler['onPwdPhoneSendError']\n // 重置密码成功\n 'pwd-reset': GuardEventsHandler['onPwdReset']\n // 重置密码失败\n 'pwd-reset-error': GuardEventsHandler['onPwdResetError']\n // 表单关闭事件\n close: GuardEventsHandler['onClose']\n // 登录的 tab 切换\n 'login-tab-change': GuardEventsHandler['onLoginTabChange']\n // 注册的 tab 切换\n 'register-tab-change': GuardEventsHandler['onRegisterTabChange']\n // 注册信息补充完毕\n 'register-info-completed': GuardEventsHandler['onRegisterInfoCompleted']\n // 注册信息补充失败\n 'register-info-completed-error': GuardEventsHandler['onRegisterInfoCompletedError']\n}\n\nexport interface PasswordLoginParams {\n type: LoginMethods.Password\n data: {\n // 标识,可能是用户名、邮箱、手机号\n identity: string\n // 密码\n password: string\n // 图形验证码\n captchaCode?: string\n }\n}\n\nexport interface LDAPLoginParams {\n type: LoginMethods.LDAP\n data: {\n // 标识,可能是用户名、邮箱、手机号\n identity: string\n // 密码\n password: string\n // 图形验证码\n captchaCode?: string\n }\n}\n\nexport interface ADLoginParams {\n type: LoginMethods.AD\n data: {\n // 标识,可能是用户名、邮箱、手机号\n identity: string\n // 密码\n password: string\n }\n}\n\nexport interface PhoneCodeLoginParams {\n type: LoginMethods.PhoneCode\n data: {\n // 手机号\n phone: string\n // 手机验证码\n code: string\n }\n}\n\nexport interface EmailRegisterParams {\n type: RegisterMethods.Email\n data: {\n // 邮箱\n email: string\n // 密码\n password: string\n }\n}\n\nexport interface PhoneRegisterParams {\n type: RegisterMethods.Phone\n data: {\n // 手机号\n phone: string\n // 密码\n password: string\n // 手机验证码\n code: string\n }\n}\n\nexport interface GuardEventsHandler {\n onLoad?: (authClient: AuthenticationClient) => void\n onLoadError?: (error: CommonMessage) => void\n onBeforeLogin?: (\n loginInfo:\n | PasswordLoginParams\n | LDAPLoginParams\n | ADLoginParams\n | PhoneCodeLoginParams,\n authClient: AuthenticationClient\n ) => boolean | Promise<boolean>\n onLogin?: (user: User, authClient: AuthenticationClient) => void\n onLoginError?: (user: User, authClient: AuthenticationClient) => void\n onBeforeRegister?: (\n registerInfo: EmailRegisterParams | PhoneRegisterParams,\n authClient: AuthenticationClient\n ) => boolean | Promise<boolean>\n onRegister?: (user: User, authClient: AuthenticationClient) => void\n onRegisterError?: (user: User, authClient: AuthenticationClient) => void\n onPwdEmailSend?: (authClient: AuthenticationClient) => void\n onPwdEmailSendError?: (\n error: CommonMessage,\n authClient: AuthenticationClient\n ) => void\n onPwdPhoneSend?: (authClient: AuthenticationClient) => void\n onPwdPhoneSendError?: (\n error: CommonMessage,\n authClient: AuthenticationClient\n ) => void\n onPwdReset?: (authClient: AuthenticationClient) => void\n onPwdResetError?: (\n error: CommonMessage,\n authClient: AuthenticationClient\n ) => void\n onClose?: () => void\n onLoginTabChange?: (activeTab: LoginMethods) => void\n onRegisterTabChange?: (activeTab: RegisterMethods) => void\n onRegisterInfoCompleted?: (\n user: User,\n udfs: {\n definition: any\n value: any\n }[],\n authClient: AuthenticationClient\n ) => void\n onRegisterInfoCompletedError?: (\n error: CommonMessage,\n udfs: {\n definition: any\n value: any\n }[],\n authClient: AuthenticationClient\n ) => void\n}\n\nexport interface UserConfig {\n logo?: string\n title?: string\n description?: string\n zIndex?: number\n isSSO?: boolean\n mode?: GuardMode\n /**\n * @deprecated 使用 appHost\n */\n apiHost?: string\n /**\n * @deprecated 使用 appHost\n */\n appDomain?: string\n appHost?: string\n contentCss?: string\n text?: {\n loginBtn?: {\n normal?: string\n loading?: string\n }\n registerBtn?: {\n normal?: string\n loading?: string\n }\n // 登录 tab\n loginTabs?: Partial<Record<LoginMethods, string>>\n }\n escCloseable?: boolean\n autoRegister?: boolean\n clickCloseable?: boolean\n disableResetPwd?: boolean\n disableRegister?: boolean\n defaultScenes?: GuardScenes\n loginMethods?: LoginMethods[]\n target?: string | HTMLElement\n enterpriseConnections?: string[]\n defaultLoginMethod?: LoginMethods\n registerMethods?: RegisterMethods[]\n socialConnections?: (SocialConnections | SocialConnectionProvider)[]\n defaultRegisterMethod?: RegisterMethods\n qrCodeScanOptions?: Parameters<QrCodeAuthenticationClient['startScanning']>[1]\n /**\n * 国际化处理\n */\n localesConfig?: LocalesConfig\n lang?: Lang\n /**\n * 用于去品牌化\n */\n headers?: AuthenticationClientOptions['headers']\n passwordLoginMethods?: PasswordLoginMethods[]\n}\n\nexport interface GuardConfig extends UserConfig {\n socialConnectionObjs: SocialConnectionItem[]\n enterpriseConnectionObjs: EnterpriseConnectionItem[]\n extendsFields: ApplicationConfig['extendsFields']\n publicKey: ApplicationConfig['publicKey']\n agreementEnabled: boolean\n agreements: Agreement[]\n loginMethodTitleMapping: Record<string, string>\n qrcodeTabsSettings: QrcodeTabsSettings\n}\n\nexport interface LocalesConfig {\n defaultLang?: Lang\n isShowChange?: boolean\n onChange?: (lang: Lang) => void\n}\n","import { message } from 'antd'\nimport { GuardModuleType } from '.'\nimport { CompleteInfoEvents } from '../CompleteInfo/interface'\nimport { ForgetPasswordEvents } from '../ForgetPassword/interface'\nimport { IdentityBindingEvents } from '../IdentityBinding/interface'\nimport { IdentityBindingAskEvents } from '../IdentityBindingAsk'\nimport { LoginEvents } from '../Login/interface'\nimport { RegisterEvents } from '../Register/interface'\nimport { i18n } from '../_utils/locales'\n\nexport interface GuardEvents\n extends LoginEvents,\n RegisterEvents,\n CompleteInfoEvents,\n ForgetPasswordEvents,\n IdentityBindingEvents,\n IdentityBindingAskEvents {\n onBeforeChangeModule?: (\n key: GuardModuleType,\n initData?: any\n ) => boolean | Promise<boolean>\n}\n\nexport const guardEventsFilter = (props: any, openEventsMapping?: boolean) => {\n const events: GuardEvents = {}\n\n const eventsNameWhiteList = ['__changeModule']\n\n const eventsName = Object.keys(props).filter(\n (name) => name.startsWith('on') || eventsNameWhiteList.includes(name)\n )\n\n eventsName.forEach((eventName) => {\n events[eventName as keyof GuardEvents] = props[eventName]\n })\n\n return guardEventsHijacking(events, openEventsMapping)\n}\n\nconst eventsMapping: Partial<GuardEvents> = {\n onLogin: (...props) => {\n message.success(i18n.t('common.LoginSuccess'))\n return props\n },\n\n onRegister: (...props) => {\n message.success(i18n.t('common.registrationSuccess'))\n return props\n },\n}\n\nexport const guardEventsHijacking = (\n events: GuardEvents,\n openEventsMapping?: boolean\n): GuardEvents => {\n const newEvents: GuardEvents = {}\n Object.keys(eventsMapping).forEach((eventsKey) => {\n // @ts-ignore\n newEvents[eventsKey] = (...props) => {\n // @ts-ignore\n openEventsMapping && eventsMapping[eventsKey](...props)\n // @ts-ignore\n events[eventsKey]?.(...props)\n }\n })\n\n return {\n ...events,\n ...newEvents,\n }\n}\n","import { AuthenticationClient, CommonMessage } from 'authing-js-sdk'\nimport { Lang } from 'authing-js-sdk/build/main/types'\nimport { ApplicationConfig } from '../AuthingGuard/api'\nimport { GuardMode } from '../AuthingGuard/types/GuardConfig'\nimport { GuardModuleType } from '../Guard/module'\nimport { FacePlugin } from '../_utils/facePlugin/interface'\n\nexport interface IG2FCProps extends IG2Events {\n appId: string\n tenantId?: string\n config?: Partial<IG2Config>\n visible?: boolean\n initData?: any\n appendConfig?: GuardAppendConfig\n facePlugin?: FacePlugin\n}\n\nexport interface GuardAppendConfig {\n window?: Window\n internalRequest?: boolean\n singleComponent?: boolean\n unAuthFlow?: boolean\n publicConfig?: ApplicationConfig\n pageConfig?: GuardPageConfig\n}\n\nexport interface IG2FCViewProps extends IG2FCProps {\n config: IG2Config\n}\n\nexport interface IG2Config {\n title?: string\n logo?: string\n lang: Lang\n langRange: Lang[]\n host: string\n isHost?: boolean // 判断是否处于托管页面\n mode: GuardMode\n clickCloseable: boolean\n escCloseable: boolean\n userpool?: string\n contentCss?: string\n target?: HTMLElement | string\n __internalRequest__?: boolean\n __singleComponent__?: boolean\n __unAuthFlow__?: boolean\n}\n\nconst defaultG2Config: IG2Config = {\n lang: 'zh-CN',\n langRange: ['zh-CN', 'en-US'],\n escCloseable: true,\n clickCloseable: true,\n mode: GuardMode.Normal,\n host: 'https://core.authing.cn',\n}\n\nexport interface IG2Events {\n onLoad?: (authClient: AuthenticationClient) => void\n onLoadError?: (error: CommonMessage) => void\n onClose?: () => void\n onLangChange?: (lang: Lang) => void\n // __codePaser?: (code: number) => Function\n __changeModule?: (moduleName: GuardModuleType, initData?: any) => void\n}\n\nexport const getDefaultG2Config = (): IG2Config => defaultG2Config\n\nexport const LanguageMap: any = {\n 'en-US': 'US',\n en: 'GB',\n 'en-GB': 'GB',\n ja: 'JP',\n 'de-DE': 'DE',\n 'zh-CN': 'CN',\n}\n\nexport enum InputMethod {\n EmailCode = 'email-code',\n PhoneCode = 'phone-code',\n}\n\nexport enum GuardPageSene {\n Global = 'global',\n}\n\nexport interface GuardPageConfig {\n [GuardPageSene.Global]: {\n showChangeLanguage: boolean\n }\n}\n","import {\n getDefaultG2Config,\n IG2Config,\n IG2Events,\n IG2FCProps,\n IG2FCViewProps,\n} from '../Type'\nimport { SocialConnectionProvider } from 'authing-js-sdk'\nimport { QrCodeAuthenticationClient } from 'authing-js-sdk/build/main/lib/authentication/QrCodeAuthenticationClient'\nimport { Agreement, PasswordLoginMethods } from '../AuthingGuard/api'\nimport {\n PasswordLoginParams,\n LDAPLoginParams,\n ADLoginParams,\n PhoneCodeLoginParams,\n AuthenticationClient,\n User,\n} from '..'\nimport { LoginMethods } from '../AuthingGuard/types'\n\nexport interface LoginConfig extends IG2Config {\n autoRegister?: boolean\n disableResetPwd?: boolean\n disableRegister?: boolean\n defaultLoginMethod?: LoginMethods\n loginMethods?: LoginMethods[]\n passwordLoginMethods?: PasswordLoginMethods[]\n socialConnections?: SocialConnectionProvider[]\n socialConnectionsBtnShape?: 'default' | 'button' | 'icon'\n enterpriseConnections?: string[]\n qrCodeScanOptions?: Parameters<QrCodeAuthenticationClient['startScanning']>[1]\n publicKey?: string\n agreementEnabled?: boolean\n agreements?: Agreement[]\n}\n\nexport interface LoginEvents extends IG2Events {\n onLogin?: (user: User, authClient: AuthenticationClient) => void\n onLoginError?: (errorMessages: any) => void\n onLoginTabChange?: (activeTab: LoginMethods) => void\n onBeforeLogin?: (\n loginInfo:\n | PasswordLoginParams\n | LDAPLoginParams\n | ADLoginParams\n | PhoneCodeLoginParams,\n authClient: AuthenticationClient\n ) => boolean | Promise<boolean>\n}\n\nexport interface GuardLoginProps extends IG2FCProps, LoginEvents {\n config?: Partial<LoginConfig>\n}\nexport interface GuardLoginViewProps extends GuardLoginProps, IG2FCViewProps {\n config: LoginConfig\n}\n\nexport const getDefaultLoginConfig = (): LoginConfig => ({\n ...getDefaultG2Config(),\n})\n","import { RegisterMethods } from 'authing-js-sdk'\nimport { IG2FCProps, IG2Config, getDefaultG2Config, IG2Events } from '../Type'\nimport {\n AuthenticationClient,\n User,\n EmailRegisterParams,\n PhoneRegisterParams,\n} from '..'\nimport { Agreement } from '../AuthingGuard/api'\n\nexport interface RegisterConfig extends IG2Config {\n disableRegister?: boolean\n registerMethods?: RegisterMethods[]\n defaultRegisterMethod?: RegisterMethods\n publicKey?: string\n agreementEnabled?: boolean\n agreements?: Agreement[]\n registerContext?: any\n}\n\nconst defaultConfig: RegisterConfig = {\n ...getDefaultG2Config(),\n}\n\nexport interface RegisterEvents extends IG2Events {\n onBeforeRegister?: (\n registerInfo: EmailRegisterParams | PhoneRegisterParams,\n authClient: AuthenticationClient\n ) => boolean | Promise<boolean>\n onRegister?: (user: User, authClient: AuthenticationClient) => void\n onRegisterError?: (error: any) => void\n onRegisterTabChange?: (activeTab: RegisterMethods) => void\n}\n\nexport interface GuardRegisterProps extends IG2FCProps, RegisterEvents {\n config?: Partial<RegisterConfig>\n}\n\nexport interface GuardRegisterViewProps extends GuardRegisterProps {\n config: RegisterConfig\n}\n\nconst getDefaultConfig = (): RegisterConfig => ({\n ...getDefaultG2Config(),\n ...defaultConfig,\n})\n\nexport const getDefaultRegisterConfig = getDefaultConfig\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"style\", null, \"\\n #path-f {\\n fill: none;\\n stroke: #eaebee;\\n stroke-width: 10;\\n stroke-dasharray: 100 220;\\n animation: dash 40s infinite linear forwards;\\n }\\n #path-b {\\n fill: none;\\n stroke: #0080ff;\\n stroke-width: 8;\\n stroke-linecap: round;\\n stroke-linejoin: round;\\n }\\n @keyframes dash {\\n to {\\n stroke-dashoffset: 12000;\\n }\\n }\\n \");\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"g\", {\n id: \"\\\\u5355\\\\u72EC\",\n transform: \"translate(25.000000, 16.000000)\",\n fillRule: \"nonzero\",\n strokeWidth: 2\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M50,0 L0,30 C0,31 0,32 0,33 C0,69 20,100 50,116 C79,100 100,69 100,33 C100,32 99,31 99,30 L50,0 Z\",\n id: \"path-b\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M50,0 L0,30 C0,31 0,32 0,33 C0,69 20,100 50,116 C79,100 100,69 100,33 C100,32 99,31 99,30 L50,0 Z\",\n id: \"path-f\"\n}));\n\nfunction SvgLoading(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"100%\",\n height: \"100%\",\n viewBox: \"0 0 150 150\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), _ref2, title === undefined ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, \"Loading\") : title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref3);\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgLoading);\nexport default __webpack_public_path__ + \"static/media/loading.4a67a5f3.svg\";\nexport { ForwardRef as ReactComponent };","import { useEffect } from 'react'\nimport { GuardComponentConfig, GuardLocalConfig } from '../config'\nimport { GuardModuleType } from '../module'\nimport isEqual from 'lodash/isEqual'\nimport { getGuardWindow } from '../core/useAppendConfig'\n\nexport interface ModuleState {\n moduleName: GuardModuleType\n initData?: any\n}\n\nexport enum ActionType {\n ChangeModule = 'ChangeModule',\n Back = 'Back',\n Init = 'Init',\n}\n\nexport interface StateMachineLog {\n action: ActionType\n date: number\n dataSource: ModuleState\n}\n\nexport type ChangeModuleEvent = (\n nextModule: GuardModuleType,\n initData?: any\n) => void\n\nlet guardStateMachine: GuardStateMachine\n\nexport class GuardStateMachine {\n // 计数器\n private order: number = 0\n\n // 总体的配置信息\n private config: GuardComponentConfig = {}\n\n // 历史记录\n private moduleStateHistory: ModuleState[] = []\n\n private changeModuleEvent: ChangeModuleEvent\n\n // Log\n private stateMachineLog: Record<number, StateMachineLog> = {}\n\n constructor(changeModuleEvent: ChangeModuleEvent, initData: ModuleState) {\n this.changeModuleEvent = changeModuleEvent\n\n this.historyPush(initData, ActionType.Init)\n }\n globalWindow = (): Window | undefined => {\n const guardWindow = getGuardWindow()\n\n return guardWindow ?? undefined\n }\n\n next = (nextModule: GuardModuleType, initData: any) => {\n // window?.history.pushState(nextModule, '', window?.location.href)\n\n const moduleData: ModuleState = {\n moduleName: nextModule,\n initData,\n }\n this.changeModuleEvent(nextModule, initData)\n\n const prevModuleData = this.moduleStateHistory.slice(1, 2)[0]\n\n // 快照history\n if (prevModuleData && isEqual(prevModuleData, moduleData)) {\n this.back()\n } else {\n this.historyPush(moduleData)\n }\n\n // console.log('next Log', this.stateMachineLog)\n // console.log('next History', this.moduleStateHistory)\n }\n\n back = (initData: any = {}) => {\n if (this.moduleStateHistory.length <= 1) return\n const backModule = this.moduleStateHistory[1]\n this.changeModuleEvent(backModule.moduleName, {\n ...initData,\n ...backModule.initData,\n })\n this.moduleStateHistory.splice(0, 1)\n\n // console.log('back Log', this.stateMachineLog)\n }\n\n // 业务终点 Log 发送\n end = () => {\n // console.log('业务终点 Log', this.stateMachineLog)\n // TODO 请求\n }\n\n historyPush = (\n data: ModuleState,\n actionType: ActionType = ActionType.ChangeModule\n ) => {\n this.moduleStateHistory.unshift(data)\n\n this.stateMachineLog[this.order++] = {\n action: actionType,\n date: new Date().getTime(),\n dataSource: data,\n }\n\n if (this.moduleStateHistory.length > 10)\n this.moduleStateHistory.splice(10, this.moduleStateHistory.length - 10)\n }\n\n historyBack = (data: ModuleState) => {\n if (this.moduleStateHistory.length <= 1) return\n\n this.moduleStateHistory.splice(0, 1)\n this.stateMachineLog[this.order++] = {\n action: ActionType.Back,\n date: new Date().getTime(),\n dataSource: data,\n }\n }\n\n setConfig = (config: GuardLocalConfig) => {\n this.config = config\n }\n}\n\nexport const useHistoryHijack = (back?: () => void) => {\n const globalWindow = getGuardWindow()\n\n const next = (state: any = {}) => {\n globalWindow?.history.pushState(state, '', globalWindow?.location.href)\n }\n\n useEffect(() => {\n const onPopstate = () => {\n back?.()\n }\n back && globalWindow?.addEventListener('popstate', onPopstate)\n\n return () => {\n back && globalWindow?.removeEventListener('popstate', onPopstate)\n }\n }, [back, globalWindow])\n\n return [next]\n}\n\nexport const initGuardStateMachine = (\n changeMouleEvent: ChangeModuleEvent,\n initData: ModuleState\n) => {\n guardStateMachine = new GuardStateMachine(changeMouleEvent, initData)\n return guardStateMachine\n}\n\nexport const getGuardStateMachine = () => {\n if (!guardStateMachine) throw new Error('Please initialize GuardStateMachine')\n\n return guardStateMachine\n}\n\nexport const useGuardStateMachine = () => getGuardStateMachine()\n","import React from 'react'\n\n//@ts-ignore\nimport { ReactComponent as ShieldSpinLoading } from './loading.svg'\ninterface IG2SpinProps {\n size?: number\n}\n\nexport const ShieldSpin = (props: IG2SpinProps) => {\n let size = props.size ? props.size : 50\n\n return (\n <div\n style={{\n width: size,\n height: size,\n }}\n >\n <ShieldSpinLoading />\n </div>\n )\n}\n\nexport const Spin = () => (\n <div className=\"g2-init-setting-loading\">\n <ShieldSpin size={100} />\n </div>\n)\n","import React from 'react'\nimport { ReactNode } from 'react'\nimport { GuardModuleType } from '.'\nimport { getDefaultLoginConfig, LoginConfig } from '../Login/interface'\nimport { getDefaultRegisterConfig, RegisterConfig } from '../Register/interface'\nimport { ShieldSpin } from '../ShieldSpin'\n\nexport interface GuardComponentConfig extends Partial<GuardLocalConfig> {}\n\nexport interface GuardLocalConfig extends RegisterConfig, LoginConfig {\n isSSO?: boolean\n defaultScenes?: GuardModuleType\n defaultInitData?: any\n showLoading?: boolean\n loadingComponent?: ReactNode\n /**\n * @description 是否调用 eventsMapping 中的事件\n */\n openEventsMapping?: boolean\n}\n\nlet defaultConfig: GuardLocalConfig = {\n ...getDefaultLoginConfig(),\n ...getDefaultRegisterConfig(),\n isSSO: false,\n defaultInitData: {},\n showLoading: true,\n openEventsMapping: true,\n loadingComponent: (\n <div className=\"g2-init-setting-loading\">\n <ShieldSpin size={100} />\n </div>\n ),\n}\n\nexport const getDefaultGuardLocalConfig = (): GuardLocalConfig => {\n return defaultConfig\n}\n","export enum LoggerType {\n INFO = 'INFO',\n WARN = 'WARN',\n ERROR = 'ERROR',\n}\n","import { User } from '..'\nimport { getGuardHttp } from '../_utils/guardHttp'\n\nexport interface SessionData {\n session: null | {\n _id: string\n cookie: {\n originalMaxAge: number\n expires: Date\n secure: boolean\n httpOnly: boolean\n path: string\n sameSite: string\n }\n appId?: string\n type: string\n userId: string\n }\n userInfo?: User\n}\n\nexport const trackSession = async () => {\n const { get } = getGuardHttp()\n return await get<SessionData>(\n `/cas/session`,\n {},\n {\n credentials: 'include',\n }\n )\n}\n","import some from 'lodash/some'\nimport { getGuardWindow } from '../Guard/core/useAppendConfig'\nimport { i18n } from './locales'\n\nconst isOriginMatched = (\n whitelist: string[],\n corsWhitelist: string[],\n origin: string\n) => {\n const wildcard = require('wildcard')\n\n if (corsWhitelist.includes(origin)) {\n return true\n }\n\n if (\n some(corsWhitelist, (allowedOrigin) => {\n return !!wildcard(allowedOrigin, origin)\n })\n ) {\n return true\n }\n\n if (whitelist.includes(origin)) {\n return true\n }\n\n if (\n some(whitelist, (allowedOrigin) => {\n return !!wildcard(allowedOrigin, origin)\n })\n ) {\n return true\n }\n return false\n}\n\nexport const corsVerification = (\n allowedOrigins: string[] = [],\n corsWhitelist: string[] = []\n) => {\n const guardWindow = getGuardWindow()\n\n if (guardWindow && allowedOrigins.length > 0) {\n const origin = guardWindow.location.origin\n const allowed = isOriginMatched(allowedOrigins, corsWhitelist, origin)\n if (!allowed) {\n throw new Error(\n `${i18n.t('common.corsErrorMessage')}${i18n.t(\n 'common.corsErrorMessage2'\n )}`\n )\n }\n }\n}\n","import { LoggerType } from './interface'\n\nlet logger: Logger\n\nexport class Logger {\n public static printType = [LoggerType.ERROR]\n\n /**\n * 打印日志\n * @param message 日志信息\n * @param type 日志类型\n */\n public static log(message: string, type: LoggerType = LoggerType.INFO) {\n const log = {\n type,\n message,\n }\n console.log(JSON.stringify(log))\n }\n\n public static info(message: string) {\n this.log(message, LoggerType.INFO)\n }\n\n public static warn(message: string) {\n this.log(message, LoggerType.WARN)\n }\n\n public static error(message: string) {\n this.log(message, LoggerType.ERROR)\n }\n}\n\nexport const getLogger = () => {\n if (logger === undefined) logger = new Logger()\n\n return logger\n}\n\nexport const useLogger = getLogger\n","import { LoginMethods, RegisterMethods } from 'authing-js-sdk'\nimport { ApplicationConfig } from '../../AuthingGuard/api'\nimport { assembledRequestHost as utilAssembledRequestHost } from '..'\nimport { GuardComponentConfig, GuardLocalConfig } from '../../Guard/config'\nimport { useCallback, useEffect, useState } from 'react'\nimport { AuthingResponse } from '../http'\nimport { GuardHttp } from '../guardHttp'\nimport { corsVerification } from '../corsVerification'\nimport { Logger } from '../logger'\n\nlet publicConfigMap: Record<string, ApplicationConfig> = {}\n\nexport const getPublicConfig = (appId: string) => publicConfigMap?.[appId]\n\nexport const setPublicConfig = (appId: string, config: ApplicationConfig) =>\n (publicConfigMap[appId] = config)\n\nconst requestPublicConfig = async (\n appId: string,\n httpClient: GuardHttp\n): Promise<ApplicationConfig> => {\n let res: AuthingResponse<ApplicationConfig>\n\n const { get } = httpClient\n\n try {\n res = await get<ApplicationConfig>(\n `/api/v2/applications/${appId}/public-config`\n )\n } catch (error) {\n Logger.error('Please check your config or network')\n throw new Error('Please check your config or network')\n }\n\n if (res.code !== 200 || !res.data) {\n Logger.error(res?.message ?? 'Please check your config')\n throw new Error(res?.message ?? 'Please check your config')\n }\n\n corsVerification(res.data.allowedOrigins, res.data.corsWhitelist)\n\n setPublicConfig(appId, res.data)\n\n return getPublicConfig(appId)\n}\n\nexport const useMergeDefaultConfig = (\n defaultConfig: GuardLocalConfig,\n config?: GuardComponentConfig\n): GuardLocalConfig | undefined => {\n const [mergedConfig, setMergedConfig] = useState<GuardLocalConfig>()\n\n useEffect(() => {\n setMergedConfig({\n ...defaultConfig,\n ...config,\n })\n }, [defaultConfig, config])\n\n return mergedConfig\n}\n\nconst mergedPublicConfig = (\n config: GuardLocalConfig,\n publicConfig: ApplicationConfig\n): GuardLocalConfig => {\n const mergedPublicConfig: GuardLocalConfig = {\n ...config,\n title: config.title ?? publicConfig.name,\n logo: !!config.logo ? config.logo : publicConfig.logo,\n loginMethods:\n config?.loginMethods ??\n (publicConfig.loginTabs?.list as LoginMethods[]) ??\n [],\n passwordLoginMethods:\n config?.passwordLoginMethods ??\n publicConfig.passwordTabConfig?.enabledLoginMethods ??\n [],\n // 默认登录方式\n defaultLoginMethod:\n config.defaultLoginMethod ??\n (publicConfig.loginTabs.default as LoginMethods),\n // 禁止重制密码\n disableResetPwd: !!(\n config.disableResetPwd ??\n !publicConfig.ssoPageComponentDisplay?.forgetPasswordBtn\n ),\n // 是否自动注册\n autoRegister:\n config.autoRegister ??\n publicConfig.ssoPageComponentDisplay.autoRegisterThenLoginHintInfo,\n registerMethods:\n config.registerMethods ??\n (publicConfig.registerTabs?.list as RegisterMethods[]),\n defaultRegisterMethod:\n config.defaultRegisterMethod ??\n (publicConfig.registerTabs.default as RegisterMethods),\n // 禁止注册\n disableRegister: !!(\n config.disableRegister ??\n !publicConfig.ssoPageComponentDisplay.registerBtn\n ),\n // publicKey\n publicKey: config.publicKey ?? publicConfig.publicKey,\n // 注册协议\n agreementEnabled: config.agreementEnabled ?? publicConfig.agreementEnabled,\n agreements: config.agreements ?? publicConfig.agreements,\n contentCss: config.contentCss ?? publicConfig.css,\n }\n\n return mergedPublicConfig\n}\n\n// host 拼接\nconst assembledRequestHost = (\n config: GuardLocalConfig,\n publicConfig: ApplicationConfig\n) => {\n const host = config?.__internalRequest__\n ? config?.host\n : utilAssembledRequestHost(publicConfig.requestHostname, config?.host!)\n\n return host\n}\n\nexport const useMergePublicConfig = (\n appId: string,\n config?: GuardLocalConfig,\n httpClient?: GuardHttp,\n serError?: any\n) => {\n const [publicConfig, setPublicConfig] = useState<ApplicationConfig>()\n\n const initPublicConfig = useCallback(async () => {\n if (httpClient && appId)\n if (!getPublicConfig(appId)) {\n try {\n await requestPublicConfig(appId, httpClient)\n } catch (error) {\n serError(error)\n }\n }\n\n setPublicConfig(getPublicConfig(appId))\n }, [appId, httpClient, serError])\n\n useEffect(() => {\n initPublicConfig()\n }, [initPublicConfig])\n\n if (publicConfig && config) {\n return {\n ...mergedPublicConfig(config, publicConfig),\n host: assembledRequestHost(config, publicConfig),\n }\n }\n}\n","import React, { useContext } from 'react'\nimport {\n GuardEvents,\n GuardLocalConfig,\n GuardModuleType,\n GuardPageConfig,\n} from '..'\nimport { ApplicationConfig } from '../AuthingGuard/api'\nimport { ModuleState } from '../Guard/GuardModule/stateMachine'\nimport { GuardHttp } from './guardHttp'\n\nexport interface IGuardContext {\n finallyConfig: GuardLocalConfig\n\n defaultMergedConfig: GuardLocalConfig\n\n publicConfig: ApplicationConfig\n\n httpClient: GuardHttp\n\n appId: string\n\n initData: any\n\n currentModule: ModuleState\n\n events: Partial<GuardEvents>\n\n changeModule?: (moduleName: GuardModuleType, initData?: any) => Promise<void>\n\n backModule?: () => void\n\n isAuthFlow: boolean\n\n contextLoaded: boolean\n\n guardPageConfig: Partial<GuardPageConfig>\n}\n\nconst DefaultGuardX: IGuardContext = {\n finallyConfig: {} as GuardLocalConfig,\n\n defaultMergedConfig: {} as GuardLocalConfig,\n\n publicConfig: {} as ApplicationConfig,\n\n httpClient: {} as GuardHttp,\n\n appId: '',\n\n initData: {},\n\n currentModule: {} as ModuleState,\n\n events: {} as Partial<GuardEvents>,\n\n isAuthFlow: false,\n\n contextLoaded: false,\n\n guardPageConfig: {} as Partial<GuardPageConfig>,\n}\n\nconst GuardXContext = React.createContext<IGuardContext>(DefaultGuardX)\n\nexport const createGuardXContext = () => {\n const Provider = GuardXContext.Provider\n const Consumer = GuardXContext.Consumer\n\n const guardXProvider: React.FC<{ value: Partial<IGuardContext> }> = ({\n value,\n children,\n }) => {\n return (\n <Provider\n value={{\n ...DefaultGuardX,\n ...value,\n }}\n >\n {children}\n </Provider>\n )\n }\n\n return {\n Provider: guardXProvider,\n Consumer,\n }\n}\n\nexport const useGuardPublicConfig = () => useContext(GuardXContext).publicConfig\n\nexport const useGuardHttpClient = () => useContext(GuardXContext).httpClient\n\nexport const useGuardDefaultMergedConfig = () =>\n useContext(GuardXContext).defaultMergedConfig\n\nexport const useGuardAppId = () => useContext(GuardXContext).appId\n\nexport function useGuardInitData<T>(): T {\n const { initData } = useContext(GuardXContext)\n return initData as T\n}\n\nexport const useGuardCurrentModule = () =>\n useContext(GuardXContext).currentModule\n\nexport const useGuardEvents = () => useContext(GuardXContext).events\n\nexport const useGuardModule = () => {\n const guardX = useContext(GuardXContext)\n\n return {\n changeModule: guardX.changeModule,\n backModule: guardX.backModule,\n }\n}\n\nexport const useGuardFinallyConfig = () =>\n useContext(GuardXContext).finallyConfig\n\nexport const useGuardContextLoaded = () =>\n useContext(GuardXContext).contextLoaded\n\nexport const useGuardIsAuthFlow = () => useContext(GuardXContext).isAuthFlow\n\nexport const useGuardPageConfig = () =>\n useContext(GuardXContext).guardPageConfig\n","export enum ErrorCode {\n OTP_MFA_CODE = 1635,\n APP_MFA_CODE = 1636,\n INPUT_CAPTCHACODE = 2000,\n USER_EXISTENCE = 2026,\n LOGIN_INVALID = 2021,\n PASSWORD_ERROR = 2333,\n USER_NOT_EXIST = 2004,\n MULTIPLE_ERROR_LOCK = 2057,\n ACCOUNT_LOCK = 2005,\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { GuardPageConfig } from '..'\nimport { GuardHttp } from './guardHttp'\nimport { AuthingResponse } from './http'\nimport { Logger } from './logger'\n\nlet pageConfigMap: Record<string, GuardPageConfig> = {}\n\nexport const getPageConfig = (appId: string) => pageConfigMap?.[appId]\n\nexport const setPageConfig = (appId: string, config: GuardPageConfig) =>\n (pageConfigMap[appId] = config)\n\nexport const requestGuardPageConfig = async (\n appId: string,\n httpClient: GuardHttp\n): Promise<GuardPageConfig> => {\n let res: AuthingResponse<GuardPageConfig>\n\n const { get } = httpClient\n\n try {\n res = await get<GuardPageConfig>(\n `/api/v2/applications/${appId}/components-public-config/guard`\n )\n } catch (error) {\n Logger.error('Please check your config or network')\n throw new Error('Please check your config or network')\n }\n\n if (res.code !== 200 || !res.data) {\n Logger.error(res?.message ?? 'Please check your config')\n throw new Error(res?.message ?? 'Please check your config')\n }\n\n setPageConfig(appId, res.data)\n\n return getPageConfig(appId)\n}\n\nexport const useGuardPageConfig = (\n appId: string,\n httpClient?: GuardHttp,\n serError?: any\n) => {\n const [pageConfig, setPageConfig] = useState<GuardPageConfig>()\n\n const initPublicConfig = useCallback(async () => {\n if (httpClient && appId)\n if (!getPageConfig(appId)) {\n try {\n await requestGuardPageConfig(appId, httpClient)\n } catch (error) {\n serError(error)\n }\n }\n\n setPageConfig(getPageConfig(appId))\n }, [appId, httpClient, serError])\n\n useEffect(() => {\n initPublicConfig()\n }, [initPublicConfig])\n\n if (pageConfig) {\n return pageConfig\n }\n}\n","import { useEffect, useState } from 'react'\nimport { ApplicationConfig } from '../AuthingGuard/api'\nimport { getGuardWindow } from '../Guard/core/useAppendConfig'\nimport { init } from './iconfont'\n\nexport const useGuardIconfont = (publicConfig?: ApplicationConfig) => {\n const [svgString, setSvgString] = useState<string>()\n\n const [loaded, setLoaded] = useState<boolean>(false)\n\n const loadSvgString = async (cdnBase: string) => {\n const res = await fetch(`${cdnBase}/svg-string/guard`)\n\n const body = await res.text()\n\n setSvgString(body)\n }\n\n useEffect(() => {\n if (!publicConfig?.cdnBase) return\n\n if (svgString) return\n\n loadSvgString(publicConfig.cdnBase)\n }, [publicConfig, svgString])\n\n useEffect(() => {\n if (!svgString) return\n\n const guardWindow = getGuardWindow()\n\n if (!guardWindow) return\n\n init(guardWindow, svgString)\n\n setLoaded(true)\n }, [svgString])\n\n if (loaded) {\n return true\n }\n}\n","export const init = function (guardWindow, svgString) {\n let c, t, l, e, i, o\n\n let m = guardWindow.document.getElementsByTagName('script')\n\n m = m[m.length - 1]?.getAttribute('data-injectcss')\n\n if (m && !guardWindow.__iconfont__svg__cssinject__) {\n guardWindow.__iconfont__svg__cssinject__ = !0\n try {\n guardWindow.document.write(\n '<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>'\n )\n } catch (a) {\n console && console.log(a)\n }\n }\n function n() {\n i || ((i = !0), l())\n }\n ;(c = function () {\n let a, c, t\n ;((t = guardWindow.document.createElement('div')).innerHTML = svgString),\n (svgString = null),\n (c = t.getElementsByTagName('svg')[0]) &&\n (c.setAttribute('aria-hidden', 'true'),\n (c.style.position = 'absolute'),\n (c.style.width = 0),\n (c.style.height = 0),\n (c.style.overflow = 'hidden'),\n (a = c),\n (t = guardWindow.document.body).firstChild\n ? (c = t.firstChild).parentNode.insertBefore(a, c)\n : t.appendChild(a))\n }),\n guardWindow.document.addEventListener\n ? ~['complete', 'loaded', 'interactive'].indexOf(\n guardWindow.document.readyState\n )\n ? setTimeout(c, 0)\n : ((t = function () {\n guardWindow.document.removeEventListener('DOMContentLoaded', t, !1),\n c()\n }),\n guardWindow.document.addEventListener('DOMContentLoaded', t, !1))\n : guardWindow.document.attachEvent &&\n ((l = c),\n (e = guardWindow.document),\n (i = !1),\n (o = function () {\n try {\n e.documentElement.doScroll('left')\n } catch (a) {\n return void setTimeout(o, 50)\n }\n n()\n })(),\n (e.onreadystatechange = function () {\n 'complete' == e.readyState && ((e.onreadystatechange = null), n())\n }))\n}\n","import { GuardProps } from '..'\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useState,\n} from 'react'\nimport { initGuardAuthClient } from '../authClient'\nimport { GuardEvents, guardEventsFilter } from '../event'\nimport { insertStyles } from '../../_utils'\nimport { getDefaultGuardLocalConfig } from '../config'\nimport { GuardModuleType } from '../module'\n\nimport {\n GuardStateMachine,\n initGuardStateMachine,\n ModuleState,\n useHistoryHijack,\n} from '../GuardModule/stateMachine'\nimport { AuthenticationClient } from '../..'\nimport { ApplicationConfig } from '../../AuthingGuard/api'\nimport { SessionData, trackSession } from '../sso'\nimport {\n getPublicConfig,\n useMergeDefaultConfig,\n useMergePublicConfig,\n} from '../../_utils/config/index'\nimport { GuardHttp, initGuardHttp } from '../../_utils/guardHttp'\nimport { initI18n } from '../../_utils/locales'\nimport { createGuardXContext } from '../../_utils/context'\nimport { useGuardPageConfig } from '../../_utils/guardPageConfig'\nimport { useGuardIconfont } from '../../IconFont/useGuardIconfont'\n\ninterface IBaseAction<T = string, P = any> {\n type: T & string\n payload?: Partial<P>\n}\n\nexport const RenderContext: React.FC<{\n guardProps: GuardProps\n initState: ModuleState\n}> = ({ guardProps, initState, children }) => {\n const { appId, tenantId, config } = guardProps\n\n const [events, setEvents] = useState<GuardEvents>()\n const [authClint, setAuthClint] = useState<AuthenticationClient>()\n const [httpClient, setHttpClient] = useState<GuardHttp>()\n const [publicConfig, setPublicConfig] = useState<ApplicationConfig>()\n const [error, setError] = useState()\n const [isAuthFlow, setIsAuthFlow] = useState(true)\n\n // 状态机\n const [\n guardStateMachine,\n setGuardStateMachine,\n ] = useState<GuardStateMachine>()\n\n const { Provider } = createGuardXContext()\n\n // 劫持浏览器 History\n const [historyNext] = useHistoryHijack(guardStateMachine?.back)\n\n // modules 定义\n const moduleReducer: (\n state: ModuleState,\n action: IBaseAction<GuardModuleType, ModuleState>\n ) => ModuleState = (state, { type, payload }) => {\n return {\n moduleName: type,\n initData: payload?.initData,\n }\n }\n\n // Modules Reducer\n const [moduleState, changeModule] = useReducer(moduleReducer, initState)\n\n // Change Module\n const onChangeModule = useCallback(\n (moduleName: GuardModuleType, initData: any = {}) => {\n historyNext(moduleName)\n\n changeModule({\n type: moduleName,\n payload: {\n initData: initData ?? {},\n },\n })\n },\n [historyNext]\n )\n\n // 合并默认值\n const defaultMergedConfig = useMergeDefaultConfig(\n getDefaultGuardLocalConfig(),\n config\n )\n\n // HttpClient\n useEffect(() => {\n if (!appId || !defaultMergedConfig) return\n\n const httpClient = initGuardHttp(defaultMergedConfig.host)\n\n httpClient.setAppId(appId)\n\n tenantId && httpClient.setTenantId(tenantId)\n\n setHttpClient(httpClient)\n }, [appId, defaultMergedConfig, tenantId])\n\n const finallyConfig = useMergePublicConfig(\n appId,\n defaultMergedConfig,\n httpClient,\n setError\n )\n\n // guardPageConfig\n const guardPageConfig = useGuardPageConfig(appId, httpClient, setError)\n\n // iconfont\n const iconfontLoaded = useGuardIconfont(publicConfig)\n\n // SSO 登录\n useEffect(() => {\n if (!config?.isSSO || !authClint || !events || !httpClient) return\n\n trackSession().then((sessionData) => {\n // 这个接口没有 code, data, 直接返回了数据\n let typedData = (sessionData as unknown) as SessionData\n if (typedData.userInfo) {\n events?.onLogin?.(typedData.userInfo, authClint!)\n }\n })\n }, [appId, authClint, config?.isSSO, events, httpClient])\n\n useEffect(() => {\n if (httpClient && finallyConfig) {\n httpClient?.setBaseUrl(finallyConfig.host)\n }\n }, [finallyConfig, httpClient])\n\n // I18n\n useEffect(() => {\n // TODO 国际化 这部分有点小问题 等待优化\n initI18n({}, config?.lang)\n }, [config?.lang])\n\n useEffect(() => {\n if (!appId) return\n\n const publicConfig = getPublicConfig(appId)\n\n if (!publicConfig) return\n\n setPublicConfig(publicConfig)\n }, [appId, finallyConfig])\n\n // AuthClient\n useEffect(() => {\n if (appId && finallyConfig && publicConfig) {\n const authClint = initGuardAuthClient(\n finallyConfig,\n appId,\n publicConfig?.websocket,\n tenantId\n )\n setAuthClint(authClint)\n }\n }, [appId, finallyConfig, publicConfig, tenantId])\n\n // initEvents\n useEffect(() => {\n if (!defaultMergedConfig) return\n\n const events = guardEventsFilter(\n {\n ...guardProps,\n },\n defaultMergedConfig?.openEventsMapping\n )\n setEvents(events)\n }, [guardProps, defaultMergedConfig])\n\n // 状态机相关\n useEffect(() => {\n const guardStateMachine = initGuardStateMachine(onChangeModule, initState)\n setGuardStateMachine(guardStateMachine)\n\n // TODO 这里有一个循环依赖问题,藏的有点深 待优化\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n // 自定义 CSS 处理\n useEffect(() => {\n if (finallyConfig && finallyConfig.contentCss)\n insertStyles(finallyConfig.contentCss)\n }, [finallyConfig])\n\n // 是否使用 Guard auth flow\n useEffect(() => {\n if (!finallyConfig) return\n\n setIsAuthFlow(!Boolean(finallyConfig?.__unAuthFlow__))\n }, [finallyConfig])\n\n const moduleEvents = useMemo(() => {\n if (!events && !guardStateMachine) return undefined\n return {\n changeModule: async (moduleName: GuardModuleType, initData?: any) => {\n // 单体组件处理\n if (finallyConfig?.__singleComponent__) {\n events?.__changeModule?.(moduleName, initData)\n } else {\n if (!events?.onBeforeChangeModule) {\n guardStateMachine?.next(moduleName, initData)\n } else if (await events.onBeforeChangeModule(moduleName, initData)) {\n guardStateMachine?.next(moduleName, initData)\n }\n }\n },\n backModule: () => {\n guardStateMachine?.back()\n },\n }\n }, [events, finallyConfig?.__singleComponent__, guardStateMachine])\n\n const contextLoaded = useMemo(() => {\n const list = [\n appId,\n events,\n defaultMergedConfig,\n finallyConfig,\n httpClient,\n moduleEvents,\n publicConfig,\n authClint,\n guardPageConfig,\n iconfontLoaded,\n ]\n\n return !list.includes(undefined)\n }, [\n appId,\n events,\n defaultMergedConfig,\n finallyConfig,\n httpClient,\n moduleEvents,\n publicConfig,\n authClint,\n guardPageConfig,\n iconfontLoaded,\n ])\n\n // TODO 触发 onLoad 事件\n useEffect(() => {\n if (!contextLoaded) return\n\n events?.onLoad?.(authClint!)\n }, [authClint, contextLoaded, events])\n\n const contextValues = useMemo(\n () => ({\n contextLoaded,\n isAuthFlow,\n defaultMergedConfig,\n finallyConfig,\n publicConfig,\n httpClient,\n appId,\n events,\n ...moduleEvents,\n initData: moduleState.initData,\n currentModule: moduleState,\n guardPageConfig,\n }),\n [\n appId,\n contextLoaded,\n defaultMergedConfig,\n events,\n finallyConfig,\n guardPageConfig,\n httpClient,\n isAuthFlow,\n moduleEvents,\n moduleState,\n publicConfig,\n ]\n )\n\n const renderContext = useMemo(() => {\n return <Provider value={contextValues}>{children}</Provider>\n }, [Provider, children, contextValues])\n\n const renderLoadingContext = useMemo(() => {\n return <Provider value={contextValues}>{children}</Provider>\n }, [Provider, children, contextValues])\n\n const renderErrorContext = useMemo(() => {\n return (\n <Provider\n value={{\n contextLoaded: true,\n defaultMergedConfig,\n initData: {\n error: error,\n },\n currentModule: {\n moduleName: GuardModuleType.ERROR,\n initData: {\n error,\n },\n },\n }}\n >\n {children}\n </Provider>\n )\n }, [Provider, children, defaultMergedConfig, error])\n\n const render = useMemo(() => {\n if (error) return renderErrorContext\n\n if (contextLoaded) return renderLoadingContext\n else if (defaultMergedConfig) return renderContext\n else return null\n }, [\n contextLoaded,\n defaultMergedConfig,\n error,\n renderContext,\n renderErrorContext,\n renderLoadingContext,\n ])\n\n return render\n}\n","import {\n GuardMode,\n UserConfig,\n GuardScenes,\n LoginMethods,\n RegisterMethods,\n LocalesConfig,\n} from '../../components/AuthingGuard/types'\nimport { i18n } from '../_utils/locales'\n\n// 个人版 OTP MFA 的 error code\nexport const OTP_MFA_CODE = 1635\n// 企业版手机和短信验证吗 MFA 的 error code\nexport const APP_MFA_CODE = 1636\n\n// 需要验证吗\nexport const NEED_CAPTCHA = 2000\n\nexport const LOGIN_METHODS_MAP = () => ({\n [LoginMethods.Password]: i18n.t('login.pwdLogin'),\n [LoginMethods.PhoneCode]: i18n.t('login.verifyCodeLogin'),\n [LoginMethods.AppQr]: i18n.t('login.appScanLogin'),\n [LoginMethods.WxMinQr]: i18n.t('login.scanLogin'),\n [LoginMethods.LDAP]: i18n.t('login.ldapLogin'),\n [LoginMethods.AD]: i18n.t('login.adLogin'),\n [LoginMethods.WechatMpQrcode]: i18n.t('login.wechatmpQrcode'),\n})\n\nexport const REGISTER_METHODS_MAP = () => ({\n [RegisterMethods.Email]: i18n.t('login.emailRegister'),\n [RegisterMethods.Phone]: i18n.t('login.phoneRegister'),\n})\n\n// 某些社会化登录会在 tabs 中显示,或者无法在 Guard 中使用,所以底部不显示了\nexport const HIDE_SOCIALS = [\n 'wechat:miniprogram:app-launch',\n 'wechat:miniprogram:qrconnect',\n // 'wechat:webpage-authorization',\n 'wechat:miniprogram:default',\n 'wechatwork:addressbook',\n 'wechat:mobile',\n]\n\nexport const HIDE_SOCIALS_SHOWIN_ENTERPRISE = [\n 'dingtalk',\n 'lark-public',\n 'lark-internal',\n 'wechatwork:corp:qrconnect',\n 'wechatwork:service-provider:qrconnect',\n 'wechatwork:agency:qrconnect',\n]\n\n// 企业版 MFA 支持的方式\nexport enum ApplicationMfaType {\n SMS = 'SMS',\n EMAIL = 'EMAIL',\n // OTP = 'OTP',\n // FACE = 'FACE',\n // FINGERPRINT = 'FINGERPRINT',\n}\n\nexport const defaultGuardConfig: Partial<UserConfig> = {\n isSSO: false,\n title: 'Authing',\n text: {\n loginTabs: LOGIN_METHODS_MAP(),\n loginBtn: {\n normal: '登录',\n loading: '登录',\n },\n registerBtn: {\n normal: '注册',\n loading: '注册',\n },\n },\n escCloseable: true,\n autoRegister: false,\n clickCloseable: true,\n mode: GuardMode.Normal,\n disableRegister: false,\n disableResetPwd: false,\n defaultScenes: GuardScenes.Login,\n appHost: 'https://core.authing.cn',\n defaultLoginMethod: LoginMethods.Password,\n defaultRegisterMethod: RegisterMethods.Email,\n loginMethods: [LoginMethods.Password, LoginMethods.PhoneCode],\n registerMethods: [RegisterMethods.Email, RegisterMethods.Phone],\n logo:\n 'https://files.authing.co/user-contents/photos/0a4c99ff-b8ce-4030-aaaf-584c807cb21c.png',\n passwordLoginMethods: [\n 'email-password',\n 'username-password',\n 'phone-password',\n ],\n}\n\nexport const defaultLocalesConfig: LocalesConfig = {\n defaultLang: 'zh-CN',\n isShowChange: false,\n}\n\nexport const defaultHeaders: {\n 'userpool-id': string\n 'app-id': string\n 'tenant-id': string\n 'sdk-version': string\n 'request-from': string\n lang: string\n} = {\n 'userpool-id': 'x-authing-userpool-id',\n 'app-id': 'x-authing-app-id',\n 'tenant-id': 'x-authing-app-tenant-id',\n 'request-from': 'x-authing-request-from',\n 'sdk-version': 'x-authing-sdk-version',\n lang: 'x-authing-lang',\n}\n","import React, { FC } from 'react'\nimport { getClassnames } from '../_utils'\nimport './iconfont'\nimport './style.less'\n\nexport const IconFont: FC<{\n type: string\n style?: React.CSSProperties\n className?: string\n}> = ({ type, style, className }) => {\n return (\n <svg style={{ ...style }} className={getClassnames(['g2-icon', className])}>\n <use xlinkHref={`#${type}`}></use>\n </svg>\n )\n}\n","import React, { FC } from 'react'\nimport { GuardModuleType } from '../../Guard/module'\nimport { createBaseContext } from '../base'\n\nexport interface IModuleContext {\n module: string\n changeModule: React.Dispatch<GuardModuleType>\n setInitData: React.Dispatch<any>\n}\n\nconst [Context, useBaseContext] = createBaseContext<IModuleContext>()\n\nexport const useModule: () => IModuleContext = () => {\n const guardContext = useBaseContext()\n\n return guardContext\n}\n\nexport const ModuleContext: FC<{\n value: IModuleContext\n}> = ({ children = null, value }) => {\n return <Context.Provider value={value}>{children}</Context.Provider>\n}\n","import { getGuardHttp } from '../_utils/guardHttp'\n\nexport enum BindTotpBusinessAction {\n VerifyTotpFirstTime = 'verify-totp-first-time',\n ConfirmTotpRecoveryCode = 'confirm-totp-recovery-code',\n}\n\nexport const authFlow = async (\n action: BindTotpBusinessAction,\n content: any\n) => {\n const { authFlow } = getGuardHttp()\n\n const res = await authFlow(action, { ...content })\n\n return res\n}\n","import { useRef, useCallback, useEffect } from 'react'\nimport { GuardModuleType } from '../../Guard/module'\nimport { useModule } from '../../context/module/context'\nimport { useMediaQuery } from 'react-responsive'\nimport phone from 'phone'\nimport { LanguageMap } from '../../Type'\nimport { SocialConnectionProvider } from 'authing-js-sdk'\nimport {\n HIDE_SOCIALS,\n HIDE_SOCIALS_SHOWIN_ENTERPRISE,\n} from '../../AuthingGuard/constants'\nimport { isLarkBrowser, isSpecialBrowser, isWeChatBrowser } from '..'\nimport { ApplicationConfig, SocialConnectionItem } from '../../AuthingGuard/api'\nimport { GuardLocalConfig } from '../../Guard'\nimport { getGuardWindow } from '../../Guard/core/useAppendConfig'\nexport interface PhoneValidResult {\n isValid: boolean\n phoneNumber: string\n countryIso2: string\n countryIso3: string\n countryCode: string\n}\n\nexport const useChangeModule = () => {\n const { module, changeModule, setInitData } = useModule()\n\n const nextModule = (nextModuleType: GuardModuleType, nextData?: any) => {\n if (nextModuleType !== module) changeModule(nextModuleType)\n\n setInitData(nextData ?? {})\n }\n\n return nextModule\n}\n\nlet thisAppId: string = ''\n\nexport const useAppId = (appId?: string) => {\n if (appId) {\n thisAppId = appId\n }\n\n return thisAppId\n}\n\nexport const useDebounce = (\n // 回调函数\n fn: any,\n // 延迟时间\n delay: number\n) => {\n const timer = useRef<{ time: any }>({ time: null })\n const errorBody = useRef<{ body: any }>({ body: null })\n\n useEffect(() => {\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n timer.current.time && clearInterval(timer.current.time)\n }\n }, [])\n\n return useCallback(\n (...args: any[]) => {\n if (timer.current.time) {\n clearTimeout(timer.current.time)\n timer.current.time = null\n }\n timer.current.time = setTimeout(() => {\n // fn.apply(this, args);\n const res = fn(...args)\n timer.current.time = null\n errorBody.current.body = res\n }, delay)\n // if (errorBody.current.body) {\n // return Promise.reject(errorBody.current.body)\n // } else {\n // return Promise.resolve()\n // }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [timer.current, delay]\n )\n}\n\nexport const useMediaSize = () => {\n const isPhoneMedia = useMediaQuery({\n maxWidth: 450,\n })\n\n return {\n isPhoneMedia,\n }\n}\n// shaking 抖动\nexport const useShaking = () => {\n // form input\n const inputs = document.getElementsByClassName('authing-g2-input')\n // 必选协议\n const agreements = document.getElementsByClassName(\n 'authing-agreements-item-invalid'\n )\n const saftyCode = document.getElementsByClassName('authing-g2-code-input')\n\n const bindTotpSecretSave = document.getElementsByClassName(\n 'g2-mfa-bindTotp-secretSave'\n )\n // 挂载 shaking\n const MountShaking = () => {\n Array.from(inputs).forEach((input) => {\n input.classList.add('shaking')\n })\n Array.from(agreements).forEach((agreement) => {\n agreement.classList.add('shaking')\n })\n saftyCode[0] && saftyCode[0].classList.add('shaking')\n bindTotpSecretSave[0] && bindTotpSecretSave[0].classList.add('shaking')\n }\n // 卸载 shaking\n const UnMountShaking = () => {\n Array.from(inputs).forEach((input) => {\n input.classList.remove('shaking')\n })\n Array.from(agreements).forEach((agreement) => {\n agreement.classList.remove('shaking')\n })\n saftyCode[0] && saftyCode[0].classList.remove('shaking')\n bindTotpSecretSave[0] && bindTotpSecretSave[0].classList.remove('shaking')\n }\n return { MountShaking, UnMountShaking }\n}\nexport const defaultAreaCode = (() => {\n if (typeof navigator === 'undefined') {\n return 'CN'\n }\n return LanguageMap[navigator.language]\n ? LanguageMap[navigator.language]\n : 'CN'\n})()\n\n/**\n * 解析手机号\n * @param fieldValue 字段值\n * @param areaCode 区号\n * @returns\n */\nexport const parsePhone = (\n isInternationSms: boolean,\n fieldValue: string,\n areaCode: string = defaultAreaCode\n) => {\n let countryCode = undefined\n\n let phoneNumber = fieldValue\n // 未开启国家化短信\n if (!isInternationSms) {\n return { phoneNumber, countryCode: undefined }\n }\n // 处理 类似 192*******9 情况\n if (phone(fieldValue, { country: areaCode }).isValid) {\n const parsePhone = phone(fieldValue, {\n country: areaCode,\n }) as PhoneValidResult\n\n countryCode = parsePhone.countryCode as string\n\n phoneNumber = parsePhone.phoneNumber.split(countryCode)[1]\n } else if (phone(fieldValue).isValid) {\n // 处理 +86 19294229909 情况\n const parsePhone = phone(fieldValue) as PhoneValidResult\n\n countryCode = parsePhone.countryCode as string\n\n phoneNumber = parsePhone.phoneNumber.split(countryCode)[1]\n }\n\n return { countryCode, phoneNumber }\n}\n\n/**\n *\n * @param config\n * @returns[socialConnectionObjs 社交身份源连接对象 enterpriseConnectionObjs 企业身份源连接对象 isNoMethod 是否没有身份源 ]\n */\nexport const useMethod: (params: {\n config: GuardLocalConfig\n publicConfig: ApplicationConfig\n}) => any = ({ config, publicConfig }) => {\n const noLoginMethods = !config?.loginMethods?.length\n\n let enterpriseConnectionObjs: ApplicationConfig['identityProviders']\n\n if (config.enterpriseConnections) {\n enterpriseConnectionObjs =\n publicConfig?.identityProviders?.filter?.((item) =>\n config.enterpriseConnections!.includes(item.identifier)\n ) || []\n } else {\n enterpriseConnectionObjs = publicConfig?.identityProviders || []\n }\n\n let socialConnectionObjs: SocialConnectionItem[]\n\n if (!config.socialConnections) {\n socialConnectionObjs = [...(publicConfig?.socialConnections || [])]\n } else {\n const socials = config.socialConnections\n socialConnectionObjs =\n publicConfig?.socialConnections?.filter?.((item) =>\n socials.includes(item.provider)\n ) ?? []\n }\n\n socialConnectionObjs = socialConnectionObjs\n ?.filter((item) => {\n // 某些社会化登录会在 tabs 中显示,或者无法在 Guard 中使用,所以底部不显示了\n return !HIDE_SOCIALS.includes(item.provider)\n })\n .filter((item: any) => {\n // 某些在企业身份源创建的社交身份源归为企业身份源方式显示\n if (HIDE_SOCIALS_SHOWIN_ENTERPRISE.includes(item.provider)) {\n if (\n !enterpriseConnectionObjs.find(\n (connection: any) => connection.identifier === item.identifier\n )\n ) {\n enterpriseConnectionObjs.push(item)\n }\n return false\n }\n return true\n })\n .filter((item) =>\n isWeChatBrowser()\n ? item.provider === SocialConnectionProvider.WECHATMP\n : item.provider !== SocialConnectionProvider.WECHATMP\n )\n .filter((item) => {\n if (isLarkBrowser()) {\n return (\n item.provider === SocialConnectionProvider.LARK_INTERNAL ||\n item.provider === SocialConnectionProvider.LARK_PUBLIC\n )\n } else {\n return true\n }\n })\n\n const guardWindow = getGuardWindow()\n\n if (!guardWindow) return\n\n if (!config?.isHost && (isSpecialBrowser() || !guardWindow.postMessage)) {\n // 嵌入模式下特殊浏览器不显示所有身份源登录\n socialConnectionObjs = []\n enterpriseConnectionObjs = []\n }\n\n const isNoMethod: boolean =\n noLoginMethods &&\n (!publicConfig?.ssoPageComponentDisplay.socialLoginBtns ||\n !socialConnectionObjs.length) &&\n (!publicConfig?.ssoPageComponentDisplay.idpBtns ||\n !enterpriseConnectionObjs.length)\n return [socialConnectionObjs, enterpriseConnectionObjs, isNoMethod]\n}\n","import React, {\n forwardRef,\n useState,\n useImperativeHandle,\n useEffect,\n} from 'react'\nimport { Button } from 'antd'\nimport { useShaking } from '../_utils/hooks'\n\ninterface SubmitButtonProps {\n text?: string\n className?: string\n onClick?: any\n}\nconst SubmitButton = (props: SubmitButtonProps, ref: any) => {\n let [spin, setSpin] = useState(false) // spin 状态需要手动设置关闭\n let [shaking, setShaking] = useState(false) // 抖动状态会自动关闭\n let { MountShaking, UnMountShaking } = useShaking() // 协议和 form input 抖动的挂载和卸载\n\n useEffect(() => {\n let timeOut: NodeJS.Timeout\n if (shaking === true) {\n timeOut = setTimeout(() => {\n setShaking(false)\n UnMountShaking()\n }, 1000)\n }\n\n return () => {\n clearTimeout(timeOut)\n }\n }, [UnMountShaking, shaking])\n\n useImperativeHandle(ref, () => ({\n onError: (text?: string) => {\n MountShaking()\n setShaking(true)\n },\n onSpin: (sp: boolean) => {\n setSpin(sp)\n },\n }))\n\n let propsCls = props.className ? props.className : ''\n // let shakingCls = shaking ? 'shaking' : ''\n let shakingCls = ''\n return (\n <Button\n size=\"large\"\n type=\"primary\"\n htmlType=\"submit\"\n loading={spin}\n onClick={props.onClick ? props.onClick : () => {}}\n className={`authing-g2-submit-button ${propsCls} ${shakingCls}`}\n >\n {props.text}\n </Button>\n )\n}\nexport default forwardRef(SubmitButton)\n","import { getDefaultG2Config, IG2Config, IG2Events, IG2FCProps } from '../Type'\nimport { AuthenticationClient, User } from '..'\n\nexport interface MFAConfig extends IG2Config {\n autoRegister: boolean\n}\n\nconst defaultConfig: MFAConfig = {\n ...getDefaultG2Config(),\n autoRegister: false,\n}\n\nexport const getDefaultMFAConfig = (): MFAConfig => ({\n ...getDefaultG2Config(),\n ...defaultConfig,\n})\n\nexport interface MFAEvents extends IG2Events {\n onLogin?: (user: User, authClient: AuthenticationClient) => void\n}\n\nexport enum MFAType {\n SMS = 'SMS',\n EMAIL = 'EMAIL',\n TOTP = 'OTP',\n FACE = 'FACE',\n}\n\nexport interface GuardMFAInitData {\n mfaToken: string\n applicationMfa: {\n mfaPolicy: MFAType\n sort: number\n status: 0 | 1\n }[]\n phoneCountryCode?: string\n faceMfaEnabled: boolean\n totpMfaEnabled: boolean\n email?: string\n phone?: string\n avatar?: string\n nickme?: string\n username?: string\n current?: MFAType\n}\n\nexport interface GuardMFAProps extends IG2FCProps, MFAEvents {\n config: Partial<MFAConfig>\n initData: GuardMFAInitData\n}\n\nexport interface GuardMFAViewProps extends GuardMFAProps {\n config: MFAConfig\n initData: GuardMFAInitData\n}\n","import { message } from 'antd'\nimport { User } from 'authing-js-sdk'\nimport React, { useEffect, useMemo, useState } from 'react'\nimport { useAsyncFn } from 'react-use'\nimport { ErrorCode } from '../_utils/GuardErrorCode'\nimport { useGuardHttp } from '../_utils/guardHttp'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { GuardModuleType } from '../Guard/module'\nimport { IconFont } from '../IconFont'\nimport { ShieldSpin, Spin } from '../ShieldSpin'\nimport { BindSuccess } from './core/bindSuccess'\nimport { SecurityCode } from './core/securityCode'\nimport { GuardBindTotpInitData } from './interface'\nimport { useTranslation } from 'react-i18next'\nimport './styles.less'\nimport {\n useGuardEvents,\n useGuardInitData,\n useGuardIsAuthFlow,\n useGuardModule,\n} from '../_utils/context'\nimport { MFAType } from '../MFA/interface'\n\nenum BindTotpType {\n SECURITY_CODE = 'securityCode',\n BIND_SUCCESS = 'bindSuccess',\n}\n\nexport const GuardBindTotpView: React.FC = () => {\n const initData = useGuardInitData<GuardBindTotpInitData>()\n\n const events = useGuardEvents()\n\n const { changeModule } = useGuardModule()\n\n const { get, post } = useGuardHttp()\n\n const isAuthFlow = useGuardIsAuthFlow()\n\n const { t } = useTranslation()\n\n const [secret, setSecret] = useState('')\n\n const [qrcode, setQrcode] = useState('')\n\n const [user, setUser] = useState<User>()\n\n const [bindTotpType, setBindTotpType] = useState<BindTotpType>(\n BindTotpType.SECURITY_CODE\n )\n\n const authClient = useGuardAuthClient()\n\n const [bindInfo, fetchBindInfo] = useAsyncFn(async () => {\n const query = {\n // type: 'totp',\n source: 'APPLICATION',\n }\n const config = {\n headers: {\n authorization: initData.mfaToken,\n },\n }\n\n try {\n const { code, message: msg } = await get<any>(\n `/api/v2/mfa/authenticator`,\n query,\n config\n )\n if (code === ErrorCode.LOGIN_INVALID) {\n message.error(msg)\n changeModule?.(GuardModuleType.LOGIN, {})\n return\n }\n } catch (error: any) {\n message.error(error?.message)\n }\n\n try {\n const { data, code, onGuardHandling } = await post<any>(\n '/api/v2/mfa/totp/associate',\n query,\n config\n )\n if (code === 200) {\n setSecret(data.recovery_code)\n setQrcode(data.qrcode_data_url)\n } else {\n onGuardHandling?.()\n }\n } catch (error: any) {\n message.error(error?.message)\n }\n }, [])\n\n const onBind = (resUser?: User) => {\n if (isAuthFlow && resUser) {\n events?.onLogin?.(resUser, authClient)\n } else {\n if (user) {\n events?.onLogin?.(user, authClient)\n }\n }\n }\n\n const onNext = (user?: User) => {\n if (isAuthFlow) {\n setBindTotpType(BindTotpType.BIND_SUCCESS)\n } else {\n setUser(user)\n setBindTotpType(BindTotpType.BIND_SUCCESS)\n }\n }\n\n useEffect(() => {\n fetchBindInfo()\n }, [fetchBindInfo])\n\n const renderContent = useMemo<\n Record<BindTotpType, (props: any) => React.ReactNode>\n >(\n () => ({\n [BindTotpType.SECURITY_CODE]: (props) => <SecurityCode {...props} />,\n [BindTotpType.BIND_SUCCESS]: (props) => <BindSuccess {...props} />,\n }),\n []\n )\n\n const onBack = () => {\n changeModule?.(GuardModuleType.MFA, { ...initData, current: MFAType.TOTP })\n }\n\n return (\n <>\n {bindInfo.loading ? (\n <Spin />\n ) : (\n <div className=\"g2-view-container g2-bind-totp\">\n <div className=\"g2-view-back\" style={{ display: 'inherit' }}>\n <span onClick={onBack} className=\"g2-view-mfa-back-hover\">\n <IconFont\n type=\"authing-arrow-left-s-line\"\n style={{ fontSize: 24 }}\n />\n <span>{t('common.backToVerify')}</span>\n </span>\n </div>\n <div className=\"g2-mfa-content g2-mfa-bindTotp\">\n {bindInfo.loading ? (\n <ShieldSpin />\n ) : (\n renderContent[bindTotpType]({\n mfaToken: initData.mfaToken,\n qrcode,\n secret,\n onBind,\n onNext,\n changeModule: changeModule,\n })\n )}\n </div>\n </div>\n )}\n </>\n )\n}\n","import { Form, Checkbox, Typography } from 'antd'\nimport React, { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport SubmitButton from '../../SubmitButton'\nimport { useGuardIsAuthFlow } from '../../_utils/context'\nimport { authFlow, BindTotpBusinessAction } from '../businessRequest'\n\nconst { Paragraph } = Typography\n\nexport interface BindSuccessProps {\n onBind: any\n secret: string\n}\n\nexport const BindSuccess: React.FC<BindSuccessProps> = ({ secret, onBind }) => {\n // const [isSaved, setIsSaved] = useState(false)\n const submitButtonRef = useRef<any>(null)\n\n const [form] = Form.useForm()\n\n const { t } = useTranslation()\n\n const isAuthFlow = useGuardIsAuthFlow()\n\n const bindSuccess = async () => {\n submitButtonRef.current?.onSpin(true)\n\n await form.validateFields()\n\n if (isAuthFlow) {\n const { data, isFlowEnd, onGuardHandling } = await authFlow(\n BindTotpBusinessAction.ConfirmTotpRecoveryCode,\n {}\n )\n submitButtonRef.current?.onSpin(false)\n if (isFlowEnd) {\n onBind(data)\n } else {\n // TODO 需要 onError 抖动吗 当 from 表单校验通过的时候 onError 是没有意义的\n submitButtonRef.current?.onError()\n onGuardHandling?.()\n }\n } else {\n submitButtonRef.current?.onSpin(false)\n onBind()\n }\n }\n\n return (\n <>\n <p className=\"authing-g2-mfa-title\">{t('common.totpText1')}</p>\n <p className=\"authing-g2-mfa-tips\">{t('common.totpText2')}</p>\n\n <div className=\"g2-mfa-bindTotp-copySecret\">\n <Paragraph copyable>{secret}</Paragraph>\n </div>\n\n <Form\n form={form}\n onFinish={bindSuccess}\n style={{ width: '100%' }}\n onFinishFailed={() => submitButtonRef.current?.onError()}\n >\n <Form.Item\n className=\"authing-g2-input-form g2-mfa-totp-verify-input\"\n name=\"remember\"\n rules={[\n {\n validator: (_, value) => {\n if (!value) {\n return Promise.reject()\n }\n return Promise.resolve()\n },\n },\n ]}\n valuePropName=\"checked\"\n >\n <Checkbox className=\"g2-mfa-bindTotp-secretSave\">\n {t('login.rememberedSecret')}\n </Checkbox>\n </Form.Item>\n\n <SubmitButton text={t('common.bindSuccess')} ref={submitButtonRef} />\n </Form>\n </>\n )\n}\n","import React, { useState } from 'react'\nimport { getClassnames } from '../_utils'\nimport './styles.less'\n\nexport interface ImageProProps\n extends React.ImgHTMLAttributes<HTMLImageElement> {\n src: string\n className?: string\n alt?: string\n imgClassName?: string\n size?: number | string\n width?: number | string\n height?: number | string\n borderRadius?: number | string\n noSpin?: boolean\n}\n\nexport const ImagePro = (props: ImageProProps) => {\n let { borderRadius, noSpin, alt, style, ...imgProps } = props\n let [loaded, setLoaded] = useState(noSpin === true ? true : false)\n let w: number | string = 0\n let h: number | string = 0\n if (props.size) {\n // size 存在,说明是正方形,让宽高等于 size\n w = props.size\n h = props.size\n } else {\n // 如果 size 不存在,说明长方形,尝试读取宽高\n w = props.width ? props.width : 'auto'\n h = props.height ? props.height : 'auto'\n }\n\n return (\n <div\n style={{ width: w, height: h }}\n className={getClassnames([\n 'g2-base-imagepro-container',\n 'g2-base-image-background-animation',\n loaded ? 'loaded' : 'unload',\n props?.className,\n ])}\n >\n <img\n {...imgProps}\n style={{ width: w, height: h, borderRadius: borderRadius, ...style }}\n className=\"g2-base-imagepro\"\n draggable={false}\n alt={alt || 'image'}\n onLoad={() => setLoaded(true)}\n />\n </div>\n )\n}\n","import Form, { FormItemProps } from 'antd/lib/form'\nimport React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport './style.less'\nexport interface VerifyCodeFormItemProps extends FormItemProps {\n codeLength: number\n ruleKeyword?: string\n}\n\nexport const VerifyCodeFormItem: React.FC<VerifyCodeFormItemProps> = (\n props\n) => {\n const { t } = useTranslation()\n const {\n codeLength,\n ruleKeyword = t('common.captchaCode'),\n ...formItemProps\n } = props\n return (\n <Form.Item\n validateTrigger={['onChange']}\n name=\"mfaCode\"\n className=\"g2-mfa-totp-verify-input\"\n validateFirst={true}\n rules={[\n {\n type: 'array',\n validateTrigger: ['onChange'],\n message: t('common.isMissing', {\n name: ruleKeyword,\n }),\n required: true,\n },\n {\n type: 'array',\n validateTrigger: [''],\n message: t('common.fullCaptchaCode', {\n name: ruleKeyword,\n }),\n min: codeLength,\n },\n ]}\n {...formItemProps}\n />\n )\n}\n","import { Divider, Input } from 'antd'\nimport React, {\n FC,\n Fragment,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport './style.less'\n\ninterface VerifyCodeInputProps extends React.HTMLAttributes<HTMLDivElement> {\n length?: number\n size?: string\n gutter?: string\n onEenter?: Function\n showDivider?: boolean\n onChange?: any\n value?: Array<number | string>\n onFinish?: any\n}\n\nexport const VerifyCodeInput: FC<VerifyCodeInputProps> = ({\n length = 4,\n size = '46px',\n gutter = length > 4 ? '14px' : '24px',\n className,\n onEenter,\n showDivider,\n onChange: onChangeProps,\n value,\n onFinish,\n ...rest\n}) => {\n const inputRef = useRef<any[]>([])\n\n const codeInputRef = useRef<HTMLDivElement>(null)\n\n const [verifyCode, setVerifyCode] = useState(value ?? [])\n const [focusIndex, setFocusIndex] = useState<number>(0)\n\n // 聚焦控制\n useEffect(() => {\n inputRef.current[focusIndex].focus()\n }, [focusIndex])\n\n const onChange = useCallback(\n (codes: string[]) => {\n // const filteredCodes = codes.filter((code) => !!code)\n setVerifyCode(codes)\n onChangeProps?.(codes)\n },\n [onChangeProps]\n )\n\n const handleChange = useCallback(\n (val: string | undefined = '', index: number) => {\n const num = parseInt(val)\n if (isNaN(num)) {\n val = ''\n } else {\n val = String(num)\n }\n const codes = [...verifyCode]\n codes[index] = val.split('').slice(-1)[0] || ''\n onChange(codes as string[])\n\n if (Boolean(val) && Boolean(inputRef.current[index + 1])) {\n setFocusIndex(index + 1)\n }\n\n // 验证码填写完成后 直接触发 onFinish\n if (codes.filter((code) => Boolean(code)).length >= length) {\n onFinish?.(codes)\n }\n },\n [length, onChange, onFinish, verifyCode]\n )\n\n const handleKeyDown = (evt: any, index: number) => {\n const currentVal = verifyCode[index]\n switch (evt.key) {\n case 'Backspace':\n if (!currentVal && inputRef.current[index - 1]) {\n handleChange('', index - 1)\n inputRef.current[index - 1].focus()\n }\n break\n\n case 'Enter':\n onEenter?.()\n break\n\n case 'Left':\n case 'ArrowLeft':\n evt.preventDefault()\n if (inputRef.current[index - 1]) {\n inputRef.current[index - 1].focus()\n }\n break\n case 'Right':\n case 'ArrowRight':\n evt.preventDefault()\n if (inputRef.current[index + 1]) {\n inputRef.current[index + 1].focus()\n }\n break\n default:\n break\n }\n }\n\n useEffect(() => {\n const el = codeInputRef.current\n\n const pasteEvent = (e: ClipboardEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n let paste = e.clipboardData?.getData('text')\n\n if (paste && !isNaN(parseInt(paste))) {\n if (paste.length < length) {\n const data = verifyCode.map((_i, index) => paste?.[index] ?? '')\n onChange(data)\n setFocusIndex(paste.length)\n } else {\n const data = paste.slice(0, length).split('')\n onChange(data)\n setFocusIndex(length - 1)\n }\n }\n }\n el?.addEventListener('paste', pasteEvent)\n\n return () => {\n el?.removeEventListener('paste', pasteEvent)\n }\n }, [length, onChange, setVerifyCode, verifyCode])\n\n return (\n <div ref={codeInputRef} className=\"authing-g2-code-input\" {...rest}>\n {new Array(length).fill(0).map((_, index) => {\n return (\n <Fragment key={index}>\n <Input\n ref={(el) => (inputRef.current[index] = el)}\n style={{\n width: size,\n minWidth: size,\n minHeight: size,\n height: size,\n lineHeight: size,\n marginLeft: index === 0 ? 0 : gutter,\n }}\n className=\"authing-g2-code-input-item\"\n size=\"large\"\n autoFocus={index === 0}\n onKeyDown={(evt) => handleKeyDown(evt, index)}\n value={verifyCode[index]}\n maxLength={1}\n onChange={(evt) => {\n evt.persist()\n // @ts-ignore\n if (evt.nativeEvent.isComposing) {\n return\n }\n\n handleChange(evt.target.value, index)\n }}\n pattern=\"[0-9]*\"\n type=\"tel\"\n />\n {showDivider && index === Math.floor(length / 2 - 1) && (\n <Divider className=\"authing-g2-code-input-divider\" />\n )}\n </Fragment>\n )\n })}\n </div>\n )\n}\n","import { Form } from 'antd'\nimport React, { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useAsyncFn } from 'react-use'\n\nimport { GuardModuleType } from '../../Guard/module'\nimport { useGuardHttp } from '../../_utils/guardHttp'\nimport SubmitButton from '../../SubmitButton'\nimport { ImagePro } from '../../ImagePro'\nimport { VerifyCodeFormItem } from '../../MFA/VerifyCodeInput/VerifyCodeFormItem'\nimport { VerifyCodeInput } from '../../MFA/VerifyCodeInput'\nimport { useGuardIsAuthFlow } from '../../_utils/context'\nimport { authFlow, BindTotpBusinessAction } from '../businessRequest'\nexport interface SecurityCodeProps {\n mfaToken: string\n qrcode: string\n onNext: any\n changeModule: any\n}\n\nexport const SecurityCode: React.FC<SecurityCodeProps> = ({\n mfaToken,\n qrcode,\n onNext,\n changeModule,\n}) => {\n const [form] = Form.useForm()\n const submitButtonRef = useRef<any>(null)\n\n const { t } = useTranslation()\n\n const { post } = useGuardHttp()\n\n const isAuthFlow = useGuardIsAuthFlow()\n\n const onJump = () => {\n changeModule?.(GuardModuleType.DOWNLOAD_AT)\n }\n\n const [, bindTotp] = useAsyncFn(async () => {\n submitButtonRef.current.onSpin(true)\n\n await form.validateFields()\n const saftyCode = form.getFieldValue('saftyCode')\n\n if (isAuthFlow) {\n // 这里绑定成功过返回的是 statusCode\n const { statusCode, onGuardHandling } = await authFlow(\n BindTotpBusinessAction.VerifyTotpFirstTime,\n {\n totp: saftyCode.join(''),\n }\n )\n submitButtonRef.current?.onSpin(false)\n\n if (statusCode === 200) {\n onNext()\n } else {\n submitButtonRef.current?.onError()\n onGuardHandling?.()\n }\n } else {\n const { code, data, onGuardHandling } = await post(\n '/api/v2/mfa/totp/associate/confirm',\n {\n authenticator_type: 'totp',\n totp: saftyCode.join(''),\n source: 'APPLICATION',\n },\n {\n headers: {\n authorization: mfaToken,\n },\n }\n )\n submitButtonRef.current?.onSpin(false)\n\n if (code === 200) {\n onNext(data)\n } else {\n submitButtonRef.current?.onError()\n onGuardHandling?.()\n }\n }\n }, [mfaToken])\n\n return (\n <>\n <p className=\"authing-g2-mfa-title\">{t('user.mfaBind')}</p>\n <p\n className=\"authing-g2-mfa-tips\"\n style={{\n textAlign: 'left',\n }}\n >\n {t('common.usePhoneOpen')}({t('common.noValidator')}{' '}\n <span\n style={{\n color: '#396AFF',\n cursor: 'pointer',\n }}\n onClick={onJump}\n >\n {t('common.clickTodownload')}\n </span>\n ) {t('common.mfaText1')}\n </p>\n <ImagePro className=\"g2-mfa-bindTotp-qrcode\" src={qrcode} alt=\"qrcode\" />\n <Form\n className=\"g2-mfa-bindTotp-securityCode-form\"\n form={form}\n onSubmitCapture={() => {}}\n onFinish={bindTotp}\n onFinishFailed={(e) => {\n submitButtonRef.current.onError()\n }}\n >\n <VerifyCodeFormItem\n codeLength={6}\n name=\"saftyCode\"\n ruleKeyword={t('user.numberSafteyCode')}\n >\n <VerifyCodeInput\n length={6}\n showDivider={false}\n gutter={'10px'}\n onFinish={bindTotp}\n />\n </VerifyCodeFormItem>\n\n <SubmitButton text={t('user.nextStep')} ref={submitButtonRef} />\n </Form>\n </>\n )\n}\n","import { Form } from 'antd'\nimport React, { useMemo } from 'react'\nimport { fieldRequiredRule, VALIDATE_PATTERN } from '../_utils'\nimport { useGuardHttp } from '../_utils/guardHttp'\nimport { useTranslation } from 'react-i18next'\nimport { ValidatorFormItemMetaProps, ValidatorFormItemProps } from '.'\nimport { Rule } from 'antd/lib/form'\nimport { useGuardPublicConfig } from '../_utils/context'\nimport { phone } from 'phone'\nimport { useCheckRepeat } from './useCheckRepeat'\n\nconst ValidatorFormItem: React.FC<ValidatorFormItemMetaProps> = (props) => {\n const {\n form,\n checkRepeat = false,\n method,\n name,\n required,\n areaCode, //国际化区号\n ...formItemProps\n } = props\n const publicConfig = useGuardPublicConfig()\n\n const { get } = useGuardHttp()\n const { t } = useTranslation()\n\n const checkInternationalSms = useMemo(() => {\n return publicConfig.internationalSmsConfig?.enabled && method === 'phone'\n }, [method, publicConfig.internationalSmsConfig?.enabled])\n\n const methodContent = useMemo(() => {\n if (method === 'email')\n return {\n field: t('common.emailLabel'),\n checkErrorMessage: t('common.checkEmail'),\n formatErrorMessage: t('common.emailFormatError'),\n pattern: VALIDATE_PATTERN.email,\n }\n else if (method === 'username') {\n return {\n field: t('common.username'),\n checkErrorMessage: t('common.checkUserName'),\n formatErrorMessage: t('common.usernameFormatError'),\n pattern: VALIDATE_PATTERN.username,\n }\n } else\n return {\n field: t('common.phone'),\n checkErrorMessage: t('common.checkPhone'),\n formatErrorMessage: t('common.phoneFormateError'),\n pattern: VALIDATE_PATTERN.phone,\n }\n }, [method, t])\n\n const checkRepeatRet = (\n value: any,\n resolve: (value: unknown) => void,\n reject: (reason?: any) => void\n ) => {\n get<boolean>(`/api/v2/users/find`, {\n userPoolId: publicConfig?.userPoolId,\n key: value,\n type: method,\n }).then(({ data }) => {\n if (Boolean(data)) {\n reject(methodContent.checkErrorMessage)\n } else {\n resolve(true)\n }\n })\n }\n\n const checkRepeatFn = useCheckRepeat(checkRepeatRet)\n\n const formatRules = useMemo<Rule>(() => {\n if (checkInternationalSms) {\n return {\n validateTrigger: 'onBlur',\n validator: async (_, value) => {\n if (!value || phone(value, { country: areaCode }).isValid)\n return Promise.resolve()\n return Promise.reject(t('common.internationPhoneMessage'))\n },\n }\n }\n\n return {\n validateTrigger: 'onBlur',\n pattern: methodContent.pattern,\n message: methodContent.formatErrorMessage,\n }\n }, [\n areaCode,\n checkInternationalSms,\n methodContent.formatErrorMessage,\n methodContent.pattern,\n t,\n ])\n\n const rules = useMemo<Rule[]>(() => {\n // 如果不是必填就不校验\n if (required === false) return []\n\n // 必填项的默认校验规则\n const rules = [...fieldRequiredRule(methodContent.field)]\n\n // 格式校验\n rules.push(formatRules)\n\n // 是否校验重复\n if (checkRepeat) {\n rules.push({\n validator: checkRepeatFn,\n validateTrigger: ['onBlur'],\n })\n }\n\n return rules\n }, [required, methodContent.field, formatRules, checkRepeat, checkRepeatFn])\n\n return (\n <Form.Item\n validateFirst={true}\n validateTrigger={['onBlur', 'onChange']}\n rules={[...rules, ...(formItemProps?.rules ?? [])]}\n name={name ?? method}\n {...formItemProps}\n />\n )\n}\nexport const EmailFormItem: React.FC<ValidatorFormItemProps> = (props) => (\n <ValidatorFormItem required method=\"email\" {...props} />\n)\nexport const PhoneFormItem: React.FC<ValidatorFormItemProps> = (props) => (\n <ValidatorFormItem required method=\"phone\" {...props} />\n)\n\nexport const UserNameFormItem: React.FC<ValidatorFormItemProps> = (props) => (\n <ValidatorFormItem required method=\"username\" {...props} />\n)\n","import { useCallback, useState } from 'react'\n\nexport const useCheckRepeat = (\n checkFn: (\n value: any,\n resolve: (value: unknown) => void,\n reject: (reason?: any) => void\n ) => void\n) => {\n const [timer, setTimer] = useState<NodeJS.Timeout>()\n\n const checkRepeat = useCallback(\n async (_, value) => {\n if (timer) {\n clearTimeout(timer)\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n checkFn(value, resolve, reject)\n }, 500)\n\n setTimer(timeout)\n })\n },\n [checkFn, timer]\n )\n\n return checkRepeat\n}\n","import { FormInstance, FormItemProps } from 'antd/lib/form'\nimport FormItem from 'antd/lib/form/FormItem'\nimport { PasswordFormItem } from './PasswordFormItem'\nimport {\n EmailFormItem,\n PhoneFormItem,\n UserNameFormItem,\n} from './ValidatorFormItem'\n\nexport interface ValidatorFormItemProps extends FormItemProps {\n form?: FormInstance\n checkRepeat?: boolean\n areaCode?: string //国际化区号\n}\n\nexport interface ValidatorFormItemMetaProps extends ValidatorFormItemProps {\n form?: FormInstance\n checkRepeat?: boolean\n method: 'email' | 'phone' | 'username'\n}\n\nexport interface PasswordFormItemProps extends FormItemProps {}\n\nexport interface ICheckProps {\n check: (values: any) => void\n}\n\ntype InternalFormItemType = typeof FormItem\n\ninterface FormItemInterface extends InternalFormItemType {\n Password: typeof PasswordFormItem\n Email: typeof EmailFormItem\n Phone: typeof PhoneFormItem\n UserName: typeof UserNameFormItem\n}\n\nconst CustomFormItem = FormItem as FormItemInterface\n\nCustomFormItem.Password = PasswordFormItem\nCustomFormItem.Email = EmailFormItem\nCustomFormItem.Phone = PhoneFormItem\nCustomFormItem.UserName = UserNameFormItem\nexport default CustomFormItem\n","import { Form } from 'antd'\nimport React from 'react'\nimport { PasswordFormItemProps } from '.'\nimport { getPasswordValidate } from '../_utils'\nimport { useGuardPublicConfig } from '../_utils/context'\nexport interface ExPasswordFormItemProps extends PasswordFormItemProps {\n fieldRequiredRuleMessage?: string\n}\nexport const PasswordFormItem: React.FC<ExPasswordFormItemProps> = (props) => {\n const { rules, fieldRequiredRuleMessage, ...fromItemProos } = props\n\n const publicConfig = useGuardPublicConfig()\n\n return publicConfig ? (\n <Form.Item\n validateTrigger={['onChange', 'onBlur']}\n validateFirst={true}\n name=\"password\"\n rules={[\n ...getPasswordValidate(\n publicConfig.passwordStrength,\n publicConfig.customPasswordStrength,\n fieldRequiredRuleMessage\n ),\n ...(rules ?? []),\n ]}\n {...fromItemProos}\n />\n ) : (\n <Form.Item {...props} />\n )\n}\n","/** eslint-disable */\n/**\n * !!!!!!!!!!!! 注意注意!!!!!!!!!!!!!\n *\n * 只要替换 svgStr 中的字符串即可,为了兼容 SSR!!!!!!\n *\n */\nimport { svgStr } from './svg'\nvar init = function (a) {\n var c,\n t,\n l,\n e,\n i,\n o,\n h = svgStr,\n m = (m = document.getElementsByTagName('script'))[\n m.length - 1\n ].getAttribute('data-injectcss')\n if (m && !a.__iconfont__svg__cssinject__) {\n a.__iconfont__svg__cssinject__ = !0\n try {\n document.write(\n '<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>'\n )\n } catch (a) {\n console && console.log(a)\n }\n }\n function n() {\n i || ((i = !0), l())\n }\n ;(c = function () {\n var a, c, t\n ;((t = document.createElement('div')).innerHTML = h),\n (h = null),\n (c = t.getElementsByTagName('svg')[0]) &&\n (c.setAttribute('aria-hidden', 'true'),\n (c.style.position = 'absolute'),\n (c.style.width = 0),\n (c.style.height = 0),\n (c.style.overflow = 'hidden'),\n (a = c),\n (t = document.body).firstChild\n ? (c = t.firstChild).parentNode.insertBefore(a, c)\n : t.appendChild(a))\n }),\n document.addEventListener\n ? ~['complete', 'loaded', 'interactive'].indexOf(document.readyState)\n ? setTimeout(c, 0)\n : ((t = function () {\n document.removeEventListener('DOMContentLoaded', t, !1), c()\n }),\n document.addEventListener('DOMContentLoaded', t, !1))\n : document.attachEvent &&\n ((l = c),\n (e = a.document),\n (i = !1),\n (o = function () {\n try {\n e.documentElement.doScroll('left')\n } catch (a) {\n return void setTimeout(o, 50)\n }\n n()\n })(),\n (e.onreadystatechange = function () {\n 'complete' == e.readyState && ((e.onreadystatechange = null), n())\n }))\n}\n\nif (typeof window !== 'undefined' && typeof window.document !== 'undefined') {\n init(window)\n}\n","export const svgStr =\n '<svg><symbol id=\"authing-gitlab\" viewBox=\"0 0 1024 1024\"><path d=\"M958.326 570.912l-50.136-154.3L808.827 110.8c-5.111-15.733-27.372-15.733-32.485 0l-99.365 305.812H347.024L247.656 110.8c-5.11-15.733-27.37-15.733-32.484 0l-99.363 305.812-50.134 154.3c-4.575 14.073 0.437 29.49 12.407 38.19L512 924.358 945.92 609.1a34.16 34.16 0 0 0 12.407-38.19\" ></path></symbol><symbol id=\"authing-yuyan\" viewBox=\"0 0 1024 1024\"><path d=\"M960 511.616A447.808 447.808 0 0 0 512 64C264.576 64 64 264.384 64 511.616a447.808 447.808 0 0 0 392.32 444.16 224.384 224.384 0 0 0 60.352 3.456A447.744 447.744 0 0 0 960 511.616z m-64 6.4a437.952 437.952 0 0 0-8.768-65.472c0.384-7.616 0.512-14.784 0.256-21.504 5.696 26.496 8.512 53.504 8.512 80.64v6.272z m-768-6.4c0-26.56 2.752-53.12 8.192-79.104 16.576 17.728 55.68 17.28 65.216-9.216 17.024 10.176 39.936 12.032 39.936 32.32 0 67.072 2.432 138.944 63.36 140.032 1.664 0 33.92 12.224 49.28 52.096 5.312 13.76 26.304 0 49.344 0 11.52 0 0 19.328 0 61.184 0 41.92 89.92 105.984 89.92 105.984-0.384 27.584 0.768 49.92 3.008 67.712a150.912 150.912 0 0 0-50.816 6.848A383.68 383.68 0 0 1 128 511.616z m478.592 371.968c-2.048-9.728-10.752-15.04-26.624-10.88 12.672-54.016 18.816-84.288 45.312-107.2 38.272-33.216 4.48-70.144-24.576-65.792-23.04 3.456-8.448-28.416-29.056-30.208-20.544-1.728-47.232-42.432-76.736-56.512-15.616-7.424-30.976-27.328-55.104-28.16-21.376-0.832-52.672 18.048-52.672 3.456 0-46.912-4.8-80.448-5.76-93.76-0.768-10.752-7.04-3.648 21.888-2.944 15.744 0.384 8.064-31.616 23.616-32.832 15.296-1.28 51.712 14.272 60.992 8.128 8.64-5.76 63.36 143.744 63.36 24.704 0-14.08-7.296-38.72 0-52.096 28.992-52.864 56.064-95.936 53.632-102.208-1.344-3.584-29.568-6.464-52.16 1.088-7.68 2.56 2.432 14.464-8.512 17.024-41.024 9.472-77.248-11.072-64.64-30.336 13.056-19.84 60.16-8.64 64.256-48.256 2.368-22.72 4.352-49.088 5.632-68.608 55.232 8.64 49.152-71.616-32.896-80.192a384.128 384.128 0 0 1 358.272 257.92 15.552 15.552 0 0 0-9.152-4.16c-24.832-62.016-84.992-17.152-64.64 37.504-109.44 84.16-81.408 142.784-45.44 176.384 18.944 17.728 36.992 44.288 48.704 63.36-12.8 37.248 47.104 22.336 76.672-40.96a384.576 384.576 0 0 1-274.432 265.6z\" ></path></symbol><symbol id=\"authing-anzhuo\" viewBox=\"0 0 1024 1024\"><path d=\"M141.1 331.2c-35 0-63.3 28.3-63.3 63.2v264.7c0 34.9 28.4 63.2 63.3 63.2 35 0 63.3-28.3 63.3-63.2V394.4c0-34.9-28.3-63.2-63.3-63.2zM228.9 753.3c0 37.3 30.3 67.5 67.6 67.5h46.1v140c0 34.9 28.4 63.2 63.3 63.2 35 0 63.3-28.3 63.3-63.2v-140h85.5v140c0 34.9 28.4 63.2 63.3 63.2 35 0 63.3-28.3 63.3-63.2v-140h46.1c37.3 0 67.6-30.2 67.6-67.5V343.1H228.9v410.2zM651.8 93.4L696 13c2.4-4.2 0.8-9.6-3.5-11.9-4.2-2.3-9.6-0.8-11.9 3.5l-44.7 81.2C598.4 69.2 556.4 59.9 512 59.9c-44.4 0-86.4 9.3-123.9 25.8L343.4 4.6c-2.3-4.3-7.7-5.8-11.9-3.5-4.3 2.3-5.9 7.7-3.5 11.9l44.2 80.4c-86.8 44.8-145.5 130-145.5 227.7h570.5c0.1-97.8-58.6-182.9-145.4-227.7zM382.2 218c-13.2 0-23.9-10.7-23.9-23.9s10.7-23.9 23.9-23.9 23.9 10.7 23.9 23.9c-0.1 13.2-10.8 23.9-23.9 23.9z m259.7 0c-13.2 0-23.9-10.7-23.9-23.9s10.7-23.9 23.9-23.9 23.9 10.7 23.9 23.9c-0.1 13.2-10.8 23.9-23.9 23.9zM882.9 331.2c-35 0-63.3 28.3-63.3 63.2v264.7c0 34.9 28.4 63.2 63.3 63.2 35 0 63.3-28.3 63.3-63.2V394.4c0-34.9-28.3-63.2-63.3-63.2z\" ></path></symbol><symbol id=\"authing-lark-public\" viewBox=\"0 0 1024 1024\"><path d=\"M933.875 98.5625L726.53414917 322.64486695a6.61651612 6.61651612 0 0 0-1.64300537 5.81726073 40.54449463 40.54449463 0 0 1-68.92053223 36.37023927L490.72827148 530.02856445l16.29821778 218.30960083L692.5625 933.875z m0 0\" ></path><path d=\"M931.6098938 104.2026062l-205.12023926 221.68377685a6.61651612 6.61651612 0 0 0-1.64300537 5.86175538 39.96688843 39.96688843 0 0 1-68.21026612 35.92611694L494.23675537 530.07388305a3.28601074 3.28601074 0 0 0-0.93273925 2.53125l16.03125 214.40148927 413.61547851-623.97537232 8.88162232-18.74047852z m0 0\" ></path><path d=\"M925.48199463 90.16949463L701.39880372 297.46502685a6.61651612 6.61651612 0 0 1-5.86175538 1.68832398 40.54449463 40.54449463 0 0 0-36.32574462 68.92053222L493.97143555 533.31622315l-218.22143555-16.43005372L90.125 331.43667602z m0 0\" ></path><path d=\"M919.8427124 92.65625l-221.77359008 205.12023926a6.61651612 6.61651612 0 0 1-5.77276612 1.64300537 39.96688843 39.96688843 0 0 0-35.92611695 68.21026612L493.92611695 530.02938843a3.28601074 3.28601074 0 0 1-2.57574463 0.93273925l-214.40148927-16.03125L900.96875 101.31539917l18.74047852-8.88079834z m0 0\" ></path></symbol><symbol id=\"authing-lark-internal\" viewBox=\"0 0 1024 1024\"><path d=\"M933.875 98.5625L726.53414917 322.64486695a6.61651612 6.61651612 0 0 0-1.64300537 5.81726073 40.54449463 40.54449463 0 0 1-68.92053223 36.37023927L490.72827148 530.02856445l16.29821778 218.30960083L692.5625 933.875z m0 0\" ></path><path d=\"M931.6098938 104.2026062l-205.12023926 221.68377685a6.61651612 6.61651612 0 0 0-1.64300537 5.86175538 39.96688843 39.96688843 0 0 1-68.21026612 35.92611694L494.23675537 530.07388305a3.28601074 3.28601074 0 0 0-0.93273925 2.53125l16.03125 214.40148927 413.61547851-623.97537232 8.88162232-18.74047852z m0 0\" ></path><path d=\"M925.48199463 90.16949463L701.39880372 297.46502685a6.61651612 6.61651612 0 0 1-5.86175538 1.68832398 40.54449463 40.54449463 0 0 0-36.32574462 68.92053222L493.97143555 533.31622315l-218.22143555-16.43005372L90.125 331.43667602z m0 0\" ></path><path d=\"M919.8427124 92.65625l-221.77359008 205.12023926a6.61651612 6.61651612 0 0 1-5.77276612 1.64300537 39.96688843 39.96688843 0 0 0-35.92611695 68.21026612L493.92611695 530.02938843a3.28601074 3.28601074 0 0 1-2.57574463 0.93273925l-214.40148927-16.03125L900.96875 101.31539917l18.74047852-8.88079834z m0 0\" ></path></symbol><symbol id=\"authing-guanbi7-01copy_1\" viewBox=\"0 0 1024 1024\"><path d=\"M0.00007 512.306485a511.999485 511.999485 0 0 1 1023.99797-0.512v0.512a510.974486 510.974486 0 0 1-511.999485 511.691485C228.86384 1023.99797 0.00007 794.725201 0.00007 512.306485z m546.200451 0l178.89282-178.78982a23.244977 23.244977 0 0 0 0-33.075967l-1.126999-1.023999a23.244977 23.244977 0 0 0-33.176967 0L511.999555 478.514519l-178.78982-179.19982a23.244977 23.244977 0 0 0-33.177967 0l-1.023999 1.023999a23.244977 23.244977 0 0 0 0 33.074967l178.78982 179.199819-178.89282 178.789821a23.244977 23.244977 0 0 0 0 33.177966l1.126999 1.023999a23.244977 23.244977 0 0 0 33.176967 0L511.999555 547.12245 690.789375 725.80927a23.244977 23.244977 0 0 0 33.177967 0l1.023999-1.023999a23.244977 23.244977 0 0 0 0-33.176967l-178.78982-179.199819z\" ></path></symbol><symbol id=\"authing-guanbi\" viewBox=\"0 0 1024 1024\"><path d=\"M583.168 523.776L958.464 148.48c18.944-18.944 18.944-50.176 0-69.12l-2.048-2.048c-18.944-18.944-50.176-18.944-69.12 0L512 453.12 136.704 77.312c-18.944-18.944-50.176-18.944-69.12 0l-2.048 2.048c-19.456 18.944-19.456 50.176 0 69.12l375.296 375.296L65.536 899.072c-18.944 18.944-18.944 50.176 0 69.12l2.048 2.048c18.944 18.944 50.176 18.944 69.12 0L512 594.944 887.296 970.24c18.944 18.944 50.176 18.944 69.12 0l2.048-2.048c18.944-18.944 18.944-50.176 0-69.12L583.168 523.776z\" ></path></symbol><symbol id=\"authing-apple-web\" viewBox=\"0 0 1024 1024\"><path d=\"M797.3 656c24.6 34.8 52.8 57.3 84.6 67.5-13.8 42.6-35.7 87-65.7 133.2-46.2 69.6-91.8 104.4-136.8 104.4-16.8 0-41.7-5.7-74.7-17.1-30.6-11.4-57.3-17.1-80.1-17.1-22.8 0-48 6-75.6 18-28.8 11.4-52.5 17.1-71.1 17.1-54 0-107.1-45.9-159.3-137.7-52.2-90.6-78.3-179.7-78.3-267.3 0-81 19.8-147.3 59.4-198.9 40.8-51.6 91.2-77.4 151.2-77.4 13.2 0 27.9 1.65 44.1 4.95 16.2 3.3 33 9.45 50.4 18.45 18.6 10.2 33.9 17.25 45.9 21.15 12 3.9 21.3 5.85 27.9 5.85 7.8 0 19.8-1.8 36-5.4a166.088 166.088 0 0 0 48.6-19.8 366.113 366.113 0 0 1 45-21.6c12.6-4.8 25.5-7.2 38.7-7.2 42 0 79.8 11.4 113.4 34.2 18 12 36.3 29.7 54.9 53.1-27.6 24-47.7 45-60.3 63-23.4 33.6-35.1 70.2-35.1 109.8 0 43.8 12.3 83.4 36.9 118.8zM616.4 235.7c-21 19.8-40.2 32.7-57.6 38.7-6 1.8-13.65 3.45-22.95 4.95-9.3 1.5-19.95 2.85-31.95 4.05 0.6-52.8 14.4-98.4 41.4-136.8 27-38.4 71.4-64.8 133.2-79.2 1.2 6 2.1 10.2 2.7 12.6v9.9c0 21.6-5.1 45.9-15.3 72.9a221.625 221.625 0 0 1-49.5 72.9z\" ></path></symbol><symbol id=\"authing-google\" viewBox=\"0 0 1024 1024\"><path d=\"M1000 523.6c0 283-193.8 484.4-480 484.4-274.4 0-496-221.6-496-496S245.6 16 520 16c133.6 0 246 49 332.6 129.8l-135 129.8c-176.6-170.4-505-42.4-505 236.4 0 173 138.2 313.2 307.4 313.2 196.4 0 270-140.8 281.6-213.8H520V440.8h472.2c4.6 25.4 7.8 49.8 7.8 82.8z\" ></path></symbol><symbol id=\"authing-dingtalk\" viewBox=\"0 0 1024 1024\"><path d=\"M905.857912 382.800144a192.415957 192.415957 0 0 1-12.101998 31.649993h0.186l-0.744 1.257c-35.140992 76.657983-126.881972 226.998949-126.881971 226.998949s-0.093-0.373-0.466-0.93l-26.856994 47.567989h129.301971L621.375975 1024l56.039988-227.649949H575.715986l35.326992-150.525966a1436.834677 1436.834677 0 0 0-102.397977 29.789993s-54.130988 32.393993-155.923965-62.137986c0 0-68.699985-61.672986-28.857994-77.079982 16.941996-6.560999 82.197982-14.892997 133.53597-21.967996 69.444984-9.494998 112.172975-14.614997 112.172975-14.614996s-214.106952 3.257999-264.83994-4.886999c-50.732989-8.099998-115.104974-94.484979-128.834972-170.353962 0 0-21.223995-41.702991 45.65999-21.968995 66.838985 19.734996 343.499923 76.799983 343.499923 76.799983S205.267069 266.95017 181.250074 239.487176c-23.922995-27.459994-70.374984-149.732966-64.324985-224.901949 0 0 2.606999-18.757996 21.457995-13.729997 0 0 266.00294 123.946972 447.852899 191.762957 181.896959 67.815985 340.009924 102.398977 319.622929 190.181957z\" ></path></symbol><symbol id=\"authing-apple\" viewBox=\"0 0 1024 1024\"><path d=\"M797.3 656c24.6 34.8 52.8 57.3 84.6 67.5-13.8 42.6-35.7 87-65.7 133.2-46.2 69.6-91.8 104.4-136.8 104.4-16.8 0-41.7-5.7-74.7-17.1-30.6-11.4-57.3-17.1-80.1-17.1-22.8 0-48 6-75.6 18-28.8 11.4-52.5 17.1-71.1 17.1-54 0-107.1-45.9-159.3-137.7-52.2-90.6-78.3-179.7-78.3-267.3 0-81 19.8-147.3 59.4-198.9 40.8-51.6 91.2-77.4 151.2-77.4 13.2 0 27.9 1.65 44.1 4.95 16.2 3.3 33 9.45 50.4 18.45 18.6 10.2 33.9 17.25 45.9 21.15 12 3.9 21.3 5.85 27.9 5.85 7.8 0 19.8-1.8 36-5.4a166.088 166.088 0 0 0 48.6-19.8 366.113 366.113 0 0 1 45-21.6c12.6-4.8 25.5-7.2 38.7-7.2 42 0 79.8 11.4 113.4 34.2 18 12 36.3 29.7 54.9 53.1-27.6 24-47.7 45-60.3 63-23.4 33.6-35.1 70.2-35.1 109.8 0 43.8 12.3 83.4 36.9 118.8zM616.4 235.7c-21 19.8-40.2 32.7-57.6 38.7-6 1.8-13.65 3.45-22.95 4.95-9.3 1.5-19.95 2.85-31.95 4.05 0.6-52.8 14.4-98.4 41.4-136.8 27-38.4 71.4-64.8 133.2-79.2 1.2 6 2.1 10.2 2.7 12.6v9.9c0 21.6-5.1 45.9-15.3 72.9a221.625 221.625 0 0 1-49.5 72.9z\" ></path></symbol><symbol id=\"authing-alipay-web\" viewBox=\"0 0 1024 1024\"><path d=\"M427.154 210.262l-1.819 59.431H185.792v45.481h242.573v78.84H228.24v43.057l203.153-1.823 203.76-1.818-3.641 14.553c-9.094 35.177-47.907 129.173-55.183 132.196-4.244 1.216-33.961-5.458-67.316-15.16-101.276-30.924-151.61-40.023-220.136-40.023-69.74 0.603-115.217 13.342-158.886 44.27-84.897 60.647-91.57 179.506-12.735 245.602 83.687 70.348 220.739 77.017 345.06 16.375 44.267-21.225 123.71-78.84 150.39-108.553l10.922-12.736 34.57 16.98c34.568 17.586 248.03 116.437 284.413 131.598l19.403 8.49V711.17l-52.762-13.95c-47.907-12.74-170.406-50.94-209.826-66.105l-15.16-6.066 20.012-41.238c21.231-42.444 63.68-162.522 63.68-180.108 0-8.491-12.128-9.702-106.128-9.702H555.71v-78.827h254.704v-40.022c0-1.817-57.614-3.032-127.353-2.425l-127.347 0.602V151.437H428.967l-1.813 58.825z m-23.657 395.392c31.535 10.922 73.382 27.896 92.786 38.206l35.167 18.805-19.404 24.255c-10.913 13.342-35.775 36.387-56.399 51.548-69.133 51.542-133.41 71.553-215.887 66.703-86.112-4.852-132.201-40.023-137.66-105.517-3.64-40.63 5.459-63.675 33.359-84.901 35.172-26.685 63.67-32.742 141.296-30.924 59.431 1.814 78.232 5.449 126.742 21.825z\" ></path></symbol><symbol id=\"authing-wechat-miniprogram-app-launch\" viewBox=\"0 0 1126 1024\"><path d=\"M961.876 262.606C900.851 134.702 747.238 80.676 619.77 141.425c-69.45 33.34-113.232 90.332-130.04 168.839-15.583 71.308-6.328 150.685 2.926 211.869 12.22 78.071 12.656 135.459 1.7 176.393-9.69 36.306-29.464 59.957-61.46 75.54a135.814 135.814 0 0 1-104.372 5.102 137.634 137.634 0 0 1-77.835-69.647 136.764 136.764 0 0 1 64.388-181.93c14.317-7.12 25.668-19.38 30.73-34.607 5.023-15.187 4.628-31.244-2.136-45.996a60.511 60.511 0 0 0-34.487-30.81 61.54 61.54 0 0 0-45.878 2.136 256.284 256.284 0 0 0-131.86 145.98 257.233 257.233 0 0 0 10.284 196.72 256.403 256.403 0 0 0 231.802 146.494 263.007 263.007 0 0 0 110.265-24.916c69.41-33.341 113.192-89.462 130.04-167.97 15.149-70.913 6.328-150.29-2.966-210.603-12.22-78.942-12.656-136.764-1.701-177.698 9.69-36.307 29.465-60.354 62.292-75.54a136.962 136.962 0 0 1 182.205 64.585 136.764 136.764 0 0 1-64.387 181.93 60.511 60.511 0 0 0-28.16 80.167c6.724 14.753 19.34 25.708 34.053 30.81 15.148 5.063 31.166 4.628 45.877-2.135 127.51-62.45 181.378-216.101 120.786-343.531z\" ></path></symbol><symbol id=\"authing-qq\" viewBox=\"0 0 1024 1024\"><path d=\"M821.295 699.385a275.463 275.463 0 0 1-57.3 90.76c54.54 16.634 41.202 45.496 41.202 45.496 24.223 13.299 22.69 99.729-111.381 98.195-89.38-0.996-127.248-26.062-142.695-42.735-11.498 1.15-23.035 1.802-34.61 1.84-14.296 0-28.286-1.073-42.084-2.645-14.91 16.634-52.586 42.544-143.308 43.54-133.879 1.534-135.412-84.895-111.15-98.195 0 0-14.642-31.046 47.142-47.335a272.511 272.511 0 0 1-58.794-98.311c-56.035 99.537-83.057 33.575-79.033-42.66 3.604-67.687 63.241-144.61 78.726-163.43a60.98 60.98 0 0 1-4.6-22.804c0-16.482 6.593-31.506 17.363-42.775a44.844 44.844 0 0 1 20.045-46.223c-0.076-2.414-0.306-4.753-0.306-7.206 0-151.394 123.569-274.235 275.96-274.235 152.469 0 275.961 122.802 275.961 274.235 0 4.6-0.268 9.122-0.498 13.645 10.425 10.617 14.947 25.68 11.998 40.283 10.616 11.192 17.36 25.871 17.36 42.276 0 8.125-1.723 15.829-4.598 22.997 15.56 19.163 74.816 96.01 78.38 163.698 3.91 74.164-21.31 138.67-73.78 51.589z\" ></path></symbol><symbol id=\"authing-wechat-mobile\" viewBox=\"0 0 1239 1024\"><path d=\"M745.256 511.245c-21.665 0-43.385 20.373-43.385 45.595 0 20.373 21.72 40.96 43.385 40.96 32.553 0 55.835-20.587 55.835-40.96 0-25.222-23.282-45.595-55.835-45.595M602.705 298.9c34.115 0 55.78-22.097 55.78-55.08 0-34.655-21.665-55.027-55.78-55.027-32.499 0-63.488 20.372-63.488 54.973 0 33.091 30.99 55.08 63.488 55.08M440.05 756.574c-57.344 0-99.167-9.431-153.439-25.169l-156.456 80.196 44.948-135.222C65.051 597.747 0 498.58 0 377.479 0 163.57 198.333 0 440.05 0c213.8 0 404.427 128.97 441.56 311.458a211.106 211.106 0 0 0-41.822-4.743c-210.729 0-373.383 160.498-373.383 353.927 0 33.037 4.635 62.895 12.396 94.37-12.396 1.616-26.409 1.616-38.804 1.616m646.198 154.14L1117.13 1024l-117.76-67.638c-44.894 9.378-88.28 23.606-133.228 23.606-207.656 0-371.873-144.761-371.873-324.07 0-179.253 164.217-323.96 371.873-323.96 196.77 0 373.437 144.707 373.437 323.907 0 100.783-66.614 190.356-153.384 254.922M295.882 188.793c-32.498 0-66.614 20.372-66.614 54.973 0 33.091 34.116 55.08 66.614 55.08 30.99 0 55.781-21.989 55.781-55.026 0-34.655-24.791-55.027-55.78-55.027m692.6 322.452c-23.228 0-43.385 20.373-43.385 45.595 0 20.373 20.157 40.96 43.385 40.96 30.99 0 54.272-20.587 54.272-40.96 0-25.222-23.282-45.595-54.272-45.595\" ></path></symbol><symbol id=\"authing-baidu\" viewBox=\"0 0 1024 1024\"><path d=\"M204.8 537.876c104.422-22.429 90.196-147.185 86.967-174.501-5.149-42.066-54.545-115.55-121.658-109.746-84.48 7.593-96.873 129.6-96.873 129.6C61.891 439.695 100.64 560.262 204.8 537.876zM315.636 754.75c-3.141 8.858-9.861 31.244-4.058 50.75 11.607 43.766 49.658 45.774 49.658 45.774h54.677V717.658H357.44c-26.27 7.855-39.01 28.407-41.847 37.091z m82.779-426.022c57.774 0 104.29-66.37 104.29-148.407C502.705 98.327 456.19 32 398.415 32c-57.47 0-104.16 66.37-104.16 148.32 0 82.036 46.69 148.364 104.29 148.364z m248.334 9.731c77.062 10.037 126.676-72.262 136.407-134.618 10.037-62.138-39.665-134.53-94.21-146.924-54.633-12.523-122.88 75.055-129.077 132.131-7.418 69.818 9.95 139.462 86.88 149.411zM835.564 704.83s-119.259-92.247-188.815-191.913c-94.254-147.01-228.349-87.185-273.164-12.48-44.64 74.75-114.196 122.095-124.014 134.531-10.036 12.393-144 84.655-114.327 216.742 29.76 132 134.269 129.6 134.269 129.6s76.974 7.55 166.342-12.393c89.323-19.898 166.21 4.975 166.21 4.975s208.67 69.818 265.746-64.713C924.8 774.56 835.564 704.83 835.564 704.83zM478.487 905.076H342.865c-58.56-11.738-81.905-51.665-84.916-58.472-2.924-6.982-19.505-39.142-10.69-93.819 25.308-81.905 97.483-87.796 97.483-87.796h72.218v-88.844l61.484 0.96 0.087 327.928z m252.742-0.96H575.011c-60.524-15.534-63.316-58.56-63.316-58.56V672.844l63.36-1.004v155.127c3.84 16.495 24.436 19.637 24.436 19.637h64.32v-173.76h67.418v231.272z m220.975-461.018c0-29.847-24.742-119.65-116.64-119.65-92.073 0-104.335 84.741-104.335 144.654 0 57.163 4.887 137.062 119.127 134.443 114.415-2.443 101.848-129.469 101.848-159.447z\" ></path></symbol><symbol id=\"authing-wechat-pc\" viewBox=\"0 0 1239 1024\"><path d=\"M727.677 511.336c-19.042 0-38.132 17.906-38.132 40.074 0 17.906 19.09 36 38.132 36 28.61 0 49.074-18.094 49.074-36 0-22.168-20.463-40.074-49.074-40.074m-125.29-186.63c29.985 0 49.026-19.422 49.026-48.411 0-30.459-19.041-48.364-49.025-48.364-28.564 0-55.8 17.905-55.8 48.316 0 29.084 27.237 48.41 55.8 48.41m-142.959 402.3c-50.4 0-87.158-8.288-134.858-22.12L187.06 775.32l39.505-118.847c-96.726-69.11-153.9-156.269-153.9-262.705C72.667 205.763 246.984 62 459.43 62c187.91 0 355.454 113.353 388.09 273.742a185.542 185.542 0 0 0-36.757-4.168c-185.211 0-328.17 141.062-328.17 311.068 0 29.037 4.075 55.28 10.896 82.943-10.895 1.42-23.211 1.42-34.105 1.42M1027.33 862.48l27.19 99.52-103.5-59.447c-39.458 8.242-77.59 20.747-117.096 20.747-182.51 0-326.841-127.231-326.841-284.827 0-157.547 144.331-284.73 326.841-284.73 172.943 0 328.216 127.183 328.216 284.683 0 88.58-58.547 167.305-134.81 224.053M332.72 227.93c-28.563 0-58.548 17.905-58.548 48.316 0 29.084 29.985 48.41 58.547 48.41 27.238 0 49.026-19.326 49.026-48.362 0-30.459-21.788-48.364-49.025-48.364m608.73 283.405c-20.415 0-38.13 17.906-38.13 40.074 0 17.906 17.715 36 38.13 36 27.238 0 47.7-18.094 47.7-36 0-22.168-20.462-40.074-47.7-40.074\" ></path></symbol><symbol id=\"authing-wechat-miniprogram-qrconnec\" viewBox=\"0 0 1126 1024\"><path d=\"M961.876 262.606C900.851 134.702 747.238 80.676 619.77 141.425c-69.45 33.34-113.232 90.332-130.04 168.839-15.583 71.308-6.328 150.685 2.926 211.869 12.22 78.071 12.656 135.459 1.7 176.393-9.69 36.306-29.464 59.957-61.46 75.54a135.814 135.814 0 0 1-104.372 5.102 137.634 137.634 0 0 1-77.835-69.647 136.764 136.764 0 0 1 64.388-181.93c14.317-7.12 25.668-19.38 30.73-34.607 5.023-15.187 4.628-31.244-2.136-45.996a60.511 60.511 0 0 0-34.487-30.81 61.54 61.54 0 0 0-45.878 2.136 256.284 256.284 0 0 0-131.86 145.98 257.233 257.233 0 0 0 10.284 196.72 256.403 256.403 0 0 0 231.802 146.494 263.007 263.007 0 0 0 110.265-24.916c69.41-33.341 113.192-89.462 130.04-167.97 15.149-70.913 6.328-150.29-2.966-210.603-12.22-78.942-12.656-136.764-1.701-177.698 9.69-36.307 29.465-60.354 62.292-75.54a136.962 136.962 0 0 1 182.205 64.585 136.764 136.764 0 0 1-64.387 181.93 60.511 60.511 0 0 0-28.16 80.167c6.724 14.753 19.34 25.708 34.053 30.81 15.148 5.063 31.166 4.628 45.877-2.135 127.51-62.45 181.378-216.101 120.786-343.531z\" ></path></symbol><symbol id=\"authing-wechat-webpage-authorization\" viewBox=\"0 0 1188 1024\"><path d=\"M512 1.896C229.452 1.896 0 229.452 0 512s229.452 510.104 512 510.104S1022.104 794.548 1022.104 512 794.548 1.896 512 1.896z m-91.022 629.57c-26.548 0-49.304-5.688-75.852-11.377l-75.852 37.926 22.756-66.37c-54.993-37.926-87.23-87.23-87.23-147.912 0-104.296 98.607-185.837 218.074-185.837 108.089 0 201.007 64.474 219.97 153.6-7.585 0-13.274-1.896-20.859-1.896-104.296 0-185.837 77.748-185.837 172.563 0 15.17 1.896 30.34 7.585 45.511-7.585 3.793-15.17 3.793-22.755 3.793z m322.37 77.749l17.067 54.992-58.785-34.133c-22.756 5.689-43.615 11.378-66.37 11.378-104.297 0-185.838-70.163-185.838-157.393S530.963 424.77 635.26 424.77c98.608 0 185.837 70.163 185.837 159.29 0 47.407-32.237 91.021-77.748 125.155z\" fill=\"#46BB36\" ></path><path d=\"M318.578 379.26c0 17.066 13.274 30.34 30.34 30.34s30.341-13.274 30.341-30.34-13.274-30.341-30.34-30.341-30.341 13.274-30.341 30.34z m235.14 159.288c0 13.274 11.378 24.652 24.652 24.652 13.274 0 24.652-11.378 24.652-24.652 0-13.274-11.378-24.652-24.652-24.652-13.274-1.896-24.651 9.482-24.651 24.652z m-81.54-159.289c0 17.067 13.274 30.341 30.34 30.341 17.067 0 30.341-13.274 30.341-30.34 0-17.067-13.274-30.341-30.34-30.341-17.067 0-30.341 13.274-30.341 30.34zM675.08 538.55c0 13.273 11.378 24.651 24.652 24.651 13.274 0 24.652-11.378 24.652-24.652 0-13.274-11.378-24.652-24.652-24.652-13.274-1.896-24.652 9.482-24.652 24.652z\" fill=\"#46BB36\" ></path></symbol><symbol id=\"authing-wechat-miniprogram-default\" viewBox=\"0 0 1126 1024\"><path d=\"M961.876 262.606C900.851 134.702 747.238 80.676 619.77 141.425c-69.45 33.34-113.232 90.332-130.04 168.839-15.583 71.308-6.328 150.685 2.926 211.869 12.22 78.071 12.656 135.459 1.7 176.393-9.69 36.306-29.464 59.957-61.46 75.54a135.814 135.814 0 0 1-104.372 5.102 137.634 137.634 0 0 1-77.835-69.647 136.764 136.764 0 0 1 64.388-181.93c14.317-7.12 25.668-19.38 30.73-34.607 5.023-15.187 4.628-31.244-2.136-45.996a60.511 60.511 0 0 0-34.487-30.81 61.54 61.54 0 0 0-45.878 2.136 256.284 256.284 0 0 0-131.86 145.98 257.233 257.233 0 0 0 10.284 196.72 256.403 256.403 0 0 0 231.802 146.494 263.007 263.007 0 0 0 110.265-24.916c69.41-33.341 113.192-89.462 130.04-167.97 15.149-70.913 6.328-150.29-2.966-210.603-12.22-78.942-12.656-136.764-1.701-177.698 9.69-36.307 29.465-60.354 62.292-75.54a136.962 136.962 0 0 1 182.205 64.585 136.764 136.764 0 0 1-64.387 181.93 60.511 60.511 0 0 0-28.16 80.167c6.724 14.753 19.34 25.708 34.053 30.81 15.148 5.063 31.166 4.628 45.877-2.135 127.51-62.45 181.378-216.101 120.786-343.531z\" ></path></symbol><symbol id=\"authing-wechatwork-service-provider-authorization\" viewBox=\"0 0 1182 1024\"><path d=\"M993.598 913.02a7.062 7.062 0 0 1 4.908 2.224c15.678 17.761 37.252 31.073 59.816 35.505 15.713 3.354 26.482 18.873 26.482 36.634 0 19.968-14.706 36.617-32.362 36.617-16.666 0-30.402-14.424-32.361-32.185-4.909-25.53-15.714-47.722-30.42-65.466-0.971-1.112-1.942-3.337-2.931-5.561 0-4.432 2.93-7.768 6.868-7.768zM1024 0a105.931 105.931 0 0 1 105.931 105.949v453.42h-70.62V247.172H70.46v670.88h452.026v70.638H32.84C15.572 988.69 0.829 975.448 0 958.27v-857.9C2.79 44.19 49.346 0.053 105.843 0zM812.138 512c136.651 0 247.172 97.774 247.172 219.224h-60.804c0-101.888-85.663-162.286-182.22-163.045-117.565-0.918-189.686 76.182-193.553 157.184-2.471 51.412 16.42 92.495 61.617 127.47 5.032 4.131 4.184 17.479 3.178 23.658l-2.684 37.34s1.006 0 2.013-1.023l49.982-25.141a16.455 16.455 0 0 1 12.058-1.042c22.104 6.18 37.676 5.509 60.787 5.509 24.117 0 46.857-2.066 64.23-8.087l15.589 55.085a288.662 288.662 0 0 1-78.371 11.317c-25.124 0-49.24-3.09-72.334-9.27l-53.265 26.766c-5.014 2.065-12.059 3.09-18.08 3.09-6.037 0-12.058-2.066-17.09-5.138-10.045-7.221-15.06-19.562-14.053-34.993v-1.041l5.014-42.196c-49.222-40.148-76.358-97.775-76.358-157.484C564.966 609.792 675.486 512 812.138 512z m338.397 330.399c17.655 0 32.362 16.649 32.362 36.634 0 18.856-12.747 34.393-28.443 36.617-22.563 5.544-42.178 17.761-57.874 34.41a21.186 21.186 0 0 1-4.908 3.32c-3.92 0-6.868-3.32-6.868-7.769 0-2.225 0.99-4.431 1.978-5.544 15.678-17.76 27.454-42.178 31.373-67.707 2.948-17.744 16.684-29.961 32.38-29.961z m-141.242-30.261c3.92 0 6.868 3.337 6.868 7.768a9.075 9.075 0 0 1-1.977 5.544c-15.678 17.761-27.454 42.178-31.374 67.708-2.948 17.743-16.684 29.96-32.38 29.96-17.654 0-32.361-16.648-32.361-36.634 0-18.856 12.747-34.392 28.442-36.617 22.564-5.544 42.179-17.743 57.874-34.392 0.971-1.113 2.93-2.225 4.908-3.337z m39.23-70.62c16.667 0 30.402 14.424 32.362 32.185 4.908 25.511 15.713 47.722 30.42 65.465 1.942 1.112 1.942 3.337 2.93 5.561 0 4.432-2.93 7.769-6.867 7.769a7.062 7.062 0 0 1-4.908-2.225c-15.696-17.761-37.253-31.073-59.816-35.504-15.713-3.355-26.483-18.874-26.483-36.635 0-19.968 14.707-36.617 32.362-36.617zM511.912 70.584a53.177 53.177 0 0 0-37.5 15.537 53 53 0 0 0 17.426 86.422 53.407 53.407 0 0 0 58.05-11.582 52.824 52.824 0 0 0 11.388-57.838 53.23 53.23 0 0 0-49.364-32.539z m-176.605 0a53.177 53.177 0 0 0-37.5 15.537 53 53 0 0 0 17.426 86.422 53.407 53.407 0 0 0 58.05-11.582 52.824 52.824 0 0 0 11.388-57.838 53.23 53.23 0 0 0-49.364-32.539z m-176.499 0a53.177 53.177 0 0 0-37.5 15.537 53 53 0 0 0 17.426 86.422 53.407 53.407 0 0 0 58.05-11.582 52.824 52.824 0 0 0 11.388-57.838 53.23 53.23 0 0 0-49.364-32.539z\" ></path></symbol><symbol id=\"authing-wechatwork-corp-qrconnect\" viewBox=\"0 0 1220 1024\"><path d=\"M1077.17 663.237c-29.54-34.659-51.2-77.982-61.047-127.803-3.938-34.659-31.508-62.819-64.985-62.819-35.446 0-64.984 32.493-64.984 71.483 0 34.659 21.661 64.985 53.17 71.484 45.291 8.664 88.614 34.658 120.122 69.316 1.97 2.167 5.908 4.333 9.846 4.333 7.877 0 13.785-6.499 13.785-15.163-1.97-4.333-1.97-8.665-5.908-10.831z m-194.955-26.782c1.97-2.166 3.939-6.498 3.939-10.83 0-8.665-5.908-15.163-13.785-15.163-3.938 2.166-7.877 4.332-9.846 6.498-31.508 32.492-70.892 56.32-116.185 67.15-31.507 4.333-57.107 34.66-57.107 71.484 0 38.99 29.538 71.483 64.984 71.483 31.508 0 59.077-23.828 64.985-58.486 7.877-49.822 31.508-97.477 63.015-132.136z m165.416 243.2c31.507-32.492 70.892-56.32 116.184-67.15 31.508-4.333 57.108-34.659 57.108-71.483 0-38.991-29.538-71.484-64.985-71.484-31.507 0-59.076 23.828-64.984 58.487-7.877 49.821-31.508 97.477-63.016 132.135-1.969 2.166-3.938 6.498-3.938 10.83 0 8.665 5.908 15.164 13.785 15.164 3.938-2.166 7.877-4.332 9.846-6.499z m-76.8 1.379c-45.293-8.665-88.616-34.659-120.123-69.317a14.375 14.375 0 0 0-9.846-4.332c-7.877 0-13.785 6.498-13.785 15.163 1.97 4.332 3.938 8.664 5.908 10.83 29.538 34.659 51.2 77.982 61.046 127.804 3.938 34.658 31.507 62.818 64.984 62.818 35.447 0 64.985-32.492 64.985-71.483 0-34.659-21.662-64.985-53.17-71.483z\" ></path><path d=\"M243.554 810.2s2.048 0 4.096-2.067l101.534-50.708c8.172-4.135 16.345-4.135 24.497-2.067 44.899 12.445 76.544 11.106 123.49 11.106 48.995 0 95.174-4.155 130.502-16.325l31.665 111.065c-51.043 14.533-106.142 22.843-159.232 22.843a571.077 571.077 0 0 1-146.964-18.688l-108.19 53.957c-10.2 4.135-24.497 6.222-36.745 6.222-12.249 0-24.497-4.135-34.698-10.377-20.421-14.514-30.622-39.424-28.574-70.558v-2.068l10.201-85.07C55.099 676.51 0 560.285 0 439.926 0 197.12 224.551 0 502.154 0c277.622 0 502.154 197.14 502.154 442.014h-123.55c0-205.43-174.001-327.208-370.196-328.744-238.808-1.85-385.378 153.6-393.216 316.948-4.982 103.62 33.36 186.466 125.224 257.024 10.2 8.31 8.468 35.19 6.44 47.655\" ></path></symbol><symbol id=\"authing-wechatwork-service-provider-qrconnect\" viewBox=\"0 0 1220 1024\"><path d=\"M1077.17 663.237c-29.54-34.659-51.2-77.982-61.047-127.803-3.938-34.659-31.508-62.819-64.985-62.819-35.446 0-64.984 32.493-64.984 71.483 0 34.659 21.661 64.985 53.17 71.484 45.291 8.664 88.614 34.658 120.122 69.316 1.97 2.167 5.908 4.333 9.846 4.333 7.877 0 13.785-6.499 13.785-15.163-1.97-4.333-1.97-8.665-5.908-10.831z m-194.955-26.782c1.97-2.166 3.939-6.498 3.939-10.83 0-8.665-5.908-15.163-13.785-15.163-3.938 2.166-7.877 4.332-9.846 6.498-31.508 32.492-70.892 56.32-116.185 67.15-31.507 4.333-57.107 34.66-57.107 71.484 0 38.99 29.538 71.483 64.984 71.483 31.508 0 59.077-23.828 64.985-58.486 7.877-49.822 31.508-97.477 63.015-132.136z m165.416 243.2c31.507-32.492 70.892-56.32 116.184-67.15 31.508-4.333 57.108-34.659 57.108-71.483 0-38.991-29.538-71.484-64.985-71.484-31.507 0-59.076 23.828-64.984 58.487-7.877 49.821-31.508 97.477-63.016 132.135-1.969 2.166-3.938 6.498-3.938 10.83 0 8.665 5.908 15.164 13.785 15.164 3.938-2.166 7.877-4.332 9.846-6.499z m-76.8 1.379c-45.293-8.665-88.616-34.659-120.123-69.317a14.375 14.375 0 0 0-9.846-4.332c-7.877 0-13.785 6.498-13.785 15.163 1.97 4.332 3.938 8.664 5.908 10.83 29.538 34.659 51.2 77.982 61.046 127.804 3.938 34.658 31.507 62.818 64.984 62.818 35.447 0 64.985-32.492 64.985-71.483 0-34.659-21.662-64.985-53.17-71.483z\" ></path><path d=\"M243.554 810.2s2.048 0 4.096-2.067l101.534-50.708c8.172-4.135 16.345-4.135 24.497-2.067 44.899 12.445 76.544 11.106 123.49 11.106 48.995 0 95.174-4.155 130.502-16.325l31.665 111.065c-51.043 14.533-106.142 22.843-159.232 22.843a571.077 571.077 0 0 1-146.964-18.688l-108.19 53.957c-10.2 4.135-24.497 6.222-36.745 6.222-12.249 0-24.497-4.135-34.698-10.377-20.421-14.514-30.622-39.424-28.574-70.558v-2.068l10.201-85.07C55.099 676.51 0 560.285 0 439.926 0 197.12 224.551 0 502.154 0c277.622 0 502.154 197.14 502.154 442.014h-123.55c0-205.43-174.001-327.208-370.196-328.744-238.808-1.85-385.378 153.6-393.216 316.948-4.982 103.62 33.36 186.466 125.224 257.024 10.2 8.31 8.468 35.19 6.44 47.655\" ></path></symbol><symbol id=\"authing-weibo\" viewBox=\"0 0 1185 1024\"><path d=\"M891.75 466.973c-17.137-5.012-29.37-7.545-19.616-30.019 19.616-47.477 19.616-90 0-120.017-39.18-57.503-144.538-54.97-264.61-2.48 0 0-39.125 17.517-29.37-12.502 19.615-59.982 17.19-109.992-12.234-140.01-66.127-67.473-240.089 2.532-389.532 154.992C63.7 431.942 0 551.96 0 656.996c0 199.94 252.322 322.49 497.314 322.49 323.354 0 536.55-192.503 538.975-347.496 0-92.533-75.934-142.545-144.539-165.017zM499.794 907C303.79 926.941 134.73 836.94 122.497 704.474c-14.714-129.987 134.73-252.484 330.735-272.532 196.005-19.939 365.01 70.06 377.243 202.527 14.712 129.987-134.73 252.484-330.68 272.532z m19.563-375.034c-93.072-25.005-198.43 22.527-240.088 107.515-41.605 87.52 0 182.478 93.125 212.496 97.975 32.497 213.142-17.515 252.322-109.995 39.179-92.53-9.81-185.01-105.359-210.016z m-70.976 219.987c-19.616 30.018-61.22 45-90.645 30.018-29.372-14.982-39.18-50.012-19.617-82.455 19.616-30.07 58.796-42.574 88.22-30.07 29.372 15.034 39.18 50.01 22.042 82.507z m63.7-82.455c-7.329 12.45-22.095 17.461-34.275 12.45-12.287-4.958-17.192-17.462-9.809-29.964 4.85-12.503 19.564-17.515 31.797-12.503 12.288 5.011 17.191 17.515 12.288 29.964z m431.137-327.555a83.964 83.964 0 0 0-14.66-74.963c-19.616-19.994-46.562-30.019-71.029-22.527-22.096 5.012-41.658-9.97-46.563-30.018a40.258 40.258 0 0 1 29.426-47.479c51.412-10.023 107.783 5.012 144.537 47.479a157.904 157.904 0 0 1 31.797 152.514c-7.33 19.994-29.372 32.497-48.988 25.006-19.563-5.012-31.796-27.485-24.466-50.012z m227.908 75.018a44.838 44.838 0 0 1-56.37 30.019c-24.521-7.546-36.755-35.032-29.426-57.504a226.13 226.13 0 0 0-46.508-222.52c-56.372-62.515-137.21-87.52-213.144-70.006a45.108 45.108 0 0 1-53.892-35.029c-4.904-24.952 9.754-49.958 34.276-54.97a312.789 312.789 0 0 1 298.884 97.544c78.413 87.467 98.03 207.485 66.18 312.466z\" ></path></symbol><symbol id=\"authing-github\" viewBox=\"0 0 1024 1024\"><path d=\"M51.57 672.155c3.72-6.605 52.236-29.956 126.057 57.307 0.186 0 0.465 0.14 0.79 0.419 5.21 4.326 29.538 39.26 43.307 51.865 58.935 53.307 147.083 12.001 157.13 6.047 4.652-38.282 19.025-68.378 43.027-90.52a290.072 290.072 0 0 1-64.052-10.047 203.832 203.832 0 0 1-61.029-18.048 168.852 168.852 0 0 1-58.052-29.165c-17.35-9.35-33.677-23.444-49.027-42.237a205.367 205.367 0 0 1-40.004-58.284c-10.698-20.095-19.071-45.911-25.072-77.356-6-28.84-8.977-62.005-8.977-99.543 0-68.983 22.979-129.64 69.076-181.924-2.745-5.395-33.026-77.17 7.907-179.969 55.447-1.954 115.173 23.49 185.226 68.332A925.198 925.198 0 0 1 547.008 46.89c56.936 1.907 113.592 9.303 169.132 22.142C739.49 54.984 821.637-1.3 900.249 2.747c37.678 89.45 11.024 170.154 6.977 178.9 46.05 46.236 69.076 104.846 69.076 175.875v6.047c0.326 5.024 0.512 10.094 0.512 15.118 0 27.77-3.163 55.958-9.536 84.473a349.24 349.24 0 0 1-25.025 77.402 282.816 282.816 0 0 1-39.027 57.26 367.242 367.242 0 0 1-49.028 41.26c-18.42 10.56-37.445 20.002-57.074 28.142a1890.865 1890.865 0 0 1-61.076 18.048 1650.986 1650.986 0 0 0-64.052 10.048c30.05 25.49 45.4 66.982 46.05 124.662a3242.148 3242.148 0 0 0-0.464 55.54c0 19.583 0.186 40.282 0.465 62.052-0.651 21.444-0.93 37.724-0.93 48.795 0 11.07 0.279 16.931 0.93 17.536a677.27 677.27 0 0 1-159.084 20.048h-14.978c-54.424 0-107.452-6.651-159.177-20.14-0.698-0.652-0.977-39.214-0.977-115.546-20.7 4.652-157.037 31.538-217.508-69.913-19.304-30.05-35.351-103.405-100.753-136.152-6.93 18.048-28.84 2.652-14-10.047z\" ></path></symbol></svg>'\n","import { getGuardHttp } from '../_utils/guardHttp'\n\nexport enum ChangePasswordBusinessAction {\n ResetPassword = 'reset-password-first-time',\n FirstLoginReset = 'reset-password-forced',\n}\n\nexport const authFlow = async (\n action: ChangePasswordBusinessAction,\n content: {\n password: string\n oldPassword?: string\n }\n) => {\n const { authFlow } = getGuardHttp()\n\n const res = await authFlow(action, { ...content })\n\n return res\n}\n","import React, { FC } from 'react'\nimport { getClassnames } from '../../_utils'\nimport './iconfont'\nimport './style.less'\n\nexport const IconFont: FC<{\n type: string\n style?: React.CSSProperties\n className?: string\n}> = ({ type, style, className }) => {\n return (\n <svg\n style={{ ...style }}\n className={getClassnames(['authing-icon', className])}\n >\n <use xlinkHref={`#${type}`}></use>\n </svg>\n )\n}\n","import { Input } from 'antd'\nimport { PasswordProps } from 'antd/lib/input'\nimport React from 'react'\nimport { IconFont } from '../AuthingGuard/IconFont'\nexport const InputPassword = React.forwardRef<\n React.RefObject<Input>,\n PasswordProps\n>((props, ref) => {\n return (\n <Input.Password\n ref={ref}\n {...props}\n iconRender={(visible) => (\n <span style={{ display: 'flex', height: '100%', alignItems: 'center' }}>\n {visible ? (\n <IconFont type=\"authing-a-eye-line1\" />\n ) : (\n <IconFont type=\"authing-a-eye-close-line1\" />\n )}\n </span>\n )}\n />\n )\n})\n","import { AuthenticationClient, CommonMessage, User } from 'authing-js-sdk'\nimport { getDefaultG2Config, IG2Config, IG2Events, IG2FCProps } from '../Type'\n\nexport interface CompleteInfoConfig extends IG2Config {}\n\nconst defaultConfig: CompleteInfoConfig = {\n ...getDefaultG2Config(),\n}\n\nexport const getDefaultCompleteInfoConfig = (): CompleteInfoConfig => ({\n ...getDefaultG2Config(),\n ...defaultConfig,\n})\n\nexport interface CompleteInfoEvents extends IG2Events {\n onRegisterInfoCompleted?: (\n user: User,\n udfs: {\n definition: any\n value: any\n }[],\n authClient: AuthenticationClient\n ) => void\n onRegisterInfoCompletedError?: (\n error: CommonMessage,\n udfs: {\n definition: any\n value: any\n }[],\n authClient: AuthenticationClient\n ) => void\n}\n\nexport interface GuardCompleteInfoProps extends IG2FCProps, CompleteInfoEvents {\n config: Partial<CompleteInfoConfig>\n}\n\nexport interface GuardCompleteInfoViewProps extends GuardCompleteInfoProps {\n config: CompleteInfoConfig\n initData: any\n onLogin?: any\n}\n\nexport type ExtendsFieldType = 'user' | 'internal'\n\nexport interface ExtendsField {\n type: ExtendsFieldType\n name: string\n label: string\n inputType: string\n required: boolean\n validateRules: any[]\n}\n\nexport enum FormValidateRule {\n NONE = 'none',\n EMAIL = 'email',\n PHONE = 'phone',\n IS_NUMBER = 'isNumber',\n REG_EXP = 'regExp',\n}\n\nexport interface CompleteInfoRule {\n type: FormValidateRule\n content: string\n errorMessage?: string\n}\n\nexport interface CompleteInfoSelectOption {\n value: string\n label: string\n}\n\nexport interface CompleteInfoMetaData {\n type: CompleteInfoBaseControls | CompleteInfoExtendsControls\n label: string\n name: string\n required: boolean\n validateRules: CompleteInfoRule[]\n options?: CompleteInfoSelectOption[]\n}\n\nexport enum CompleteInfoBaseControls {\n USERNAME = 'username',\n PHONE = 'phone',\n EMAIL = 'email',\n}\n\nexport enum CompleteInfoExtendsControls {\n IMAGE = 'image',\n NUMBER = 'number',\n DATE = 'date',\n DATE_TIME = 'dateTime',\n SELECT = 'select',\n DROPDOWN = 'dropdown',\n BOOLEAN = 'boolean',\n STRING = 'string',\n TEXT = 'text',\n GENDER = 'gender',\n COUNTRY = 'country',\n}\n\nexport interface CompleteInfoInitData {\n skip: boolean\n metaData: CompleteInfoMetaData[]\n}\n\nexport interface RegisterCompleteInfoInitData {\n content: any\n businessRequestName: 'registerByEmail' | 'registerByPhoneCode'\n}\nexport interface CompleteInfoRequest {\n fieldValues: {\n name: string\n value: string\n code?: string\n }[]\n}\n\nexport enum OmitCompleteInfo {\n 'registerByEmail' = 'email',\n 'registerByPhoneCode' = 'phone',\n}\n","import React, { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Form, message } from 'antd'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport SubmitButton from '../../SubmitButton'\nimport CustomFormItem from '../../ValidatorRules'\nimport { IconFont } from '../../IconFont'\nimport { InputPassword } from '../../InputPassword'\nimport {\n useGuardInitData,\n useGuardIsAuthFlow,\n useGuardPublicConfig,\n} from '../../_utils/context'\nimport { authFlow, ChangePasswordBusinessAction } from '../businessRequest'\nimport { ApiCode } from '../../_utils/responseManagement/interface'\ninterface FirstLoginResetProps {\n onReset: any\n}\nexport const FirstLoginReset: React.FC<FirstLoginResetProps> = ({\n onReset,\n}) => {\n const { t } = useTranslation()\n\n const initData = useGuardInitData<{ token: string }>()\n\n const isAuthFlow = useGuardIsAuthFlow()\n\n const { publicKey } = useGuardPublicConfig()\n\n let [form] = Form.useForm()\n\n let client = useGuardAuthClient()\n\n const encrypt = client.options.encryptFunction\n\n let submitButtonRef = useRef<any>(null)\n\n const onFinish = async (values: any) => {\n let newPassword = values.password\n submitButtonRef.current?.onSpin(true)\n\n if (isAuthFlow) {\n // 重置密码成功不会返回 UserInfo\n const { apiCode, onGuardHandling } = await authFlow(\n ChangePasswordBusinessAction.FirstLoginReset,\n {\n password: await encrypt!(newPassword, publicKey),\n }\n )\n submitButtonRef.current?.onSpin(false)\n\n if (apiCode === ApiCode.ABORT_FLOW) {\n onReset()\n } else {\n submitButtonRef.current?.onError()\n onGuardHandling?.()\n }\n } else {\n try {\n let res = await client.resetPasswordByFirstLoginToken({\n token: initData.token,\n password: newPassword,\n })\n onReset(res)\n } catch (error: any) {\n message.error(error.message)\n submitButtonRef?.current?.onError()\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n }\n }\n\n return (\n <div className=\"authing-g2-login-phone-code\">\n <Form\n name=\"resetPassword\"\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => {\n submitButtonRef?.current?.onError()\n }}\n autoComplete=\"off\"\n >\n <CustomFormItem.Password\n className=\"authing-g2-input-form\"\n name=\"password\"\n required={true}\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputPwd')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </CustomFormItem.Password>\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"password2\"\n rules={[\n {\n validator(_, value) {\n let pwd = form.getFieldValue('password')\n if (!value) {\n return Promise.reject(t('login.inputPwd'))\n }\n if (value !== pwd) {\n return Promise.reject(t('common.repeatPasswordDoc'))\n }\n return Promise.resolve()\n },\n },\n ]}\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputPwdAgain')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n\n <Form.Item className=\"authing-g2-input-form submit-form\">\n <SubmitButton\n className=\"forget-password\"\n text={t('common.confirm')}\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import React, { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Form, message } from 'antd'\nimport SubmitButton from '../../SubmitButton'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport CustomFormItem from '../../ValidatorRules'\nimport { fieldRequiredRule } from '../../_utils'\nimport { InputPassword } from '../../InputPassword'\nimport { IconFont } from '../../IconFont'\nimport {\n useGuardInitData,\n useGuardIsAuthFlow,\n useGuardPublicConfig,\n} from '../../_utils/context'\nimport { authFlow, ChangePasswordBusinessAction } from '../businessRequest'\nimport { ApiCode } from '../../_utils/responseManagement/interface'\n\ninterface RotateResetProps {\n onReset: any\n}\n\nexport const RotateReset = (props: RotateResetProps) => {\n const { t } = useTranslation()\n\n const { onReset } = props\n\n let [form] = Form.useForm()\n\n const { publicKey } = useGuardPublicConfig()\n\n let authClient = useGuardAuthClient()\n\n const encrypt = authClient.options.encryptFunction\n\n const isAuthFlow = useGuardIsAuthFlow()\n\n let submitButtonRef = useRef<any>(null)\n\n const initData = useGuardInitData<{ token: string }>()\n\n const onFinish = async (values: any) => {\n let { password, oldPassword } = values\n submitButtonRef?.current?.onSpin(true)\n\n if (isAuthFlow) {\n const { apiCode, onGuardHandling } = await authFlow(\n ChangePasswordBusinessAction.ResetPassword,\n {\n password: await encrypt!(password, publicKey),\n oldPassword: await encrypt!(oldPassword, publicKey),\n }\n )\n\n submitButtonRef?.current?.onSpin(false)\n\n // 重置密码 返回的是流程终止\n if (apiCode === ApiCode.ABORT_FLOW) {\n onReset()\n } else {\n submitButtonRef?.current?.onError()\n onGuardHandling?.()\n }\n } else {\n try {\n let res = await authClient.resetPasswordByForceResetToken({\n token: initData.token,\n newPassword: password,\n oldPassword: oldPassword,\n })\n props.onReset({ code: 200, data: res })\n } catch (error) {\n message.error(error.message)\n submitButtonRef?.current?.onError()\n } finally {\n submitButtonRef?.current?.onSpin(false)\n }\n }\n }\n\n return (\n <div className=\"authing-g2-login-phone-code\">\n <Form\n name=\"resetPassword\"\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => {\n submitButtonRef?.current?.onError()\n }}\n autoComplete=\"off\"\n >\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"oldPassword\"\n rules={[...fieldRequiredRule(t('common.password'))]}\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('user.inputCurrPwd')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n <CustomFormItem.Password\n className=\"authing-g2-input-form\"\n name=\"password\"\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputPwd')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </CustomFormItem.Password>\n <CustomFormItem.Password\n className=\"authing-g2-input-form\"\n name=\"password2\"\n rules={[\n {\n validator(_, value) {\n let pwd = form.getFieldValue('password')\n if (!value) {\n return Promise.reject(t('login.inputPwd'))\n }\n if (value !== pwd) {\n return Promise.reject(t('common.repeatPasswordDoc'))\n }\n return Promise.resolve()\n },\n },\n ]}\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputPwdAgain')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </CustomFormItem.Password>\n <Form.Item className=\"authing-g2-input-form submit-form\">\n <SubmitButton\n className=\"forget-password\"\n text={t('common.confirm')}\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import { message } from 'antd'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GuardModuleType } from '../Guard/module'\nimport { ImagePro } from '../ImagePro'\nimport {\n useGuardFinallyConfig,\n useGuardInitData,\n useGuardModule,\n} from '../_utils/context'\nimport { FirstLoginReset } from './core/firstLoginReset'\nimport { RotateReset } from './core/rotateReset'\n\n// 手动修改密码,并非「忘记密码」\n// 进入的场景是读取配置:1开了首次登录修改密码 || 2开了密码轮换\nexport const GuardChangePassword: React.FC<{\n title: string\n explain: string\n}> = (props) => {\n const { title, explain, children } = props\n\n const config = useGuardFinallyConfig()\n\n const typeContent = useMemo(\n () => ({\n title,\n explain,\n }),\n [explain, title]\n )\n\n return (\n <div className=\"g2-view-container g2-change-password\">\n <div className=\"g2-view-header\">\n <ImagePro\n src={config?.logo!}\n size={48}\n borderRadius={4}\n alt=\"\"\n className=\"icon\"\n />\n <div className=\"title\">{typeContent.title}</div>\n <div className=\"title-explain\">{typeContent.explain}</div>\n </div>\n <div className=\"g2-view-tabs\">{children}</div>\n </div>\n )\n}\n\nexport const GuardFirstLoginPasswordResetView: React.FC = () => {\n const { t } = useTranslation()\n\n const { changeModule } = useGuardModule()\n\n const onReset = () => {\n message.success(t('common.updatePsswordSuccess'))\n setTimeout(() => {\n changeModule?.(GuardModuleType.LOGIN)\n }, 500)\n }\n\n const config = useGuardFinallyConfig()\n\n const coreForm = <FirstLoginReset onReset={onReset} />\n\n return (\n <GuardChangePassword\n title={`${t('common.welcome')} ${config.title}`}\n explain={t('common.initPasswordText')}\n >\n {coreForm}\n </GuardChangePassword>\n )\n}\n\nexport const GuardForcedPasswordResetView: React.FC = () => {\n const { t } = useTranslation()\n\n const { changeModule } = useGuardModule()\n\n const initData = useGuardInitData<{ forcedCycle: number }>()\n\n const onReset = () => {\n message.success(t('common.updatePsswordSuccess'))\n setTimeout(() => {\n changeModule?.(GuardModuleType.LOGIN)\n }, 500)\n }\n\n const coreForm = <RotateReset onReset={onReset} />\n\n return (\n <GuardChangePassword\n title={t('user.modifyPwd')}\n explain={t('user.modifyPwdText', {\n number: initData.forcedCycle,\n })}\n >\n {coreForm}\n </GuardChangePassword>\n )\n}\n","import { PlusOutlined } from '@ant-design/icons'\nimport { message, Spin, Upload } from 'antd'\nimport { UploadChangeParam } from 'antd/lib/upload'\nimport React, { FC, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useGuardContext } from '../../../context/global/context'\n\nexport const UploadImage: FC<{\n value?: string\n onChange?: (value: string) => void\n}> = ({ value, onChange }) => {\n const [uploading, setUploading] = useState(false)\n const { t } = useTranslation()\n const {\n state: {\n config: { apiHost },\n },\n } = useGuardContext()\n\n const onStatusChange = (info: UploadChangeParam) => {\n const { status } = info.file\n\n if (status === 'uploading') {\n setUploading(true)\n } else {\n setUploading(false)\n }\n\n if (status === 'done') {\n const { code, message: errMsg, data } = info.file.response\n if (code !== 200) {\n return message.error(errMsg)\n }\n const { url } = data\n onChange?.(url)\n } else if (status === 'error') {\n message.error(\n t('common.uploadFail', {\n name: info.file.name,\n })\n )\n }\n }\n\n const uploadButton = (\n <div>\n <PlusOutlined />\n <div style={{ marginTop: 8 }}>Upload</div>\n </div>\n )\n\n return (\n <Upload\n name=\"file\"\n accept=\"image/*\"\n listType=\"picture-card\"\n showUploadList={false}\n action={`${apiHost}/api/v2/upload?folder=photos`}\n onChange={onStatusChange}\n >\n <Spin size=\"small\" spinning={uploading}>\n {value ? (\n <img src={value} alt=\"\" style={{ width: '100%' }} />\n ) : (\n uploadButton\n )}\n </Spin>\n </Upload>\n )\n}\n","import { getGuardAuthClient } from '../Guard/authClient'\nimport { getGuardHttp } from '../_utils/guardHttp'\nimport { CompleteInfoRequest } from './interface'\n\nexport enum CompleteInfoAuthFlowAction {\n Complete = 'complete-completion',\n Skip = 'skip-completion',\n}\n\nexport const authFlow = async (\n action: CompleteInfoAuthFlowAction,\n data?: CompleteInfoRequest\n) => {\n const { authFlow } = getGuardHttp()\n\n const res = await authFlow(action, data)\n\n return res\n}\n\nconst registerMethod = (\n fnName: 'registerByEmail' | 'registerByPhoneCode',\n content: any,\n profile?: any\n) => {\n const authClient = getGuardAuthClient()\n\n if (fnName === 'registerByEmail') {\n return authClient!.registerByEmail(\n content.email,\n content.password,\n {\n ...content.profile,\n ...profile,\n },\n {\n ...content.options,\n phoneToken: profile?.phoneToken,\n }\n )\n } else if (fnName === 'registerByPhoneCode') {\n return authClient!.registerByPhoneCode(\n content.phone,\n content.code,\n content.password,\n {\n ...content.profile,\n ...profile,\n },\n {\n ...content.options,\n phoneToken: profile?.emailToken,\n }\n )\n }\n}\n\nexport const registerRequest = async (\n action: CompleteInfoAuthFlowAction,\n registerFnName: 'registerByEmail' | 'registerByPhoneCode',\n registerContent: any,\n registerProfile?: any\n) => {\n if (action === CompleteInfoAuthFlowAction.Skip) {\n return await registerMethod(registerFnName, registerContent)\n } else if (action === CompleteInfoAuthFlowAction.Complete) {\n return await registerMethod(\n registerFnName,\n registerContent,\n registerProfile\n )\n }\n}\n","import Input, { InputProps } from 'antd/lib/input'\nimport React, { useState } from 'react'\n\nexport interface InputNumberProps extends InputProps {}\n\nexport const InputNumber = React.forwardRef<any, InputNumberProps>(\n (props, ref) => {\n const { onChange, value: propsValue, ...inputProps } = props\n const [value, setValue] = useState<InputNumberProps['value']>(\n /^[0-9]*$/.test(String(propsValue)) ? propsValue : ''\n )\n\n const valueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value)\n onChange?.(e)\n }\n\n return (\n <Input\n {...inputProps}\n ref={ref}\n value={value}\n type=\"tel\"\n pattern=\"[0-9]*\"\n onChange={(e) => {\n let v = e.target.value\n if (!/^[0-9]*$/.test(v)) {\n return\n }\n\n valueChange(e)\n }}\n />\n )\n }\n)\n","import { Button } from 'antd'\nimport React, { FC, useState, useRef, useEffect, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport './style.less'\nimport { ButtonProps } from 'antd/lib/button'\n\nconst TIME = 60\nexport interface SendCodeProps extends ButtonProps {\n beforeSend: () => Promise<boolean>\n btnRef?: React.RefObject<HTMLButtonElement>\n setSent?: (value: boolean) => void\n sendDesc?: string\n}\n\nconst useSentCounter = (effect: any) => {\n const [countDown, setCountDown] = useState(0)\n const timerRef = useRef<any>(0)\n\n useEffect(() => {\n return () => clearInterval(timerRef.current)\n }, [])\n\n useEffect(() => {\n if (countDown <= 0) {\n clearInterval(timerRef.current)\n effect?.(false)\n } else {\n effect?.(true)\n }\n }, [countDown, effect])\n\n const enabled = useMemo(() => countDown <= 0, [countDown])\n\n const send = () => {\n setCountDown(TIME)\n\n timerRef.current = setInterval(() => {\n setCountDown((prev) => {\n return prev - 1\n })\n }, 1000)\n }\n\n return {\n enabled,\n send,\n countDown,\n }\n}\n\nexport const SendCodeBtn: FC<SendCodeProps> = (props) => {\n const { t } = useTranslation()\n const {\n sendDesc = t('login.clickSent'),\n beforeSend,\n btnRef,\n setSent,\n ...buttonProps\n } = props\n const { enabled, send, countDown } = useSentCounter(setSent)\n const [loading, setLoading] = useState(false)\n const disabled = useMemo(() => {\n return !enabled || loading\n }, [enabled, loading])\n\n const onClick = async (e: React.MouseEvent<HTMLButtonElement>) => {\n setLoading(true)\n if (disabled) {\n return\n }\n let beforeStop = !(await beforeSend())\n if (beforeStop) {\n setLoading(false)\n return\n }\n setLoading(false)\n send()\n }\n\n return (\n <Button\n {...buttonProps}\n className={\n buttonProps.type ?? 'authing-g2-send-code-btn g2-loading-btn-center'\n }\n disabled={disabled}\n loading={loading}\n onClick={onClick}\n ref={btnRef}\n >\n {loading === true && <span></span>}\n {loading === false && (\n <span>\n {enabled\n ? sendDesc\n : t('common.retryAfterTime', {\n time: countDown,\n })}\n </span>\n )}\n </Button>\n )\n}\n","import { Col, Row } from 'antd'\nimport React, { FC } from 'react'\n\nimport { SendCodeBtn } from './SendCodeBtn'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nimport { InputProps } from 'antd/lib/input'\nimport { InputNumber } from '../InputNumber'\n\nexport interface SendPhoneCodeProps extends InputProps {\n form?: any\n beforeSend?: any // 点击的时候先做这个\n autoSubmit?: boolean //验证码输入完毕是否自动提交\n}\n\nexport const SendCode: FC<SendPhoneCodeProps> = ({\n value,\n onChange,\n autoSubmit = false,\n form,\n beforeSend,\n maxLength,\n ...inputProps\n}) => {\n const { t } = useTranslation()\n\n return (\n <>\n <Row justify=\"space-between\" align=\"middle\">\n <Col span={15} className=\"g2-send-code-input-col\">\n <InputNumber\n value={value}\n onChange={(e) => {\n onChange?.(e)\n if (!autoSubmit) return\n if (maxLength && e.target.value.length >= maxLength) {\n form?.submit()\n }\n }}\n {...inputProps}\n maxLength={maxLength}\n />\n </Col>\n <Col offset={1} span={8}>\n <SendCodeBtn\n beforeSend={beforeSend}\n sendDesc={t('common.sendVerifyCode')}\n />\n </Col>\n </Row>\n </>\n )\n}\n","import { message } from 'antd'\nimport React, { FC } from 'react'\nimport { EmailScene } from 'authing-js-sdk'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { validate } from '../_utils'\nimport { InputProps } from 'antd/lib/input'\nimport { SendCode } from './index'\nexport interface SendCodeByEmailProps extends InputProps {\n data: string\n form?: any\n onSendCodeBefore?: any // 点击的时候先做这个\n fieldName?: string\n autoSubmit?: boolean //验证码输入完毕是否自动提交\n scene: EmailScene\n}\n\nexport const SendCodeByEmail: FC<SendCodeByEmailProps> = (props) => {\n const {\n scene,\n data,\n form,\n onSendCodeBefore,\n fieldName,\n ...remainProps\n } = props\n const { t } = useTranslation()\n\n const authClient = useGuardAuthClient()\n\n const sendEmail = async (email: string) => {\n if (!email) {\n message.error(t('login.inputEmail'))\n return false\n }\n if (!validate('email', email)) {\n message.error(t('common.emailFormatError'))\n return false\n }\n try {\n await authClient.sendEmail(email, scene)\n // onSend?.()\n return true\n } catch (error) {\n // onError?.(error)\n return false\n }\n }\n\n return (\n <SendCode\n beforeSend={() => {\n return onSendCodeBefore()\n .then(async (b: any) => {\n let email = form ? form.getFieldValue(fieldName || 'email') : data\n return await sendEmail(email)\n })\n .catch((e: any) => {\n return false\n })\n }}\n form={form}\n {...remainProps}\n />\n )\n}\n","import { message } from 'antd'\nimport React, { FC } from 'react'\nimport { SceneType } from 'authing-js-sdk'\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { InputProps } from 'antd/lib/input'\nimport { SendCode } from './index'\nimport { parsePhone } from '../_utils/hooks'\nexport interface SendCodeByPhoneProps extends InputProps {\n data?: string\n form?: any\n onSendCodeBefore?: any // 点击的时候先做这个\n fieldName?: string\n autoSubmit?: boolean //验证码输入完毕是否自动提交\n scene: SceneType\n areaCode?: string //国际区号\n isInternationSms?: boolean //是否是国际短信\n}\n\nexport const SendCodeByPhone: FC<SendCodeByPhoneProps> = (props) => {\n const {\n scene,\n data,\n form,\n areaCode,\n onSendCodeBefore,\n fieldName,\n isInternationSms = false,\n ...remainProps\n } = props\n const { t } = useTranslation()\n\n const authClient = useGuardAuthClient()\n\n const sendPhone = async (phone: string, countryCode?: string) => {\n try {\n await authClient.sendSmsCode(phone, countryCode, scene)\n return true\n } catch (error: any) {\n if (error.code === 'ECONNABORTED') {\n message.error(t('login.sendCodeTimeout'))\n return false\n }\n const { message: msg } = JSON.parse(error.message)\n message.error(msg)\n return false\n }\n }\n\n return (\n <>\n <SendCode\n beforeSend={() => {\n return onSendCodeBefore()\n .then(async (b: any) => {\n let fieldValue = form\n ? form.getFieldValue(fieldName || 'phone')\n : data\n const { phoneNumber, countryCode } = parsePhone(\n isInternationSms,\n fieldValue,\n areaCode\n )\n\n return await sendPhone(phoneNumber, countryCode)\n })\n .catch((e: any) => {\n return false\n })\n }}\n form={form}\n {...remainProps}\n />\n </>\n )\n}\n","export interface IsoType {\n iso: string\n regions: string\n regions_en: string\n phoneCountryCode: string\n}\nexport const isoInfo: IsoType[] = [\n {\n iso: 'CA',\n regions: '加拿大',\n regions_en: 'Canada',\n phoneCountryCode: '+1',\n },\n {\n iso: 'US',\n regions: '美国',\n regions_en: 'United States',\n phoneCountryCode: '+1',\n },\n {\n iso: 'KZ',\n regions: '哈萨克斯坦',\n regions_en: 'Kazakhstan',\n phoneCountryCode: '+7',\n },\n {\n iso: 'RU',\n regions: '俄罗斯',\n regions_en: 'Russia',\n phoneCountryCode: '+7',\n },\n {\n iso: 'EG',\n regions: '埃及',\n regions_en: 'Egypt',\n phoneCountryCode: '+20',\n },\n {\n iso: 'ZA',\n regions: '南非',\n regions_en: 'South Africa',\n phoneCountryCode: '+27',\n },\n {\n iso: 'GR',\n regions: '希腊',\n regions_en: 'Greece',\n phoneCountryCode: '+30',\n },\n {\n iso: 'NL',\n regions: '荷兰',\n regions_en: 'Netherlands',\n phoneCountryCode: '+31',\n },\n {\n iso: 'BE',\n regions: '比利时',\n regions_en: 'Belgium',\n phoneCountryCode: '+32',\n },\n {\n iso: 'FR',\n regions: '法国',\n regions_en: 'France',\n phoneCountryCode: '+33',\n },\n {\n iso: 'ES',\n regions: '西班牙',\n regions_en: 'Spain',\n phoneCountryCode: '+34',\n },\n {\n iso: 'HU',\n regions: '匈牙利',\n regions_en: 'Hungary',\n phoneCountryCode: '+36',\n },\n {\n iso: 'IT',\n regions: '意大利',\n regions_en: 'Italy',\n phoneCountryCode: '+39',\n },\n {\n iso: 'RO',\n regions: '罗马尼亚',\n regions_en: 'Romania',\n phoneCountryCode: '+40',\n },\n {\n iso: 'CH',\n regions: '瑞士',\n regions_en: 'Switzerland',\n phoneCountryCode: '+41',\n },\n {\n iso: 'AT',\n regions: '奥地利',\n regions_en: 'Austria',\n phoneCountryCode: '+43',\n },\n {\n iso: 'GB',\n regions: '英国',\n regions_en: 'United Kingdom',\n phoneCountryCode: '+44',\n },\n {\n iso: 'DK',\n regions: '丹麦',\n regions_en: 'Denmark',\n phoneCountryCode: '+45',\n },\n {\n iso: 'SE',\n regions: '瑞典',\n regions_en: 'Sweden',\n phoneCountryCode: '+46',\n },\n {\n iso: 'NO',\n regions: '挪威',\n regions_en: 'Norway',\n phoneCountryCode: '+47',\n },\n {\n iso: 'PL',\n regions: '波兰',\n regions_en: 'Poland',\n phoneCountryCode: '+48',\n },\n {\n iso: 'DE',\n regions: '德国',\n regions_en: 'Germany',\n phoneCountryCode: '+49',\n },\n {\n iso: 'PE',\n regions: '秘鲁',\n regions_en: 'Peru',\n phoneCountryCode: '+51',\n },\n {\n iso: 'MX',\n regions: '墨西哥',\n regions_en: 'Mexico',\n phoneCountryCode: '+52',\n },\n {\n iso: 'CU',\n regions: '古巴',\n regions_en: 'Cuba',\n phoneCountryCode: '+53',\n },\n {\n iso: 'AR',\n regions: '阿根廷',\n regions_en: 'Argentina',\n phoneCountryCode: '+54',\n },\n {\n iso: 'BR',\n regions: '巴西',\n regions_en: 'Brazil',\n phoneCountryCode: '+55',\n },\n {\n iso: 'CL',\n regions: '智利',\n regions_en: 'Chile',\n phoneCountryCode: '+56',\n },\n {\n iso: 'CO',\n regions: '哥伦比亚',\n regions_en: 'Colombia',\n phoneCountryCode: '+57',\n },\n {\n iso: 'VE',\n regions: '委内瑞拉',\n regions_en: 'Venezuela',\n phoneCountryCode: '+58',\n },\n {\n iso: 'MY',\n regions: '马来西亚',\n regions_en: 'Malaysia',\n phoneCountryCode: '+60',\n },\n {\n iso: 'AU',\n regions: '澳大利亚',\n regions_en: 'Australia',\n phoneCountryCode: '+61',\n },\n {\n iso: 'ID',\n regions: '印度尼西亚',\n regions_en: 'Indonesia',\n phoneCountryCode: '+62',\n },\n {\n iso: 'PH',\n regions: '菲律宾',\n regions_en: 'Philippines',\n phoneCountryCode: '+63',\n },\n {\n iso: 'NZ',\n regions: '新西兰',\n regions_en: 'New Zealand',\n phoneCountryCode: '+64',\n },\n {\n iso: 'SG',\n regions: '新加坡',\n regions_en: 'Singapore',\n phoneCountryCode: '+65',\n },\n {\n iso: 'TH',\n regions: '泰国',\n regions_en: 'Thailand',\n phoneCountryCode: '+66',\n },\n {\n iso: 'JP',\n regions: '日本',\n regions_en: 'Japan',\n phoneCountryCode: '+81',\n },\n {\n iso: 'KR',\n regions: '韩国',\n regions_en: 'South Korea',\n phoneCountryCode: '+82',\n },\n {\n iso: 'VN',\n regions: '越南',\n regions_en: 'Vietnam',\n phoneCountryCode: '+84',\n },\n {\n iso: 'CN',\n regions: '中国',\n regions_en: 'China',\n phoneCountryCode: '+86',\n },\n {\n iso: 'TR',\n regions: '土耳其',\n regions_en: 'Turkey',\n phoneCountryCode: '+90',\n },\n {\n iso: 'IN',\n regions: '印度',\n regions_en: 'India',\n phoneCountryCode: '+91',\n },\n {\n iso: 'PK',\n regions: '巴基斯坦',\n regions_en: 'Pakistan',\n phoneCountryCode: '+92',\n },\n {\n iso: 'AF',\n regions: '阿富汗',\n regions_en: 'Afghanistan',\n phoneCountryCode: '+93',\n },\n {\n iso: 'LK',\n regions: '斯里兰卡',\n regions_en: 'Sri Lanka',\n phoneCountryCode: '+94',\n },\n {\n iso: 'MM',\n regions: '缅甸',\n regions_en: 'Myanmar',\n phoneCountryCode: '+95',\n },\n {\n iso: 'IR',\n regions: '伊朗',\n regions_en: 'Iran',\n phoneCountryCode: '+98',\n },\n {\n iso: 'MA',\n regions: '摩洛哥',\n regions_en: 'Morocco',\n phoneCountryCode: '+212',\n },\n {\n iso: 'DZ',\n regions: '阿尔及利亚',\n regions_en: 'Algeria',\n phoneCountryCode: '+213',\n },\n {\n iso: 'TN',\n regions: '突尼斯',\n regions_en: 'Tunisia',\n phoneCountryCode: '+216',\n },\n {\n iso: 'LY',\n regions: '利比亚',\n regions_en: 'Libya',\n phoneCountryCode: '+218',\n },\n {\n iso: 'GM',\n regions: '冈比亚',\n regions_en: 'Gambia',\n phoneCountryCode: '+220',\n },\n {\n iso: 'SN',\n regions: '塞内加尔',\n regions_en: 'Senegal',\n phoneCountryCode: '+221',\n },\n {\n iso: 'MR',\n regions: '毛里塔尼亚',\n regions_en: 'Mauritania',\n phoneCountryCode: '+222',\n },\n {\n iso: 'ML',\n regions: '马里',\n regions_en: 'Mali',\n phoneCountryCode: '+223',\n },\n {\n iso: 'GN',\n regions: '几内亚',\n regions_en: 'Guinea',\n phoneCountryCode: '+224',\n },\n {\n iso: 'CI',\n regions: '象牙海岸',\n regions_en: 'Ivory Coast',\n phoneCountryCode: '+225',\n },\n {\n iso: 'BF',\n regions: '布基纳法索',\n regions_en: 'Burkina Faso',\n phoneCountryCode: '+226',\n },\n {\n iso: 'NE',\n regions: '尼日尔',\n regions_en: 'Niger',\n phoneCountryCode: '+227',\n },\n {\n iso: 'TG',\n regions: '多哥',\n regions_en: 'Togo',\n phoneCountryCode: '+228',\n },\n {\n iso: 'BJ',\n regions: '贝宁',\n regions_en: 'Benin',\n phoneCountryCode: '+229',\n },\n {\n iso: 'MU',\n regions: '毛里求斯',\n regions_en: 'Mauritius',\n phoneCountryCode: '+230',\n },\n {\n iso: 'LR',\n regions: '利比里亚',\n regions_en: 'Liberia',\n phoneCountryCode: '+231',\n },\n {\n iso: 'SL',\n regions: '塞拉利昂',\n regions_en: 'Sierra Leone',\n phoneCountryCode: '+232',\n },\n {\n iso: 'GH',\n regions: '加纳',\n regions_en: 'Ghana',\n phoneCountryCode: '+233',\n },\n {\n iso: 'NG',\n regions: '尼日利亚',\n regions_en: 'Nigeria',\n phoneCountryCode: '+234',\n },\n {\n iso: 'TD',\n regions: '乍得',\n regions_en: 'Chad',\n phoneCountryCode: '+235',\n },\n {\n iso: 'CF',\n regions: '中非共和国',\n regions_en: 'Central African Republic',\n phoneCountryCode: '+236',\n },\n {\n iso: 'CM',\n regions: '喀麦隆',\n regions_en: 'Cameroon',\n phoneCountryCode: '+237',\n },\n {\n iso: 'CV',\n regions: '开普',\n regions_en: 'Cape Verde',\n phoneCountryCode: '+238',\n },\n {\n iso: 'ST',\n regions: '圣多美和普林西比',\n regions_en: 'Sao Tome and Principe',\n phoneCountryCode: '+239',\n },\n {\n iso: 'GQ',\n regions: '赤道几内亚',\n regions_en: 'Equatorial Guinea',\n phoneCountryCode: '+240',\n },\n {\n iso: 'GA',\n regions: '加蓬',\n regions_en: 'Gabon',\n phoneCountryCode: '+241',\n },\n {\n iso: 'CG',\n regions: '刚果共和国',\n regions_en: 'Republic Of The Congo',\n phoneCountryCode: '+242',\n },\n {\n iso: 'CD',\n regions: '刚果民主共和国',\n regions_en: 'Democratic Republic of theCongo',\n phoneCountryCode: '+243',\n },\n {\n iso: 'AO',\n regions: '安哥拉',\n regions_en: 'Angola',\n phoneCountryCode: '+244',\n },\n {\n iso: 'GW',\n regions: '几内亚比绍共和国',\n regions_en: 'Guinea-Bissau',\n phoneCountryCode: '+245',\n },\n {\n iso: 'SC',\n regions: '塞舌尔',\n regions_en: 'Seychelles',\n phoneCountryCode: '+248',\n },\n {\n iso: 'SD',\n regions: '苏丹',\n regions_en: 'Sudan',\n phoneCountryCode: '+249',\n },\n {\n iso: 'RW',\n regions: '卢旺达',\n regions_en: 'Rwanda',\n phoneCountryCode: '+250',\n },\n {\n iso: 'ET',\n regions: '埃塞俄比亚',\n regions_en: 'Ethiopia',\n phoneCountryCode: '+251',\n },\n {\n iso: 'SO',\n regions: '索马里',\n regions_en: 'Somalia',\n phoneCountryCode: '+252',\n },\n {\n iso: 'DJ',\n regions: '吉布提',\n regions_en: 'Djibouti',\n phoneCountryCode: '+253',\n },\n {\n iso: 'KE',\n regions: '肯尼亚',\n regions_en: 'Kenya',\n phoneCountryCode: '+254',\n },\n {\n iso: 'TZ',\n regions: '坦桑尼亚',\n regions_en: 'Tanzania',\n phoneCountryCode: '+255',\n },\n {\n iso: 'UG',\n regions: '乌干达',\n regions_en: 'Uganda',\n phoneCountryCode: '+256',\n },\n {\n iso: 'BI',\n regions: '布隆迪',\n regions_en: 'Burundi',\n phoneCountryCode: '+257',\n },\n {\n iso: 'MZ',\n regions: '莫桑比克',\n regions_en: 'Mozambique',\n phoneCountryCode: '+258',\n },\n {\n iso: 'ZM',\n regions: '赞比亚',\n regions_en: 'Zambia',\n phoneCountryCode: '+260',\n },\n {\n iso: 'MG',\n regions: '马达加斯加',\n regions_en: 'Madagascar',\n phoneCountryCode: '+261',\n },\n {\n iso: 'RE',\n regions: '留尼汪',\n regions_en: 'Réunion Island',\n phoneCountryCode: '+262',\n },\n {\n iso: 'ZW',\n regions: '津巴布韦',\n regions_en: 'Zimbabwe',\n phoneCountryCode: '+263',\n },\n {\n iso: 'NA',\n regions: '纳米比亚',\n regions_en: 'Namibia',\n phoneCountryCode: '+264',\n },\n {\n iso: 'MW',\n regions: '马拉维',\n regions_en: 'Malawi',\n phoneCountryCode: '+265',\n },\n {\n iso: 'LS',\n regions: '莱索托',\n regions_en: 'Lesotho',\n phoneCountryCode: '+266',\n },\n {\n iso: 'BW',\n regions: '博茨瓦纳',\n regions_en: 'Botswana',\n phoneCountryCode: '+267',\n },\n {\n iso: 'SZ',\n regions: '斯威士兰',\n regions_en: 'Swaziland',\n phoneCountryCode: '+268',\n },\n {\n iso: 'KM',\n regions: '科摩罗',\n regions_en: 'Comoros',\n phoneCountryCode: '+269',\n },\n {\n iso: 'YT',\n regions: '马约特',\n regions_en: 'Mayotte',\n phoneCountryCode: '+269',\n },\n {\n iso: 'ER',\n regions: '厄立特里亚',\n regions_en: 'Eritrea',\n phoneCountryCode: '+291',\n },\n {\n iso: 'AW',\n regions: '阿鲁巴',\n regions_en: 'Aruba',\n phoneCountryCode: '+297',\n },\n {\n iso: 'FO',\n regions: '法罗群岛',\n regions_en: 'Faroe Islands',\n phoneCountryCode: '+298',\n },\n {\n iso: 'GL',\n regions: '格陵兰岛',\n regions_en: 'Greenland',\n phoneCountryCode: '+299',\n },\n {\n iso: 'GI',\n regions: '直布罗陀',\n regions_en: 'Gibraltar',\n phoneCountryCode: '+350',\n },\n {\n iso: 'PT',\n regions: '葡萄牙',\n regions_en: 'Portugal',\n phoneCountryCode: '+351',\n },\n {\n iso: 'LU',\n regions: '卢森堡',\n regions_en: 'Luxembourg',\n phoneCountryCode: '+352',\n },\n {\n iso: 'IE',\n regions: '爱尔兰',\n regions_en: 'Ireland',\n phoneCountryCode: '+353',\n },\n {\n iso: 'IS',\n regions: '冰岛',\n regions_en: 'Iceland',\n phoneCountryCode: '+354',\n },\n {\n iso: 'AL',\n regions: '阿尔巴尼亚',\n regions_en: 'Albania',\n phoneCountryCode: '+355',\n },\n {\n iso: 'MT',\n regions: '马耳他',\n regions_en: 'Malta',\n phoneCountryCode: '+356',\n },\n {\n iso: 'CY',\n regions: '塞浦路斯',\n regions_en: 'Cyprus',\n phoneCountryCode: '+357',\n },\n {\n iso: 'FI',\n regions: '芬兰',\n regions_en: 'Finland',\n phoneCountryCode: '+358',\n },\n {\n iso: 'BG',\n regions: '保加利亚',\n regions_en: 'Bulgaria',\n phoneCountryCode: '+359',\n },\n {\n iso: 'LT',\n regions: '立陶宛',\n regions_en: 'Lithuania',\n phoneCountryCode: '+370',\n },\n {\n iso: 'LV',\n regions: '拉脱维亚',\n regions_en: 'Latvia',\n phoneCountryCode: '+371',\n },\n {\n iso: 'EE',\n regions: '爱沙尼亚',\n regions_en: 'Estonia',\n phoneCountryCode: '+372',\n },\n {\n iso: 'MD',\n regions: '摩尔多瓦',\n regions_en: 'Moldova',\n phoneCountryCode: '+373',\n },\n {\n iso: 'AM',\n regions: '亚美尼亚',\n regions_en: 'Armenia',\n phoneCountryCode: '+374',\n },\n {\n iso: 'BY',\n regions: '白俄罗斯',\n regions_en: 'Belarus',\n phoneCountryCode: '+375',\n },\n {\n iso: 'AD',\n regions: '安道尔',\n regions_en: 'Andorra',\n phoneCountryCode: '+376',\n },\n {\n iso: 'MC',\n regions: '摩纳哥',\n regions_en: 'Monaco',\n phoneCountryCode: '+377',\n },\n {\n iso: 'SM',\n regions: '圣马力诺',\n regions_en: 'San Marino',\n phoneCountryCode: '+378',\n },\n {\n iso: 'UA',\n regions: '乌克兰',\n regions_en: 'Ukraine',\n phoneCountryCode: '+380',\n },\n {\n iso: 'RS',\n regions: '塞尔维亚',\n regions_en: 'Serbia',\n phoneCountryCode: '+381',\n },\n {\n iso: 'ME',\n regions: '黑山',\n regions_en: 'Montenegro',\n phoneCountryCode: '+382',\n },\n {\n iso: 'HR',\n regions: '克罗地亚',\n regions_en: 'Croatia',\n phoneCountryCode: '+385',\n },\n {\n iso: 'SI',\n regions: '斯洛文尼亚',\n regions_en: 'Slovenia',\n phoneCountryCode: '+386',\n },\n {\n iso: 'BA',\n regions: '波斯尼亚和黑塞哥维那',\n regions_en: 'Bosniaand Herzegovina',\n phoneCountryCode: '+387',\n },\n {\n iso: 'MK',\n regions: '马其顿',\n regions_en: 'Macedonia',\n phoneCountryCode: '+389',\n },\n {\n iso: 'CZ',\n regions: '捷克',\n regions_en: 'Czech',\n phoneCountryCode: '+420',\n },\n {\n iso: 'SK',\n regions: '斯洛伐克',\n regions_en: 'Slovakia',\n phoneCountryCode: '+421',\n },\n {\n iso: 'LI',\n regions: '列支敦士登',\n regions_en: 'Liechtenstein',\n phoneCountryCode: '+423',\n },\n {\n iso: 'BZ',\n regions: '伯利兹',\n regions_en: 'Belize',\n phoneCountryCode: '+501',\n },\n {\n iso: 'GT',\n regions: '瓜地马拉',\n regions_en: 'Guatemala',\n phoneCountryCode: '+502',\n },\n {\n iso: 'SV',\n regions: '萨尔瓦多',\n regions_en: 'ElSalvador',\n phoneCountryCode: '+503',\n },\n {\n iso: 'HN',\n regions: '洪都拉斯',\n regions_en: 'Honduras',\n phoneCountryCode: '+504',\n },\n {\n iso: 'NI',\n regions: '尼加拉瓜',\n regions_en: 'Nicaragua',\n phoneCountryCode: '+505',\n },\n {\n iso: 'CR',\n regions: '哥斯达黎加',\n regions_en: 'CostaRica',\n phoneCountryCode: '+506',\n },\n {\n iso: 'PA',\n regions: '巴拿马',\n regions_en: 'Panama',\n phoneCountryCode: '+507',\n },\n {\n iso: 'PM',\n regions: '圣彼埃尔和密克隆岛',\n regions_en: 'Saint Pierreand Miquelon',\n phoneCountryCode: '+508',\n },\n {\n iso: 'HT',\n regions: '海地',\n regions_en: 'Haiti',\n phoneCountryCode: '+509',\n },\n {\n iso: 'GP',\n regions: '瓜德罗普岛',\n regions_en: 'Guadeloupe',\n phoneCountryCode: '+590',\n },\n {\n iso: 'BO',\n regions: '玻利维亚',\n regions_en: 'Bolivia',\n phoneCountryCode: '+591',\n },\n {\n iso: 'GY',\n regions: '圭亚那',\n regions_en: 'Guyana',\n phoneCountryCode: '+592',\n },\n {\n iso: 'EC',\n regions: '厄瓜多尔',\n regions_en: 'Ecuador',\n phoneCountryCode: '+593',\n },\n {\n iso: 'GF',\n regions: '法属圭亚那',\n regions_en: 'French Guiana',\n phoneCountryCode: '+594',\n },\n {\n iso: 'PY',\n regions: '巴拉圭',\n regions_en: 'Paraguay',\n phoneCountryCode: '+595',\n },\n {\n iso: 'SR',\n regions: '苏里南',\n regions_en: 'Suriname',\n phoneCountryCode: '+597',\n },\n {\n iso: 'UY',\n regions: '乌拉圭',\n regions_en: 'Uruguay',\n phoneCountryCode: '+598',\n },\n {\n iso: 'BQ',\n regions: '荷兰加勒比',\n regions_en: 'Caribisch Nederland',\n phoneCountryCode: '+599',\n },\n {\n iso: 'CW',\n regions: '库拉索',\n regions_en: 'Curacao',\n phoneCountryCode: '+599',\n },\n {\n iso: 'TL',\n regions: '东帝汶',\n regions_en: 'East Timor',\n phoneCountryCode: '+670',\n },\n {\n iso: 'BN',\n regions: '文莱',\n regions_en: 'Brunei',\n phoneCountryCode: '+673',\n },\n {\n iso: 'NR',\n regions: '拿鲁岛',\n regions_en: 'Nauru',\n phoneCountryCode: '+674',\n },\n {\n iso: 'PG',\n regions: '巴布亚新几内亚',\n regions_en: 'Papua New Guinea',\n phoneCountryCode: '+675',\n },\n {\n iso: 'TO',\n regions: '汤加',\n regions_en: 'Tonga',\n phoneCountryCode: '+676',\n },\n {\n iso: 'SB',\n regions: '所罗门群岛',\n regions_en: 'Solomon Islands',\n phoneCountryCode: '+677',\n },\n {\n iso: 'VU',\n regions: '瓦努阿图',\n regions_en: 'Vanuatu',\n phoneCountryCode: '+678',\n },\n {\n iso: 'FJ',\n regions: '斐济',\n regions_en: 'Fiji',\n phoneCountryCode: '+679',\n },\n {\n iso: 'PW',\n regions: '帕劳',\n regions_en: 'Palau',\n phoneCountryCode: '+680',\n },\n {\n iso: 'CK',\n regions: '库克群岛',\n regions_en: 'Cook Islands',\n phoneCountryCode: '+682',\n },\n {\n iso: 'WS',\n regions: '萨摩亚',\n regions_en: 'Samoa',\n phoneCountryCode: '+685',\n },\n {\n iso: 'KI',\n regions: '基里巴斯',\n regions_en: 'Kiribati',\n phoneCountryCode: '+686',\n },\n {\n iso: 'NC',\n regions: '新喀里多尼亚',\n regions_en: 'New Caledonia',\n phoneCountryCode: '+687',\n },\n {\n iso: 'PF',\n regions: '法属波利尼西亚',\n regions_en: 'French Polynesia',\n phoneCountryCode: '+689',\n },\n {\n iso: 'FM',\n regions: '密克罗尼西亚',\n regions_en: 'Micronesia',\n phoneCountryCode: '+691',\n },\n {\n iso: 'MH',\n regions: '马绍尔群岛',\n regions_en: 'Marshall Islands',\n phoneCountryCode: '+692',\n },\n {\n iso: 'KP',\n regions: '朝鲜',\n regions_en: 'Korea Democratic Rep.',\n phoneCountryCode: '+850',\n },\n {\n iso: 'HK',\n regions: '中国香港',\n regions_en: 'Hong Kong',\n phoneCountryCode: '+852',\n },\n {\n iso: 'MO',\n regions: '中国澳门',\n regions_en: 'Macau',\n phoneCountryCode: '+853',\n },\n {\n iso: 'KH',\n regions: '柬埔寨',\n regions_en: 'Cambodia',\n phoneCountryCode: '+855',\n },\n {\n iso: 'LA',\n regions: '老挝',\n regions_en: 'Laos',\n phoneCountryCode: '+856',\n },\n {\n iso: 'BD',\n regions: '孟加拉国',\n regions_en: 'Bangladesh',\n phoneCountryCode: '+880',\n },\n {\n iso: 'TW',\n regions: '中国台湾',\n regions_en: 'Taiwan',\n phoneCountryCode: '+886',\n },\n {\n iso: 'MV',\n regions: '马尔代夫',\n regions_en: 'Maldives',\n phoneCountryCode: '+960',\n },\n {\n iso: 'LB',\n regions: '黎巴嫩',\n regions_en: 'Lebanon',\n phoneCountryCode: '+961',\n },\n {\n iso: 'JO',\n regions: '约旦',\n regions_en: 'Jordan',\n phoneCountryCode: '+962',\n },\n {\n iso: 'SY',\n regions: '叙利亚',\n regions_en: 'Syria',\n phoneCountryCode: '+963',\n },\n {\n iso: 'IQ',\n regions: '伊拉克',\n regions_en: 'Iraq',\n phoneCountryCode: '+964',\n },\n {\n iso: 'KW',\n regions: '科威特',\n regions_en: 'Kuwait',\n phoneCountryCode: '+965',\n },\n {\n iso: 'SA',\n regions: '沙特阿拉伯',\n regions_en: 'Saudi Arabia',\n phoneCountryCode: '+966',\n },\n {\n iso: 'YE',\n regions: '也门',\n regions_en: 'Yemen',\n phoneCountryCode: '+967',\n },\n {\n iso: 'OM',\n regions: '阿曼',\n regions_en: 'Oman',\n phoneCountryCode: '+968',\n },\n {\n iso: 'AE',\n regions: '阿拉伯联合酋长国',\n regions_en: 'United Arab Emirates',\n phoneCountryCode: '+971',\n },\n {\n iso: 'IL',\n regions: '以色列',\n regions_en: 'Israel',\n phoneCountryCode: '+972',\n },\n {\n iso: 'BH',\n regions: '巴林',\n regions_en: 'Bahrain',\n phoneCountryCode: '+973',\n },\n {\n iso: 'QA',\n regions: '卡塔尔',\n regions_en: 'Qatar',\n phoneCountryCode: '+974',\n },\n {\n iso: 'BT',\n regions: '不丹',\n regions_en: 'Bhutan',\n phoneCountryCode: '+975',\n },\n {\n iso: 'MN',\n regions: '蒙古',\n regions_en: 'Mongolia',\n phoneCountryCode: '+976',\n },\n {\n iso: 'NP',\n regions: '尼泊尔',\n regions_en: 'Nepal',\n phoneCountryCode: '+977',\n },\n {\n iso: 'TJ',\n regions: '塔吉克斯坦',\n regions_en: 'Tajikistan',\n phoneCountryCode: '+992',\n },\n {\n iso: 'TM',\n regions: '土库曼斯坦',\n regions_en: 'Turkmenistan',\n phoneCountryCode: '+993',\n },\n {\n iso: 'AZ',\n regions: '阿塞拜疆',\n regions_en: 'Azerbaijan',\n phoneCountryCode: '+994',\n },\n {\n iso: 'GE',\n regions: '格鲁吉亚',\n regions_en: 'Georgia',\n phoneCountryCode: '+995',\n },\n {\n iso: 'KG',\n regions: '吉尔吉斯斯坦',\n regions_en: 'Kyrgyzstan',\n phoneCountryCode: '+996',\n },\n {\n iso: 'UZ',\n regions: '乌兹别克斯坦',\n regions_en: 'Uzbekistan',\n phoneCountryCode: '+998',\n },\n {\n iso: 'BS',\n regions: '巴哈马',\n regions_en: 'Bahamas',\n phoneCountryCode: '+1242',\n },\n {\n iso: 'BB',\n regions: '巴巴多斯',\n regions_en: 'Barbados',\n phoneCountryCode: '+1246',\n },\n {\n iso: 'AI',\n regions: '安圭拉',\n regions_en: 'Anguilla',\n phoneCountryCode: '+1264',\n },\n {\n iso: 'AG',\n regions: '安提瓜和巴布达',\n regions_en: 'Antigua and Barbuda',\n phoneCountryCode: '+1268',\n },\n {\n iso: 'VG',\n regions: '英属处女群岛',\n regions_en: 'VirginIslands,British',\n phoneCountryCode: '+1284',\n },\n {\n iso: 'KY',\n regions: '开曼群岛',\n regions_en: 'Cayman Islands',\n phoneCountryCode: '+1345',\n },\n {\n iso: 'BM',\n regions: '百慕大群岛',\n regions_en: 'Bermuda',\n phoneCountryCode: '+1441',\n },\n {\n iso: 'GD',\n regions: '格林纳达',\n regions_en: 'Grenada',\n phoneCountryCode: '+1473',\n },\n {\n iso: 'TC',\n regions: '特克斯和凯科斯群岛',\n regions_en: 'Turksand Caicos Islands',\n phoneCountryCode: '+1649',\n },\n {\n iso: 'MS',\n regions: '蒙特塞拉特岛',\n regions_en: 'Montserrat',\n phoneCountryCode: '+1664',\n },\n {\n iso: 'GU',\n regions: '关岛',\n regions_en: 'Guam',\n phoneCountryCode: '+1671',\n },\n {\n iso: 'AS',\n regions: '美属萨摩亚',\n regions_en: 'American Samoa',\n phoneCountryCode: '+1684',\n },\n {\n iso: 'LC',\n regions: '圣露西亚',\n regions_en: 'Saint Lucia',\n phoneCountryCode: '+1758',\n },\n {\n iso: 'DM',\n regions: '多米尼加',\n regions_en: 'Dominica',\n phoneCountryCode: '+1767',\n },\n {\n iso: 'VC',\n regions: '圣文森特和格林纳丁斯',\n regions_en: 'Saint Vincent and The Grenadines',\n phoneCountryCode: '+1784',\n },\n {\n iso: 'PR',\n regions: '波多黎各',\n regions_en: 'Puerto Rico',\n phoneCountryCode: '+1787',\n },\n {\n iso: 'DO',\n regions: '多米尼加共和国',\n regions_en: 'dominican republic',\n phoneCountryCode: '+1809',\n },\n {\n iso: 'TT',\n regions: '特立尼达和多巴哥',\n regions_en: 'Trinidadand Tobago',\n phoneCountryCode: '+1868',\n },\n {\n iso: 'KN',\n regions: '圣基茨和尼维斯',\n regions_en: 'Saint Kitts and Nevis',\n phoneCountryCode: '+1869',\n },\n {\n iso: 'JM',\n regions: '牙买加',\n regions_en: 'Jamaica',\n phoneCountryCode: '+1876',\n },\n]\n","import React, { FC } from 'react'\nimport { Select, Tooltip } from 'antd'\nimport { isoInfo, IsoType } from '../../../_utils/countryList'\nimport './styles.less'\nimport { IconFont } from '../../../IconFont'\nimport { i18n } from '../../../_utils/locales'\n\nexport interface VirtualDropdownProps {\n value?: string\n onChange?: (value: string) => void\n style?: React.CSSProperties\n}\nexport const VirtualDropdown: FC<VirtualDropdownProps> = (props) => {\n const { value, onChange } = props\n // const [open, setOpen] = useState(false)\n // TODO 先取 iso type 作为 select 获取的 value 后续映射表弄好改为 区号码\n const options = isoInfo.map((info: IsoType) => {\n return {\n value: info.iso,\n key: info.iso,\n children: info.phoneCountryCode,\n label: (\n <div className=\"select-option-item\">\n <span>{info.phoneCountryCode}</span>\n <div className=\"country\">\n <Tooltip\n title={i18n.language === 'zh-CN' ? info.regions : info.regions_en}\n >\n {i18n.language === 'zh-CN' ? info.regions : info.regions_en}\n </Tooltip>\n </div>\n </div>\n ),\n }\n })\n\n return (\n <Select\n showSearch\n dropdownClassName=\"areacode-virtual-dropdown\"\n bordered={false}\n listHeight={258}\n options={options}\n value={value}\n onChange={onChange}\n optionLabelProp=\"children\"\n dropdownMatchSelectWidth={138}\n filterOption={(input, option: any) => {\n return option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0\n }}\n suffixIcon={\n <IconFont\n className={'areacode-virtual-dropdown-icon'}\n type={'authing-arrow-down-s-fill'}\n style={{ width: 20, height: 20 }}\n />\n }\n />\n )\n}\n","import Input, { InputProps } from 'antd/lib/input'\nimport React, { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\n\nimport { VirtualDropdown } from './VirtualDropdown'\nexport interface InputInternationPhoneProps extends InputProps {\n areaCode: string\n onAreaCodeChange: (areaCode: string) => void\n}\nexport const InputInternationPhone: React.FC<InputInternationPhoneProps> = (\n props\n) => {\n const {\n areaCode,\n onAreaCodeChange,\n onChange,\n value: formValue,\n ...inputProps\n } = props\n const { t } = useTranslation()\n const [value, setValue] = useState(\n /^[^a-zA-Z]*$/.test(String(formValue)) ? formValue : ''\n )\n\n const valueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value)\n onChange?.(e)\n }\n\n return (\n <>\n <Input\n pattern=\"[^a-zA-Z]*\"\n value={value}\n placeholder={t('login.inputPhone')}\n {...inputProps}\n onChange={(e) => {\n let v = e.target.value\n if (!/^[^a-zA-Z]*$/.test(v)) {\n return\n }\n valueChange(e)\n }}\n prefix={\n <VirtualDropdown value={areaCode} onChange={onAreaCodeChange} />\n }\n />\n </>\n )\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Form, Input, Select, DatePicker } from 'antd'\nimport { useTranslation } from 'react-i18next'\nimport { useAsyncFn } from 'react-use'\nimport { UploadImage } from '../../AuthingGuard/Forms/UploadImage'\nimport { i18n } from '../../_utils/locales'\nimport {\n CompleteInfoBaseControls,\n CompleteInfoExtendsControls,\n CompleteInfoMetaData,\n CompleteInfoRequest,\n} from '../interface'\nimport { useGuardHttp } from '../../_utils/guardHttp'\nimport SubmitButton from '../../SubmitButton'\nimport { InputNumber } from '../../InputNumber'\nimport { EmailScene, SceneType } from 'authing-js-sdk'\nimport CustomFormItem from '../../ValidatorRules'\nimport { fieldRequiredRule } from '../../_utils'\nimport { SendCodeByEmail } from '../../SendCode/SendCodeByEmail'\nimport { SendCodeByPhone } from '../../SendCode/SendCodeByPhone'\nimport { useGuardPublicConfig } from '../../_utils/context'\nimport { defaultAreaCode, parsePhone } from '../../_utils/hooks'\nimport { InputInternationPhone } from '../../Login/core/withVerifyCode/InputInternationPhone'\nexport interface CompleteInfoProps {\n metaData: CompleteInfoMetaData[]\n businessRequest: (data: CompleteInfoRequest) => Promise<void>\n}\n\nexport interface FieldMetadata {\n key: string\n options: any\n}\n\nconst filterOption = (input: any, option: any) => {\n return (\n option.props.value.toLowerCase().indexOf(input.toLowerCase()) >= 0 ||\n option.props.label.toLowerCase().indexOf(input.toLowerCase()) >= 0\n )\n}\n\nexport const CompleteInfo: React.FC<CompleteInfoProps> = (props) => {\n const { metaData, businessRequest } = props\n\n const config = useGuardPublicConfig()\n\n const verifyCodeLength = config?.verifyCodeLength\n\n const submitButtonRef = useRef<any>(null)\n\n const [countryList, setCountryList] = useState<any>([])\n\n const isInternationSms = config?.internationalSmsConfig?.enabled || false\n\n const [areaCode, setAreaCode] = useState(defaultAreaCode)\n\n const { get } = useGuardHttp()\n\n const { t } = useTranslation()\n\n const [form] = Form.useForm()\n\n const loadInitCountryList = useCallback(async () => {\n const { data } = await get(`/api/v2/country-list`)\n\n const countryMap = i18n.language === 'zh-CN' ? data?.zh : data?.en\n\n const countryList: { label: string; value: string }[] = []\n\n for (const [key, value] of Object.entries(countryMap)) {\n countryList.push({\n label: value as string,\n value: key,\n })\n }\n\n setCountryList(countryList)\n }, [get])\n\n useEffect(() => {\n if (!metaData.map((i) => i.name).includes('country')) return\n loadInitCountryList()\n }, [loadInitCountryList, metaData])\n\n const PhoneAccount = useCallback(\n (props) => {\n if (isInternationSms) {\n return (\n <InputInternationPhone\n {...props}\n className=\"authing-g2-input\"\n size=\"large\"\n areaCode={areaCode}\n onAreaCodeChange={(value: string) => {\n setAreaCode(value)\n form.getFieldValue(['internal phone:phone']) &&\n form.validateFields(['internal phone:phone'])\n }}\n />\n )\n } else {\n return (\n <InputNumber\n {...props}\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n key=\"internal-phone:phone123\"\n type=\"tel\"\n size=\"large\"\n maxLength={11}\n placeholder={t('login.inputPhone')}\n />\n )\n }\n },\n [areaCode, form, isInternationSms, t]\n )\n const baseControlMap: Record<\n string,\n (props?: any) => React.ReactNode | undefined\n > = useMemo(\n () => ({\n gender: (props) => (\n <Select\n key={props.key}\n className=\"authing-g2-select\"\n options={[\n { label: i18n.t('common.man'), value: 'M' },\n { label: i18n.t('common.female'), value: 'F' },\n ]}\n />\n ),\n country: (props) => (\n <Select\n key={props.key}\n className=\"authing-g2-select\"\n options={countryList}\n showSearch\n filterOption={filterOption}\n />\n ),\n image: () => <UploadImage />,\n number: (props) => (\n <InputNumber\n key={props.key}\n style={{ width: '100%' }}\n className=\"authing-g2-input\"\n />\n ),\n date: (props) => (\n <DatePicker\n key={props.key}\n className=\"authing-g2-input\"\n style={{ width: '100%' }}\n placeholder={i18n.t('common.pleaseSelectDate')}\n />\n ),\n datetime: (props) => (\n <DatePicker\n key={props.key}\n className=\"authing-g2-input\"\n style={{ width: '100%' }}\n placeholder={i18n.t('common.pleaseSelectDate')}\n />\n ),\n select: (props: any) => (\n <Select\n key={props.key}\n className=\"authing-g2-select\"\n showSearch\n options={props.options}\n filterOption={filterOption}\n />\n ),\n dropdown: (props: any) => (\n <Select\n key={props.key}\n className=\"authing-g2-select\"\n showSearch\n options={props.options}\n filterOption={filterOption}\n />\n ),\n boolean: (props) => (\n <Select\n key={props.key}\n className=\"authing-g2-select\"\n options={[\n { label: i18n.t('common.yes'), value: true as any },\n { label: i18n.t('common.no'), value: false as any },\n ]}\n />\n ),\n string: (props) => (\n <Input\n key={props.key}\n type=\"text\"\n size=\"large\"\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n />\n ),\n text: (props) => (\n <Input\n key={props.key}\n type=\"text\"\n size=\"large\"\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n />\n ),\n }),\n [countryList]\n )\n const internalControlMap: Record<\n string,\n (props: any) => React.ReactNode | undefined\n > = useMemo(\n () => ({\n username: (props: any) => (\n <CustomFormItem.UserName\n validateFirst={true}\n className=\"authing-g2-input-form\"\n name=\"username\"\n key={props.key}\n label={i18n.t('common.username')}\n required={props.required}\n checkRepeat={true}\n >\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"username\"\n key=\"internal-username:asdf\"\n size=\"large\"\n maxLength={11}\n placeholder={t('login.inputUsername')}\n />\n </CustomFormItem.UserName>\n ),\n phone: (props: { required?: boolean }) => (\n <>\n <CustomFormItem.Phone\n validateFirst={true}\n className={\n isInternationSms\n ? 'authing-g2-input-form remove-padding'\n : 'authing-g2-input-form'\n }\n name=\"phone\"\n key=\"internal-phone:phone\"\n label={i18n.t('common.phoneLabel')}\n required={props.required}\n checkRepeat={true}\n areaCode={areaCode}\n >\n <PhoneAccount />\n </CustomFormItem.Phone>\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"phoneCode\"\n key=\"internal-phone:code\"\n rules={\n props.required\n ? fieldRequiredRule(t('common.captchaCode'))\n : undefined\n }\n >\n <SendCodeByPhone\n isInternationSms={isInternationSms}\n areaCode={areaCode}\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"one-time-code\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n })}\n scene={SceneType.SCENE_TYPE_COMPLETE_PHONE}\n maxLength={verifyCodeLength}\n fieldName=\"phone\"\n form={form}\n onSendCodeBefore={() => form.validateFields(['phone'])}\n />\n </Form.Item>\n </>\n ),\n email: (props: { required?: boolean }) => (\n <>\n <CustomFormItem.Email\n className=\"authing-g2-input-form\"\n name=\"email\"\n checkRepeat={true}\n label={i18n.t('common.email')}\n required={props.required}\n key=\"internal email:email13\"\n validateFirst={true}\n >\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"email\"\n size=\"large\"\n placeholder={t('login.inputEmail')}\n />\n </CustomFormItem.Email>\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"emailCode\"\n key=\"internal email:code1432\"\n rules={\n props.required\n ? fieldRequiredRule(t('common.captchaCode'))\n : undefined\n }\n >\n <SendCodeByEmail\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"one-time-code\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n })}\n maxLength={verifyCodeLength}\n data={''}\n scene={EmailScene.VerifyCode}\n fieldName=\"email\"\n form={form}\n onSendCodeBefore={() => form.validateFields(['email'])}\n />\n </Form.Item>\n </>\n ),\n }),\n [PhoneAccount, areaCode, form, isInternationSms, t, verifyCodeLength]\n )\n\n const generateRules = useCallback(\n (metaData: CompleteInfoMetaData) => {\n const formRules = []\n\n const label =\n i18n.language === 'zh-CN'\n ? metaData.label || metaData.name\n : metaData.name\n\n const rules = metaData.validateRules ?? []\n\n const required = metaData.required ?? false\n\n if (metaData.required) {\n formRules.push({\n required: true,\n message: `${label} ${t('login.noEmpty')}`,\n })\n }\n\n // TODO 后端的 rule Type 有很多 前端目前只做了两种的映射\n rules.forEach((rule) => {\n switch (rule.type) {\n case 'isNumber':\n formRules.push({\n type: 'number',\n required,\n message: rule.errorMessage || '请填写数字',\n })\n break\n case 'regExp':\n formRules.push({\n required,\n pattern: new RegExp(rule.content.replaceAll('/', '')),\n message: rule.errorMessage,\n })\n break\n default:\n break\n }\n })\n return formRules\n },\n [t]\n )\n\n const inputElement = useCallback(\n (metaData: CompleteInfoMetaData) => {\n const label =\n i18n.language === 'zh-CN'\n ? metaData.label || metaData.name\n : metaData.name\n\n // 这部分的控件分两种 一个集成控件(手机号 + 验证码)一种是基础控件 分开处理\n if (\n (Object.values(CompleteInfoBaseControls) as (\n | CompleteInfoBaseControls\n | CompleteInfoExtendsControls\n )[]).includes(metaData.type)\n ) {\n return internalControlMap[metaData.name]({\n required: metaData.required,\n })\n } else {\n const userFormItem = (children: React.ReactNode) => (\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n rules={generateRules(metaData)}\n key={metaData.name}\n name={metaData.name}\n label={label}\n style={{ marginBottom: 8 }}\n >\n {children}\n </Form.Item>\n )\n\n if (Object.keys(baseControlMap).includes(metaData.name)) {\n return userFormItem(\n baseControlMap[metaData.name]({\n options: metaData.options,\n key: metaData.name,\n })\n )\n } else if (Object.keys(baseControlMap).includes(metaData.type)) {\n return userFormItem(\n baseControlMap[metaData.type]({\n options: metaData.options,\n key: metaData.name,\n })\n )\n }\n return userFormItem(\n <Input type=\"text\" className=\"authing-g2-input\" autoComplete=\"off\" />\n )\n }\n },\n [baseControlMap, generateRules, internalControlMap]\n )\n\n const formFieldsV2 = useMemo(() => {\n return metaData.map((data) => inputElement(data))\n }, [inputElement, metaData])\n\n const [, onFinish] = useAsyncFn(\n async (values: any) => {\n // submitButtonRef.current?.onSpin(true)\n\n const fieldValues = Object.keys(values)\n // 先过滤掉 为空的字段\n .filter((key) => values[key] !== undefined && values[key] !== '')\n // 再过滤掉 两个验证码的字段\n .filter((key) => !['phoneCode', 'emailCode'].includes(key))\n .map((key) => {\n const baseData = {\n name: key,\n value: values[key],\n }\n // 给这两个字段添加一个验证码\n // 国际化短信 需要携带区号\n // TODO 默认这里手机号与邮箱 都是有验证码的\n if (key === 'phone') {\n if (isInternationSms) {\n const { countryCode } = parsePhone(\n isInternationSms,\n values[key],\n areaCode\n )\n return {\n ...baseData,\n code: values.phoneCode,\n phoneCountryCode: countryCode,\n }\n }\n\n return { ...baseData, code: values.phoneCode }\n }\n if (key === 'email') return { ...baseData, code: values.emailCode }\n return baseData\n })\n try {\n await businessRequest?.({ fieldValues })\n } catch (error) {\n // TODO\n // throw new Error(error)\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n },\n [areaCode]\n )\n\n return (\n <Form\n layout=\"vertical\"\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n className=\"authing-g2-completeInfo-form authing-g2-form-required-item-icon-after\"\n >\n {formFieldsV2}\n\n <Form.Item className=\"authing-g2-input-form\">\n <SubmitButton\n text={t('common.problem.form.submit')}\n ref={submitButtonRef}\n className=\"password g2-completeInfo-submit\"\n />\n </Form.Item>\n </Form>\n )\n}\n","import { Tabs } from 'antd'\nimport React, { ReactNode, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ImagePro } from '../ImagePro'\nimport { IconFont } from '../IconFont'\nimport './styles.less'\nimport { useGuardModule, useGuardPublicConfig } from '../_utils/context'\n\nenum DownloadType {\n IOS = 'ios',\n Android = 'Android',\n}\n\nexport const GuardDownloadATView: React.FC = () => {\n const { t } = useTranslation()\n\n const publicConfig = useGuardPublicConfig()\n\n const { backModule } = useGuardModule()\n\n const cdnBase = publicConfig?.cdnBase\n\n const downloadConfig: Record<DownloadType, any> = useMemo(\n () => ({\n [DownloadType.IOS]: {\n title: t('common.downloadTotpAppIOS'),\n google: `${cdnBase}/GoogleAuthenticator-Apple.png`,\n microsoft: `${cdnBase}/MicrosoftAuthenticator-Apple.png`,\n },\n [DownloadType.Android]: {\n title: t('common.downloadTotpAppAndroid'),\n google: `${cdnBase}/GoogleAuthenticator-Authing.png`,\n microsoft: `${cdnBase}/MicrosoftAuthenticator-Baidu.png`,\n },\n }),\n [cdnBase, t]\n )\n\n const renderTab = useMemo(\n () =>\n (Object.keys(downloadConfig) as DownloadType[]).map<ReactNode>(\n (value: DownloadType, index: number) => (\n <Tabs.TabPane\n tab={downloadConfig[value].title}\n key={index}\n className=\"g2-mfa-download-at-tab\"\n >\n <span className=\"g2-mfa-totp-download-subtitle\">\n {t('common.downloadTotpAppDocs')}\n </span>\n <div className=\"g2-mfa-totp-download-qrcode\">\n <div className=\"g2-mfa-totp-download-qrcode-item\">\n <ImagePro\n width={120}\n height={120}\n className=\"g2-mfa-totp-download-image\"\n src={downloadConfig[value].google}\n alt=\"Google Authenticator\"\n />\n <span className=\"g2-mfa-totp-download-qrcode-text\">\n Google Authenticator\n </span>\n </div>\n <div className=\"g2-mfa-totp-download-qrcode-item\">\n <ImagePro\n width={120}\n height={120}\n className=\"g2-mfa-totp-download-image\"\n src={downloadConfig[value].microsoft}\n alt=\"Microsoft Authenticator\"\n />\n <span className=\"g2-mfa-totp-download-qrcode-text\">\n Microsoft Authenticator\n </span>\n </div>\n </div>\n </Tabs.TabPane>\n )\n ),\n [downloadConfig, t]\n )\n\n const onBack = () => backModule?.()\n\n return (\n <div className=\"g2-view-container g2-download-authenticator\">\n <div className=\"g2-view-back\" style={{ display: 'inherit' }}>\n <span onClick={onBack} className=\"g2-view-mfa-back-hover\">\n <IconFont type=\"authing-arrow-left-s-line\" style={{ fontSize: 24 }} />\n <span>{t('common.backToMFA')}</span>\n </span>\n </div>\n <div className=\"g2-view-tabs g2-mfa-totp-download-tabs\">\n <Tabs defaultActiveKey={DownloadType.IOS}>{renderTab}</Tabs>\n </div>\n </div>\n )\n}\n","import { User } from 'authing-js-sdk'\nimport { ApplicationConfig } from '../AuthingGuard/api'\nimport {\n CompleteInfoBaseControls,\n CompleteInfoExtendsControls,\n CompleteInfoMetaData,\n CompleteInfoRequest,\n ExtendsField,\n} from '../CompleteInfo/interface'\n\nexport const completeFieldsFilter = (user: User, field: ExtendsField) => {\n if (!user) {\n return true\n }\n const { name } = field\n if (name === 'email' && user?.email) {\n return false\n }\n if (name === 'phone' && user?.phone) {\n return false\n }\n if (name === 'username') {\n if (user[name] === user['phone'] || user[name] === user['email']) {\n return true\n }\n }\n\n // gender 默认是 U\n if (name === 'gender' && user[name] === 'U') {\n return true\n }\n // 如果基础字段里面已经有了,不再要求补全\n if (\n user[name as keyof User] !== undefined &&\n user[name as keyof User] !== null\n ) {\n return false\n }\n // 如果扩展信息又了,不再要求补全\n const customData = user.customData\n if (\n customData &&\n customData[name] !== undefined &&\n customData[name] !== null\n ) {\n return false\n }\n return true\n}\n\nexport const extendsFieldsToMetaData = (\n extendsFields: ApplicationConfig['extendsFields'] = [],\n selectOptions: {\n key: string\n options: {\n value: string\n label: string\n }[]\n }[]\n): CompleteInfoMetaData[] =>\n extendsFields.map((item) => {\n return {\n type: item.inputType as\n | CompleteInfoBaseControls\n | CompleteInfoExtendsControls,\n label: item.label,\n name: item.name,\n required: item.required,\n validateRules: item.validateRules,\n options: selectOptions.find((option) => option.key === item.name)\n ?.options,\n }\n })\n\nexport const fieldValuesToRegisterProfile = (\n extendsFields: ApplicationConfig['extendsFields'],\n fieldValues?: CompleteInfoRequest['fieldValues']\n) => {\n const registerProfile: Record<string, any> = {\n udf: [],\n }\n\n fieldValues?.forEach(({ name, value, code }) => {\n const fieldType = extendsFields.find((item) => item.name === name)?.type\n\n // 根据字段类型生成不同的数据结构\n if (fieldType === 'internal') {\n if (name === 'phone') registerProfile.phoneCode = code\n\n if (name === 'email') registerProfile.emailCode = code\n\n registerProfile[name] = value\n } else if (fieldType === 'user') {\n registerProfile.udf.push({\n key: name,\n value,\n })\n }\n })\n\n return registerProfile\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ImagePro } from '../ImagePro'\nimport { CompleteInfo } from './core/completeInfo'\nimport {\n CompleteInfoInitData,\n CompleteInfoMetaData,\n CompleteInfoRequest,\n OmitCompleteInfo,\n RegisterCompleteInfoInitData,\n} from './interface'\nimport './styles.less'\nimport { IconFont } from '../IconFont'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardInitData,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport {\n authFlow,\n CompleteInfoAuthFlowAction,\n registerRequest,\n} from './businessRequest'\nimport { extendsFieldsToMetaData, fieldValuesToRegisterProfile } from './utils'\nimport { GuardModuleType } from '../Guard'\nimport { message } from 'antd'\n\nexport const GuardCompleteInfo: React.FC<{\n metaData: CompleteInfoMetaData[]\n skipComplateFileds: boolean\n businessRequest: (\n action: CompleteInfoAuthFlowAction,\n data?: CompleteInfoRequest\n ) => Promise<void>\n}> = ({ metaData, businessRequest, skipComplateFileds }) => {\n const config = useGuardFinallyConfig()\n\n const { t } = useTranslation()\n\n const [disabled, setDisabled] = useState(false)\n\n const onSkip = async () => {\n if (disabled) return\n try {\n setDisabled(true)\n await businessRequest(CompleteInfoAuthFlowAction.Skip)\n } catch (error) {\n setDisabled(false)\n }\n }\n\n return (\n <div className=\"g2-view-container g2-complete-info\">\n <div className=\"g2-view-header\">\n <div className=\"g2-completeInfo-header\">\n <ImagePro\n src={config?.logo!}\n size={48}\n borderRadius={4}\n alt=\"\"\n className=\"icon\"\n />\n\n {skipComplateFileds && (\n <span\n className=\"g2-completeInfo-header-skip\"\n onClick={() => onSkip()}\n >\n <IconFont type=\"authing-a-share-forward-line1\" />\n <span>{t('common.skip')}</span>\n </span>\n )}\n </div>\n\n <div className=\"title\">{t('common.perfectUserInfo')}</div>\n <div className=\"title-explain\">\n {t('common.welcomeDoc', { name: config.title })}\n </div>\n </div>\n <div className=\"g2-view-tabs g2-completeInfo-content\">\n <CompleteInfo\n metaData={metaData}\n businessRequest={async (data) =>\n await businessRequest?.(CompleteInfoAuthFlowAction.Complete, data)\n }\n />\n </div>\n </div>\n )\n}\n\nexport const GuardLoginCompleteInfoView: React.FC = () => {\n const { metaData, skip } = useGuardInitData<CompleteInfoInitData>()\n\n const events = useGuardEvents()\n\n const authClient = useGuardAuthClient()\n\n const businessRequest = async (\n action: CompleteInfoAuthFlowAction,\n data?: CompleteInfoRequest\n ) => {\n const { isFlowEnd, data: resData, onGuardHandling } = await authFlow(\n action,\n data\n )\n\n if (isFlowEnd) {\n events?.onLogin?.(resData, authClient)\n } else {\n onGuardHandling?.()\n }\n }\n\n return (\n <GuardCompleteInfo\n metaData={metaData}\n businessRequest={businessRequest}\n skipComplateFileds={skip}\n />\n )\n}\n\nexport const GuardRegisterCompleteInfoView: React.FC = () => {\n const initData = useGuardInitData<RegisterCompleteInfoInitData>()\n\n const { changeModule } = useGuardModule()\n\n const publicConfig = useGuardPublicConfig()\n\n const { get } = useGuardHttpClient()\n\n const config = useGuardFinallyConfig()\n\n const events = useGuardEvents()\n\n const authClient = useGuardAuthClient()\n\n const [selectOptions, setSelectOptions] = useState<\n Array<{\n key: string\n options: {\n value: string\n label: string\n }[]\n }>\n >()\n\n const [metaData, setMetaData] = useState<CompleteInfoMetaData[]>()\n\n // 过滤掉 phone 或者 email\n const extendsFields = useMemo(() => {\n return publicConfig?.extendsFields.filter(\n (field) => field.name !== OmitCompleteInfo[initData.businessRequestName]\n )\n }, [initData.businessRequestName, publicConfig?.extendsFields])\n\n const skipComplateFileds = publicConfig?.skipComplateFileds\n\n const loadingComponent = useMemo(() => {\n return config.loadingComponent\n }, [config.loadingComponent])\n\n const loadSelectOptions = useCallback(async () => {\n const { data: selectOptions } = await get(\n `/api/v2/udfs/field-metadata-for-completion`,\n undefined,\n {}\n )\n\n setSelectOptions(selectOptions)\n }, [get])\n\n const businessRequest = async (\n action: CompleteInfoAuthFlowAction,\n data?: CompleteInfoRequest\n ) => {\n const registerProfile = fieldValuesToRegisterProfile(\n extendsFields,\n data?.fieldValues\n )\n try {\n // sdk 直接 throw error 拿不到错误详细信息 不能手动给他执行我们的拦截\n const user = await registerRequest(\n action,\n initData.businessRequestName,\n initData.content,\n registerProfile\n )\n\n if (user) {\n events?.onRegister?.(user, authClient)\n changeModule?.(GuardModuleType.LOGIN)\n }\n } catch (error: any) {\n message.error(error.message)\n }\n }\n\n useEffect(() => {\n loadSelectOptions()\n }, [loadSelectOptions])\n\n useEffect(() => {\n if (!selectOptions) return\n\n const metaData = extendsFieldsToMetaData(extendsFields, selectOptions)\n\n setMetaData(metaData)\n }, [extendsFields, selectOptions])\n\n return (\n <>\n {!metaData ? (\n loadingComponent\n ) : (\n <GuardCompleteInfo\n metaData={metaData}\n skipComplateFileds={skipComplateFileds}\n businessRequest={businessRequest}\n />\n )}\n </>\n )\n}\n","import React, { useCallback, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Form } from 'antd'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { fieldRequiredRule, validate } from '../../_utils'\nimport SubmitButton from '../../SubmitButton'\nimport CustomFormItem from '../../ValidatorRules'\nimport { IconFont } from '../../IconFont'\nimport { InputPassword } from '../../InputPassword'\nimport { EmailScene, SceneType } from 'authing-js-sdk'\nimport { SendCodeByEmail } from '../../SendCode/SendCodeByEmail'\nimport { SendCodeByPhone } from '../../SendCode/SendCodeByPhone'\nimport { FormItemIdentify } from '../../Login/core/withVerifyCode/FormItemIdentify'\nimport { InputIdentify } from '../../Login/core/withVerifyCode/inputIdentify'\nimport { parsePhone } from '../../_utils/hooks'\nexport enum InputMethodMap {\n email = 'email-code',\n phone = 'phone-code',\n}\ninterface ResetPasswordProps {\n onReset: any\n publicConfig: any\n onSend: (type: 'email' | 'phone') => void\n onSendError: (type: 'email' | 'phone', error: any) => void\n}\nexport const ResetPassword = (props: ResetPasswordProps) => {\n const { t } = useTranslation()\n let [form] = Form.useForm()\n let [identify, setIdentify] = useState('')\n let [codeMethod, setCodeMethod] = useState<'phone' | 'email'>('phone')\n let client = useGuardAuthClient()\n let submitButtonRef = useRef<any>(null)\n\n const verifyCodeLength = props.publicConfig.verifyCodeLength ?? 4\n // 是否开启了国际化短信功能\n const isInternationSms =\n props.publicConfig.internationalSmsConfig?.enabled || false\n\n const onFinish = async (values: any) => {\n let identify = values.identify\n let code = values.code\n let newPassword = values.password\n let context = new Promise(() => {})\n\n if (codeMethod === 'email') {\n context = client.resetPasswordByEmailCode(identify, code, newPassword)\n }\n if (codeMethod === 'phone') {\n const { phoneNumber, countryCode } = parsePhone(\n isInternationSms,\n identify\n )\n context = client.resetPasswordByPhoneCode(\n phoneNumber,\n code,\n newPassword,\n countryCode\n )\n }\n\n context\n .then((r) => {\n props.onSend(codeMethod)\n props.onReset(r)\n })\n .catch((e) => {\n submitButtonRef.current.onError()\n props.onSendError(codeMethod, e)\n props.onReset(e)\n })\n }\n\n const SendCode = useCallback(\n (props: any) => {\n return (\n <>\n {codeMethod === 'phone' && (\n <SendCodeByPhone\n {...props}\n isInternationSms={isInternationSms}\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n })}\n prefix={\n <IconFont\n type=\"authing-a-shield-check-line1\"\n style={{ color: '#878A95' }}\n />\n }\n scene={SceneType.SCENE_TYPE_RESET}\n maxLength={verifyCodeLength}\n data={identify}\n onSendCodeBefore={async () => {\n await form.validateFields(['identify'])\n }}\n />\n )}\n {codeMethod === 'email' && (\n <SendCodeByEmail\n {...props}\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n })}\n prefix={\n <IconFont\n type=\"authing-a-shield-check-line1\"\n style={{ color: '#878A95' }}\n />\n }\n scene={EmailScene.ResetPassword}\n maxLength={verifyCodeLength}\n data={identify}\n onSendCodeBefore={async () => {\n await form.validateFields(['identify'])\n }}\n />\n )}\n </>\n )\n },\n [codeMethod, form, identify, isInternationSms, t, verifyCodeLength]\n )\n\n return (\n <div className=\"authing-g2-login-phone-code\">\n <Form\n name=\"resetPassword\"\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => {\n submitButtonRef?.current?.onError()\n }}\n autoComplete=\"off\"\n >\n <FormItemIdentify\n name=\"identify\"\n className=\"authing-g2-input-form\"\n methods={['email-code', 'phone-code']}\n currentMethod={InputMethodMap[codeMethod]}\n >\n <InputIdentify\n methods={['email-code', 'phone-code']}\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n value={identify}\n onChange={(e) => {\n let v = e.target.value\n setIdentify(v)\n if (validate('email', v)) {\n setCodeMethod('email')\n }\n if (validate('phone', v)) {\n setCodeMethod('phone')\n }\n }}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </FormItemIdentify>\n\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"code\"\n rules={[...fieldRequiredRule(t('common.captchaCode'))]}\n >\n <SendCode />\n </Form.Item>\n <CustomFormItem.Password\n className=\"authing-g2-input-form\"\n name=\"password\"\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('user.inputNewPwd')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </CustomFormItem.Password>\n <Form.Item className=\"authing-g2-input-form submit-form\">\n <SubmitButton\n className=\"forget-password\"\n text={t('common.confirm')}\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import React from 'react'\nimport { ErrorInitData } from './interface'\nimport { i18n } from '../_utils/locales'\nimport './styles.less'\nimport { IconFont } from '../IconFont'\nimport { useGuardInitData } from '../_utils/context'\n\nexport const GuardErrorView: React.FC = () => {\n const { error } = useGuardInitData<ErrorInitData>()\n\n const messages = error?.message\n ? `${error?.message} `\n : `${i18n.t('user.contactAdministrator')}`\n\n return (\n <div className=\"g2-view-container g2-view-error\">\n <div className=\"g2-error-content\">\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <IconFont type=\"authing-bianzu\" style={{ width: 240, height: 160 }} />\n </div>\n <div className=\"g2-error-message\">{i18n.t('user.error')}</div>\n <span\n className=\"g2-error-message-text\"\n dangerouslySetInnerHTML={{ __html: messages }}\n />\n </div>\n </div>\n )\n}\n","import { FormItemProps } from 'antd/lib/form'\nimport FormItem from 'antd/lib/form/FormItem'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport CustomFormItem from '../../../ValidatorRules'\nimport { fieldRequiredRule, validate } from '../../../_utils'\nimport { phone } from 'phone'\nimport { useGuardPublicConfig } from '../../../_utils/context'\nimport { VerifyLoginMethods } from '../../../AuthingGuard/api'\nimport { defaultAreaCode } from '../../../_utils/hooks'\nexport interface FormItemIdentifyProps extends FormItemProps {\n checkRepeat?: boolean\n methods: VerifyLoginMethods[]\n currentMethod?: 'phone-code' | 'email-code' //当前 input 输入\n areaCode?: string //国际化手机号区号\n}\n\nexport const FormItemIdentify: React.FC<FormItemIdentifyProps> = (props) => {\n const {\n methods,\n areaCode = defaultAreaCode,\n currentMethod,\n ...formItemProps\n } = props\n\n const publicConfig = useGuardPublicConfig()\n const { t } = useTranslation()\n // TODO 未来抽离\n const renderTemplate = useMemo(() => {\n const rules = [...fieldRequiredRule(t('common.phoneOrEmail'))]\n if (currentMethod === 'email-code') {\n rules.push({\n validator: async (_: any, value: any) => {\n if (value && !validate('email', value)) {\n return Promise.reject(t('login.inputCorrectPhone'))\n }\n },\n validateTrigger: 'onBlur',\n })\n }\n // 单纯的手机号校验\n if (\n currentMethod === 'phone-code' &&\n publicConfig &&\n !publicConfig.internationalSmsConfig?.enabled\n ) {\n rules.push({\n validator: async (_: any, value: any) => {\n if (value && !validate('phone', value)) {\n return Promise.reject(t('login.inputCorrectPhone'))\n }\n },\n validateTrigger: 'onBlur',\n })\n }\n // 国际化校验规则\n if (\n publicConfig &&\n publicConfig.internationalSmsConfig?.enabled &&\n currentMethod === 'phone-code'\n ) {\n rules.push({\n validateTrigger: 'onBlur',\n validator: async (_: any, value: any) => {\n //无区号就走 默认区号\n if (\n value &&\n (phone(value, { country: areaCode }).isValid ||\n phone(value).isValid)\n ) {\n return Promise.resolve()\n }\n return Promise.reject(t('login.inputCorrectPhone'))\n },\n })\n }\n\n if (methods.length !== 1)\n return (\n <FormItem\n validateTrigger={['onBlur', 'onChange']}\n validateFirst={true}\n rules={rules}\n {...formItemProps}\n />\n )\n\n switch (currentMethod) {\n case 'phone-code':\n return <CustomFormItem.Phone areaCode={areaCode} {...formItemProps} />\n case 'email-code':\n return <CustomFormItem.Email {...formItemProps} />\n }\n }, [areaCode, currentMethod, formItemProps, methods, publicConfig, t])\n\n return <>{renderTemplate}</>\n}\n","import Input, { InputProps } from 'antd/lib/input'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { VerifyLoginMethods } from '../../../AuthingGuard/api'\nimport { IconFont } from '../../../IconFont'\nimport { InputNumber } from '../../../InputNumber'\nimport { useGuardPublicConfig } from '../../../_utils/context'\n\nexport interface InputIdentifyProps extends InputProps {\n methods: VerifyLoginMethods[]\n}\n\nexport const InputIdentify: React.FC<InputIdentifyProps> = (props) => {\n const { methods, ...inputProps } = props\n\n const publicConfig = useGuardPublicConfig()\n\n const { t } = useTranslation()\n\n const verifyCodeMethodsText = useMemo<\n Record<\n VerifyLoginMethods,\n {\n t: string\n sort: number\n }\n >\n >(\n () => ({\n 'email-code': {\n t: t('common.email'),\n sort: 1,\n },\n 'phone-code': {\n t: publicConfig?.internationalSmsConfig?.enabled\n ? t('common.areaCodePhone')\n : t('common.phoneNumber'),\n sort: 2,\n },\n }),\n [publicConfig, t]\n )\n\n const placeholder = useMemo(\n () =>\n t('login.inputAccount', {\n text: methods\n ?.map((item) => verifyCodeMethodsText[item])\n .sort((a, b) => a.sort - b.sort)\n .map((item) => item.t)\n .join(' / '),\n }),\n [methods, t, verifyCodeMethodsText]\n )\n\n const renderInput = useMemo(() => {\n if (methods.length === 1 && methods[0] === 'phone-code') {\n // TODO 开启国际化配置并登录方式为手机号码时\n return (\n <InputNumber maxLength={11} placeholder={placeholder} {...inputProps} />\n )\n }\n\n return (\n <Input\n placeholder={placeholder}\n {...inputProps}\n prefix={\n <IconFont type=\"authing-a-user-line1\" style={{ color: '#878A95' }} />\n }\n />\n )\n }, [inputProps, methods, placeholder])\n\n return <>{renderInput}</>\n}\n","import { useState, useEffect } from 'react'\nimport { getGuardWindow } from '../../Guard/core/useAppendConfig'\n\nfunction debounce(fn: Function, delay: number, immediate = true) {\n let timer: any\n\n return function (this: any) {\n let context = this\n let args = arguments\n timer && clearTimeout(timer)\n\n if (immediate && !timer) {\n fn.apply(context, args)\n }\n\n timer = setTimeout(function () {\n fn.apply(context, args)\n }, delay)\n }\n}\n\nfunction inRange(n: number, start: number, end?: number): boolean {\n if (end || end === 0) {\n return n >= start && n <= end\n }\n return n >= start\n}\n\nexport enum ScreenSize {\n Mobile = 'mobile',\n Desktop = 'desktop',\n}\nexport const SCREEN_SIZE_RANG: {\n size: ScreenSize\n range: [number, number]\n}[] = [\n {\n size: ScreenSize.Mobile,\n range: [0, 719],\n },\n {\n size: ScreenSize.Desktop,\n range: [720, Infinity],\n },\n]\n\nexport const getScreenSize = () => {\n const viewportWidth = document.body.clientWidth\n return (\n SCREEN_SIZE_RANG.find((item) => inRange(viewportWidth, ...item.range))\n ?.size ?? ScreenSize.Desktop\n )\n}\n\nexport const useScreenSize = () => {\n const [screenSize, setScreenSize] = useState(getScreenSize)\n\n useEffect(() => {\n const onResize = debounce(() => {\n setScreenSize(getScreenSize())\n }, 200)\n\n const guardWindow = getGuardWindow()\n\n guardWindow?.addEventListener('resize', onResize)\n\n return () => guardWindow?.removeEventListener('resize', onResize)\n }, [])\n\n return [screenSize]\n}\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { message } from 'antd'\n\nimport { GuardModuleType } from '../Guard/module'\nimport { ResetPassword } from './core/resetPassword'\n\nimport { ImagePro } from '../ImagePro'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { CommonMessage } from '..'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\n// import { ChangeLanguage } from '../ChangeLanguage'\n\nexport const GuardForgetPassword: React.FC = () => {\n const { t } = useTranslation()\n\n const events = useGuardEvents()\n\n const publicConfig = useGuardPublicConfig()\n\n const authClient = useGuardAuthClient()\n\n const config = useGuardFinallyConfig()\n\n const { changeModule } = useGuardModule()\n\n const onReset = (res: any) => {\n let code = res.code\n if (code !== 200) {\n events?.onPwdResetError?.(res, authClient)\n message.error(res.message)\n return\n }\n events?.onPwdReset?.(authClient)\n // 返回登录\n const initData = {\n title: t('common.resetSuccess'),\n message: t('common.resetSuccessMessage'),\n }\n changeModule?.(GuardModuleType.SUBMIT_SUCCESS, {\n ...initData,\n })\n }\n\n const onSend = (type: 'phone' | 'email') => {\n if (type === 'phone') events?.onPwdPhoneSend?.(authClient)\n if (type === 'email') events?.onPwdEmailSend?.(authClient)\n }\n const onSendError = (type: 'phone' | 'email', error: any) => {\n if (type === 'phone')\n events?.onPwdPhoneSendError?.(error as CommonMessage, authClient)\n if (type === 'email')\n events?.onPwdEmailSendError?.(error as CommonMessage, authClient)\n }\n\n return (\n <div className=\"g2-view-container g2-forget-password\">\n <div className=\"g2-view-header\">\n <ImagePro\n src={config?.logo!}\n size={48}\n borderRadius={4}\n alt=\"\"\n className=\"icon\"\n />\n <div className=\"title\">{t('login.resetPwd')}</div>\n <div className=\"title-explain\">{t('user.resetpasswordText1')}</div>\n </div>\n <div className=\"g2-view-tabs\">\n <ResetPassword\n onReset={onReset}\n publicConfig={publicConfig}\n onSend={onSend}\n onSendError={onSendError}\n />\n </div>\n <div className=\"g2-tips-line\">\n <div\n className=\"link-like back-to-login\"\n onClick={() => changeModule?.(GuardModuleType.LOGIN)}\n >\n {t('common.backLoginPage')}\n </div>\n </div>\n {/* <ChangeLanguage langRange={langRange} onLangChange={props.onLangChange} /> */}\n </div>\n )\n}\n","import { FormItemProps } from 'antd/lib/form'\nimport FormItem from 'antd/lib/form/FormItem'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PasswordLoginMethods } from '../../../AuthingGuard/api'\nimport CustomFormItem from '../../../ValidatorRules'\nimport { fieldRequiredRule } from '../../../_utils'\n\nexport interface FormItemAccountProps extends FormItemProps {\n passwordLoginMethods: PasswordLoginMethods[]\n}\n\nexport const FormItemAccount: React.FC<FormItemAccountProps> = (props) => {\n const { passwordLoginMethods: methods, ...formItemPtops } = props\n const { t } = useTranslation()\n const runderTemplate = useMemo(() => {\n if (methods.length !== 1)\n return (\n <FormItem\n validateTrigger={['onBlur', 'onChange']}\n rules={fieldRequiredRule(t('common.account'))}\n {...formItemPtops}\n />\n )\n\n switch (methods[0]) {\n case 'phone-password':\n return <CustomFormItem.Phone {...formItemPtops} />\n case 'email-password':\n return <CustomFormItem.Email {...formItemPtops} />\n case 'username-password':\n return <CustomFormItem.UserName {...formItemPtops} />\n }\n }, [formItemPtops, methods, t])\n\n return <>{runderTemplate}</>\n}\n","import Input, { InputProps } from 'antd/lib/input'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { PasswordLoginMethods } from '../../../AuthingGuard/api'\nimport { InputNumber } from '../../../InputNumber'\n\nexport interface InputAccountProps extends InputProps {\n passwordLoginMethods: PasswordLoginMethods[]\n}\n\nexport const InputAccount: React.FC<InputAccountProps> = (props) => {\n const { passwordLoginMethods: methods, ...inputProps } = props\n\n const { t } = useTranslation()\n\n const loginMethodsText = useMemo<\n Record<\n PasswordLoginMethods,\n {\n t: string\n sort: number\n }\n >\n >(\n () => ({\n 'email-password': {\n t: t('common.email'),\n sort: 2,\n },\n 'phone-password': {\n t: t('common.phoneNumber'),\n sort: 1,\n },\n 'username-password': {\n t: t('common.username'),\n sort: 0,\n },\n }),\n [t]\n )\n\n const placeholder = useMemo(\n () =>\n t('login.inputAccount', {\n text: methods\n ?.map((item) => loginMethodsText[item])\n .sort((a, b) => a.sort - b.sort)\n .map((item) => item.t)\n .join(' / '),\n }),\n [loginMethodsText, methods, t]\n )\n\n const runderInput = useMemo(() => {\n if (methods.length === 1 && methods[0] === 'phone-password')\n return (\n <InputNumber maxLength={11} placeholder={placeholder} {...inputProps} />\n )\n\n return <Input placeholder={placeholder} {...inputProps} />\n }, [inputProps, methods, placeholder])\n\n return <>{runderInput}</>\n}\n","import Input, { InputProps } from 'antd/lib/input'\nimport React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ImagePro } from '../../../ImagePro'\n\nexport interface GraphicVerifyCodeProps extends InputProps {\n verifyCodeUrl: string\n changeCode: () => void\n}\n\nexport const GraphicVerifyCode: React.FC<GraphicVerifyCodeProps> = (props) => {\n const { verifyCodeUrl, changeCode, ...inputProps } = props\n\n const { t } = useTranslation()\n\n return (\n <div className=\"g2-graphic-verify-code\">\n <Input {...inputProps} />\n\n <ImagePro\n className=\"g2-captcha-code-image\"\n src={verifyCodeUrl}\n alt={t('login.captchaCode')}\n height=\"46px\"\n style={{ cursor: 'pointer' }}\n onClick={() => changeCode()}\n />\n </div>\n )\n}\n","import React, { FC, useState, useMemo, useEffect } from 'react'\nimport { Space, Checkbox } from 'antd'\nimport './style.less'\nimport { getClassnames } from '../../../_utils'\nimport { Agreement } from '../../../AuthingGuard/api'\n\nexport interface AgreementsProps {\n value?: boolean\n onChange?: (value: boolean) => void\n style?: React.CSSProperties\n agreements: Agreement[]\n showError?: boolean\n}\n\nexport const Agreements: FC<AgreementsProps> = ({\n showError,\n onChange = () => {},\n style,\n agreements,\n}) => {\n const [acceptList, setAcceptList] = useState<(string | number)[]>([])\n\n const toggleItemCheck = (id: string | number) => {\n setAcceptList((prev) => {\n if (prev.includes(id)) {\n return prev.filter((item) => item !== id)\n }\n return [...prev, id]\n })\n }\n\n /** 是否可以注册 */\n const isAccept = useMemo(() => {\n /** 所有必须勾选的都勾了就可以通过 */\n return agreements\n .filter((item) => item.required)\n .every((item) => acceptList.includes(item.id))\n }, [acceptList, agreements])\n\n useEffect(() => {\n onChange(isAccept)\n }, [isAccept, onChange])\n\n return (\n <div\n className={getClassnames([\n 'authing-agreements',\n showError && 'authing-agreements-error',\n ])}\n >\n {agreements.map((item) => {\n return (\n <div\n key={item.id}\n style={{ ...style }}\n className={getClassnames([\n 'authing-agreements-item',\n item.required &&\n !acceptList.includes(item.id) &&\n 'authing-agreements-item-invalid',\n ])}\n onClick={(e: any) => {\n e.persist()\n if (e.target.nodeName !== 'A') {\n toggleItemCheck(item.id)\n }\n }}\n >\n <Space align=\"start\" size={5}>\n <Checkbox\n className=\"authing-agreements-checkbox\"\n checked={acceptList.includes(item.id)}\n />\n <div\n className=\"authing-agreements-item-content\"\n dangerouslySetInnerHTML={{\n __html: item.title,\n }}\n ></div>\n </Space>\n </div>\n )\n })}\n </div>\n )\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Form } from 'antd'\nimport { useTranslation } from 'react-i18next'\nimport { useGuardHttp } from '../../../_utils/guardHttp'\nimport { useGuardAuthClient } from '../../../Guard/authClient'\nimport { fieldRequiredRule, getUserRegisterParams } from '../../../_utils'\nimport { ErrorCode } from '../../../_utils/GuardErrorCode'\nimport SubmitButton from '../../../SubmitButton'\nimport { Agreement, PasswordLoginMethods } from '../../../AuthingGuard/api'\nimport { LoginMethods } from '../../..'\nimport { FormItemAccount } from './FormItemAccount'\nimport { InputAccount } from './InputAccount'\nimport { GraphicVerifyCode } from './GraphicVerifyCode'\nimport { IconFont } from '../../../IconFont'\nimport { InputPassword } from '../../../InputPassword'\nimport { Agreements } from '../../../Register/components/Agreements'\nimport { AuthingGuardResponse, AuthingResponse } from '../../../_utils/http'\nimport { CodeAction } from '../../../_utils/responseManagement/interface'\ninterface LoginWithPasswordProps {\n // configs\n publicKey: string\n autoRegister?: boolean\n host?: string\n\n // events\n // onLogin: any\n onBeforeLogin?: any\n onLoginSuccess?: any\n onLoginFailed?: any\n // 越过 login 正常的请求,返回一个 res\n onLoginRequest?: (loginInfo: any) => Promise<AuthingResponse>\n passwordLoginMethods: PasswordLoginMethods[]\n\n agreements: Agreement[]\n loginWay?: LoginMethods\n submitButText?: string\n}\n\nexport const LoginWithPassword = (props: LoginWithPasswordProps) => {\n const { agreements, onLoginFailed, onLoginSuccess } = props\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n\n const [validated, setValidated] = useState(false)\n\n let { t } = useTranslation()\n let { post } = useGuardHttp()\n let client = useGuardAuthClient()\n\n let submitButtonRef = useRef<any>(null)\n\n const [showCaptcha, setShowCaptcha] = useState(false)\n const [verifyCodeUrl, setVerifyCodeUrl] = useState('')\n const [remainCount, setRemainCount] = useState(0)\n const [accountLock, setAccountLock] = useState(false)\n const getCaptchaUrl = () => {\n const url = new URL(props.host!)\n url.pathname = '/api/v2/security/captcha'\n url.search = `?r=${+new Date()}`\n return url.href\n }\n\n const encrypt = client.options.encryptFunction\n\n const loginRequest = useCallback(\n async (loginInfo: any): Promise<AuthingGuardResponse> => {\n if (!!props.onLoginRequest) {\n const res = await props.onLoginRequest(loginInfo)\n return res\n }\n\n // onLogin\n const { data: loginData } = loginInfo\n let url = '/api/v2/login/account'\n let account = loginData.identity && loginData.identity.trim()\n let password = loginData.password && loginData.password.trim()\n let captchaCode = loginData.captchaCode && loginData.captchaCode.trim()\n\n let body = {\n account: account,\n password: await encrypt!(password, props.publicKey),\n captchaCode,\n customData: getUserRegisterParams(),\n autoRegister: props.autoRegister,\n withCustomData: true,\n }\n const res = await post(url, body)\n\n return res\n },\n [encrypt, post, props]\n )\n\n const onFinish = async (values: any) => {\n setValidated(true)\n if (agreements?.length && !acceptedAgreements) {\n submitButtonRef.current.onError()\n return\n }\n setRemainCount(0)\n // onBeforeLogin\n submitButtonRef?.current.onSpin(true)\n let loginInfo = {\n type: LoginMethods.Password,\n data: {\n identity: values.account,\n password: values.password,\n captchaCode: values.captchaCode,\n },\n }\n let context = await props.onBeforeLogin?.(loginInfo)\n if (!context && !!props.onBeforeLogin) {\n submitButtonRef?.current.onSpin(false)\n return\n }\n\n const res = await loginRequest(loginInfo)\n\n onLoginRes(res)\n }\n\n const onLoginRes = (res: AuthingGuardResponse) => {\n const { code, message: msg, data, onGuardHandling } = res\n\n if (code === ErrorCode.INPUT_CAPTCHACODE) {\n setVerifyCodeUrl(getCaptchaUrl())\n setShowCaptcha(true)\n }\n\n if (code === ErrorCode.PASSWORD_ERROR) {\n if ((data as any)?.remainCount) {\n setRemainCount((data as any)?.remainCount ?? 0)\n submitButtonRef?.current.onSpin(false)\n // TODO 临时拦截密码错误限制不报 message\n // props.onLogin(9999, data, msg)\n onLoginFailed?.(9999, data, msg)\n return\n }\n }\n\n if (\n code === ErrorCode.ACCOUNT_LOCK ||\n code === ErrorCode.MULTIPLE_ERROR_LOCK\n ) {\n // 账号锁定\n setAccountLock(true)\n }\n\n submitButtonRef?.current.onSpin(false)\n\n if (code === 200) {\n onLoginSuccess(data, msg)\n } else {\n // 响应拦截器处理通用错误以及changeModule\n const handMode = onGuardHandling?.()\n // 向上层抛出错误\n handMode === CodeAction.RENDER_MESSAGE && onLoginFailed?.(code, data, msg)\n }\n }\n\n useEffect(() => {\n setRemainCount(0)\n setAccountLock(false)\n }, [props.loginWay])\n\n const submitText = useMemo(() => {\n if (props.submitButText) return props.submitButText\n\n return props.autoRegister\n ? `${t('common.login')} / ${t('common.register')}`\n : t('common.login')\n }, [props, t])\n\n return (\n <div className=\"authing-g2-login-password\">\n <Form\n name=\"passworLogin\"\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n autoComplete=\"off\"\n >\n <FormItemAccount\n name=\"account\"\n className=\"authing-g2-input-form\"\n passwordLoginMethods={props.passwordLoginMethods}\n >\n <InputAccount\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n passwordLoginMethods={props.passwordLoginMethods}\n />\n </FormItemAccount>\n <Form.Item\n name=\"password\"\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n rules={fieldRequiredRule(t('common.password'))}\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputLoginPwd')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n {/* 图形验证码 */}\n {showCaptcha && (\n <Form.Item\n className=\"authing-g2-input-form\"\n validateTrigger={['onBlur', 'onChange']}\n name=\"captchaCode\"\n rules={fieldRequiredRule(t('common.captchaCode'))}\n >\n <GraphicVerifyCode\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputCaptchaCode')}\n verifyCodeUrl={verifyCodeUrl}\n changeCode={() => setVerifyCodeUrl(getCaptchaUrl())}\n />\n </Form.Item>\n )}\n {remainCount !== 0 && !accountLock && (\n <span\n style={{\n marginBottom: 23,\n fontSize: 12,\n color: '#E8353E',\n display: 'block',\n }}\n >\n {t('common.loginFailCheck', {\n number: remainCount,\n })}\n </span>\n )}\n {accountLock && (\n <span\n style={{\n marginBottom: 23,\n fontSize: 12,\n color: '#E8353E',\n display: 'block',\n }}\n >\n {t('common.accountLock')}\n </span>\n )}\n\n {Boolean(agreements?.length) && (\n <Agreements\n onChange={setAcceptedAgreements}\n agreements={agreements}\n showError={validated}\n />\n )}\n <Form.Item>\n <SubmitButton\n text={submitText}\n className=\"password\"\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import React, { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Form, Input, message } from 'antd'\nimport { LoginMethods } from '../../'\nimport { ErrorCode } from '../../_utils/GuardErrorCode'\n// import { useGuardAuthClient } from '../../Guard/authClient'\nimport SubmitButton from '../../SubmitButton'\nimport { fieldRequiredRule } from '../../_utils'\nimport { IconFont } from '../../IconFont'\nimport { InputPassword } from '../../InputPassword'\nimport { Agreements } from '../../Register/components/Agreements'\nimport { Agreement } from '../../AuthingGuard/api'\nimport { useGuardHttpClient } from '../../_utils/context'\nimport { CodeAction } from '../../_utils/responseManagement/interface'\ninterface LoginWithLDAPProps {\n // configs\n publicKey: string\n autoRegister?: boolean\n host?: string\n\n // events\n // onLogin: any\n onLoginSuccess: any\n onLoginFailed: any\n onBeforeLogin: any\n agreements: Agreement[]\n}\n\nexport const LoginWithLDAP = (props: LoginWithLDAPProps) => {\n const { agreements, onLoginSuccess, onLoginFailed } = props\n\n // const { responseIntercept } = useGuardHttpClient()\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n\n const [validated, setValidated] = useState(false)\n // let client = useGuardAuthClient()\n const { post } = useGuardHttpClient()\n const { t } = useTranslation()\n let submitButtonRef = useRef<any>(null)\n\n const [showCaptcha, setShowCaptcha] = useState(false)\n const [verifyCodeUrl, setVerifyCodeUrl] = useState('')\n const captchaUrl = `${props.host}/api/v2/security/captcha`\n const getCaptchaUrl = () => `${captchaUrl}?r=${+new Date()}`\n\n const onFinish = async (values: any) => {\n setValidated(true)\n if (agreements?.length && !acceptedAgreements) {\n submitButtonRef.current?.onError()\n return\n }\n // onBeforeLogin\n submitButtonRef.current?.onSpin(true)\n let loginInfo = {\n type: LoginMethods.LDAP,\n data: {\n identity: values.account,\n password: values.password,\n captchaCode: values.captchaCode,\n },\n }\n let context = await props.onBeforeLogin(loginInfo)\n if (!context) {\n submitButtonRef.current?.onSpin(false)\n return\n }\n\n // onLogin\n let username = values.account && values.account.trim()\n let password = values.password && values.password.trim()\n\n try {\n const { code, data, onGuardHandling } = await post(\n '/api/v2/ldap/verify-user',\n {\n username,\n password,\n }\n )\n\n submitButtonRef.current.onSpin(false)\n\n if (code === 200) {\n onLoginSuccess(data)\n } else {\n if (code === ErrorCode.INPUT_CAPTCHACODE) {\n setVerifyCodeUrl(getCaptchaUrl())\n setShowCaptcha(true)\n }\n const handMode = onGuardHandling?.()\n // 向上层抛出错误\n handMode === CodeAction.RENDER_MESSAGE && onLoginFailed(code, data)\n }\n } catch (error: any) {\n submitButtonRef.current?.onSpin(false)\n if (error.code === 'ECONNABORTED') {\n message.error(t('common.timeoutLDAP'))\n onLoginFailed(2333, {})\n } else {\n console.log(error)\n }\n }\n\n // let captchaCode = values.captchaCode && values.captchaCode.trim()\n // await client\n // .loginByLdap(account, password)\n // .then((user) => {\n // onLoginSuccess(user)\n // })\n // .catch((error: any) => {\n // if (error.code === 'ECONNABORTED') {\n // message.error(t('common.timeoutLDAP'))\n // onLoginFailed(2333, {})\n // } else {\n // submitButtonRef.current?.onError()\n // let parsedMessage: any = {}\n // try {\n // parsedMessage = JSON.parse(error.message) || error\n // } catch {\n // console.log('message 解析失败')\n // }\n // const { code, statusCode, apiCode, message, data } = parsedMessage\n // if (code === ErrorCode.INPUT_CAPTCHACODE) {\n // setVerifyCodeUrl(getCaptchaUrl())\n // setShowCaptcha(true)\n // }\n // // TODO 错误信息返回不符合 AuthingResponse 的格式 暂用 code 替代\n // const { onGuardHandling } = responseIntercept({\n // statusCode: statusCode || code,\n // apiCode,\n // data,\n // message,\n // code,\n // })\n // const handMode = onGuardHandling?.()\n // // 向上层抛出错误\n // handMode === CodeAction.RENDER_MESSAGE && onLoginFailed(code, data)\n // }\n // })\n // .finally(() => {\n // submitButtonRef.current?.onSpin(false)\n // })\n }\n\n return (\n <div className=\"authing-g2-login-ldap\">\n <Form\n name=\"passworLogin\"\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current?.onError()}\n autoComplete=\"off\"\n >\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"account\"\n rules={fieldRequiredRule(t('common.account'))}\n >\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('login.inputLdapUsername')}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"password\"\n rules={fieldRequiredRule(t('common.password'))}\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputLdapPwd')}\n // prefix={<LockOutlined style={{ color: '#878A95' }} />}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n {showCaptcha && (\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"captchaCode\"\n rules={[{ required: true, message: t('login.inputCaptchaCode') }]}\n >\n <Input\n className=\"authing-g2-input add-after\"\n size=\"large\"\n placeholder={t('login.inputCaptchaCode')}\n addonAfter={\n <img\n className=\"g2-captcha-code-image\"\n src={verifyCodeUrl}\n alt={t('login.captchaCode')}\n style={{ height: '2em', cursor: 'pointer' }}\n onClick={() => setVerifyCodeUrl(getCaptchaUrl())}\n />\n }\n />\n </Form.Item>\n )}\n {Boolean(agreements?.length) && (\n <Agreements\n onChange={setAcceptedAgreements}\n agreements={agreements}\n showError={validated}\n />\n )}\n <Form.Item>\n <SubmitButton\n text={t('common.login')}\n className=\"password\"\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import { Form, Input, message } from 'antd'\nimport { LoginMethods } from 'authing-js-sdk'\nimport React, { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Agreement } from '../../AuthingGuard/api'\n// import { useGuardAuthClient } from '../../Guard/authClient'\nimport { IconFont } from '../../IconFont'\nimport { InputPassword } from '../../InputPassword'\nimport { Agreements } from '../../Register/components/Agreements'\nimport SubmitButton from '../../SubmitButton'\nimport version from '../../version/version'\nimport { fieldRequiredRule } from '../../_utils'\nimport {\n useGuardAppId,\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardPublicConfig,\n} from '../../_utils/context'\nimport { requestClient } from '../../_utils/http'\nimport { i18n } from '../../_utils/locales'\nimport { CodeAction } from '../../_utils/responseManagement/interface'\n\ninterface LoginWithADProps {\n // configs\n publicKey: string\n autoRegister?: boolean\n // host?: string\n\n // events\n // onLogin: any\n onLoginSuccess: any\n onLoginFailed: any\n onBeforeLogin: any\n agreements: Agreement[]\n}\n\nexport const LoginWithAD = (props: LoginWithADProps) => {\n const { agreements, onLoginFailed, onLoginSuccess } = props\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n\n const [validated, setValidated] = useState(false)\n\n const publicConfig = useGuardPublicConfig()\n\n const appId = useGuardAppId()\n\n const { responseIntercept } = useGuardHttpClient()\n\n const config = useGuardFinallyConfig()\n\n const { t } = useTranslation()\n\n // let client = useGuardAuthClient()\n\n // const { post } = useGuardHttpClient()\n\n let submitButtonRef = useRef<any>(null)\n\n const onFinish = async (values: any) => {\n setValidated(true)\n if (agreements?.length && !acceptedAgreements) {\n submitButtonRef.current?.onError()\n return\n }\n // onBeforeLogin\n submitButtonRef.current?.onSpin(true)\n let loginInfo = {\n type: LoginMethods.AD,\n data: {\n identity: values.account,\n password: values.password,\n },\n }\n let context = await props.onBeforeLogin(loginInfo)\n if (!context) {\n submitButtonRef.current?.onSpin(false)\n return\n }\n\n // onLogin\n let username = values.account && values.account.trim()\n let password = values.password && values.password.trim()\n\n // todo\n try {\n const firstLevelDomain = new URL(config.host).hostname\n .split('.')\n .slice(1)\n .join('.')\n\n const websocketHost = `https://ws.${firstLevelDomain}`\n\n const api = `${websocketHost}/api/v2/ad/verify-user`\n\n const fetchRes = await fetch(api, {\n method: 'POST',\n body: JSON.stringify({ username, password }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n [requestClient.langHeader]: i18n.language,\n 'x-authing-userpool-id': publicConfig.userPoolId,\n 'x-authing-app-id': appId,\n 'x-authing-sdk-version': version,\n 'x-authing-request-from': `Guard@${version}`,\n },\n })\n\n const res = await fetchRes.json()\n\n const { code, data, onGuardHandling } = responseIntercept(res)\n\n submitButtonRef.current?.onSpin(false)\n\n if (code === 200) {\n onLoginSuccess(data)\n } else {\n const handMode = onGuardHandling?.()\n // 向上层抛出错误\n handMode === CodeAction.RENDER_MESSAGE && onLoginFailed(code, data)\n }\n } catch (error: any) {\n submitButtonRef.current?.onSpin(false)\n if (error.code === 'ECONNABORTED') {\n message.error(t('common.timeoutAD'))\n onLoginFailed(2333, {})\n } else {\n console.log(error)\n }\n }\n\n // await client\n // .loginByAd(account, password)\n // .then((user) => {\n // // props.onLogin(200, user)\n // onLoginSuccess(user)\n // })\n // .catch((error: any) => {\n // if (error.code === 'ECONNABORTED') {\n // message.error(t('common.timeoutAD'))\n // onLoginFailed(2333, {})\n // } else {\n // submitButtonRef.current?.onError()\n // let parsedMessage: any = {}\n // try {\n // parsedMessage = JSON.parse(error.message) || error\n // } catch {\n // console.log('message 解析失败')\n // }\n // const { code, statusCode, apiCode, message, data } = parsedMessage\n // // TODO 错误信息返回不符合 AuthingResponse 的格式 暂用 code 替代\n // const { onGuardHandling } = responseIntercept({\n // statusCode: statusCode || code,\n // apiCode,\n // data,\n // message,\n // code,\n // })\n\n // const handMode = onGuardHandling?.()\n // // 向上层抛出错误\n // handMode === CodeAction.RENDER_MESSAGE && onLoginFailed(code, data)\n // }\n // })\n // .finally(() => {\n // submitButtonRef.current?.onSpin(false)\n // })\n }\n\n return (\n <div className=\"authing-g2-login-ad\">\n <Form\n name=\"adLogin\"\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n autoComplete=\"off\"\n >\n {publicConfig?.ssoPageComponentDisplay.userPasswordInput && (\n <>\n <Form.Item\n className=\"authing-g2-input-form\"\n name=\"account\"\n validateTrigger={['onBlur', 'onChange']}\n rules={fieldRequiredRule(t('common.account'))}\n >\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('login.inputAdUsername')}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"password\"\n rules={fieldRequiredRule(t('common.password'))}\n >\n <InputPassword\n autoComplete=\"off\"\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputAdPwd')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n {Boolean(agreements?.length) && (\n <Agreements\n onChange={setAcceptedAgreements}\n agreements={agreements}\n showError={validated}\n />\n )}\n <Form.Item>\n <SubmitButton\n text={t('common.login')}\n className=\"password\"\n ref={submitButtonRef}\n />\n </Form.Item>\n </>\n )}\n </Form>\n </div>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { ShieldSpin } from '../../ShieldSpin'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { message } from 'antd'\nimport { useGuardHttpClient } from '../../_utils/context'\n\ninterface LoginWithAppQrcodeProps {\n // onLogin: any\n onLoginSuccess: any\n canLoop: boolean\n qrCodeScanOptions: any\n}\n\nexport const LoginWithAppQrcode = (props: LoginWithAppQrcodeProps) => {\n const timerRef = useRef<any>()\n const client = useGuardAuthClient()\n const [loading, setLoading] = useState(true)\n const appQrcodeClient = client.qrcode\n const { responseIntercept } = useGuardHttpClient()\n\n useEffect(() => {\n if (!props.canLoop) {\n return () => clearInterval(timerRef.current)\n }\n setLoading(true)\n appQrcodeClient.startScanning('authingGuardAppQrcode', {\n autoExchangeUserInfo: true,\n ...props.qrCodeScanOptions,\n onCodeShow() {\n setLoading(false)\n },\n onStart(timer) {\n timerRef.current = timer\n },\n onSuccess(user) {\n // props.onLogin(200, user)\n clearInterval(timerRef.current)\n props.onLoginSuccess(user)\n },\n onError: (ms) => {\n if (ms) {\n message.error(ms)\n }\n },\n onCodeLoadFailed: ({ message: mes }: any) => {\n message.error(JSON.parse(mes).message)\n setLoading(false)\n },\n onRetry: () => {\n setLoading(true)\n },\n onAuthFlow: (scannedResult) => {\n clearInterval(timerRef.current)\n const { onGuardHandling } = responseIntercept(scannedResult)\n onGuardHandling?.()\n },\n })\n return () => clearInterval(timerRef.current)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [appQrcodeClient, props.canLoop])\n\n return (\n <div className=\"authing-g2-login-app-qrcode\">\n {loading && <ShieldSpin />}\n <div id=\"authingGuardAppQrcode\"></div>\n </div>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { message } from 'antd'\nimport { ShieldSpin } from '../../ShieldSpin'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { useGuardHttpClient } from '../../_utils/context'\n\ninterface LoginWithWechatMiniQrcodeProps {\n // onLogin: any\n onLoginSuccess: any\n canLoop: boolean\n qrCodeScanOptions: any\n}\n\nexport const LoginWithWechatMiniQrcode = (\n props: LoginWithWechatMiniQrcodeProps\n) => {\n const timerRef = useRef<any>()\n const client = useGuardAuthClient()\n const [loading, setLoading] = useState(true)\n const appQrcodeClient = client.wxqrcode\n const { responseIntercept } = useGuardHttpClient()\n\n const domId = `authingGuardMiniQrcode-${props.qrCodeScanOptions.extIdpConnId}`\n\n useEffect(() => {\n if (!props.canLoop) {\n return () => clearInterval(timerRef.current)\n }\n setLoading(true)\n appQrcodeClient.startScanning(domId, {\n autoExchangeUserInfo: true,\n ...props.qrCodeScanOptions,\n onCodeShow() {\n setLoading(false)\n },\n onStart(timer) {\n timerRef.current = timer\n },\n onSuccess(user) {\n // props.onLogin(200, user)\n clearInterval(timerRef.current)\n props.onLoginSuccess(user)\n },\n onError: (ms) => {\n if (ms) {\n message.error(ms)\n }\n },\n onCodeLoadFailed: ({ message: mes }: any) => {\n message.error(JSON.parse(mes).message)\n setLoading(false)\n },\n onRetry: () => {\n setLoading(true)\n },\n onAuthFlow: (scannedResult) => {\n clearInterval(timerRef.current)\n const { onGuardHandling } = responseIntercept(scannedResult)\n onGuardHandling?.()\n },\n })\n return () => clearInterval(timerRef.current)\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [appQrcodeClient, props.canLoop])\n\n return (\n <div className=\"authing-g2-login-app-qrcode\">\n {loading && <ShieldSpin />}\n <div id={domId}></div>\n </div>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { ShieldSpin } from '../../ShieldSpin'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { useGuardHttpClient } from '../../_utils/context'\nimport { message } from 'antd'\n\ninterface LoginWithWechatmpQrcodeProps {\n // onLogin: any\n onLoginSuccess: any\n canLoop: boolean\n qrCodeScanOptions: any\n}\n\nexport const LoginWithWechatmpQrcode = (\n props: LoginWithWechatmpQrcodeProps\n) => {\n const timerRef = useRef<any>()\n\n const client = useGuardAuthClient()\n\n const { responseIntercept } = useGuardHttpClient()\n\n const [loading, setLoading] = useState(true)\n\n const appQrcodeClient = client.wechatmpqrcode\n\n const domId = `authingGuardMpQrcode-${props.qrCodeScanOptions.extIdpConnId}`\n\n useEffect(() => {\n if (!props.canLoop) {\n return () => clearInterval(timerRef.current)\n }\n setLoading(true)\n appQrcodeClient.startScanning(domId, {\n autoExchangeUserInfo: true,\n ...props.qrCodeScanOptions,\n\n onCodeShow() {\n setLoading(false)\n },\n onStart(timer) {\n timerRef.current = timer\n },\n onSuccess(user) {\n // props.onLogin(200, user)\n props.onLoginSuccess(user)\n clearInterval(timerRef.current)\n },\n onError: (ms) => {\n if (ms) {\n message.error(ms)\n }\n },\n onCodeLoadFailed: ({ message: mes }: any) => {\n message.error(JSON.parse(mes).message)\n setLoading(false)\n },\n onRetry: () => {\n setLoading(true)\n },\n onAuthFlow: (scannedResult) => {\n // props.onLogin(code, mfaData, message)\n clearInterval(timerRef.current)\n const { onGuardHandling } = responseIntercept(scannedResult)\n onGuardHandling?.()\n },\n })\n return () => clearInterval(timerRef.current)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [appQrcodeClient, props.canLoop])\n\n return (\n <div className=\"authing-g2-login-app-qrcode\">\n {loading && <ShieldSpin />}\n <div id={domId}></div>\n </div>\n )\n}\n","import { ErrorCode } from '../_utils/GuardErrorCode'\nimport { GuardModuleAction, GuardModuleType } from '../Guard/module'\nimport { MFAType } from '../MFA/interface'\n\nexport const codeMap: Record<number, GuardModuleAction> = {\n [ErrorCode.APP_MFA_CODE]: {\n // 跳转去 mfa 验证\n action: 'changeModule',\n module: GuardModuleType.MFA,\n },\n [ErrorCode.OTP_MFA_CODE]: {\n // 跳转去 mfa 验证\n action: 'changeModule',\n module: GuardModuleType.MFA,\n initData: {\n current: MFAType.TOTP,\n totpMfaEnabled: true,\n },\n },\n [ErrorCode.INPUT_CAPTCHACODE]: {\n // 需要输入图形验证码\n action: 'message',\n },\n 500: {\n action: 'message',\n },\n 1002: {\n // 登录太频繁\n action: 'message',\n },\n 2820002: {\n // ldap url报错信息\n action: 'message',\n },\n 2333: {\n // 密码错误\n action: 'message',\n },\n 2057: {\n // 多次错误登录导致账号锁定\n action: 'accountLock',\n },\n 2005: {\n // 账号锁定\n action: 'accountLock',\n },\n 2042: {\n // 禁止未验证邮箱注册\n action: 'message',\n },\n 2001: {\n // 验证码过期\n action: 'message',\n },\n 1576: {\n action: 'message',\n },\n 2029: {\n action: 'message',\n },\n 3720001: {\n // 01 02 03 计量计费相关\n action: 'message',\n },\n 3720002: {\n action: 'message',\n },\n 3720003: {\n action: 'message',\n },\n 2130010: {\n // 无权登录此应用\n action: 'message',\n },\n 2120008: {\n action: 'message',\n },\n 2031: {\n // 禁止注册\n action: 'message',\n },\n 1640: {\n action: 'changeModule',\n module: GuardModuleType.IDENTITY_BINDING,\n },\n 1641: {\n action: 'changeModule',\n module: GuardModuleType.IDENTITY_BINDING_ASK,\n },\n 1642: {\n action: 'changeModule',\n module: GuardModuleType.LOGIN_COMPLETE_INFO,\n },\n // 1643: {},\n 408: {\n action: 'message',\n },\n}\n","import { useGuardIsAuthFlow } from '../_utils/context'\nimport { getGuardHttp } from '../_utils/guardHttp'\n\nexport enum MfaBusinessAction {\n VerifyEmail = 'verify-email',\n VerifySms = 'verify-sms',\n VerifyTotp = 'verify-totp',\n VerifyFace = 'verify-face',\n AssociateFace = 'associate-face',\n}\n\nexport const authFlow = async (action: MfaBusinessAction, content: any) => {\n const { authFlow } = getGuardHttp()\n\n const res = await authFlow(action, { ...content })\n\n return res\n}\n\ninterface VerifySmsContent {\n phone: string\n code: string\n mfaToken?: string\n phoneCountryCode?: string\n}\n\ninterface VerifyEmailContent {\n email: string\n code: string\n mfaToken?: string\n}\n\ninterface VerifyTotpContent {\n totp: string\n mfaToken?: string\n}\n\ninterface VerifyFaceContent {\n photo: string\n mfaToken?: string\n}\n\ninterface AssociateFaceContent {\n photoA: string\n photoB: string\n isExternalPhoto?: boolean\n mfaToken?: string\n}\n\nexport const VerifyEmail = async (content: VerifyEmailContent) => {\n const { email, code, mfaToken } = content\n const { post } = getGuardHttp()\n\n return await post(\n '/api/v2/applications/mfa/email/verify',\n {\n email,\n code,\n },\n {\n headers: {\n authorization: `Bearer ${mfaToken}`,\n },\n }\n )\n}\n\nexport const VerifySms = async (content: VerifySmsContent) => {\n const { phone, code, mfaToken, phoneCountryCode } = content\n const { post } = getGuardHttp()\n\n return await post(\n '/api/v2/applications/mfa/sms/verify',\n {\n phone,\n code,\n phoneCountryCode,\n },\n {\n headers: {\n authorization: `Bearer ${mfaToken}`,\n },\n }\n )\n}\n\nexport const VerifyTotp = async (content: VerifyTotpContent) => {\n const { totp, mfaToken } = content\n const { post } = getGuardHttp()\n\n return await post(\n '/api/v2/applications/mfa/totp/verify',\n {\n totp,\n },\n {\n headers: {\n authorization: `Bearer ${mfaToken}`,\n },\n }\n )\n}\n\nexport const VerifyFace = async (content: VerifyFaceContent) => {\n const { photo, mfaToken } = content\n const { post } = getGuardHttp()\n\n return await post(\n '/api/v2/applications/mfa/face/verify',\n {\n photo,\n },\n {\n headers: {\n authorization: `Bearer ${mfaToken}`,\n },\n }\n )\n}\n\nexport const AssociateFace = async (content: AssociateFaceContent) => {\n const { photoA, photoB, isExternalPhoto, mfaToken } = content\n const { post } = getGuardHttp()\n\n return await post(\n '/api/v2/mfa/face/associate',\n {\n photoA,\n photoB,\n isExternalPhoto,\n },\n {\n headers: {\n authorization: `Bearer ${mfaToken}`,\n },\n }\n )\n}\n\nexport const useMfaBusinessRequest = () => {\n const isFlow = useGuardIsAuthFlow()\n\n const request = {\n [MfaBusinessAction.VerifyEmail]: (content: VerifyEmailContent) => {\n if (isFlow) {\n return authFlow(MfaBusinessAction.VerifyEmail, content)\n }\n\n return VerifyEmail(content)\n },\n [MfaBusinessAction.VerifySms]: (content: VerifySmsContent) => {\n if (isFlow) {\n return authFlow(MfaBusinessAction.VerifySms, content)\n }\n\n return VerifySms(content)\n },\n [MfaBusinessAction.VerifyTotp]: (content: VerifyTotpContent) => {\n if (isFlow) {\n return authFlow(MfaBusinessAction.VerifyTotp, content)\n }\n\n return VerifyTotp(content)\n },\n [MfaBusinessAction.VerifyFace]: (content: VerifyFaceContent) => {\n if (isFlow) {\n return authFlow(MfaBusinessAction.VerifyFace, content)\n }\n\n return VerifyFace(content)\n },\n [MfaBusinessAction.AssociateFace]: (content: AssociateFaceContent) => {\n if (isFlow) {\n return authFlow(MfaBusinessAction.AssociateFace, content)\n }\n\n return AssociateFace(content)\n },\n }\n\n return request\n}\n","import { Avatar, Button } from 'antd'\nimport {\n IAzureAdConnectionConfig,\n ICasConnectionConfig,\n IOAuthConnectionConfig,\n ISamlConnectionConfig,\n OIDCConnectionConfig,\n Protocol,\n} from 'authing-js-sdk'\nimport qs from 'qs'\nimport React, { useCallback } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport shortid from 'shortid'\nimport { useGuardAuthClient } from '../../../Guard/authClient'\nimport { getGuardWindow } from '../../../Guard/core/useAppendConfig'\nimport { IconFont } from '../../../IconFont'\nimport version from '../../../version/version'\nimport { popupCenter } from '../../../_utils'\nimport { useGuardHttp } from '../../../_utils/guardHttp'\n\nexport const IdpButton = (props: any) => {\n const { i, appId, userPoolId } = props\n\n const { t } = useTranslation()\n\n const { post } = useGuardHttp()\n\n const authClient = useGuardAuthClient()\n\n const renderBtn = useCallback(() => {\n if (i?.provider) {\n // 社交身份源\n const iconType = `authing-${i.provider.replace(/:/g, '-')}`\n\n const onLogin = async () => {\n await authClient.social.authorize(i.identifier, {\n guardVersion: `Guard@${version}`,\n\n // onSuccess(user) {\n // // TODO\n // // onSuccess(user)\n // setLoading(false)\n // onGuardLogin(200, user)\n // },\n // onError(code, msg) {\n // setLoading(false)\n // try {\n // const parsedMsg = JSON.parse(msg)\n // const { message: authingMessage, data: authingData } = parsedMsg\n // onGuardLogin(code, authingData, authingMessage)\n // } catch (e) {\n // // do nothing...\n // }\n // // message.error(msg)\n // },\n })\n }\n return (\n <Button\n key={i.identifier}\n className=\"g2-guard-third-login-btn\"\n block\n size=\"large\"\n icon={\n <IconFont\n type={`${iconType}-fill`}\n style={{ fontSize: 20, marginRight: 8 }}\n />\n }\n onClick={onLogin}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n }\n if (i.protocol === Protocol.OIDC) {\n const configItem = i.config as OIDCConnectionConfig\n const state = shortid.generate()\n const query = qs.stringify({\n client_id: configItem.clientId,\n redirect_uri: configItem.redirectUri,\n scope: configItem.scopes,\n response_type: configItem.responseType,\n state,\n nonce: shortid.generate(),\n })\n const url = `${configItem.authorizationEdpoint}?${query}`\n\n return (\n <Button\n key={i.identifier}\n className=\"g2-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n const guardWindow = getGuardWindow()\n\n if (!guardWindow) return\n\n await post('/api/v2/connections/oidc/start-interaction', {\n state,\n protocol: i.protocol,\n userPoolId,\n appId,\n referer: guardWindow?.location.href,\n connection: { providerIentifier: i.identifier },\n })\n popupCenter(url)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else if (i.protocol === Protocol.SAML) {\n const config = i.config as ISamlConnectionConfig\n return (\n <Button\n key={i.identifier}\n className=\"g2-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n popupCenter(config.samlRequest!)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else if (i.protocol === Protocol.CAS) {\n const config = i.config as ICasConnectionConfig\n\n return (\n <Button\n key={i.identifier}\n className=\"g2-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n popupCenter(config.casConnectionLoginUrl!)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else if (i.protocol === Protocol.OAUTH) {\n const config = i.config as IOAuthConnectionConfig\n\n return (\n <Button\n key={i.identifier}\n className=\"g2-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n popupCenter(config.authUrl!)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else if (i.protocol === Protocol.AZURE_AD) {\n const configItem = i.config as IAzureAdConnectionConfig\n return (\n <Button\n key={i.identifier}\n className=\"g2-guard-third-login-btn\"\n block\n size=\"large\"\n icon={<Avatar size={20} src={i.logo} style={{ marginRight: 8 }} />}\n onClick={async () => {\n popupCenter(configItem.authorizationUrl)\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </Button>\n )\n } else {\n return null\n }\n }, [appId, authClient.social, i, post, t, userPoolId])\n return renderBtn()\n}\n","import { Button, Space, Tooltip } from 'antd'\nimport { SocialConnectionProvider, RelayMethodEnum } from 'authing-js-sdk'\nimport { Lang } from 'authing-js-sdk/build/main/types'\nimport React, { useEffect } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { i18n } from '../../_utils/locales'\nimport { isLarkBrowser, isWeChatBrowser } from '../../_utils'\nimport querystring from 'query-string'\nimport { ApplicationConfig, SocialConnectionItem } from '../../AuthingGuard/api'\nimport { useScreenSize } from '../../AuthingGuard/hooks/useScreenSize'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { IconFont } from '../../IconFont'\nimport './style.less'\nimport { useMediaSize } from '../../_utils/hooks'\nimport { useGuardPublicConfig } from '../../_utils/context'\nimport { IdpButton } from './IdpButton'\nimport { usePostMessage } from './postMessage'\nimport { CodeAction } from '../../_utils/responseManagement/interface'\nimport version from '../../version/version'\nimport { GuardLocalConfig } from '../../Guard'\nimport { getGuardWindow } from '../../Guard/core/useAppendConfig'\n\nexport interface SocialLoginProps {\n appId: string\n config: GuardLocalConfig\n // onLogin: any\n onLoginFailed: any\n onLoginSuccess: any\n enterpriseConnectionObjs: ApplicationConfig['identityProviders']\n socialConnectionObjs: SocialConnectionItem[]\n}\n\nexport const SocialLogin: React.FC<SocialLoginProps> = ({\n appId,\n config,\n onLoginFailed,\n onLoginSuccess,\n enterpriseConnectionObjs,\n socialConnectionObjs,\n}) => {\n const noLoginMethods = !config?.loginMethods?.length\n\n const publicConfig = useGuardPublicConfig()\n\n const userPoolId = publicConfig?.userPoolId\n\n const { t } = useTranslation()\n\n const [screenSize] = useScreenSize()\n\n const authClient = useGuardAuthClient()\n\n const { isPhoneMedia } = useMediaSize()\n\n const onMessage = usePostMessage()\n\n // const onErrorHandling = useErrorHandling()\n\n useEffect(() => {\n const onPostMessage = (evt: MessageEvent) => {\n const res = onMessage(evt)\n\n if (!res) return\n\n const { code, data, onGuardHandling } = res\n if (code === 200) {\n onLoginSuccess(data)\n } else {\n const handMode = onGuardHandling?.()\n // 向上层抛出错误\n handMode === CodeAction.RENDER_MESSAGE && onLoginFailed(code, data)\n }\n }\n\n const guardWindow = getGuardWindow()\n\n guardWindow?.addEventListener('message', onPostMessage)\n return () => {\n guardWindow?.removeEventListener('message', onPostMessage)\n }\n }, [onLoginFailed, onLoginSuccess, onMessage])\n\n const idpButtons = enterpriseConnectionObjs.map((i: any) => {\n return (\n <IdpButton\n key={i.identifier}\n i={i}\n appId={appId}\n userPoolId={userPoolId}\n />\n )\n })\n\n const socialLoginButtons = socialConnectionObjs.map((item: any) => {\n let iconType = `authing-${item.provider.replace(/:/g, '-')}`\n const options: Record<string, any> = {}\n const authorization_params: Record<string, any> = {}\n if (item.provider === SocialConnectionProvider.BAIDU) {\n authorization_params.display = screenSize\n }\n if (config?.isHost) {\n const guardWindow = getGuardWindow()\n\n if (guardWindow) {\n // 如果 isHost 是 true,则从 url 获取 finish_login_url 作为 social.authorize 方法的 targetUrl 参数\n options.targetUrl = querystring.parse(guardWindow.location.search)?.[\n 'finish_login_url'\n ]\n }\n }\n // 根据 UA 判断是否在微信网页浏览器、钉钉浏览器等内部,使用 form_post 参数作为 social.authorize 方法的 relayMethod 参数,其他情况用 web_message\n options.relayMethod =\n isWeChatBrowser() || isLarkBrowser()\n ? RelayMethodEnum.FORM_POST\n : RelayMethodEnum.WEB_MESSAGE\n\n const onLogin = () => {\n authClient.social.authorize(item.identifier, {\n // onSuccess(user) {\n // onGuardLogin(200, user)\n // },\n // onError(code, msg, data) {\n // // try {\n // // const parsedMsg = JSON.parse(msg)\n // // const { message: authingMessage, data: authingData } = parsedMsg\n // // onGuardLogin(code, authingData, authingMessage)\n // // } catch (e) {\n // // // do nothing...\n // // onGuardLogin(code, data, msg)\n // // }\n // // // message.error(msg)\n\n // const { onGuardHandling } = onErrorHandling({\n // code,\n // message: msg,\n // data,\n // })\n\n // onGuardHandling?.()\n // },\n authorization_params,\n // 兼容后端因取不到 guardVersion 而走老版本 guard 逻辑 无法拉起信息补全问题\n guardVersion: `Guard@${version}`,\n ...options,\n })\n }\n\n const shape = config.socialConnectionsBtnShape\n\n if (shape === 'button') {\n return (\n <Button\n key={item.id}\n block\n size=\"large\"\n className=\"g2-guard-third-login-btn\"\n icon={\n <IconFont\n type={`${iconType}-fill`}\n style={{ fontSize: 20, marginRight: 8 }}\n />\n }\n onClick={onLogin}\n style={{\n marginBottom: 8,\n }}\n >\n {item.displayName ??\n (i18n.language === 'zh-CN' ? item.name : item.name_en) ??\n item.provider}\n </Button>\n )\n } else if (shape === 'icon') {\n return isPhoneMedia ? (\n <div className=\"g2-social-login-item\" onClick={onLogin}>\n <IconFont type={`${iconType}-fill`} />\n </div>\n ) : (\n <Tooltip\n key={item.id}\n title={item.tooltip?.[i18n.language as Lang] || item.name}\n trigger={['hover', 'click', 'contextMenu']}\n >\n <div className=\"g2-social-login-item\" onClick={onLogin}>\n <IconFont type={`${iconType}-fill`} />\n </div>\n </Tooltip>\n )\n } else {\n return noLoginMethods ? (\n <Button\n key={item.id}\n block\n size=\"large\"\n className=\"g2-guard-third-login-btn\"\n icon={\n <IconFont\n type={`${iconType}-fill`}\n style={{ fontSize: 20, marginRight: 8 }}\n />\n }\n onClick={onLogin}\n >\n {item.displayName ??\n (i18n.language === 'zh-CN' ? item.name : item.name_en) ??\n item.provider}\n </Button>\n ) : isPhoneMedia ? (\n <div className=\"g2-social-login-item\" onClick={onLogin} key={item.id}>\n <IconFont type={`${iconType}-fill`} />\n </div>\n ) : (\n <Tooltip\n overlayStyle={{ fontFamily: 'sans-serif' }}\n key={item.id}\n title={\n item.displayName ||\n item.tooltip?.[i18n.language as Lang] ||\n item.name\n }\n trigger={['hover', 'click', 'contextMenu']}\n >\n <div className=\"g2-social-login-item\" onClick={onLogin}>\n <IconFont type={`${iconType}-fill`} />\n </div>\n </Tooltip>\n )\n }\n })\n const idp = enterpriseConnectionObjs.length ? (\n <>\n {!noLoginMethods && (\n <div className=\"g2-social-login-title\">\n {i18n.t('login.otherLoginWay')}\n </div>\n )}\n <div className=\"g2-social-login-list\">{idpButtons}</div>\n </>\n ) : null\n\n const socialLogin =\n socialLoginButtons.length > 0 && noLoginMethods ? (\n <Space\n size={noLoginMethods ? 0 : 12}\n className=\"g2-guard-full-width-space no-login-methods\"\n direction=\"vertical\"\n >\n {socialLoginButtons}\n </Space>\n ) : (\n socialLoginButtons.length > 0 && (\n <>\n <div className=\"g2-social-login-title\">\n {t('login.thridAccLogin')}\n </div>\n <div className=\"g2-social-login-list\">{socialLoginButtons}</div>\n </>\n )\n )\n\n return (\n <>\n {!noLoginMethods && (\n <div\n style={{\n flex: 1,\n minHeight: 32,\n }}\n />\n )}\n <Space\n size={noLoginMethods ? 0 : 12}\n direction=\"vertical\"\n className=\"g2-guard-full-width-space\"\n >\n {!publicConfig?.ssoPageComponentDisplay.idpBtns || idp}\n {!publicConfig?.ssoPageComponentDisplay.socialLoginBtns || socialLogin}\n </Space>\n </>\n )\n}\n","import { useGuardHttpClient } from '../../_utils/context'\nimport { AuthingResponse } from '../../_utils/http'\n\n// 处理所有使用 postMessage 方式的登录\nexport const usePostMessage = () => {\n // 借用一下 GuardHttpClient 的方法\n const { responseIntercept } = useGuardHttpClient()\n\n const onMessage = (evt: MessageEvent) => {\n const { message, data, event, code } = evt.data\n\n const { source } = event || {}\n // 社会化登录是用 authing-js-sdk 实现的,不用再在这里回调了\n // if (source === 'authing' && eventType === 'socialLogin') {\n // return\n // }\n\n if (source !== 'authing') {\n return\n }\n\n // 如果直接为 200 代表成功了\n if (code === 200) {\n localStorage.setItem('_authing_token', data?.token)\n return { code, data, onGuardHandling: undefined }\n }\n\n // TODO 完整的登陆信息 在 message 中 以 Json 的形式返回 待优化\n let parsedMessage: any\n try {\n parsedMessage = JSON.parse(message)\n } catch (error) {\n console.error('Json parse error in postMessage')\n console.error(`message: ${message}, code: ${code}`)\n return\n }\n\n const {\n code: authingCode,\n statusCode,\n apiCode,\n message: authingMessage,\n data: authingResData,\n } = parsedMessage\n\n const res = responseIntercept({\n statusCode,\n apiCode,\n data: authingResData,\n message: authingMessage,\n code: authingCode,\n })\n\n if (statusCode === 200) {\n localStorage.setItem('_authing_token', data?.token)\n }\n\n return res\n }\n\n return onMessage\n}\n\nexport const useErrorHandling = () => {\n // 借用一下 GuardHttpClient 的方法\n const { responseIntercept } = useGuardHttpClient()\n\n const errorHandling = (res: AuthingResponse) => {\n const { message } = res\n\n const parsedMsg = JSON.parse(message!)\n\n const {\n code: authingCode,\n statusCode,\n apiCode,\n message: authingMessage,\n data: authingResData,\n } = parsedMsg\n\n const response = responseIntercept({\n statusCode,\n apiCode,\n data: authingResData,\n message: authingMessage,\n code: authingCode,\n })\n\n return response\n }\n\n return errorHandling\n}\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { IconFont } from '../IconFont'\nimport { useGuardPageConfig } from '../_utils/context'\nimport { changeLang } from '../_utils/locales'\n\nexport const ChangeLanguage = (props: any) => {\n const { i18n } = useTranslation()\n\n const guardPageConfig = useGuardPageConfig()\n\n if (\n props.langRange.length <= 1 ||\n !guardPageConfig?.global?.showChangeLanguage\n ) {\n return null\n }\n\n let switchText = 'English'\n if (i18n.language === 'en-US') {\n switchText = '简体中文'\n }\n return (\n <div className=\"g2-change-language-container\">\n <span\n className=\"g2-change-language-button\"\n onClick={() => {\n if (i18n.language === 'zh-CN') {\n props.onLangChange?.('en-US')\n changeLang('en-US')\n } else if (i18n.language === 'en-US') {\n props.onLangChange?.('zh-CN')\n changeLang('zh-CN')\n }\n }}\n >\n <IconFont\n style={{ fontSize: 16 }}\n type={\n i18n.language === 'zh-CN'\n ? 'authing-a-yingwen1'\n : 'authing-zhongwen'\n }\n />\n <span className=\"g2-change-language-text\">{switchText}</span>\n </span>\n </div>\n )\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Form } from 'antd'\nimport { useTranslation } from 'react-i18next'\nimport {\n fieldRequiredRule,\n getUserRegisterParams,\n validate,\n} from '../../../_utils'\nimport SubmitButton from '../../../SubmitButton'\nimport { IconFont } from '../../../IconFont'\nimport { Agreements } from '../../../Register/components/Agreements'\nimport { EmailScene, SceneType } from 'authing-js-sdk'\nimport { SendCodeByPhone } from '../../../SendCode/SendCodeByPhone'\nimport {\n useGuardHttpClient,\n useGuardPublicConfig,\n} from '../../../_utils/context'\nimport { SendCodeByEmail } from '../../../SendCode/SendCodeByEmail'\nimport { FormItemIdentify } from './FormItemIdentify'\nimport { InputIdentify } from './inputIdentify'\nimport './styles.less'\nimport { InputInternationPhone } from './InputInternationPhone'\nimport { defaultAreaCode, parsePhone } from '../../../_utils/hooks'\nimport { InputMethod } from '../../../Type'\nimport { CodeAction } from '../../../_utils/responseManagement/interface'\n\nexport const LoginWithVerifyCode = (props: any) => {\n const config = useGuardPublicConfig()\n\n const {\n agreements,\n methods,\n submitButText,\n onLoginFailed,\n onLoginSuccess,\n } = props\n\n const verifyCodeLength = config?.verifyCodeLength ?? 4\n\n const { post } = useGuardHttpClient()\n\n // 是否开启了国际化短信功能\n const isInternationSms = config?.internationalSmsConfig?.enabled || false\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n\n const [validated, setValidated] = useState(false)\n\n const [identify, setIdentify] = useState('')\n const [currentMethod, setCurrentMethod] = useState<InputMethod>(methods[0])\n // 是否仅开启国际化短信\n const [isOnlyInternationSms, setInternationSms] = useState(false)\n // 区号 默认\n const [areaCode, setAreaCode] = useState(defaultAreaCode)\n\n let [form] = Form.useForm()\n\n let submitButtonRef = useRef<any>(null)\n const { t } = useTranslation()\n\n const SendCode = useCallback(\n (props: any) => {\n if (isOnlyInternationSms) {\n return (\n <SendCodeByPhone\n {...props}\n form={form}\n fieldName=\"identify\"\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n })}\n areaCode={areaCode}\n prefix={\n <IconFont\n type=\"authing-a-shield-check-line1\"\n style={{ color: '#878A95' }}\n />\n }\n isInternationSms={isInternationSms}\n scene={SceneType.SCENE_TYPE_LOGIN}\n maxLength={verifyCodeLength}\n onSendCodeBefore={async () => {\n await form.validateFields(['identify'])\n }}\n />\n )\n }\n\n return (\n <>\n {currentMethod === InputMethod.PhoneCode && (\n <SendCodeByPhone\n {...props}\n isInternationSms={isInternationSms}\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n })}\n areaCode={areaCode}\n prefix={\n <IconFont\n type=\"authing-a-shield-check-line1\"\n style={{ color: '#878A95' }}\n />\n }\n scene={SceneType.SCENE_TYPE_LOGIN}\n maxLength={verifyCodeLength}\n data={identify}\n onSendCodeBefore={async () => {\n await form.validateFields(['identify'])\n }}\n />\n )}\n {currentMethod === InputMethod.EmailCode && (\n <SendCodeByEmail\n {...props}\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n })}\n prefix={\n <IconFont\n type=\"authing-a-shield-check-line1\"\n style={{ color: '#878A95' }}\n />\n }\n scene={EmailScene.VerifyCode}\n maxLength={verifyCodeLength}\n data={identify}\n onSendCodeBefore={async () => {\n await form.validateFields(['identify'])\n }}\n />\n )}\n </>\n )\n },\n [\n areaCode,\n currentMethod,\n form,\n identify,\n isInternationSms,\n isOnlyInternationSms,\n t,\n verifyCodeLength,\n ]\n )\n\n useEffect(() => {\n // 开启国际化配置且登录方式为手机号码时\n if (\n methods.length === 1 &&\n methods[0] === 'phone-code' &&\n config &&\n config.internationalSmsConfig?.enabled\n ) {\n setInternationSms(true)\n }\n }, [config, methods])\n\n const loginByPhoneCode = async (values: any) => {\n const reqContent: any = {\n phone: values.phoneNumber,\n code: values.code,\n customData: getUserRegisterParams(),\n autoRegister: props.autoRegister,\n withCustomData: true,\n }\n\n if (config && config.internationalSmsConfig?.enabled)\n reqContent.phoneCountryCode = values.phoneCountryCode\n\n const { code, data, onGuardHandling } = await post(\n '/api/v2/login/phone-code',\n reqContent\n )\n\n submitButtonRef.current.onSpin(false)\n\n if (code === 200) {\n // props.onLogin(200, data)\n onLoginSuccess(data)\n } else {\n const handMode = onGuardHandling?.()\n // 向上层抛出错误\n handMode === CodeAction.RENDER_MESSAGE && onLoginFailed(code, data)\n }\n }\n\n const loginByEmailCode = async (values: any) => {\n const reqContent = {\n email: values.identify,\n code: values.code,\n customData: getUserRegisterParams(),\n autoRegister: props.autoRegister,\n withCustomData: true,\n }\n const { code, data, onGuardHandling } = await post(\n '/api/v2/login/email-code',\n reqContent\n )\n\n submitButtonRef.current.onSpin(false)\n\n if (code === 200) {\n // props.onLogin(200, data)\n onLoginSuccess(data)\n } else {\n const handMode = onGuardHandling?.()\n // 向上层抛出错误\n handMode === CodeAction.RENDER_MESSAGE && onLoginFailed(code, data)\n }\n }\n\n const onFinish = async (values: any) => {\n setValidated(true)\n if (agreements?.length && !acceptedAgreements) {\n // message.error(t('common.loginProtocolTips'))\n submitButtonRef.current.onError()\n return\n }\n // 解析手机号码 ==> 输出 phoenNumber 和 phoneCountryCode\n const { phoneNumber, countryCode: phoneCountryCode } = parsePhone(\n isInternationSms,\n values.identify,\n areaCode\n )\n // onBeforeLogin\n submitButtonRef.current.onSpin(true)\n\n let loginInfo = {\n type: currentMethod,\n data: {\n identity: phoneNumber,\n code: values.code,\n phoneCountryCode,\n },\n }\n\n let context = await props.onBeforeLogin?.(loginInfo)\n\n if (!context && !!props.onBeforeLogin) {\n submitButtonRef.current.onSpin(false)\n return\n }\n // 身份源绑定\n if (!!props.onLoginRequest) {\n const res = await props.onLoginRequest?.(loginInfo)\n const { code, data, onGuardHandling } = res\n\n submitButtonRef?.current.onSpin(false)\n\n if (code === 200) {\n onLoginSuccess(data)\n } else {\n const handMode = onGuardHandling?.()\n // 向上层抛出错误 执行绑定失败钩子\n handMode === CodeAction.RENDER_MESSAGE && onLoginFailed(code, data)\n }\n return\n }\n\n if (currentMethod === 'phone-code') {\n await loginByPhoneCode({ ...values, phoneNumber, phoneCountryCode })\n } else {\n await loginByEmailCode(values)\n }\n }\n\n const submitText = useMemo(() => {\n if (submitButText) return submitButText\n\n return props.autoRegister\n ? `${t('common.login')} / ${t('common.register')}`\n : t('common.login')\n }, [props.autoRegister, submitButText, t])\n // 为了 refresh input\n const AreaCodePhoneAccount = useCallback(\n (props) => {\n return (\n <InputInternationPhone\n {...props}\n className=\"authing-g2-input\"\n size=\"large\"\n areaCode={areaCode}\n onAreaCodeChange={(value: string) => {\n setAreaCode(value)\n form.getFieldValue(['identify']) &&\n form.validateFields(['identify'])\n }}\n />\n )\n },\n [areaCode, form]\n )\n return (\n <div className=\"authing-g2-login-phone-code\">\n <Form\n name=\"phoneCode\"\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n autoComplete=\"off\"\n >\n <FormItemIdentify\n name=\"identify\"\n className={\n isOnlyInternationSms\n ? 'authing-g2-input-form remove-padding'\n : 'authing-g2-input-form'\n }\n methods={methods}\n currentMethod={currentMethod}\n areaCode={areaCode}\n >\n {isOnlyInternationSms ? (\n <AreaCodePhoneAccount />\n ) : (\n <InputIdentify\n className=\"authing-g2-input\"\n size=\"large\"\n value={identify}\n methods={methods}\n onChange={(e) => {\n let v = e.target.value\n setIdentify(v)\n if (validate('email', v)) {\n setCurrentMethod(InputMethod.EmailCode)\n } else {\n // 放开手机号校验 方便同时开启邮箱和短信国际化手机号通过\n setCurrentMethod(InputMethod.PhoneCode)\n }\n }}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n )}\n </FormItemIdentify>\n\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"code\"\n rules={[...fieldRequiredRule(t('common.captchaCode'))]}\n >\n <SendCode />\n </Form.Item>\n {Boolean(agreements?.length) && (\n <Agreements\n onChange={setAcceptedAgreements}\n agreements={agreements}\n showError={validated}\n />\n )}\n <Form.Item>\n <SubmitButton\n text={submitText}\n className=\"password\"\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { message, Popover, Tabs, Tooltip } from 'antd'\nimport intersection from 'lodash/intersection'\n\nimport { LoginWithPassword } from './core/withPassword/index'\nimport { LoginWithLDAP } from './core/withLDAP'\nimport { LoginWithAD } from './core/withAD'\nimport { LoginWithAppQrcode } from './core/withAppQrcode'\nimport { LoginWithWechatMiniQrcode } from './core/withWechatMiniQrcode'\nimport { LoginWithWechatmpQrcode } from './core/withWechatmpQrcode'\nimport { codeMap } from './codemap'\nimport { SocialLogin } from './socialLogin'\n\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { GuardModuleType } from '../Guard/module'\nimport { LoginMethods } from '../AuthingGuard/types'\nimport { IconFont } from '../IconFont'\nimport { ChangeLanguage } from '../ChangeLanguage'\nimport { i18n } from '../_utils/locales'\n\nimport './styles.less'\nimport {\n useGuardAppId,\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport { isWeChatBrowser } from '../_utils'\nimport { LoginWithVerifyCode } from './core/withVerifyCode'\nimport { VerifyLoginMethods } from '../AuthingGuard/api'\nimport { useMediaSize, useMethod } from '../_utils/hooks'\nimport { GuardPageSene } from '../Type'\n\nconst inputWays = [\n LoginMethods.Password,\n LoginMethods.PhoneCode,\n LoginMethods.AD,\n LoginMethods.LDAP,\n]\nconst qrcodeWays = [\n LoginMethods.AppQr,\n LoginMethods.WxMinQr,\n LoginMethods.WechatMpQrcode,\n]\n\nconst useMethods = (config: any) => {\n let dlm = config?.defaultLoginMethod\n let propsMethods = config?.loginMethods\n if (!propsMethods?.includes(dlm)) {\n dlm = propsMethods?.[0]\n }\n\n let renderInputWay = intersection(propsMethods, inputWays).length > 0\n let renderQrcodeWay = intersection(propsMethods, qrcodeWays).length > 0\n return [dlm, renderInputWay, renderQrcodeWay]\n}\n\nconst useDisables = (data: any) => {\n let { disableResetPwd, disableRegister } = data.config\n let { loginWay, autoRegister } = data\n\n if (loginWay === LoginMethods.PhoneCode) {\n disableResetPwd = true\n }\n if (loginWay === LoginMethods.LDAP) {\n disableResetPwd = true\n disableRegister = true\n }\n if (loginWay === LoginMethods.AD) {\n disableResetPwd = true\n disableRegister = true\n }\n if (autoRegister === true) {\n disableRegister = true\n }\n return { disableResetPwd, disableRegister }\n}\n\nconst useSwitchStates = (loginWay: LoginMethods) => {\n let switchText = i18n.t('login.scanLogin')\n if (qrcodeWays.includes(loginWay)) {\n switchText = i18n.t('login.moreWays')\n }\n let inputNone = !inputWays.includes(loginWay) ? 'none' : ''\n let qrcodeNone = !qrcodeWays.includes(loginWay) ? 'none' : ''\n\n return { switchText, inputNone, qrcodeNone }\n}\nexport const GuardLoginView = () => {\n // const { config } = props\n\n const config = useGuardFinallyConfig()\n\n const appId = useGuardAppId()\n\n const { changeModule } = useGuardModule()\n\n const events = useGuardEvents()\n\n const publicConfig = useGuardPublicConfig()\n\n let [defaultMethod, renderInputWay, renderQrcodeWay] = useMethods(config)\n const agreementEnabled = config?.agreementEnabled\n\n const { t } = useTranslation()\n\n const [loginWay, setLoginWay] = useState(defaultMethod)\n\n const [canLoop, setCanLoop] = useState(false) // 允许轮询\n\n const client = useGuardAuthClient()\n\n const qrcodeTabsSettings = publicConfig?.qrcodeTabsSettings\n\n const [errorNumber, setErrorNumber] = useState(0)\n\n const [accountLock, setAccountLock] = useState(false)\n\n let publicKey = config?.publicKey!\n\n // let autoRegister = props.config?.autoRegister\n let ms = config?.loginMethods\n\n const firstInputWay = inputWays.filter((way) => ms?.includes(way))[0]\n\n const firstQRcodeWay = qrcodeWays.filter((way) => ms?.includes(way))[0]\n\n let { disableResetPwd, disableRegister } = useDisables({\n config: config,\n loginWay,\n autoRegister: config?.autoRegister,\n })\n\n const verifyCodeLogin = useMemo(() => {\n const methods = publicConfig?.verifyCodeTabConfig?.enabledLoginMethods ?? [\n 'phone-code',\n ]\n\n if (methods.length === 1 && methods[0] === 'phone-code') {\n return t('common.phoneVerifyCode')\n } else if (methods.length === 1 && methods[0] === 'email-code') {\n return t('common.emailVerifyCode')\n }\n\n return t('common.verifyCodeLogin')\n }, [publicConfig, t])\n\n const hiddenTab = useMemo(() => {\n const scanLogins = ms ?? [].filter((method) => qrcodeWays.includes(method)) //取到扫码登录类型\n if (scanLogins.length > 1) {\n // 如果有两个以上的code 类型\n return false\n } else if (!scanLogins.includes(LoginMethods.AppQr)) {\n // 如果只有一个且那一个还不是 app 类型\n if (\n qrcodeTabsSettings &&\n (qrcodeTabsSettings?.[LoginMethods.WechatMpQrcode].length > 1 ||\n qrcodeTabsSettings?.[LoginMethods.WxMinQr].length > 1)\n ) {\n return false\n } else {\n return true\n }\n } else {\n return true\n }\n }, [ms, qrcodeTabsSettings])\n\n const defaultQrCodeWay = useMemo(() => {\n if (\n [LoginMethods.WechatMpQrcode, LoginMethods.WxMinQr].includes(\n defaultMethod\n )\n ) {\n const id = qrcodeTabsSettings?.[defaultMethod as LoginMethods]?.find(\n (i: { id: string; title: string; isDefault?: boolean | undefined }) =>\n i.isDefault\n )?.id\n return defaultMethod + id\n } else {\n return defaultMethod\n }\n }, [defaultMethod, qrcodeTabsSettings])\n\n const onLoginSuccess = (data: any, message?: string) => {\n // data._message = message\n events?.onLogin?.(data, client)\n }\n\n const onLoginFailed = (code: number, data: any, message?: string) => {\n // TODO 与拦截器中 render-message 同步\n const action = codeMap[code]\n if (action?.action === 'message') {\n setErrorNumber(errorNumber + 1)\n }\n\n if (action?.action === 'accountLock') {\n setAccountLock(true)\n }\n\n events?.onLoginError?.({\n code,\n data,\n message,\n })\n }\n\n const onBeforeLogin = (loginInfo: any) => {\n if (events?.onBeforeLogin) {\n return events?.onBeforeLogin?.(loginInfo, client)\n }\n return () => console.log('Guard not onBeforeLogin hooks')\n }\n\n useEffect(() => {\n if (qrcodeWays.includes(loginWay)) {\n setCanLoop(true)\n } else {\n setCanLoop(false)\n }\n // 可以设定 = fasle 的时候关闭 qrcode 的几个定时器\n // 不关的话,第二次进入会更快,也没什么代价(只有轮询)\n }, [loginWay])\n\n let { switchText, inputNone, qrcodeNone } = useSwitchStates(loginWay)\n //availableAt 0或者null-注册时,1-登录时,2-注册和登录时 注册登录合并时应该登录注册协议全部显示\n const agreements = useMemo(\n () =>\n agreementEnabled\n ? config?.agreements?.filter(\n (agree) =>\n agree.lang === i18n.language &&\n (config?.autoRegister || !!agree?.availableAt)\n ) ?? []\n : [],\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [agreementEnabled, config?.autoRegister, config?.agreements, i18n.language]\n )\n\n const verifyLoginMethods = useMemo<VerifyLoginMethods[]>(\n () =>\n publicConfig?.verifyCodeTabConfig?.enabledLoginMethods ?? ['phone-code'],\n\n [publicConfig?.verifyCodeTabConfig?.enabledLoginMethods]\n )\n\n const [\n socialConnectionObjs,\n enterpriseConnectionObjs,\n isNoMethod,\n ] = useMethod({ config, publicConfig })\n\n const noLoginMethods = !config?.loginMethods?.length\n\n const { isPhoneMedia } = useMediaSize()\n\n // 渲染前执行\n useLayoutEffect(() => {\n if (noLoginMethods && !isPhoneMedia) {\n // pc 下\n const containerDOM = document.getElementsByClassName(\n 'g2-view-container'\n )?.[0]\n\n if (containerDOM) {\n // @ts-ignore\n containerDOM.style['min-height'] = '456px'\n containerDOM.classList.add('no-login-methods-view')\n return () => {\n // @ts-ignore\n containerDOM.style['min-height'] = '610px'\n containerDOM.classList.remove('no-login-methods-view')\n }\n }\n }\n }, [isPhoneMedia, noLoginMethods])\n\n useEffect(() => {\n const containerDOM = document.getElementsByClassName('g2-view-header')?.[0]\n const innerContainer = document.querySelector(\n '.g2-view-login>.g2-view-container-inner'\n )\n if (isPhoneMedia && noLoginMethods) {\n if (containerDOM) {\n containerDOM.classList.add('g2-view-header-mobile')\n }\n if (innerContainer) {\n innerContainer.classList.add('g2-view-login-mobile-inner')\n }\n } else {\n containerDOM?.classList.remove('g2-view-header-mobile')\n innerContainer?.classList.remove('g2-view-login-mobile-inner')\n }\n return () => {\n containerDOM?.classList.remove('g2-view-header-mobile')\n innerContainer?.classList.remove('g2-view-login-mobile-inner')\n }\n }, [isPhoneMedia, noLoginMethods])\n\n return (\n <div className=\"g2-view-container g2-view-login\">\n <div className=\"g2-view-container-inner\">\n {isNoMethod ? (\n <>\n <div className=\"g2-view-header\">\n <img src={config?.logo} alt=\"\" className=\"icon\" />\n <div className=\"title\">{config?.title}</div>\n {!!publicConfig?.welcomeMessage && (\n <div className=\"title-description\">\n {publicConfig?.welcomeMessage[i18n.language]}\n </div>\n )}\n </div>\n <div className=\"no-login-methods-view\">\n <IconFont\n type=\"authing-bianzu\"\n style={{ width: 178, height: 120 }}\n />\n <span className=\"no-login-methods-desc\">\n {t('login.noLoginMethodsDesc')}\n </span>\n </div>\n </>\n ) : (\n <>\n {/* 两种方式都需要渲染的时候,才出现切换按钮 */}\n {renderInputWay && renderQrcodeWay && (\n <div className=\"g2-qrcode-switch\">\n {/* <div className=\"switch-text\">{switchText}</div> */}\n <Popover\n placement=\"leftTop\"\n content={switchText}\n overlayClassName=\"switch-text\"\n getPopupContainer={(node: any) => {\n if (node) {\n return node.parentElement\n }\n return document.body\n }}\n >\n <div\n className=\"switch-img\"\n onClick={() => {\n message.destroy()\n if (inputWays.includes(loginWay)) {\n setLoginWay(firstQRcodeWay)\n } else if (qrcodeWays.includes(loginWay)) {\n setLoginWay(firstInputWay)\n }\n }}\n >\n <div className=\"imgae-mask\" />\n <IconFont\n type=\"authing-a-erweima22\"\n className={`qrcode-switch-image ${inputNone}`}\n />\n <IconFont\n type=\"authing-diannao\"\n className={`qrcode-switch-image ${qrcodeNone}`}\n />\n </div>\n </Popover>\n </div>\n )}\n\n <div className=\"g2-view-header\">\n <img src={config?.logo} alt=\"\" className=\"icon\" />\n <div className=\"title\">{config?.title}</div>\n {!!publicConfig?.welcomeMessage && (\n <div className=\"title-description\">\n {publicConfig?.welcomeMessage[i18n.language]}\n </div>\n )}\n </div>\n\n {renderInputWay && (\n <div className={inputNone}>\n <div className={`g2-view-tabs`}>\n <Tabs\n onChange={(k: any) => {\n setLoginWay(k)\n message.destroy()\n events?.onLoginTabChange?.(k)\n }}\n activeKey={loginWay}\n >\n {ms?.includes(LoginMethods.Password) && (\n <Tabs.TabPane\n key={LoginMethods.Password}\n tab={t('login.pwdLogin')}\n >\n <LoginWithPassword\n loginWay={loginWay}\n publicKey={publicKey}\n autoRegister={config?.autoRegister}\n host={config?.host}\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n onBeforeLogin={onBeforeLogin}\n passwordLoginMethods={\n config?.passwordLoginMethods ?? []\n }\n agreements={agreements}\n />\n </Tabs.TabPane>\n )}\n {ms?.includes(LoginMethods.PhoneCode) && (\n <Tabs.TabPane\n key={LoginMethods.PhoneCode}\n tab={verifyCodeLogin}\n >\n <LoginWithVerifyCode\n verifyCodeLength={publicConfig?.verifyCodeLength}\n autoRegister={config?.autoRegister}\n onBeforeLogin={onBeforeLogin}\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n agreements={agreements}\n methods={verifyLoginMethods}\n />\n </Tabs.TabPane>\n )}\n {ms?.includes(LoginMethods.LDAP) && (\n <Tabs.TabPane\n key={LoginMethods.LDAP}\n tab={t('login.ldapLogin')}\n >\n <LoginWithLDAP\n publicKey={publicKey}\n autoRegister={config?.autoRegister}\n host={config?.host}\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n onBeforeLogin={onBeforeLogin}\n agreements={agreements}\n />\n </Tabs.TabPane>\n )}\n {ms?.includes(LoginMethods.AD) && (\n <Tabs.TabPane\n key={LoginMethods.AD}\n tab={t('login.adLogin')}\n >\n <LoginWithAD\n publicKey={publicKey}\n autoRegister={config?.autoRegister}\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n onBeforeLogin={onBeforeLogin}\n agreements={agreements}\n />\n </Tabs.TabPane>\n )}\n </Tabs>\n </div>\n <div className={`g2-tips-line`}>\n {!disableResetPwd && (\n <div>\n <span\n className=\"link-like forget-password-link\"\n onClick={() =>\n changeModule?.(GuardModuleType.FORGET_PWD, {})\n }\n >\n {t('login.forgetPwd')}\n </span>\n {(errorNumber >= 2 || accountLock) && (\n <span style={{ margin: '0 4px', color: '#EAEBEE' }}>\n 丨\n </span>\n )}\n </div>\n )}\n {(errorNumber >= 2 || accountLock) && (\n <Tooltip title={t('common.feedback')}>\n <div\n className=\"touch-tip question-feedback\"\n onClick={() =>\n changeModule?.(GuardModuleType.ANY_QUESTIONS, {})\n }\n >\n <IconFont\n type={'authing-a-question-line1'}\n style={{ fontSize: 16 }}\n />\n </div>\n </Tooltip>\n )}\n\n {!disableRegister && (\n <span className=\"go-to-register\">\n {/* <span className=\"gray\">{t('common.noAccYet')}</span> */}\n <span\n className=\"link-like register-link\"\n onClick={() =>\n changeModule?.(GuardModuleType.REGISTER, {})\n }\n >\n {t('common.registerImmediate')}\n </span>\n </span>\n )}\n </div>\n </div>\n )}\n {renderQrcodeWay && (\n <div\n className={`g2-view-tabs ${qrcodeNone} ${\n hiddenTab && 'hidden'\n }`}\n >\n <Tabs\n destroyInactiveTabPane={true}\n onChange={(k: any) => {\n message.destroy()\n events?.onLoginTabChange?.(k)\n }}\n defaultActiveKey={defaultQrCodeWay}\n >\n {ms?.includes(LoginMethods.WxMinQr) &&\n qrcodeTabsSettings?.[LoginMethods.WxMinQr].map(\n (item: any) => (\n <Tabs.TabPane\n key={LoginMethods.WxMinQr + item.id}\n tab={item.title ?? t('login.scanLogin')}\n >\n <LoginWithWechatMiniQrcode\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n canLoop={canLoop}\n qrCodeScanOptions={{\n ...config?.qrCodeScanOptions,\n extIdpConnId: item.id,\n tips: {\n title:\n i18n.language === 'zh-CN'\n ? '使用 微信 扫码登录'\n : `Use WeChat to scan and login`,\n expired: t('login.qrcodeExpired'),\n },\n }}\n />\n </Tabs.TabPane>\n )\n )}\n {ms?.includes(LoginMethods.AppQr) && (\n <Tabs.TabPane\n key={LoginMethods.AppQr}\n tab={t('login.appScanLogin')}\n >\n <LoginWithAppQrcode\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n canLoop={canLoop}\n qrCodeScanOptions={{\n ...config?.qrCodeScanOptions,\n tips: {\n title:\n i18n.language === 'zh-CN'\n ? '使用 APP 扫码登录'\n : `Use APP to scan and login`,\n expired: t('login.qrcodeExpired'),\n },\n }}\n />\n </Tabs.TabPane>\n )}\n {ms?.includes(LoginMethods.WechatMpQrcode) &&\n qrcodeTabsSettings?.[LoginMethods.WechatMpQrcode].map(\n (item) => (\n <Tabs.TabPane\n key={LoginMethods.WechatMpQrcode + item.id}\n tab={item.title ?? t('login.wechatmpQrcode')}\n >\n <LoginWithWechatmpQrcode\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n canLoop={canLoop}\n qrCodeScanOptions={{\n ...config?.qrCodeScanOptions,\n extIdpConnId: item.id,\n tips: {\n title:\n i18n.language === 'zh-CN'\n ? `${\n isWeChatBrowser() ? '长按' : '扫码'\n }关注 ${item.title} 微信公众号登录`\n : `${\n isWeChatBrowser() ? 'Press' : 'Scan'\n } to follow ${item.title} and login`,\n expired: t('login.qrcodeExpired'),\n },\n }}\n />\n </Tabs.TabPane>\n )\n )}\n </Tabs>\n </div>\n )}\n <div className=\"g2-social-login\">\n <SocialLogin\n appId={appId}\n config={config!}\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n socialConnectionObjs={socialConnectionObjs}\n enterpriseConnectionObjs={enterpriseConnectionObjs}\n />\n </div>\n </>\n )}\n </div>\n <ChangeLanguage\n langRange={config?.langRange}\n onLangChange={events?.onLangChange}\n />\n </div>\n )\n}\n","import { FacePlugin } from './interface'\n\nlet facePluginInstance: FacePlugin\n\nexport const getFacePlugin = () => {\n if (!facePluginInstance) {\n throw new Error('facePlugin is not initialized')\n }\n\n return facePluginInstance\n}\n\nexport const initFacePlugin = (facePlugin: FacePlugin) => {\n facePluginInstance = facePlugin\n\n return facePluginInstance\n}\n","enum FaceErrorName {\n NotAllowedError = 'NotAllowedError',\n AbortError = 'AbortError',\n NotReadableError = 'NotReadableError',\n OverconstrainedError = 'OverconstrainedError',\n SecurityError = 'SecurityError',\n}\nexport interface FaceErrorMessage extends DOMException {\n name: FaceErrorName\n}\nexport const faceErrorMessage = (error: FaceErrorMessage) => {\n let message: string = ''\n switch (error.name) {\n case FaceErrorName.NotAllowedError:\n message = 'login.AuthorizationCamera'\n break\n case FaceErrorName.SecurityError:\n message = 'login.checkPreferences'\n break\n case FaceErrorName.OverconstrainedError:\n message = 'login.requireError'\n break\n default:\n message = 'login.hardwareSupport'\n }\n return message\n}\n","import { Input, message, message as Message } from 'antd'\nimport { Form } from 'antd'\nimport { EmailScene } from 'authing-js-sdk'\nimport React, { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { VerifyCodeInput } from '../VerifyCodeInput'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { SendCodeBtn } from '../../SendCode/SendCodeBtn'\nimport SubmitButton from '../../SubmitButton'\nimport CustomFormItem from '../../ValidatorRules'\nimport { MFAConfig } from '../interface'\nimport { VerifyCodeFormItem } from '../VerifyCodeInput/VerifyCodeFormItem'\nimport { IconFont } from '../../IconFont'\nimport { mailDesensitization } from '../../_utils'\nimport { useGuardPublicConfig } from '../../_utils/context'\nimport { MfaBusinessAction, useMfaBusinessRequest } from '../businessRequest'\n\ninterface BindMFAEmailProps {\n mfaToken: string\n onBind: (email: string) => void\n config: any\n}\nexport const BindMFAEmail: React.FC<BindMFAEmailProps> = ({\n mfaToken,\n onBind,\n config,\n}) => {\n const submitButtonRef = useRef<any>(null)\n\n const { t } = useTranslation()\n\n const [form] = Form.useForm()\n\n const onFinish = async ({ email }: any) => {\n submitButtonRef.current?.onSpin(true)\n await form.validateFields()\n try {\n onBind(email)\n } catch (e: any) {\n const error = JSON.parse(e?.message)\n submitButtonRef.current.onError()\n Message.error(error.message)\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n }\n return (\n <>\n <p className=\"authing-g2-mfa-title\">{t('common.bindEmail')}</p>\n <p className=\"authing-g2-mfa-tips\">{t('common.bindEmailDoc')}</p>\n <Form\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n >\n <CustomFormItem.Email\n className=\"authing-g2-input-form\"\n name=\"email\"\n form={form}\n checkRepeat={true}\n required={true}\n >\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('login.inputEmail')}\n prefix={\n <IconFont\n type=\"authing-a-mail-line3\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </CustomFormItem.Email>\n\n <SubmitButton text={t('common.sure')} ref={submitButtonRef} />\n </Form>\n </>\n )\n}\n\ninterface VerifyMFAEmailProps {\n email: string\n mfaToken: string\n onVerify: (code: number, data: any) => void\n sendCodeRef: React.RefObject<HTMLButtonElement>\n codeLength: number\n}\n\nexport const VerifyMFAEmail: React.FC<VerifyMFAEmailProps> = ({\n email,\n mfaToken,\n onVerify,\n sendCodeRef,\n codeLength,\n}) => {\n const authClient = useGuardAuthClient()\n\n const businessRequest = useMfaBusinessRequest()[MfaBusinessAction.VerifyEmail]\n\n const submitButtonRef = useRef<any>(null)\n\n const { t } = useTranslation()\n\n const [form] = Form.useForm()\n\n const [sent, setSent] = useState(false)\n\n const sendVerifyCode = async () => {\n try {\n await authClient.sendEmail(email!, EmailScene.MfaVerify)\n setSent(true)\n return true\n } catch (e: any) {\n if (e.code === 'ECONNABORTED') {\n message.error(t('login.sendCodeTimeout'))\n return false\n }\n const errorMessage = JSON.parse(e.message)\n message.error(errorMessage.message)\n return false\n }\n }\n\n const onFinish = async (values: any) => {\n submitButtonRef.current?.onSpin(true)\n const mfaCode = form.getFieldValue('mfaCode')\n\n const requestData = {\n mfaToken,\n email: email!,\n code: mfaCode.join(''),\n }\n\n const { isFlowEnd, data, onGuardHandling } = await businessRequest(\n requestData\n )\n\n submitButtonRef.current?.onSpin(false)\n\n if (isFlowEnd) {\n onVerify(200, data)\n } else {\n submitButtonRef.current?.onError()\n onGuardHandling?.()\n }\n }\n\n return (\n <>\n <p className=\"authing-g2-mfa-title\">{t('login.inputEmailCode')}</p>\n <p className=\"authing-g2-mfa-tips\">\n {sent\n ? `${t('login.verifyCodeSended')} ${mailDesensitization(email)}`\n : ''}\n </p>\n <Form\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current?.onError()}\n >\n <VerifyCodeFormItem\n codeLength={codeLength}\n ruleKeyword={t('common.captchaCode')}\n >\n <VerifyCodeInput length={codeLength} onFinish={onFinish} />\n </VerifyCodeFormItem>\n\n <SendCodeBtn\n btnRef={sendCodeRef}\n setSent={setSent}\n beforeSend={() => sendVerifyCode()}\n type=\"link\"\n />\n\n <SubmitButton\n text={t('common.sure')}\n ref={submitButtonRef}\n className=\"g2-mfa-submit-button\"\n />\n </Form>\n </>\n )\n}\n\nexport const MFAEmail: React.FC<{\n mfaToken: string\n email?: string\n mfaLogin: any\n config: MFAConfig\n}> = ({ email: userEmail, mfaToken, mfaLogin, config }) => {\n const [email, setEmail] = useState(userEmail)\n const sendCodeRef = useRef<HTMLButtonElement>(null)\n\n const publicConfig = useGuardPublicConfig()\n\n const codeLength = publicConfig?.verifyCodeLength\n\n return (\n <>\n {email ? (\n <VerifyMFAEmail\n mfaToken={mfaToken}\n email={email}\n onVerify={(code, data) => {\n mfaLogin(code, data)\n }}\n sendCodeRef={sendCodeRef}\n codeLength={codeLength ?? 4}\n />\n ) : (\n <BindMFAEmail\n config={config}\n mfaToken={mfaToken}\n onBind={(email: string) => {\n setEmail(email)\n sendCodeRef.current?.click()\n }}\n />\n )}\n </>\n )\n}\n","import { message } from 'antd'\nimport { Form } from 'antd'\nimport { SceneType } from 'authing-js-sdk'\nimport React, { useCallback, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { VerifyCodeInput } from '../VerifyCodeInput'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { SendCodeBtn } from '../../SendCode/SendCodeBtn'\nimport SubmitButton from '../../SubmitButton'\nimport CustomFormItem from '../../ValidatorRules'\nimport { VerifyCodeFormItem } from '../VerifyCodeInput/VerifyCodeFormItem'\nimport { GuardMFAInitData, MFAConfig } from '../interface'\nimport { InputNumber } from '../../InputNumber'\nimport { IconFont } from '../../IconFont'\nimport { phoneDesensitization } from '../../_utils'\nimport { useGuardPublicConfig } from '../../_utils/context'\nimport { useMfaBusinessRequest, MfaBusinessAction } from '../businessRequest'\nimport { InputInternationPhone } from '../../Login/core/withVerifyCode/InputInternationPhone'\nimport { defaultAreaCode, parsePhone } from '../../_utils/hooks'\nexport interface BindMFASmsProps {\n mfaToken: string\n onBind: (phone: string) => void\n config: any\n areaCode: string\n setAreaCode: (areaCode: string) => void\n isInternationSms: boolean\n}\n\nexport const BindMFASms: React.FC<BindMFASmsProps> = ({\n mfaToken,\n onBind,\n config,\n areaCode,\n setAreaCode,\n isInternationSms,\n}) => {\n const submitButtonRef = useRef<any>(null)\n const { t } = useTranslation()\n const [form] = Form.useForm()\n\n const onFinish = async ({ phone }: any) => {\n submitButtonRef.current.onSpin(true)\n await form.validateFields()\n try {\n onBind(phone)\n } catch (e) {\n // do nothing\n submitButtonRef.current?.onError()\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n }\n\n const PhoneAccount = useCallback(\n (props) => {\n if (isInternationSms) {\n return (\n <InputInternationPhone\n {...props}\n className=\"authing-g2-input\"\n size=\"large\"\n areaCode={areaCode}\n onAreaCodeChange={(value: string) => {\n setAreaCode(value)\n form.getFieldValue(['phone']) && form.validateFields(['phone'])\n }}\n />\n )\n } else {\n return (\n <InputNumber\n {...props}\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('login.inputPhone')}\n prefix={\n <IconFont\n type=\"authing-a-smartphone-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n )\n }\n },\n [areaCode, form, isInternationSms, setAreaCode, t]\n )\n return (\n <>\n <h3 className=\"authing-g2-mfa-title\">{t('common.bindPhone')}</h3>\n <p className=\"authing-g2-mfa-tips\">{t('login.bindPhoneInfo')}</p>\n <Form\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n >\n <CustomFormItem.Phone\n className={\n isInternationSms\n ? 'authing-g2-input-form remove-padding'\n : 'authing-g2-input-form'\n }\n name=\"phone\"\n form={form}\n checkRepeat={true}\n required={true}\n areaCode={areaCode}\n >\n <PhoneAccount />\n </CustomFormItem.Phone>\n <SubmitButton text={t('common.sure')} ref={submitButtonRef} />\n </Form>\n </>\n )\n}\n\nexport interface VerifyMFASmsProps {\n mfaToken: string\n phone: string\n onVerify: (code: number, data: any) => void\n sendCodeRef: React.RefObject<HTMLButtonElement>\n codeLength: number\n areaCode: string //绑定选择的\n phoneCountryCode?: string //后端返回的国家区号\n isInternationSms: boolean\n userPhone?: string\n}\n\nexport const VerifyMFASms: React.FC<VerifyMFASmsProps> = ({\n mfaToken,\n phone,\n userPhone,\n onVerify,\n sendCodeRef,\n codeLength = 4,\n areaCode,\n phoneCountryCode,\n isInternationSms,\n}) => {\n const authClient = useGuardAuthClient()\n\n const submitButtonRef = useRef<any>(null)\n\n const { t } = useTranslation()\n\n const [form] = Form.useForm()\n\n const [sent, setSent] = useState<boolean>(false)\n\n const { phoneNumber, countryCode } = parsePhone(\n isInternationSms,\n phone,\n areaCode\n )\n\n const businessRequest = useMfaBusinessRequest()[MfaBusinessAction.VerifySms]\n\n const onFinish = async (values: any) => {\n submitButtonRef.current.onSpin(true)\n const mfaCode = form.getFieldValue('mfaCode')\n\n const requestData: any = {\n mfaToken,\n phone: phone!,\n code: mfaCode.join(''),\n phoneCountryCode: phoneCountryCode ? phoneCountryCode : countryCode,\n }\n\n const { isFlowEnd, data, onGuardHandling } = await businessRequest(\n requestData\n )\n\n submitButtonRef.current?.onSpin(false)\n\n if (isFlowEnd) {\n onVerify(200, data)\n } else {\n submitButtonRef.current.onError()\n onGuardHandling?.()\n }\n }\n\n const tips = useMemo(\n () =>\n sent\n ? `${t('login.verifyCodeSended')} ${\n isInternationSms\n ? phoneCountryCode\n ? phoneCountryCode\n : countryCode\n : ''\n } ${phoneDesensitization(phone)}`\n : '',\n [countryCode, isInternationSms, phone, phoneCountryCode, sent, t]\n )\n\n const sendVerifyCode = async () => {\n try {\n await authClient.sendSmsCode(\n userPhone ? userPhone : phoneNumber,\n phoneCountryCode ? phoneCountryCode : countryCode,\n SceneType.SCENE_TYPE_MFA_VERIFY\n )\n return true\n } catch (e: any) {\n if (e.code === 'ECONNABORTED') {\n message.error(t('login.sendCodeTimeout'))\n return false\n }\n const errorMessage = JSON.parse(e.message)\n message.error(errorMessage.message)\n return false\n }\n }\n\n return (\n <>\n <h3 className=\"authing-g2-mfa-title\">{t('login.inputPhoneCode')}</h3>\n <p className=\"authing-g2-mfa-tips\">{tips}</p>\n <Form\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n >\n <VerifyCodeFormItem\n codeLength={codeLength}\n ruleKeyword={t('common.captchaCode')}\n >\n <VerifyCodeInput length={codeLength} onFinish={onFinish} />\n </VerifyCodeFormItem>\n\n <SendCodeBtn\n btnRef={sendCodeRef}\n beforeSend={() => sendVerifyCode()}\n type=\"link\"\n setSent={setSent}\n />\n\n <SubmitButton\n text={t('common.sure')}\n ref={submitButtonRef}\n className=\"g2-mfa-submit-button\"\n />\n </Form>\n </>\n )\n}\n\nexport const MFASms: React.FC<{\n // mfaToken: string\n // phone?: string\n mfaLogin: any\n config: MFAConfig\n initData: GuardMFAInitData\n}> = ({\n mfaLogin,\n config,\n initData: { phone: userPhone, mfaToken, phoneCountryCode },\n}) => {\n const [phone, setPhone] = useState(userPhone)\n\n const sendCodeRef = useRef<HTMLButtonElement>(null)\n\n const publicConfig = useGuardPublicConfig()\n\n const codeLength = publicConfig?.verifyCodeLength\n const [areaCode, setAreaCode] = useState(defaultAreaCode)\n\n const isInternationSms = Boolean(\n publicConfig?.internationalSmsConfig?.enabled\n )\n // todo 后续改 不用 phone 作为判断模式\n return (\n <>\n {phone ? (\n <VerifyMFASms\n mfaToken={mfaToken}\n phone={phone}\n userPhone={userPhone}\n phoneCountryCode={phoneCountryCode}\n isInternationSms={isInternationSms}\n onVerify={(code, data) => {\n mfaLogin(code, data)\n }}\n codeLength={codeLength ?? 4}\n sendCodeRef={sendCodeRef}\n areaCode={areaCode}\n />\n ) : (\n <BindMFASms\n config={config}\n mfaToken={mfaToken}\n areaCode={areaCode}\n setAreaCode={setAreaCode}\n isInternationSms={isInternationSms}\n onBind={(phone: string) => {\n setPhone(phone)\n sendCodeRef.current?.click()\n }}\n />\n )}\n </>\n )\n}\n","import { getFacePlugin } from '../../_utils/facePlugin'\n\nlet inputSize = 512\nlet scoreThreshold = 0.5\n\nexport const devicesConstraints = {\n video: {\n width: 210,\n height: 210,\n },\n}\nexport const FACE_SCORE = 0.65\n\nexport function getFaceDetectorOptions() {\n const { TinyFaceDetectorOptions } = getFacePlugin()\n return new TinyFaceDetectorOptions({ inputSize, scoreThreshold })\n}\n\nexport function getCurrentFaceDetectionNet() {\n const { nets } = getFacePlugin()\n\n return nets.tinyFaceDetector\n}\n\nexport function isFaceDetectionModelLoaded() {\n return !!getCurrentFaceDetectionNet().params\n}\n\nexport function dataURItoBlob(base64Data: any) {\n var byteString\n if (base64Data.split(',')[0].indexOf('base64') >= 0)\n byteString = atob(base64Data.split(',')[1])\n else byteString = unescape(base64Data.split(',')[1])\n var mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0]\n var ia = new Uint8Array(byteString.length)\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i)\n }\n return new Blob([ia], { type: mimeString })\n}\n","import { getGuardHttp } from '../_utils/guardHttp'\n\nexport enum TotpRecoveryCodeBusinessAction {\n RecoveryTotp = 'recovery-totp',\n ConfirmTotpRecoveryCode = 'confirm-totp-recovery-code',\n}\n\nexport async function authFlow<T>(\n action: TotpRecoveryCodeBusinessAction,\n content: any\n) {\n const { authFlow } = getGuardHttp()\n\n const res = await authFlow<T>(action, { ...content })\n\n return res\n}\n","import React, {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useGuardHttp } from '../../_utils/guardHttp'\nimport {\n FACE_SCORE,\n devicesConstraints,\n dataURItoBlob,\n getCurrentFaceDetectionNet,\n getFaceDetectorOptions,\n isFaceDetectionModelLoaded,\n} from './face_deps'\nimport { ImagePro } from '../../ImagePro'\nimport SubmitButton from '../../SubmitButton'\nimport { message } from 'antd'\nimport { faceErrorMessage } from '../../_utils/errorFace'\nimport { MFABackStateContext } from '..'\nimport { useGuardPublicConfig } from '../../_utils/context'\nimport { MfaBusinessAction, useMfaBusinessRequest } from '../businessRequest'\nimport { getFacePlugin } from '../../_utils/facePlugin'\n\nconst useDashoffset = (percent: number) => {\n // 接受 0 - 1,返回 0-700 之间的偏移量\n let offset = percent * 7\n\n // 在识别成功的时候,返回绿色\n let dashStyle = {}\n return { offset, dashStyle }\n}\n\nexport const MFAFace = (props: any) => {\n const mfaBackContext = useContext(MFABackStateContext)\n\n let { postForm } = useGuardHttp()\n\n let { t } = useTranslation()\n\n const [faceState, setFaceState] = useState('ready') // ready, identifying, retry\n\n const [percent, setPercent] = useState(0) // 识别进度(相似性)\n\n const mfaBusinessRequest = useMfaBusinessRequest()\n\n const verifyRequest = mfaBusinessRequest[MfaBusinessAction.VerifyFace]\n\n const bindRequest = mfaBusinessRequest[MfaBusinessAction.AssociateFace]\n\n const videoRef = useRef<HTMLVideoElement>(null)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const interval = useRef<NodeJS.Timeout | undefined>()\n const p1 = useRef<string>() // p1 key\n const p2 = useRef<string>() // p2 key\n const cooldown = useRef<number>(0) // p2 cooldown, * 500ms\n const publicConfig = useGuardPublicConfig()\n\n const cdnBase = publicConfig?.cdnBase\n\n let { offset, dashStyle } = useDashoffset(percent)\n\n // 预加载数据\n useEffect(() => {\n // 载入 cdn\n getCurrentFaceDetectionNet().loadFromUri(\n `${cdnBase}/face-api/v1/tiny_face_detector_model-weights_manifest.json`\n )\n\n if (faceState !== 'identifying') {\n return // 不存在 video dom,不要去尝试了\n }\n if (typeof navigator === 'undefined') {\n return // 不存在 navigator,ssr\n }\n let devicesContext = navigator.mediaDevices.getUserMedia(devicesConstraints)\n devicesContext\n .then((stream) => {\n videoRef.current!.srcObject = stream\n })\n .catch((e) => {\n const msg = faceErrorMessage(e)\n message.error(t(msg))\n\n // 没有设备,或没有授权\n // console.error(e)\n // setVideoType(VideoAction.ERROR)\n // setProgressStatus('exception')\n // setPercent(100)\n // setVideoError(e.message)\n })\n\n return () => {\n interval.current && clearInterval(interval.current)\n }\n }, [faceState, interval, props.config, cdnBase, t])\n\n // 监听 faceState\n useEffect(() => {\n // if (faceState === 'identifying' || faceState === 'retry') {\n // props.setShowMethods(false)\n // } else {\n // props.setShowMethods(true)\n // }\n if (mfaBackContext?.mfaBackState === 'check') {\n props.setShowMethods(false)\n } else {\n props.setShowMethods(true)\n }\n }, [mfaBackContext?.mfaBackState, props])\n\n // 上传文件\n const uploadImage = async (blob: Blob) => {\n const formData = new FormData()\n formData.append('folder', 'photos')\n formData.append('file', blob, 'personal.jpeg')\n\n let url = '/api/v2/upload?folder=photos&private=true'\n let result = await postForm<any>(url, formData)\n let key = result.data?.key\n return key\n }\n\n // get base 64\n const getBase64 = (videoDom: any) => {\n const canvas = canvasRef.current!\n const ctx = canvas!.getContext('2d')!\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.drawImage(videoDom, 0, 0, canvas.width, canvas.height)\n const base64Data = canvas.toDataURL('image/jpeg', 1.0)\n return base64Data\n }\n\n const faceBind = async () => {\n const requestData = {\n photoA: p1.current!,\n photoB: p2.current!,\n mfaToken: props.initData.mfaToken,\n }\n const result = await bindRequest(requestData)\n\n const { isFlowEnd, onGuardHandling, code, data } = result\n\n if (isFlowEnd) {\n props.mfaLogin(200, data)\n } else {\n if (code === 1700 || code === 1701 || code === 1702) {\n p1.current = undefined\n\n p2.current = undefined\n\n interval.current = undefined\n\n cooldown.current = 0\n\n setFaceState('retry')\n } else {\n onGuardHandling?.()\n }\n }\n }\n\n const faceCheck = async () => {\n const requestData = {\n photo: p1.current!,\n mfaToken: props.initData.mfaToken,\n }\n\n const result = await verifyRequest(requestData)\n\n const { isFlowEnd, onGuardHandling, data, code } = result\n\n if (isFlowEnd) {\n props.mfaLogin(200, data)\n } else {\n if (code === 1700 || code === 1701 || code === 1702) {\n p1.current = undefined\n\n p2.current = undefined\n\n interval.current = undefined\n\n cooldown.current = 0\n\n setFaceState('retry')\n } else {\n onGuardHandling?.()\n }\n }\n }\n\n // bind 的情况\n const goToBindScene = (key: string) => {\n if (!p1.current) {\n p1.current = key\n } else {\n if (cooldown.current > 0) {\n cooldown.current -= 1\n }\n if (cooldown.current <= 0) {\n p2.current = key\n // 彻底上传完了,应该走验证了\n interval.current && clearInterval(interval.current)\n faceBind()\n }\n }\n }\n\n // goToCheck 的情况\n const goToCheckScene = (key: string) => {\n p1.current = key\n interval.current && clearInterval(interval.current)\n faceCheck()\n }\n\n // 识别成功,自动前进到下一个步骤\n const quitIdentifying = (blob: Blob) => {\n setPercent(100)\n uploadImage(blob).then((key) => {\n if (props.initData?.faceMfaEnabled === true) {\n goToCheckScene(key)\n } else {\n goToBindScene(key)\n }\n })\n }\n\n const autoShoot = useCallback(async () => {\n if (!interval.current) {\n interval.current = setInterval(() => autoShoot(), 500)\n }\n const videoDom = videoRef.current!\n if (videoDom?.paused || videoDom?.ended || !isFaceDetectionModelLoaded()) {\n return\n }\n const options = getFaceDetectorOptions()\n\n const { detectSingleFace } = getFacePlugin()\n\n const result = await detectSingleFace(videoDom, options)\n\n if (result) {\n if (result.score > FACE_SCORE) {\n const base64Data = getBase64(videoDom)\n const blob = dataURItoBlob(base64Data)\n quitIdentifying(blob) // 识别成功,退出识别\n } else {\n // 识别失败,但是有结果,设置相似性\n setPercent(() => {\n return (result.score / FACE_SCORE) * 100\n })\n // ('识别失败,但是有结果,设置相似性', percent)\n }\n } else {\n setPercent(10)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return (\n <div>\n <h3 className=\"authing-g2-mfa-title\">{t('common.faceText1')}</h3>\n <p className=\"authing-g2-mfa-tips\">{t('common.faceText2')}</p>\n {(faceState === 'ready' || mfaBackContext?.mfaBackState === 'login') && (\n <>\n <ImagePro\n className=\"g2-mfa-face-image\"\n width={247}\n height={131}\n src={`${cdnBase}/face.png`}\n alt=\"\"\n />\n\n <SubmitButton\n onClick={() => {\n if (typeof navigator === 'undefined') {\n return\n }\n // 设置状态之前 校验是否支持面容 (api 和 设备)\n // TODO 之后添加人脸识别插件支持 减小包体积\n if (navigator.mediaDevices) {\n setFaceState('identifying')\n mfaBackContext?.setMfaBackState &&\n mfaBackContext.setMfaBackState('check')\n autoShoot()\n } else {\n message.error(t('login.mediaDevicesSupport'))\n }\n }}\n text={t('common.faceText3')}\n className=\"mfa-face\"\n />\n </>\n )}\n <div\n className=\"g2-mfa-face-identifying\"\n style={{\n display:\n faceState !== 'ready' && mfaBackContext?.mfaBackState !== 'login'\n ? 'flex'\n : 'none',\n }}\n >\n <video\n className=\"video-round\"\n ref={videoRef}\n style={{ transform: 'rotateY(180deg)' }}\n // onLoadedMetadata={() => onIdentify()}\n id=\"inputVideo\"\n autoPlay\n muted\n playsInline\n />\n <div\n className=\"video-round mesh\"\n style={{\n display: faceState === 'retry' ? 'flex' : 'none',\n }}\n onClick={() => {\n setFaceState('identifying')\n setPercent(0)\n autoShoot()\n }}\n >\n {t('common.faceText4')}\n </div>\n\n <div className=\"video-round ring\">\n <svg width={240} height={240} fill=\"none\">\n <circle\n className=\"svg-circle-running\"\n style={dashStyle}\n strokeDasharray={700} // 根据周长做 0-700 之间的数值表示准确率\n strokeDashoffset={700 - offset} // 处理这个 offset, 0-700之间的数\n cx={120}\n cy={120}\n r={110}\n />\n </svg>\n </div>\n </div>\n\n <canvas\n style={{\n width: 210,\n height: 210,\n opacity: 0,\n position: 'absolute',\n display: 'none',\n }}\n ref={canvasRef}\n />\n </div>\n )\n}\n","import { Form } from 'antd'\nimport React, { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useAsyncFn } from 'react-use'\nimport { GuardModuleType } from '../../Guard/module'\nimport { GuardMFAInitData, MFAConfig } from '../interface'\nimport SubmitButton from '../../SubmitButton'\nimport { VerifyCodeFormItem } from '../VerifyCodeInput/VerifyCodeFormItem'\nimport { VerifyCodeInput } from '../VerifyCodeInput'\nimport { IconFont } from '../../IconFont'\nimport { MfaBusinessAction, useMfaBusinessRequest } from '../businessRequest'\nimport { useGuardInitData } from '../../_utils/context'\n\nexport interface BindMFATotpProps {\n initData: GuardMFAInitData\n changeModule: any\n}\n\nexport const BindMFATotp: React.FC<BindMFATotpProps> = ({\n changeModule,\n initData,\n}) => {\n const { t } = useTranslation()\n\n const next = () => changeModule(GuardModuleType.BIND_TOTP, initData)\n return (\n <>\n <p className=\"authing-g2-mfa-title\">{t('common.bindTotp')}</p>\n <p className=\"authing-g2-mfa-tips\">{t('common.otpText1')}</p>\n\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <IconFont type=\"authing-otp\" style={{ width: 247, height: 131 }} />\n </div>\n <SubmitButton\n text={t('common.sure')}\n onClick={next}\n className=\"g2-mfa-submit-button bind-totp\"\n />\n </>\n )\n}\n\nexport interface VerifyMFATotpProps {\n mfaToken: string\n mfaLogin: any\n changeModule: any\n}\n\nexport const VerifyMFATotp: React.FC<VerifyMFATotpProps> = ({\n mfaToken,\n mfaLogin,\n changeModule,\n}) => {\n const { t } = useTranslation()\n\n const [form] = Form.useForm()\n\n const submitButtonRef = useRef<any>(null)\n\n const initData = useGuardInitData<GuardMFAInitData>()\n\n const businessRequest = useMfaBusinessRequest()[MfaBusinessAction.VerifyTotp]\n\n const [, onFinish] = useAsyncFn(async () => {\n submitButtonRef.current.onSpin(true)\n\n const mfaCode = form.getFieldValue('mfaCode')\n\n const requestData = {\n totp: mfaCode.join(''),\n mfaToken,\n }\n\n const { isFlowEnd, data, onGuardHandling } = await businessRequest(\n requestData\n )\n\n submitButtonRef.current.onSpin(false)\n\n if (isFlowEnd) {\n mfaLogin(200, data)\n } else {\n submitButtonRef.current.onError()\n\n onGuardHandling?.()\n }\n }, [mfaToken])\n\n return (\n <>\n <p className=\"authing-g2-mfa-title\">{t('login.accPwdLoginVerify')}</p>\n <p className=\"authing-g2-mfa-tips\">{t('login.inputSixCode')}</p>\n <Form\n form={form}\n onSubmitCapture={() => {}}\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n >\n <VerifyCodeFormItem codeLength={6}>\n <VerifyCodeInput\n length={6}\n showDivider={false}\n gutter={'10px'}\n onFinish={onFinish}\n />\n </VerifyCodeFormItem>\n\n <SubmitButton text={t('common.sure')} ref={submitButtonRef} />\n <p className=\"authing-g2-mfa-totp-recoveryCode\">\n {t('common.hasLooseSaftyCode')}\n <span\n onClick={() => {\n changeModule(GuardModuleType.RECOVERY_CODE, {\n ...initData,\n })\n }}\n >\n {t('common.useRecoverCode')}\n </span>\n </p>\n </Form>\n </>\n )\n}\n\nexport interface MFATotpProps {\n changeModule: any\n config: MFAConfig\n initData: GuardMFAInitData\n mfaLogin: any\n}\n\nexport const MFATotp: React.FC<MFATotpProps> = ({\n changeModule,\n initData,\n mfaLogin,\n}) => {\n return (\n <>\n {initData.totpMfaEnabled ? (\n <VerifyMFATotp\n mfaToken={initData.mfaToken}\n mfaLogin={mfaLogin}\n changeModule={changeModule}\n />\n ) : (\n <BindMFATotp initData={initData} changeModule={changeModule} />\n )}\n </>\n )\n}\n","import React, { useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from 'antd'\nimport { IconFont } from '../../IconFont'\nimport { GuardMFAInitData, MFAType } from '../interface'\nimport { i18n } from '../../_utils/locales'\nimport './style.less'\nimport { useGuardInitData } from '../../_utils/context'\n\nexport interface MFAMethodsProps {\n method: MFAType\n onChangeMethod: (type: MFAType) => void\n}\n\nconst methodTitleMapping: Record<\n MFAType,\n {\n title: () => string\n icon: string\n }\n> = {\n [MFAType.EMAIL]: {\n title: () => i18n.t('common.EmailVerification'),\n icon: 'authing-mail',\n },\n [MFAType.SMS]: {\n title: () => i18n.t('common.SMS'),\n icon: 'authing-phone',\n },\n [MFAType.TOTP]: {\n title: () => i18n.t('common.OTPVerification'),\n icon: 'authing-totp',\n },\n [MFAType.FACE]: {\n title: () => i18n.t('common.faceVerification'),\n icon: 'authing-face',\n },\n}\n\nexport const MFAMethods: React.FC<MFAMethodsProps> = ({\n method,\n onChangeMethod,\n}) => {\n const [currentMethod, setCurrentMethod] = useState(method)\n const { t } = useTranslation()\n\n const { applicationMfa } = useGuardInitData<GuardMFAInitData>()\n\n const otherMethods = useMemo(\n () =>\n applicationMfa\n .filter((item) => item.mfaPolicy !== currentMethod)\n .sort((a, b) => a.sort - b.sort)\n .map((item) => (\n <Button\n className=\"g2-guard-mfa-methods-btn\"\n onClick={(e) => {\n onChangeMethod(item.mfaPolicy)\n setCurrentMethod(item.mfaPolicy)\n }}\n key={item.mfaPolicy}\n >\n <IconFont type={methodTitleMapping[item.mfaPolicy].icon} />\n {`${methodTitleMapping[item.mfaPolicy].title()}`}\n </Button>\n )),\n [applicationMfa, currentMethod, onChangeMethod]\n )\n\n return (\n <>\n {otherMethods.length !== 0 && (\n <>\n <div\n style={{\n minHeight: 32,\n }}\n />\n <div className=\"g2-mfa-method\">\n <div className=\"g2-mfa-method-title\">\n {t('login.otherVerifyWay')}\n </div>\n {otherMethods}\n </div>\n </>\n )}\n </>\n )\n}\n","import { GuardModuleAction, GuardModuleType } from '../Guard/module'\n\nexport const codeMap: Record<number, GuardModuleAction> = {\n // 待添加\n 2021: {\n action: 'changeModule',\n module: GuardModuleType.LOGIN,\n },\n 1700: {\n action: 'insideFix',\n message: 'verification failed, let components inside fix is fine.',\n },\n 1701: {\n action: 'insideFix',\n message: 'verification failed, let components inside fix is fine.',\n },\n 1702: {\n action: 'insideFix',\n message: 'verification failed, let components inside fix is fine.',\n },\n 500: {\n action: 'message',\n },\n 6001: {\n action: 'message',\n },\n 602: {\n action: 'message',\n },\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GuardModuleType } from '../Guard/module'\nimport { IconFont } from '../IconFont'\nimport { MFAEmail } from './core/email'\nimport { MFASms } from './core/sms'\nimport { MFAFace } from './core/face'\nimport { MFATotp } from './core/totp'\nimport { MFAMethods } from './mfaMethods'\nimport { GuardMFAInitData, MFAType } from './interface'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { codeMap } from './codemap'\nimport './styles.less'\nimport { message } from 'antd'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardInitData,\n useGuardModule,\n} from '../_utils/context'\ninterface MFABackStateContextType {\n setMfaBackState: React.Dispatch<React.SetStateAction<string>>\n mfaBackState: string\n}\nexport const MFABackStateContext = React.createContext<\n MFABackStateContextType | undefined\n>(undefined)\n\nconst ComponentsMapping: Record<MFAType, (props: any) => React.ReactNode> = {\n [MFAType.EMAIL]: ({ config, initData, mfaLogin }) => (\n <MFAEmail\n config={config}\n mfaToken={initData.mfaToken}\n email={initData.email}\n mfaLogin={mfaLogin}\n />\n ),\n [MFAType.SMS]: ({ config, initData, mfaLogin }) => (\n <MFASms config={config} initData={initData} mfaLogin={mfaLogin} />\n ),\n [MFAType.TOTP]: ({ initData, config, changeModule, mfaLogin }) => (\n <MFATotp\n changeModule={changeModule}\n config={config}\n initData={initData}\n mfaLogin={mfaLogin}\n />\n ),\n [MFAType.FACE]: ({ config, initData, mfaLogin, setShowMethods }) => (\n <MFAFace\n config={config}\n initData={initData}\n mfaLogin={mfaLogin}\n setShowMethods={setShowMethods}\n />\n ),\n}\n\nexport const GuardMFAView: React.FC = () => {\n const initData = useGuardInitData<GuardMFAInitData>()\n\n const config = useGuardFinallyConfig()\n\n const { changeModule } = useGuardModule()\n\n const events = useGuardEvents()\n\n const [currentMethod, setCurrentMethod] = useState(\n initData.current ??\n initData.applicationMfa?.sort((a, b) => a.sort - b.sort)[0].mfaPolicy\n )\n\n const [mfaBackState, setMfaBackState] = useState<string>('login')\n const [showMethods, setShowMethods] = useState(true)\n const client = useGuardAuthClient()\n const { t } = useTranslation()\n\n const onBack = () => {\n if (currentMethod === MFAType.FACE && mfaBackState === 'check') {\n setCurrentMethod(\n initData.applicationMfa.find((item) => item.mfaPolicy === MFAType.FACE)\n ? MFAType.FACE\n : initData.applicationMfa?.sort((a, b) => a.sort - b.sort)[0]\n .mfaPolicy\n )\n setShowMethods(true)\n setMfaBackState('login')\n return\n }\n changeModule?.(GuardModuleType.LOGIN)\n }\n\n const __codePaser = (code: number, msg?: string) => {\n const action = codeMap[code]\n\n if (code === 200) {\n return (data: any) => {\n events?.onLogin?.(data, client!) // 登录成功\n }\n }\n\n if (!action) {\n return (data: any) => {\n console.error('not catch code', code)\n // message.error(data.message)\n }\n }\n\n // 解析成功\n if (action?.action === 'changeModule') {\n let m = action.module ? action.module : GuardModuleType.ERROR\n let init = action.initData ? action.initData : {}\n return (initData?: any) => changeModule?.(m, { ...initData, init })\n }\n if (action?.action === 'insideFix') {\n return () => {}\n }\n\n if (action?.action === 'message') {\n return (data: any) => {\n data.message ? message.error(data.message) : message.error(msg)\n }\n }\n\n // 最终结果\n return () => {\n console.error('last action at mfaview')\n }\n }\n\n const mfaLogin = (code: any, data: any, message?: string) => {\n const callback = __codePaser?.(code, message)\n\n if (!data) {\n data = {}\n }\n\n data.__message = message\n\n callback?.(data)\n }\n\n return (\n // 返回验证页和返回登录页 需要获取内部 face 模式下的状态\n <MFABackStateContext.Provider\n value={{ setMfaBackState: setMfaBackState, mfaBackState: mfaBackState }}\n >\n <div className=\"g2-view-container g2-view-mfa\">\n <div className=\"g2-view-back\" style={{ display: 'inherit' }}>\n <span onClick={onBack} className=\"g2-view-mfa-back-hover\">\n <IconFont\n type=\"authing-arrow-left-s-line\"\n style={{ fontSize: 24 }}\n />\n <span>\n {currentMethod === MFAType.FACE && mfaBackState === 'check'\n ? t('common.backToVerify')\n : t('common.backLoginPage')}\n </span>\n </span>\n </div>\n <div className=\"g2-mfa-content\">\n {ComponentsMapping[currentMethod]({\n config: config,\n initData: initData,\n changeModule: changeModule,\n mfaLogin: mfaLogin,\n setShowMethods: setShowMethods,\n })}\n </div>\n {showMethods && (\n <MFAMethods\n method={currentMethod}\n onChangeMethod={(type) => {\n setCurrentMethod(type)\n }}\n />\n )}\n </div>\n </MFABackStateContext.Provider>\n )\n}\n","import React, { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Form, Input, Modal, Progress, Select, Upload } from 'antd'\nimport SubmitButton from '../../SubmitButton'\nimport { PlusOutlined } from '@ant-design/icons'\nimport { UploadFile } from 'antd/lib/upload/interface'\nimport { useGuardHttp } from '../../_utils/guardHttp'\nimport { fieldRequiredRule, validate } from '../../_utils'\nimport { IconFont } from '../../IconFont'\n\ninterface describeQuestionsProps {\n appId: string\n host: string\n onSuccess: any\n}\n\nexport const DescribeQuestions = (props: describeQuestionsProps) => {\n const { t } = useTranslation()\n // 不清楚为什么放出去之后,i18n 的结果全是 undefeated\n const typeProblemMap: any = {\n 0: [\n t('common.problem.noVerifyTip.tip'),\n t('common.problem.noVerifyTip.type1'),\n t('common.problem.noVerifyTip.type2'),\n t('common.problem.noVerifyTip.type3'),\n ],\n 1: [\n t('common.problem.noLoginTips'),\n t('common.problem.noLoginTip.type1'),\n t('common.problem.noLoginTip.type2'),\n ],\n 2: [\n t('common.problem.noRegisterTip.tip'),\n t('common.problem.noRegisterTip.type1'),\n t('common.problem.noRegisterTip.type2'),\n t('common.problem.noRegisterTip.type3'),\n ],\n 3: [\n t('common.problem.noAccountTip.tip'),\n t('common.problem.noAccountTip.type1'),\n t('common.problem.noAccountTip.type2'),\n ],\n 4: [\n t('common.problem.noResetPassTip.tip'),\n t('common.problem.noResetPassTip.type1'),\n t('common.problem.noResetPassTip.type2'),\n ],\n 5: [t('common.problem.lockedTips')],\n 6: [],\n }\n\n const typeOperations = [\n {\n label: t('common.problem.noVerify'),\n value: 0,\n },\n {\n label: t('common.problem.noLogin'),\n value: 1,\n },\n {\n label: t('common.problem.noRegister'),\n value: 2,\n },\n {\n label: t('common.problem.noAccount'),\n value: 3,\n },\n {\n label: t('common.problem.noResetPass'),\n value: 4,\n },\n {\n label: t('common.problem.locked'),\n value: 5,\n },\n {\n label: t('common.problem.other'),\n value: 6,\n },\n ]\n\n const [form] = Form.useForm()\n const { post } = useGuardHttp()\n const [uploadUrl, setUploadUrl] = useState([])\n const [previewVisible, setPreviewVisible] = useState(false)\n const [previewImage, setPreviewImage] = useState()\n const [fileList, setFileList] = useState<UploadFile<any>[]>([])\n const [typeProblem, setTypeProblem] = useState(0)\n const submitButtonRef = useRef<any>(null)\n const textMap = typeProblemMap[typeProblem]\n\n const onFinish = (values: any) => {\n submitButtonRef?.current?.onSpin(true)\n const params = {\n type: typeProblem,\n description: values.description,\n phone: values.identify,\n images: uploadUrl,\n appId: props.appId,\n }\n // TODO 暂不支持国际化短信参数\n let context = post('/api/v2/feedback', params)\n context.then((res) => {\n if (res.code === 200) {\n submitButtonRef?.current?.onSpin(false)\n props.onSuccess()\n }\n })\n }\n\n const handlePreview = async (file: any) => {\n let url\n if (file.status === 'error' || file.response) {\n url = await new Promise((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(file.originFileObj)\n reader.onload = () => resolve(reader.result)\n })\n } else {\n url = file.response.data.url\n }\n // setPreviewImage(file.url);\n // file 没有 url 属性,需要改成下面的用法\n // let url = file.response.data.url\n setPreviewImage(url)\n setPreviewVisible(true)\n }\n\n return (\n <div className=\"authing-g2-describe-questions authing-g2-form-required-item-icon-after\">\n <Form\n name=\"resetPassword\"\n layout=\"vertical\"\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => {\n submitButtonRef?.current?.onError()\n }}\n autoComplete=\"off\"\n >\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"identify\"\n label={t('common.problem.form.phone')}\n validateFirst={true}\n rules={[\n ...fieldRequiredRule(t('common.problem.form.phone')),\n {\n validator: async (_, value) => {\n if (!value) {\n return\n }\n if (validate('email', value) || validate('phone', value)) {\n return\n } else {\n throw new Error(t('login.inputCorrectPhoneOrEmail'))\n }\n },\n },\n ]}\n >\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('login.inputPhoneOrEmail')}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form \"\n label={t('common.problem.form.question')}\n name=\"questionPicker\"\n initialValue={typeProblem}\n >\n <Select\n className=\"authing-g2-select\"\n onChange={(value: number) => {\n setTypeProblem(value)\n }}\n >\n {typeOperations?.map(({ value, label }) => (\n <Select.Option\n key={value}\n value={value}\n className={`authing-g2-question-option ${\n typeProblem === value\n ? 'authing-g2-question-option-active'\n : ''\n }`}\n >\n {label}\n </Select.Option>\n ))}\n </Select>\n </Form.Item>\n <div className=\"authing-g2-input-form\">\n {textMap?.map((item: any, index: any) => (\n <div key={index}>{item}</div>\n ))}\n </div>\n\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"description\"\n label={t('common.problem.form.questionDescript')}\n >\n <Input.TextArea\n className=\"authing-g2-questions-textarea\"\n maxLength={200}\n showCount\n rows={4}\n style={{\n marginBottom: 10,\n }}\n />\n </Form.Item>\n\n <div className=\"authing-g2-input-form\">\n <div className=\"label-title\">\n {t('common.problem.form.questionClip')}\n </div>\n <div className=\"g2-questions\">\n <Upload\n action={`${props.host}/api/v2/upload?folder=photos`}\n listType=\"picture-card\"\n accept=\"image/png, image/jpeg, image/jpg\"\n className=\"authing-g2-questions-upload-self\"\n fileList={fileList}\n onPreview={handlePreview}\n onChange={(e) => {\n setFileList(e.fileList)\n const imgUrl: any = e.fileList.map((item: any) => {\n const response = item.response\n return response?.data.url\n })\n setUploadUrl(imgUrl)\n }}\n beforeUpload={(file) => {\n if (\n ['image/png', 'image/jpeg', 'image/jpg'].includes(file.type)\n ) {\n return true\n }\n return Promise.reject(file)\n }}\n itemRender={(n, file) => {\n return (\n <>\n {file.status === 'uploading' ? (\n <div\n style={{\n padding: 6,\n borderRadius: 2,\n border: '1px solid #d9d9d9',\n }}\n >\n <Progress\n showInfo={false}\n style={{\n margin: 1,\n }}\n width={40}\n type=\"circle\"\n percent={file.percent}\n />\n </div>\n ) : (\n n\n )}\n </>\n )\n }}\n >\n {fileList.length < 4 && <PlusOutlined />}\n </Upload>\n </div>\n </div>\n\n <Form.Item className=\"authing-g2-input-form submit-form\">\n <SubmitButton\n className=\"forget-password\"\n text={t('common.problem.form.submit')}\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n\n <Modal\n visible={previewVisible}\n title={null}\n footer={null}\n onCancel={() => setPreviewVisible(false)}\n >\n <img alt=\"example\" style={{ width: '100%' }} src={previewImage} />\n </Modal>\n </div>\n )\n}\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ImagePro } from '../ImagePro'\nimport { DescribeQuestions } from './core/describeQuestions'\nimport { GuardModuleType } from '../Guard/module'\nimport {\n useGuardAppId,\n useGuardFinallyConfig,\n useGuardModule,\n} from '../_utils/context'\n\nexport const GuardNeedHelpView = (props: any) => {\n const { t } = useTranslation()\n\n const appId = useGuardAppId()\n\n const { changeModule } = useGuardModule()\n\n const config = useGuardFinallyConfig()\n\n const onSuccess = () => {\n changeModule?.(GuardModuleType.SUBMIT_SUCCESS)\n }\n\n return (\n <div className=\"g2-view-container g2-need-help\">\n <div className=\"g2-view-header\">\n <ImagePro\n src={config.logo!}\n size={48}\n borderRadius={4}\n alt=\"\"\n className=\"icon\"\n />\n\n <div className=\"title\">{t('common.problem.title')}</div>\n </div>\n <div className=\"g2-view-tabs\">\n <DescribeQuestions\n appId={appId}\n host={config.host}\n onSuccess={onSuccess}\n />\n </div>\n <div className=\"g2-tips-line \">\n <div className=\"back-to-login\">\n <span className=\"gray\">{t('common.noQuestions')}</span>\n <span\n className=\"link-like\"\n onClick={() => changeModule?.(GuardModuleType.LOGIN)}\n >\n {t('common.goToLogin')}\n </span>\n </div>\n </div>\n </div>\n )\n}\n","import { Checkbox, Form, Typography } from 'antd'\nimport React, { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport SubmitButton from '../../SubmitButton'\nimport { useGuardIsAuthFlow } from '../../_utils/context'\nimport { authFlow, TotpRecoveryCodeBusinessAction } from '../businessRequest'\n\nconst { Paragraph } = Typography\n\nexport const SaveCode: React.FC<{\n secret: string\n onBind: any\n}> = (props) => {\n const { secret, onBind } = props\n\n const { t } = useTranslation()\n\n const [form] = Form.useForm()\n\n const isAuthFlow = useGuardIsAuthFlow()\n\n const submitButtonRef = useRef<any>(null)\n\n const bindSuccess = async () => {\n submitButtonRef.current?.onSpin(true)\n\n if (isAuthFlow) {\n const { isFlowEnd, data, onGuardHandling } = await authFlow(\n TotpRecoveryCodeBusinessAction.ConfirmTotpRecoveryCode,\n {}\n )\n\n submitButtonRef.current?.onSpin(false)\n if (isFlowEnd) {\n onBind(data)\n } else {\n submitButtonRef.current?.onError()\n onGuardHandling?.()\n }\n } else {\n try {\n await form.validateFields()\n onBind()\n } catch (e: any) {\n submitButtonRef.current?.onError()\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n }\n }\n\n return (\n <>\n <p className=\"authing-g2-mfa-title\">{t('common.useRecoverCode')}</p>\n <p className=\"authing-g2-mfa-tips\">{t('common.totpGenerateCode')}</p>\n\n <div className=\"g2-mfa-bindTotp-copySecret\">\n <Paragraph copyable>{secret}</Paragraph>\n </div>\n\n <Form\n form={form}\n onFinish={bindSuccess}\n style={{ width: '100%' }}\n onFinishFailed={() => submitButtonRef.current?.onError()}\n >\n <Form.Item\n className=\"authing-g2-input-form g2-mfa-totp-recoveryCode-input\"\n name=\"remember\"\n rules={[\n {\n validator: (_, value) => {\n if (!value) {\n return Promise.reject(t('common.pleaseRecordKey'))\n }\n return Promise.resolve()\n },\n },\n ]}\n valuePropName=\"checked\"\n >\n <Checkbox className=\"g2-mfa-bindTotp-secretSave\">\n {t('login.rememberedSecret')}\n </Checkbox>\n </Form.Item>\n\n <SubmitButton text={t('common.confirm')} ref={submitButtonRef} />\n </Form>\n </>\n )\n}\n","// import { useGuardIsAuthFlow } from '../_utils/context'\nimport { getGuardHttp } from '../_utils/guardHttp'\nexport enum IdentityBindingBusinessAction {\n PhoneCode = 'phone-code',\n EmailCode = 'emial-code',\n Password = 'password',\n}\nexport interface PhoneCodeParams {\n phone: string\n code: string\n phoneCountryCode?: string\n}\nexport interface EmailCodeParams {\n email: string\n code: string\n}\nexport interface PasswordParams {\n account: string\n password: string\n}\nexport const PhoneCode = async (params: PhoneCodeParams) => {\n // const { phone, code, phoneCountryCode } = params\n\n const { post } = getGuardHttp()\n\n return await post('/interaction/federation/binding/byPhoneCode', params)\n}\n\nexport const EmailCode = async (params: EmailCodeParams) => {\n const { email, code } = params\n\n const { post } = getGuardHttp()\n\n return await post('/interaction/federation/binding/byEmailCode', {\n email,\n code,\n })\n}\n\nexport const Password = async (params: PasswordParams) => {\n const { account, password } = params\n\n const { post } = getGuardHttp()\n\n return await post('/interaction/federation/binding/byAccount', {\n account,\n password,\n })\n}\n\nexport const useIdentityBindingBusinessRequest = () => {\n // const isFlow = useGuardIsAuthFlow()\n\n const request = {\n [IdentityBindingBusinessAction.PhoneCode]: (params: PhoneCodeParams) => {\n // if (isFlow) {\n // return authFlow(MfaBusinessAction.VerifyEmail, content)\n // }\n return PhoneCode(params)\n },\n [IdentityBindingBusinessAction.EmailCode]: (params: EmailCodeParams) => {\n // if (isFlow) {\n // return authFlow(MfaBusinessAction.VerifySms, content)\n // }\n\n return EmailCode(params)\n },\n [IdentityBindingBusinessAction.Password]: (params: PasswordParams) => {\n // if (isFlow) {\n // return authFlow(MfaBusinessAction.VerifyTotp, content)\n // }\n\n return Password(params)\n },\n }\n\n return request\n}\n","import { Form, Input } from 'antd'\nimport React, { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { User } from '../..'\nimport { IconFont } from '../../IconFont'\nimport SubmitButton from '../../SubmitButton'\nimport { useGuardIsAuthFlow } from '../../_utils/context'\nimport { useGuardHttp } from '../../_utils/guardHttp'\nimport { authFlow, TotpRecoveryCodeBusinessAction } from '../businessRequest'\n\nexport interface UseCodeProps {\n mfaToken: string\n onSubmit: (recoveryCode: string, user?: User) => void\n}\n\nexport const UseCode: React.FC<UseCodeProps> = ({ mfaToken, onSubmit }) => {\n const { t } = useTranslation()\n\n const isAuthFlow = useGuardIsAuthFlow()\n\n const [form] = Form.useForm()\n\n const { post } = useGuardHttp()\n\n let submitButtonRef = useRef<any>(null)\n\n const onFinish = async (values: any) => {\n submitButtonRef.current?.onSpin(true)\n\n if (isAuthFlow) {\n const { data, onGuardHandling, statusCode } = await authFlow<{\n recoveryCode: string\n }>(TotpRecoveryCodeBusinessAction.RecoveryTotp, {\n recoveryCode: values.recoveryCode,\n })\n\n submitButtonRef.current?.onSpin(false)\n\n if (statusCode === 200) {\n onSubmit(data!.recoveryCode)\n } else {\n submitButtonRef.current?.onError()\n\n onGuardHandling?.()\n }\n } else {\n try {\n const res = await post(\n '/api/v2/mfa/totp/recovery',\n {\n recoveryCode: form.getFieldValue('recoveryCode'),\n },\n {\n headers: {\n authorization: mfaToken,\n },\n }\n )\n if (res.code === 200) {\n // @ts-ignore\n onSubmit(res.recoveryCode, res.data)\n } else {\n // message.error(res.message)\n submitButtonRef.current?.onError()\n res.onGuardHandling?.()\n }\n } catch (error) {\n // TODO: handle error\n submitButtonRef.current?.onError()\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n }\n }\n\n return (\n <>\n <p className=\"authing-g2-mfa-title\">{t('common.useRecoverCode')}</p>\n <p className=\"authing-g2-mfa-tips\">{t('login.mfaAfterReset')}</p>\n <Form\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n >\n <Form.Item\n validateTrigger={['onBlur', 'onChange']}\n className=\"authing-g2-input-form\"\n name=\"recoveryCode\"\n rules={[\n {\n required: true,\n message: t('login.inputRecoverCode'),\n },\n ]}\n >\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('login.inputRecoverCode')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n\n <Form.Item className=\"authing-g2-input-form submit-form\">\n <SubmitButton text={t('common.sure')} ref={submitButtonRef} />\n </Form.Item>\n </Form>\n </>\n )\n}\n","import React, { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GuardModuleType, User } from '..'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { IconFont } from '../IconFont'\nimport { GuardMFAInitData, MFAType } from '../MFA/interface'\nimport {\n useGuardEvents,\n useGuardInitData,\n useGuardIsAuthFlow,\n useGuardModule,\n} from '../_utils/context'\nimport { SaveCode } from './core/saveCode'\nimport { UseCode } from './core/useCode'\nimport './style.less'\n\nexport const RecoveryCode: React.FC = () => {\n const { changeModule } = useGuardModule()\n\n const initData = useGuardInitData<GuardMFAInitData>()\n\n const events = useGuardEvents()\n\n const onBack = () =>\n changeModule?.(GuardModuleType.MFA, { ...initData, current: MFAType.TOTP })\n\n const { t } = useTranslation()\n\n const [user, setUser] = useState<User>()\n\n const [code, setCode] = useState<string>()\n\n const authClient = useGuardAuthClient()\n\n const onBind = () => {\n if (user) events?.onLogin?.(user, authClient)\n }\n return (\n <div className=\"g2-view-container g2-mfa-recovery-code\">\n <div className=\"g2-view-back\" style={{ display: 'inherit' }}>\n <span onClick={onBack} className=\"g2-view-mfa-back-hover\">\n <IconFont type=\"authing-arrow-left-s-line\" style={{ fontSize: 24 }} />\n <span>{t('common.backToVerify')}</span>\n </span>\n </div>\n <div className=\"g2-mfa-content\">\n {user && code ? (\n <SaveCode secret={code} onBind={onBind} />\n ) : (\n <UseCode\n mfaToken={initData.mfaToken}\n onSubmit={(code, user) => {\n setUser(user)\n setCode(code)\n }}\n />\n )}\n </div>\n </div>\n )\n}\n\nexport const RecoveryCodeAuthFlow: React.FC = () => {\n const { changeModule } = useGuardModule()\n\n const initData = useGuardInitData<GuardMFAInitData>()\n\n const [recoveryCode, setRecoveryCode] = useState<string>()\n\n const events = useGuardEvents()\n\n const authClient = useGuardAuthClient()\n\n const onBind = (user: User) => {\n if (user) events?.onLogin?.(user, authClient)\n }\n\n const onBack = () =>\n changeModule?.(GuardModuleType.MFA, { ...initData, current: MFAType.TOTP })\n\n const { t } = useTranslation()\n\n return (\n <div className=\"g2-view-container g2-mfa-recovery-code\">\n <div className=\"g2-view-back\" style={{ display: 'inherit' }}>\n <span onClick={onBack} className=\"g2-view-mfa-back-hover\">\n <IconFont type=\"authing-arrow-left-s-line\" style={{ fontSize: 24 }} />\n <span>{t('common.backToVerify')}</span>\n </span>\n </div>\n <div className=\"g2-mfa-content\">\n {recoveryCode ? (\n <SaveCode secret={recoveryCode} onBind={onBind} />\n ) : (\n <UseCode\n mfaToken={initData.mfaToken}\n onSubmit={(code) => {\n setRecoveryCode(code)\n }}\n />\n )}\n </div>\n </div>\n )\n}\n\nexport const GuardRecoveryCodeView: React.FC = () => {\n const isAuthFlow = useGuardIsAuthFlow()\n\n return <>{isAuthFlow ? <RecoveryCodeAuthFlow /> : <RecoveryCode />}</>\n}\n","import { useGuardPublicConfig } from '../_utils/context'\nimport omit from 'lodash/omit'\n// 是否进行注册信息补全\nexport const useIsChangeComplete = (currentMode: 'phone' | 'email') => {\n const { extendsFields } = useGuardPublicConfig()\n\n const { complateFiledsPlace } = useGuardPublicConfig()\n\n // 开关控制 如果没有 register 就不开启了\n if (!complateFiledsPlace.includes('register')) {\n return false\n }\n // 排除掉已有的字段\n if (\n !Boolean(omit(extendsFields, currentMode)) ||\n extendsFields.length === 0\n ) {\n // 为空就不补了~\n return false\n }\n\n // 字段唯一 切 与注册的方式相同 就不补了\n if (extendsFields.length === 1 && extendsFields[0].name === currentMode) {\n return false\n }\n\n // 其他的补\n return true\n}\n","import { Form, Input, message } from 'antd'\nimport { RegisterMethods } from 'authing-js-sdk'\nimport React, { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useAsyncFn } from 'react-use'\nimport { Agreement, ApplicationConfig } from '../../AuthingGuard/api'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { getDeviceName } from '../../_utils'\nimport { Agreements } from '../components/Agreements'\nimport SubmitButton from '../../SubmitButton'\nimport CustomFormItem from '../../ValidatorRules'\nimport { IconFont } from '../../IconFont'\nimport { InputPassword } from '../../InputPassword'\nimport { useIsChangeComplete } from '../utils'\nimport { useGuardModule } from '../../_utils/context'\nimport { GuardModuleType } from '../../Guard'\n\nexport interface RegisterWithEmailProps {\n // onRegister: Function\n onRegisterSuccess: Function\n onRegisterFailed: Function\n onBeforeRegister?: Function\n publicConfig?: ApplicationConfig\n agreements: Agreement[]\n registeContext?: any\n}\n\nexport const RegisterWithEmail: React.FC<RegisterWithEmailProps> = ({\n onRegisterSuccess,\n onRegisterFailed,\n onBeforeRegister,\n agreements,\n registeContext,\n}) => {\n const { t } = useTranslation()\n const submitButtonRef = useRef<any>(null)\n\n const authClient = useGuardAuthClient()\n const [form] = Form.useForm()\n\n const isChangeComplete = useIsChangeComplete('email')\n\n const { changeModule } = useGuardModule()\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n const [validated, setValidated] = useState(false)\n\n const [, onFinish] = useAsyncFn(\n async (values: any) => {\n submitButtonRef.current.onSpin(true)\n\n if (onBeforeRegister) {\n try {\n const canRegister = await onBeforeRegister(\n {\n type: RegisterMethods.Phone,\n data: {\n phone: values.phone,\n password: values.password,\n code: values.code,\n },\n },\n authClient\n )\n if (!canRegister) {\n submitButtonRef.current.onSpin(false)\n return\n }\n } catch (e: any) {\n if (typeof e === 'string') {\n message.error(e)\n } else {\n message.error(e?.message)\n }\n submitButtonRef.current.onSpin(false)\n return\n }\n }\n\n try {\n await form.validateFields()\n setValidated(true)\n\n if (agreements?.length && !acceptedAgreements) {\n submitButtonRef.current.onError()\n return\n }\n const { email, password } = values\n\n const context = registeContext ?? {}\n\n // 注册使用的详情信息\n const registerContent = {\n email,\n password,\n profile: {\n browser:\n typeof navigator !== 'undefined' ? navigator.userAgent : null,\n device: getDeviceName(),\n },\n options: {\n context,\n generateToken: true,\n // params: getUserRegisterParams(),\n },\n }\n\n // 看看是否要跳转到 信息补全\n if (isChangeComplete) {\n changeModule?.(GuardModuleType.REGISTER_COMPLETE_INFO, {\n businessRequestName: 'registerByEmail',\n content: registerContent,\n })\n\n return\n }\n\n // 注册\n const user = await authClient.registerByEmail(\n registerContent.email,\n registerContent.password,\n registerContent.profile,\n registerContent.options\n )\n\n submitButtonRef.current.onSpin(false)\n onRegisterSuccess(user)\n } catch (error: any) {\n const { code, data, message } = error\n submitButtonRef.current.onError()\n onRegisterFailed(code, data, message)\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n },\n [form, acceptedAgreements],\n { loading: false }\n )\n\n return (\n <div className=\"authing-g2-register-email\">\n <Form\n form={form}\n name=\"emailRegister\"\n autoComplete=\"off\"\n onFinish={(values: any) => {\n submitButtonRef.current.onSpin(true)\n onFinish(values)\n }}\n onFinishFailed={() => submitButtonRef.current.onError()}\n onValuesChange={(_, values) => {\n if (values['password'] && values['new-password']) {\n // password changed verify new password\n form.validateFields(['new-password'])\n }\n }}\n >\n <CustomFormItem.Email\n key=\"email\"\n name=\"email\"\n className=\"authing-g2-input-form\"\n validateFirst={true}\n form={form}\n checkRepeat={true}\n required={true}\n >\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('login.inputEmail')}\n // prefix={<UserOutlined style={{ color: '#878A95' }} />}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </CustomFormItem.Email>\n <CustomFormItem.Password\n key=\"password\"\n name=\"password\"\n className=\"authing-g2-input-form\"\n validateFirst={true}\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputPwd')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </CustomFormItem.Password>\n <CustomFormItem.Password\n key=\"new-password\"\n name=\"new-password\"\n fieldRequiredRuleMessage={t('common.repeatPasswordDoc')}\n rules={[\n {\n validateTrigger: 'onBlur',\n validator: (_, value) => {\n if (value !== form.getFieldValue('password') && value) {\n return Promise.reject(t('common.repeatPasswordDoc'))\n } else {\n return Promise.resolve()\n }\n },\n },\n ]}\n className=\"authing-g2-input-form\"\n validateFirst={true}\n >\n <InputPassword\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('common.passwordAgain')}\n // prefix={<LockOutlined style={{ color: '#878A95' }} />}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </CustomFormItem.Password>\n {Boolean(agreements?.length) && (\n <Agreements\n onChange={setAcceptedAgreements}\n agreements={agreements}\n showError={validated}\n />\n )}\n <Form.Item>\n <SubmitButton text={t('common.register')} ref={submitButtonRef} />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import { Form } from 'antd'\nimport React, { useCallback, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Agreement, ApplicationConfig } from '../../AuthingGuard/api'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { fieldRequiredRule, getDeviceName } from '../../_utils'\nimport { Agreements } from '../components/Agreements'\nimport SubmitButton from '../../SubmitButton'\nimport { InputNumber } from '../../InputNumber'\nimport CustomFormItem from '../../ValidatorRules'\nimport { IconFont } from '../../IconFont'\nimport { SceneType } from 'authing-js-sdk'\nimport { SendCodeByPhone } from '../../SendCode/SendCodeByPhone'\nimport { InputInternationPhone } from '../../Login/core/withVerifyCode/InputInternationPhone'\nimport { defaultAreaCode, parsePhone } from '../../_utils/hooks'\nimport { useIsChangeComplete } from '../utils'\nimport { useGuardModule } from '../../_utils/context'\nimport { GuardModuleType } from '../../Guard'\n\nexport interface RegisterWithPhoneProps {\n // onRegister: Function\n onRegisterSuccess: Function\n onRegisterFailed: Function\n agreements: Agreement[]\n publicConfig?: ApplicationConfig\n registeContext?: any\n}\n\nexport const RegisterWithPhone: React.FC<RegisterWithPhoneProps> = ({\n onRegisterSuccess,\n onRegisterFailed,\n agreements,\n publicConfig,\n registeContext,\n}) => {\n const { t } = useTranslation()\n const isChangeComplete = useIsChangeComplete('phone')\n\n const { changeModule } = useGuardModule()\n\n const submitButtonRef = useRef<any>(null)\n const authClient = useGuardAuthClient()\n const [form] = Form.useForm()\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n const [validated, setValidated] = useState(false)\n // 区号 默认\n const [areaCode, setAreaCode] = useState(defaultAreaCode)\n\n const verifyCodeLength = publicConfig?.verifyCodeLength ?? 4\n const isInternationSms =\n publicConfig?.internationalSmsConfig?.enabled || false\n const onFinish = useCallback(\n async (values: any) => {\n try {\n submitButtonRef.current.onSpin(true)\n await form.validateFields()\n\n setValidated(true)\n\n if (agreements?.length && !acceptedAgreements) {\n // message.error(t('common.registerProtocolTips'))\n submitButtonRef.current.onError()\n // submitButtonRef.current.onSpin(false)\n return\n }\n\n const { phone, password = '', code } = values\n\n const context = registeContext ?? {}\n const { phoneNumber, countryCode: phoneCountryCode } = parsePhone(\n isInternationSms,\n phone,\n areaCode\n )\n\n // 注册\n const options: any = {\n context,\n generateToken: true,\n }\n\n if (isInternationSms) {\n options.phoneCountryCode = phoneCountryCode\n }\n\n const registerContent = {\n phone: phoneNumber,\n code,\n password,\n profile: {\n browser:\n typeof navigator !== 'undefined' ? navigator.userAgent : null,\n device: getDeviceName(),\n },\n options,\n }\n\n // 看看是否要跳转到 信息补全\n if (isChangeComplete) {\n changeModule?.(GuardModuleType.REGISTER_COMPLETE_INFO, {\n businessRequestName: 'registerByPhoneCode',\n content: registerContent,\n })\n\n return\n }\n\n const user = await authClient.registerByPhoneCode(\n phoneNumber,\n code,\n password,\n {\n browser:\n typeof navigator !== 'undefined' ? navigator.userAgent : null,\n device: getDeviceName(),\n },\n options\n )\n\n submitButtonRef.current.onSpin(false)\n onRegisterSuccess(user)\n } catch (error: any) {\n const { code, message, data } = error\n submitButtonRef.current.onError()\n onRegisterFailed(code, data, message)\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n },\n [\n form,\n agreements?.length,\n acceptedAgreements,\n registeContext,\n isInternationSms,\n areaCode,\n isChangeComplete,\n authClient,\n onRegisterSuccess,\n changeModule,\n onRegisterFailed,\n ]\n )\n\n const PhoenAccount = useCallback(\n (props) => {\n if (publicConfig && publicConfig.internationalSmsConfig?.enabled) {\n return (\n <InputInternationPhone\n {...props}\n className=\"authing-g2-input\"\n size=\"large\"\n areaCode={areaCode}\n onAreaCodeChange={(value: string) => {\n setAreaCode(value)\n form.getFieldValue(['phone']) && form.validateFields(['phone'])\n }}\n />\n )\n } else {\n return (\n <InputNumber\n {...props}\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputPhone')}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n maxLength={11}\n />\n )\n }\n },\n [areaCode, form, publicConfig, t]\n )\n\n const SendCode = useCallback(\n (props) => {\n if (isInternationSms) {\n return (\n <SendCodeByPhone\n {...props}\n isInternationSms={isInternationSms}\n form={form}\n fieldName=\"phone\"\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n })}\n areaCode={areaCode}\n prefix={\n <IconFont\n type=\"authing-a-shield-check-line1\"\n style={{ color: '#878A95' }}\n />\n }\n scene={SceneType.SCENE_TYPE_REGISTER}\n maxLength={verifyCodeLength}\n onSendCodeBefore={async () => {\n await form.validateFields(['phone'])\n }}\n />\n )\n } else {\n return (\n <SendCodeByPhone\n {...props}\n form={form}\n fieldName=\"phone\"\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n })}\n maxLength={verifyCodeLength}\n scene={SceneType.SCENE_TYPE_REGISTER}\n prefix={\n <IconFont\n type=\"authing-a-shield-check-line1\"\n style={{ color: '#878A95' }}\n />\n }\n onSendCodeBefore={async () => {\n await form.validateFields(['phone'])\n }}\n />\n )\n }\n },\n [areaCode, form, isInternationSms, t, verifyCodeLength]\n )\n\n return (\n <div className=\"authing-g2-register-email\">\n <Form\n form={form}\n name=\"emailRegister\"\n autoComplete=\"off\"\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\n >\n <CustomFormItem.Phone\n key=\"phone\"\n name=\"phone\"\n className={\n publicConfig?.internationalSmsConfig?.enabled\n ? 'authing-g2-input-form remove-padding'\n : 'authing-g2-input-form'\n }\n validateFirst={true}\n form={form}\n checkRepeat={true}\n required={true}\n areaCode={areaCode}\n >\n <PhoenAccount />\n </CustomFormItem.Phone>\n <Form.Item\n key=\"code\"\n name=\"code\"\n validateTrigger={['onBlur', 'onChange']}\n rules={fieldRequiredRule(t('common.captchaCode'))}\n className=\"authing-g2-input-form\"\n validateFirst={true}\n >\n <SendCode />\n </Form.Item>\n {Boolean(agreements?.length) && (\n <Agreements\n onChange={setAcceptedAgreements}\n agreements={agreements}\n showError={validated}\n />\n )}\n <Form.Item>\n <SubmitButton text={t('common.register')} ref={submitButtonRef} />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Tabs } from 'antd'\nimport { RegisterMethods } from 'authing-js-sdk'\nimport { ChangeLanguage } from '../ChangeLanguage'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { GuardModuleType } from '../Guard/module'\nimport { RegisterWithEmail } from './core/WithEmail'\nimport { RegisterWithPhone } from './core/WithPhone'\n\nimport { tabSort } from '../_utils'\nimport { i18n } from '../_utils/locales'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport { VerifyLoginMethods } from '../AuthingGuard/api'\n\nexport const GuardRegisterView: React.FC = () => {\n const events = useGuardEvents()\n\n const config = useGuardFinallyConfig()\n\n const { changeModule } = useGuardModule()\n\n const { t } = useTranslation()\n const agreementEnabled = config?.agreementEnabled\n const { langRange } = config\n const authClient = useGuardAuthClient()\n\n const publicConfig = useGuardPublicConfig()\n\n const verifyLoginMethods = useMemo<VerifyLoginMethods[]>(\n () =>\n publicConfig?.verifyCodeTabConfig?.enabledLoginMethods ?? ['phone-code'],\n [publicConfig?.verifyCodeTabConfig?.enabledLoginMethods]\n )\n\n const registerContextProps = useMemo(\n () => ({\n onRegisterSuccess: (data: any = {}, message?: string) => {\n events?.onRegister?.(data, authClient)\n changeModule?.(GuardModuleType.LOGIN, {})\n },\n onRegisterFailed: (code: number, data: any = {}, message?: string) => {\n events?.onRegisterError?.({\n code,\n data,\n message,\n })\n },\n registeContext: config.registerContext,\n onBeforeRegister: events?.onBeforeRegister,\n //availableAt 0或者null-注册时,1-登录时,2-注册和登录时\n agreements: agreementEnabled\n ? config?.agreements?.filter(\n (agree) => agree.lang === i18n.language && agree?.availableAt !== 1\n ) ?? []\n : [],\n publicConfig: publicConfig,\n verifyLoginMethods: verifyLoginMethods,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n agreementEnabled,\n config?.agreements,\n events?.onBeforeRegister,\n i18n.language,\n verifyLoginMethods,\n ]\n )\n\n const tabMapping: Record<\n RegisterMethods,\n { component: React.ReactNode; name: string }\n > = useMemo(\n () => ({\n [RegisterMethods.Email]: {\n component: <RegisterWithEmail {...registerContextProps} />,\n name: t('common.emailLabel'),\n },\n [RegisterMethods.Phone]: {\n component: <RegisterWithPhone {...registerContextProps} />,\n name: t('common.phoneLabel'),\n },\n }),\n [registerContextProps, t]\n )\n\n const renderTab = useMemo(() => {\n const { registerMethods, defaultRegisterMethod } = config\n return tabSort(defaultRegisterMethod!, registerMethods!)?.map((method) => (\n <Tabs.TabPane tab={tabMapping[method].name} key={method}>\n {tabMapping[method].component}\n </Tabs.TabPane>\n ))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config?.defaultRegisterMethod, tabMapping])\n\n return (\n <div className=\"g2-view-container g2-view-register\">\n <div className=\"g2-view-container-inner\">\n <div className=\"g2-view-header\">\n <img src={config?.logo} alt=\"\" className=\"icon\" />\n\n <div className=\"title\">{config?.title}</div>\n </div>\n <div className=\"g2-view-tabs\">\n <Tabs\n defaultActiveKey={config?.defaultRegisterMethod}\n onChange={(activeKey) => {\n events?.onRegisterTabChange?.(activeKey as RegisterMethods)\n }}\n >\n {renderTab}\n </Tabs>\n </div>\n <div className=\"g2-tips-line\">\n <span className=\"back-to-login\">\n {/* <span className=\"gray\">{t('common.alreadyHasAcc')}</span> */}\n <span\n className=\"link-like\"\n onClick={() => changeModule?.(GuardModuleType.LOGIN, {})}\n >\n {t('common.backLoginPage')}\n </span>\n </span>\n </div>\n </div>\n <ChangeLanguage\n langRange={langRange}\n onLangChange={events?.onLangChange}\n />\n </div>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GuardModuleType } from '..'\nimport { ImagePro } from '../ImagePro'\nimport SubmitButton from '../SubmitButton'\nimport {\n useGuardInitData,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport { SubmitSuccessInitData } from './interface'\n\nexport const GuardSubmitSuccessView: React.FC = () => {\n const { t } = useTranslation()\n\n const initData = useGuardInitData<SubmitSuccessInitData>()\n\n const { changeModule: __changeModule } = useGuardModule()\n\n const [countDown, setCountDown] = useState(5)\n\n const timerRef = useRef<any>(0)\n\n const publicConfig = useGuardPublicConfig()\n\n const {\n title = t('common.problem.successTip'),\n message = t('common.problem.successTipMsg'),\n text = t('common.backLoginPage'),\n countDesc = t('common.pToLogin'),\n changeModule = GuardModuleType.LOGIN,\n } = initData ?? {}\n const cdnBase = publicConfig?.cdnBase\n\n useEffect(() => {\n timerRef.current = setInterval(() => {\n setCountDown((prev) => {\n return prev - 1\n })\n }, 1000)\n\n return () => clearInterval(timerRef.current)\n }, [])\n\n useEffect(() => {\n if (countDown <= 0) {\n clearInterval(timerRef.current)\n __changeModule?.(changeModule)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [countDown])\n\n return (\n <div className=\"g2-view-container g2-submit-success\">\n <div className=\"g2-view-tabs g2-questions-send-success-page\">\n <ImagePro\n className=\"plate\"\n src={`${cdnBase}/questions-send-ok.png`}\n alt=\"\"\n width={191}\n height={146}\n />\n <div className=\"title\">{title}</div>\n <div className=\"message\">{message}</div>\n <SubmitButton\n onClick={() => {\n __changeModule?.(changeModule)\n }}\n text={text as string}\n />\n <div className=\"timer-tip\">\n {countDown} {countDesc}\n </div>\n </div>\n </div>\n )\n}\n","import { ConfigProvider, message, Modal } from 'antd'\nimport React, { useEffect, useMemo } from 'react'\nimport { GuardModuleType, GuardProps } from '..'\nimport { GuardBindTotpView } from '../../BindTotp'\nimport {\n GuardFirstLoginPasswordResetView,\n GuardForcedPasswordResetView,\n} from '../../ChangePassword'\nimport {\n GuardLoginCompleteInfoView,\n GuardRegisterCompleteInfoView,\n} from '../../CompleteInfo'\nimport { GuardDownloadATView } from '../../DownloadAuthenticator'\nimport { GuardErrorView } from '../../Error'\nimport { GuardForgetPassword } from '../../ForgetPassword'\nimport { GuardLoginView } from '../../Login'\nimport { GuardMFAView } from '../../MFA'\nimport { GuardNeedHelpView } from '../../NeedHelpView'\nimport { GuardRecoveryCodeView } from '../../RecoveryCode'\nimport { GuardRegisterView } from '../../Register'\nimport { GuardSubmitSuccessView } from '../../SubmitSuccess'\nimport {\n useGuardContextLoaded,\n useGuardCurrentModule,\n useGuardDefaultMergedConfig,\n useGuardHttpClient,\n useGuardModule,\n} from '../../_utils/context'\nimport zhCN from 'antd/lib/locale/zh_CN'\nimport enUS from 'antd/lib/locale/en_US'\nimport { i18n } from '../../_utils/locales'\nimport { GuardMode } from '../..'\nimport { IconFont } from '../../IconFont'\nimport { AuthingGuardResponse, AuthingResponse } from '../../_utils/http'\nimport {\n CodeAction,\n ChangeModuleApiCodeMapping,\n ApiCode,\n} from '../../_utils/responseManagement/interface'\nimport { GuardIdentityBindingView } from '../../IdentityBinding'\nimport { GuardIdentityBindingAskView } from '../../IdentityBindingAsk'\nimport '../styles.less'\n\nconst PREFIX_CLS = 'authing-ant'\n\nmessage.config({\n prefixCls: `${PREFIX_CLS}-message`,\n})\n\nexport enum LangMAP {\n zhCn = 'zh-CN',\n enUs = 'en-US',\n}\n\nconst langMap = {\n [LangMAP.zhCn]: zhCN,\n [LangMAP.enUs]: enUS,\n}\n\nexport const RenderModule: React.FC<{\n guardProps: GuardProps\n}> = ({ guardProps }) => {\n const defaultMergedConfig = useGuardDefaultMergedConfig()\n\n const contextLoaded = useGuardContextLoaded()\n\n const { moduleName } = useGuardCurrentModule()\n\n const httpClient = useGuardHttpClient()\n\n const { changeModule } = useGuardModule()\n\n const loadingComponent = useMemo(() => {\n return defaultMergedConfig.loadingComponent\n }, [defaultMergedConfig])\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const ComponentsMapping: Record<\n GuardModuleType,\n (key: string) => React.ReactNode\n > = {\n // Error\n [GuardModuleType.ERROR]: (key: string) => <GuardErrorView key={key} />,\n // Login\n [GuardModuleType.LOGIN]: (key: string) => <GuardLoginView key={key} />,\n // 身份源绑定\n [GuardModuleType.IDENTITY_BINDING]: (key: string) => (\n <GuardIdentityBindingView key={key} />\n ),\n // 身份源绑定 问询\n [GuardModuleType.IDENTITY_BINDING_ASK]: (key: string) => (\n <GuardIdentityBindingAskView key={key} />\n ),\n // MFA\n [GuardModuleType.MFA]: (key: string) => <GuardMFAView key={key} />,\n // 注册\n [GuardModuleType.REGISTER]: (key: string) => (\n <GuardRegisterView key={key} />\n ),\n // 下载 Authenticator\n [GuardModuleType.DOWNLOAD_AT]: (key: string) => (\n <GuardDownloadATView key={key} />\n ),\n // 忘记密码 -> 重置密码\n [GuardModuleType.FORGET_PWD]: (key: string) => (\n <GuardForgetPassword key={key} />\n ),\n // 首次登录修改密码\n [GuardModuleType.FIRST_LOGIN_PASSWORD]: (key: string) => (\n <GuardFirstLoginPasswordResetView key={key} />\n ),\n // 登陆安全策略 密码轮换\n [GuardModuleType.FORCED_PASSWORD_RESET]: (key: string) => (\n <GuardForcedPasswordResetView key={key} />\n ),\n // 绑定 TOTP\n [GuardModuleType.BIND_TOTP]: (key: string) => (\n <GuardBindTotpView key={key} />\n ),\n // 问题反馈\n [GuardModuleType.ANY_QUESTIONS]: (key: string) => (\n <GuardNeedHelpView key={key} />\n ),\n // MFA 恢复码\n [GuardModuleType.RECOVERY_CODE]: (key: string) => (\n <GuardRecoveryCodeView key={key} />\n ),\n // 提交成功\n [GuardModuleType.SUBMIT_SUCCESS]: (key: string) => (\n <GuardSubmitSuccessView key={key} />\n ),\n // 注册信息补全\n [GuardModuleType.REGISTER_COMPLETE_INFO]: (key: string) => (\n <GuardRegisterCompleteInfoView key={key} />\n ),\n // 登录信息补全\n [GuardModuleType.LOGIN_COMPLETE_INFO]: (key: string) => (\n <GuardLoginCompleteInfoView key={key} />\n ),\n }\n\n // 初始化 请求拦截器 (Error Code)\n useEffect(() => {\n if (!httpClient || !changeModule) return\n\n // 错误码处理回调 切换 module 和 错误信息提示\n const errorCodeCb = (\n code: CodeAction,\n res: AuthingResponse\n ): AuthingGuardResponse => {\n const codeActionMapping = {\n [CodeAction.CHANGE_MODULE]: () => {\n const nextModule = ChangeModuleApiCodeMapping[res.apiCode!]\n\n const nextData = res.data\n\n changeModule(nextModule, nextData)\n return CodeAction.CHANGE_MODULE\n },\n [CodeAction.RENDER_MESSAGE]: () => {\n message.error(res.message ?? res.messages)\n return CodeAction.RENDER_MESSAGE\n },\n [CodeAction.FLOW_END]: () => {\n return CodeAction.FLOW_END\n },\n }\n\n const codeAction = codeActionMapping[code]\n\n if (!codeAction) return res\n\n if (res.apiCode === ApiCode.FLOW_END) {\n const newData = res.data.user\n\n return {\n ...res,\n onGuardHandling: codeAction,\n isFlowEnd: true,\n data: newData ? { ...newData } : res,\n }\n }\n\n return {\n ...res,\n onGuardHandling: codeAction,\n }\n }\n\n httpClient.initErrorCodeInterceptor(errorCodeCb)\n }, [httpClient, changeModule])\n\n const renderModule = useMemo(() => {\n if (contextLoaded) {\n return ComponentsMapping[moduleName](new Date().toString())\n } else if (loadingComponent) {\n return loadingComponent\n }\n return null\n }, [ComponentsMapping, contextLoaded, loadingComponent, moduleName])\n\n const visible = useMemo(() => {\n return guardProps.visible\n }, [guardProps.visible])\n\n return (\n <ConfigProvider\n prefixCls={PREFIX_CLS}\n locale={langMap[i18n.language as LangMAP]}\n >\n {defaultMergedConfig.mode === GuardMode.Modal ? (\n <Modal\n className=\"authing-g2-render-module-modal\"\n closeIcon={\n <IconFont type=\"authing-close-line\" className=\"g2-modal-close\" />\n }\n visible={visible}\n onCancel={guardProps?.onClose}\n keyboard={defaultMergedConfig.escCloseable}\n maskClosable={false} // 点击蒙层,是否允许关闭\n getContainer={defaultMergedConfig.target ?? false}\n >\n <div className=\"authing-g2-render-module\">{renderModule}</div>\n </Modal>\n ) : (\n <div className=\"authing-g2-render-module\">{renderModule}</div>\n )}\n </ConfigProvider>\n )\n}\n","import { Tabs } from 'antd'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GuardModuleType } from '..'\nimport { PasswordLoginMethods } from '../AuthingGuard/api'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { IconFont } from '../IconFont'\n// import { codeMap } from '../Login/codemap'\nimport { LoginWithPassword } from '../Login/core/withPassword'\nimport { LoginWithVerifyCode } from '../Login/core/withVerifyCode'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardInitData,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport { i18n } from '../_utils/locales'\nimport {\n IdentityBindingBusinessAction,\n useIdentityBindingBusinessRequest,\n} from './businessRequest'\nimport { GuardIdentityBindingInitData } from './interface'\nimport './styles.less'\n\nexport const GuardIdentityBindingView: React.FC = () => {\n const initData = useGuardInitData<GuardIdentityBindingInitData>()\n\n const config = useGuardFinallyConfig()\n\n const { changeModule, backModule } = useGuardModule()\n\n const { t } = useTranslation()\n\n const events = useGuardEvents()\n\n const { publicKey, agreementEnabled } = config\n\n const publicConfig = useGuardPublicConfig()\n\n const isInternationSms =\n publicConfig?.internationalSmsConfig?.enabled || false\n\n const authClient = useGuardAuthClient()\n const phoneCodeRequest = useIdentityBindingBusinessRequest()[\n IdentityBindingBusinessAction.PhoneCode\n ]\n const emailCodeRequest = useIdentityBindingBusinessRequest()[\n IdentityBindingBusinessAction.EmailCode\n ]\n const PasswordRequest = useIdentityBindingBusinessRequest()[\n IdentityBindingBusinessAction.Password\n ]\n\n const onBack = () => {\n if (initData.source === GuardModuleType.IDENTITY_BINDING_ASK) backModule?.()\n else changeModule?.(GuardModuleType.LOGIN)\n }\n\n const bindMethodsMap = {\n 'phone-code': async (data: any) => {\n const { identity, code, phoneCountryCode } = data\n\n const options: any = {\n phone: identity,\n code,\n }\n\n if (isInternationSms) {\n options.phoneCountryCode = phoneCountryCode\n }\n return await phoneCodeRequest(options)\n // return await post('/interaction/federation/binding/byPhoneCode', {\n // phone: identity,\n // code,\n // })\n },\n 'email-code': async (data: any) => {\n const { identity: email, code } = data\n return await emailCodeRequest({ email, code })\n // return await post('/interaction/federation/binding/byEmailCode', {\n // email: identity,\n // code,\n // })\n },\n password: async (data: any) => {\n const { identity: account, password } = data\n const encrypt = authClient.options.encryptFunction\n\n const encryptPassword = await encrypt!(password, publicKey!)\n return await PasswordRequest({ account, password: encryptPassword })\n // return await post('/interaction/federation/binding/byAccount', {\n // account: identity,\n // password: encryptPassword,\n // })\n },\n }\n\n // const __codePaser = (code: number) => {\n // const action = codeMap[code]\n // if (code === 200) {\n // return (data: any) => {\n // events?.onBinding?.(data.user, authClient!) // 绑定成功\n\n // events?.onLogin?.(data.user, authClient!) // 登录成功\n // }\n // }\n\n // if (!action) {\n // return (initData?: any) => {\n // // initData?._message && message.error(initData?._message)\n // console.error('未捕获 code', code)\n // }\n // }\n\n // // 解析成功\n // if (action?.action === 'changeModule') {\n // let m = action.module ? action.module : GuardModuleType.ERROR\n // let init = action.initData ? action.initData : {}\n // return (initData?: any) => {\n // changeModule?.(m, { ...initData, ...init })\n // }\n // }\n // if (action?.action === 'message') {\n // return (initData?: any) => {\n // message.error(initData?._message)\n // }\n // }\n // if (action?.action === 'accountLock') {\n // return () => {}\n // }\n\n // // 最终结果\n // return (initData?: any) => {\n // // props.onLoginError?.(data, client!) // 未捕获 code\n // console.error('last action at loginview')\n // message.error(initData?._message)\n // }\n // }\n\n // const onLogin = (code: any, data: any, message?: string) => {\n // const callback = __codePaser?.(code)\n // if (code !== 200) {\n // events?.onBindingError?.({\n // code,\n // data,\n // message,\n // })\n // events?.onLoginError?.({\n // code,\n // data,\n // message,\n // })\n // }\n // if (!data) {\n // data = {}\n // }\n // data._message = message\n // callback?.(data)\n // }\n\n const onLoginSuccess = (data: any) => {\n events?.onBinding?.(data, authClient!) // 绑定成功\n\n events?.onLogin?.(data, authClient!) // 登录成功\n }\n\n const onLoginFailed = (code: number, data: any, message?: string) => {\n events?.onBindingError?.({\n code,\n data,\n message,\n })\n events?.onLoginError?.({\n code,\n data,\n message,\n })\n }\n\n const onBind = async (loginInfo: any) => {\n const { type, data } = loginInfo\n\n const res = await bindMethodsMap[\n type as 'phone-code' | 'email-code' | 'password'\n ]?.(data)\n\n return res\n }\n\n const agreements = useMemo(\n () =>\n agreementEnabled\n ? config?.agreements?.filter(\n (agree) => agree.lang === i18n.language && !!agree?.availableAt\n ) ?? []\n : [],\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [agreementEnabled, config?.agreements, i18n.language]\n )\n\n const passwordLoginMethods = useMemo<PasswordLoginMethods[]>(() => {\n const loginMethodsBase = [\n 'username-password',\n 'email-password',\n 'phone-password',\n ]\n\n // @ts-ignore\n return initData.methods.filter((method) =>\n loginMethodsBase.includes(method)\n ) as PasswordLoginMethods[]\n }, [initData.methods])\n\n const codeLoginMethods = useMemo(() => {\n const loginMethodsBase = ['email-code', 'phone-code']\n\n return initData.methods.filter((method) =>\n loginMethodsBase.includes(method)\n )\n }, [initData.methods])\n\n const methods = [\n {\n key: 'code',\n title: t('common.verifyCodeLogin'),\n component: (\n <LoginWithVerifyCode\n verifyCodeLength={publicConfig?.verifyCodeLength}\n autoRegister={false}\n onLoginRequest={onBind}\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n agreements={agreements}\n methods={codeLoginMethods}\n submitButText={t('common.bind')}\n />\n ),\n },\n {\n key: 'password',\n title: t('login.pwdLogin'),\n component: (\n <LoginWithPassword\n publicKey={publicKey!}\n autoRegister={false}\n host={config.host}\n onLoginRequest={onBind}\n passwordLoginMethods={passwordLoginMethods}\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n agreements={agreements}\n submitButText={t('common.bind')}\n />\n ),\n },\n ]\n\n return (\n <div className=\"g2-view-container g2-view-identity-binding\">\n <div className=\"g2-view-back\" style={{ display: 'inherit' }}>\n <span onClick={onBack} className=\"g2-view-mfa-back-hover\">\n <IconFont type=\"authing-arrow-left-s-line\" style={{ fontSize: 24 }} />\n <span>{t('common.back')}</span>\n </span>\n </div>\n\n <div className=\"g2-view-identity-binding-content\">\n <div className=\"g2-view-identity-binding-content-logo\">\n <img src={config?.logo} alt=\"\" className=\"logo\" />\n </div>\n <div className=\"g2-view-identity-binding-content-title\">\n <span>{t('common.identityBindingTitle')}</span>\n </div>\n <div className=\"g2-view-identity-binding-content-desc\">\n <span>{t('common.identityBindingDesc')}</span>\n </div>\n <div className=\"g2-view-identity-binding-content-login\">\n <Tabs>\n {methods\n .filter((method) => {\n if (method.key === 'password')\n return passwordLoginMethods.length !== 0\n\n if (method.key === 'code') return codeLoginMethods.length !== 0\n\n return true\n })\n .map((method) => (\n <Tabs.TabPane key={method.key} tab={method.title}>\n {method.component}\n </Tabs.TabPane>\n ))}\n </Tabs>\n </div>\n </div>\n </div>\n )\n}\n","import { Button } from 'antd'\nimport React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useAsyncFn } from 'react-use'\nimport { GuardModuleType } from '..'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { IconFont } from '../IconFont'\nimport {\n useGuardEvents,\n useGuardInitData,\n useGuardModule,\n} from '../_utils/context'\nimport { useGuardHttp } from '../_utils/guardHttp'\nimport { GuardIdentityBindingAskInitData } from './interface'\nimport './styles.less'\n\nexport const GuardIdentityBindingAskView: React.FC = () => {\n const initData = useGuardInitData<GuardIdentityBindingAskInitData>()\n\n const { changeModule } = useGuardModule()\n\n const { t } = useTranslation()\n\n const { post } = useGuardHttp()\n\n const authClient = useGuardAuthClient()\n\n const onBack = () => changeModule?.(GuardModuleType.LOGIN)\n\n const events = useGuardEvents()\n\n const onCreate = (data: any) => {\n events?.onLogin?.(data, authClient)\n\n events?.onCreate?.(data, authClient)\n }\n\n const onCreateError = (code: any, data: any) => {\n events?.onCreateError?.({\n code,\n data,\n })\n events?.onLoginError?.({\n code,\n data,\n })\n }\n\n const [createLoading, createAccount] = useAsyncFn(async () => {\n const url = '/interaction/federation/binding/register'\n\n const { code, onGuardHandling, data } = await post(url, {})\n\n if (code === 200) {\n onCreate(data)\n } else {\n onCreateError(code, data)\n\n onGuardHandling?.()\n }\n }, [])\n\n const bindingAccount = () => {\n changeModule?.(GuardModuleType.IDENTITY_BINDING, {\n ...initData,\n source: GuardModuleType.IDENTITY_BINDING_ASK,\n })\n }\n\n return (\n <div className=\"g2-view-container g2-view-identity-binding-ask\">\n <div className=\"g2-view-back\" style={{ display: 'inherit' }}>\n <span onClick={onBack} className=\"g2-view-mfa-back-hover\">\n <IconFont type=\"authing-arrow-left-s-line\" style={{ fontSize: 24 }} />\n <span>{t('common.back')}</span>\n </span>\n </div>\n\n <div className=\"g2-view-identity-binding-ask-content\">\n <div className=\"g2-view-identity-binding-ask-content-title\">\n <span>{t('common.identityBindingAskTitle')}</span>\n </div>\n <div className=\"g2-view-identity-binding-ask-content-desc\">\n <span>{t('common.identityBindingAskDesc')}</span>\n </div>\n <div className=\"g2-view-identity-binding-ask-content-img\">\n <IconFont type=\"authing-bind\" />\n </div>\n <div className=\"g2-view-identity-binding-ask-content-button-group\">\n <Button\n className=\"g2-view-identity-binding-ask-content-button g2-view-identity-binding-ask-content-button-create\"\n loading={createLoading.loading}\n onClick={createAccount}\n >\n {t('common.identityBindingCreate')}\n </Button>\n <Button\n className=\" g2-view-identity-binding-ask-content-button g2-view-identity-binding-ask-content-button-binding authing-g2-submit-button\"\n onClick={bindingAccount}\n type=\"primary\"\n >\n {t('common.identityBindingBinding')}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n","import { GuardModuleType } from '../../Guard'\n\nexport enum CodeAction {\n // 切换 Module\n CHANGE_MODULE = 'changeModule',\n // 渲染 错误信息\n RENDER_MESSAGE = 'renderMessage',\n // 流程 结束\n FLOW_END = 'flowEnd',\n}\n\nexport enum ApiCode {\n IDENTITY_BINDING_ASK = 1641,\n\n IDENTITY_BINDING = 1640,\n\n APP_MFA = 1636,\n\n MFA = 1635,\n\n ABORT_FLOW = 1699,\n\n COMPLETE_INFO = 1642,\n\n FLOW_END = 1600,\n\n FIRST_LOGIN_PASSWORD = 1639,\n\n FORCED_PASSWORD_RESET = 2058,\n}\n\nexport const ChangeModuleApiCodeMapping: Record<string, GuardModuleType> = {\n [ApiCode.IDENTITY_BINDING]: GuardModuleType.IDENTITY_BINDING,\n [ApiCode.IDENTITY_BINDING_ASK]: GuardModuleType.IDENTITY_BINDING_ASK,\n [ApiCode.APP_MFA]: GuardModuleType.MFA,\n [ApiCode.MFA]: GuardModuleType.MFA,\n [ApiCode.ABORT_FLOW]: GuardModuleType.LOGIN,\n [ApiCode.COMPLETE_INFO]: GuardModuleType.LOGIN_COMPLETE_INFO,\n [ApiCode.FIRST_LOGIN_PASSWORD]: GuardModuleType.FIRST_LOGIN_PASSWORD,\n [ApiCode.FORCED_PASSWORD_RESET]: GuardModuleType.FORCED_PASSWORD_RESET,\n}\n","import { initFacePlugin } from '../../_utils/facePlugin'\nimport { FacePlugin } from '../../_utils/facePlugin/interface'\nimport isEqual from 'lodash/isEqual'\n\nexport const useGuardPlugin = (plugin: { facePlugin?: FacePlugin }) => {\n const { facePlugin } = plugin\n\n return useGuardFacePlugin(facePlugin)\n}\n\nexport const useGuardFacePlugin = (facePlugin?: FacePlugin) => {\n if (!facePlugin) return true\n\n const guardFace = initFacePlugin(facePlugin)\n\n return isEqual(guardFace, facePlugin)\n}\n","import React from 'react'\nimport { GuardProps } from '..'\nimport { ModuleState } from '../GuardModule/stateMachine'\nimport { RenderContext } from './renderContext'\nimport { RenderModule } from './renderModule'\nimport { useInitGuardAppendConfig } from './useAppendConfig'\nimport { useGuardPlugin } from './usePlugin'\n\nexport const useRenderGuardCore = (\n props: GuardProps,\n initState: ModuleState\n) => {\n useInitGuardAppendConfig(props)\n\n useGuardPlugin(props)\n\n return (\n <RenderContext guardProps={props} initState={initState}>\n <RenderModule guardProps={props} />\n </RenderContext>\n )\n}\n","import { memo } from 'react'\n\nimport { GuardEvents } from './event'\nimport { IG2FCProps } from '../Type'\nimport { GuardLocalConfig } from './config'\nimport { GuardModuleType } from './module'\nimport 'moment/locale/zh-cn'\nimport { useRenderGuardCore } from './core/index'\nimport { GuardPropsFilter } from '../_utils'\n\nexport interface GuardProps extends GuardEvents, IG2FCProps {\n config?: Partial<GuardLocalConfig>\n}\n\ninterface ModuleState {\n moduleName: GuardModuleType\n initData: any\n}\n\nconst propsAreEqual = (pre: GuardProps, current: GuardProps) => {\n return GuardPropsFilter(pre, current)\n}\n\nexport const Guard = memo((props: GuardProps) => {\n const { config } = props\n // 首页 init 数据\n const initState: ModuleState = {\n moduleName: config?.defaultScenes ?? GuardModuleType.LOGIN,\n initData: config?.defaultInitData ?? {},\n }\n\n const renderGuard = useRenderGuardCore(props, initState)\n\n return renderGuard\n}, propsAreEqual)\n","import version from '../version'\nimport { AuthingGuardResponse, AuthingResponse, requestClient } from './http'\nimport { errorCodeInterceptor } from './responseManagement'\nimport { CodeAction } from './responseManagement/interface'\n\nlet httpClient: GuardHttp\n\nenum InterceptorName {\n ERROR_CODE = 'errorCode',\n}\n\ntype ResponseInterceptor = (res: AuthingResponse) => AuthingResponse\n\nexport class GuardHttp {\n private requestClient: any\n private headers: Record<string, string> = {\n 'x-authing-userpool-id': '',\n 'x-authing-app-id': '',\n 'x-authing-sdk-version': version,\n 'x-authing-request-from': `Guard@${version}`,\n }\n\n private responseInterceptorMap: Map<\n InterceptorName,\n ResponseInterceptor\n > = new Map()\n\n constructor(baseUrl?: string) {\n if (!baseUrl) return\n this.getRequestClient().setBaseUrl(baseUrl)\n }\n\n private getRequestClient() {\n if (!this.requestClient) {\n this.requestClient = requestClient\n }\n\n return this.requestClient\n }\n\n setUserpoolId(userpoolId: string) {\n this.headers['x-authing-userpool-id'] = userpoolId\n return this\n }\n\n setAppId(appId: string) {\n this.headers['x-authing-app-id'] = appId\n return this\n }\n\n setTenantId(tenantId: string) {\n this.headers['x-authing-app-tenant-id'] = tenantId\n return this\n }\n\n setBaseUrl(baseUrl: string) {\n this.getRequestClient().setBaseUrl(baseUrl)\n return this\n }\n\n public getHeaders = () => this.headers\n\n public get = async <T = any>(\n path: string,\n query: Record<string, any> = {},\n config?: RequestInit\n ): Promise<AuthingGuardResponse<T>> => {\n const res = await requestClient.get<T>(path, query, {\n ...config,\n headers: { ...this.headers, ...config?.headers },\n })\n\n return this.responseIntercept(res)\n }\n\n public post = async <T = any>(\n path: string,\n data: any,\n config?: {\n headers: any\n }\n ): Promise<AuthingGuardResponse<T>> => {\n const res = await requestClient.post<T>(path, data, {\n headers: {\n ...this.headers,\n ...config?.headers,\n },\n })\n\n return this.responseIntercept(res)\n }\n\n public postForm = async <T = any>(\n path: string,\n formData: any,\n config?: {\n headers: any\n }\n ): Promise<AuthingGuardResponse<T>> => {\n const res = await requestClient.postForm<T>(path, formData, {\n headers: {\n ...this.headers,\n ...config?.headers,\n },\n })\n\n return this.responseIntercept(res)\n }\n\n public authFlow = async <T = any>(\n action: string,\n data?: any\n ): Promise<AuthingGuardResponse<T>> => {\n const flowPath = '/interaction/authFlow'\n\n const requestData = {\n action,\n data,\n }\n\n const res = await requestClient.post<T>(flowPath, requestData, {\n headers: {\n ...this.headers,\n },\n })\n\n return this.responseIntercept(res)\n }\n\n // 初始化 Error code 拦截器\n public initErrorCodeInterceptor = (\n callBack: (code: CodeAction, res: AuthingResponse) => AuthingGuardResponse\n ) => {\n // 初始化 errorCode 响应拦截器\n if (this.responseInterceptorMap.has(InterceptorName.ERROR_CODE)) return\n\n this.responseInterceptorMap.set(\n InterceptorName.ERROR_CODE,\n (res) => errorCodeInterceptor(res, callBack) // 传入调度拦截器回调\n )\n\n return this\n }\n\n public responseIntercept: (res: AuthingResponse) => AuthingGuardResponse = (\n res\n ) => {\n if (this.responseInterceptorMap.size === 0) return res\n\n const interceptors = Array.from(this.responseInterceptorMap.values())\n\n return interceptors.reduce((acc, cur) => cur(acc), res)\n }\n}\n\nexport const initGuardHttp = (baseUrl: string) => {\n if (!httpClient) {\n const guardHttp = new GuardHttp(baseUrl)\n httpClient = guardHttp\n }\n\n return httpClient\n}\n\nexport const getGuardHttp = () => {\n if (!httpClient) {\n throw new Error('Please initialize Http Client')\n }\n\n return httpClient\n}\n\nexport const useGuardHttp = () => getGuardHttp()\n","import { getHundreds } from '..'\nimport { AuthingGuardResponse, AuthingResponse } from '../http'\nimport { CodeAction } from './interface'\n\nexport const errorCodeInterceptor: (\n res: AuthingResponse<any>,\n callBack: (code: CodeAction, res: AuthingResponse) => AuthingGuardResponse\n) => AuthingResponse<any> = (res, callBack) => {\n if (!res.statusCode) return res\n\n const statusCode = res.statusCode\n\n // if ([6].includes(getHundreds(statusCode))) {\n // callBack(CodeAction.RENDER_MESSAGE, res)\n\n // return res\n // }\n\n // TODO 临时逻辑 如果有 Code 的话 先不走 statusCode 的行为\n // 否则会出现 messages 渲染两次的问题\n // if (!!res.code) return res\n\n switch (getHundreds(statusCode)) {\n case 3:\n return callBack(CodeAction.CHANGE_MODULE, res)\n\n case 4:\n case 6:\n return callBack(CodeAction.RENDER_MESSAGE, res)\n\n default:\n break\n }\n\n return res\n}\n","export enum Steps {\n Verify,\n Reset,\n}\n","import { LoginMethods, RegisterMethods } from 'authing-js-sdk'\nimport { GuardPageConfig, IG2Config } from '../Type'\nimport { ApplicationConfig } from '../AuthingGuard/api'\nimport { getGuardHttp } from './guardHttp'\nimport { AuthingResponse } from './http'\nimport { GuardComponentConfig, GuardLocalConfig } from '../Guard/config'\nimport { corsVerification } from './corsVerification'\n\nlet publicConfigMap: Record<string, ApplicationConfig> = {}\n\nlet pageConfigMap: Record<string, GuardPageConfig> = {}\n\nconst getPublicConfig = (appId: string) => publicConfigMap?.[appId]\n\nexport const setPublicConfig = (appId: string, config: ApplicationConfig) =>\n (publicConfigMap[appId] = config)\n\nconst getPageConfig = (appId: string) => pageConfigMap?.[appId]\n\nexport const setPageConfig = (appId: string, config: GuardPageConfig) =>\n (pageConfigMap[appId] = config)\n\nexport const initConfig = async (\n appId: string,\n config: Partial<IG2Config>,\n defaultConfig: IG2Config\n): Promise<{ config: GuardLocalConfig; publicConfig: ApplicationConfig }> => {\n if (!getPublicConfig(appId)) await requestPublicConfig(appId)\n if (!getPageConfig(appId)) await requestPageConfig(appId)\n\n const mergedConfig = mergeConfig(\n config,\n defaultConfig,\n getPublicConfig(appId)\n )\n\n return {\n config: {\n ...mergedConfig,\n // 请求地址 拼装\n // __appHost__: config?.__internalRequest__\n // ? mergedConfig?.host\n // : assembledRequestHost(\n // getPublicConfig(appId).requestHostname,\n // mergedConfig?.host!\n // ),\n },\n publicConfig: getPublicConfig(appId),\n }\n}\n\nconst mergeConfig = (\n config: GuardComponentConfig,\n defaultConfig: IG2Config,\n publicConfig: ApplicationConfig\n): GuardLocalConfig => {\n const mergedPublicConfig: GuardLocalConfig = {\n ...defaultConfig,\n ...config,\n title: config.title ?? publicConfig.name,\n logo: !!config.logo ? config.logo : publicConfig.logo,\n loginMethods:\n config?.loginMethods ??\n (publicConfig.loginTabs?.list as LoginMethods[]) ??\n [],\n passwordLoginMethods:\n config?.passwordLoginMethods ??\n publicConfig.passwordTabConfig?.enabledLoginMethods ??\n [],\n // 默认登录方式\n defaultLoginMethod:\n config.defaultLoginMethod ??\n (publicConfig.loginTabs.default as LoginMethods),\n // 禁止重制密码\n disableResetPwd: !!(\n config.disableResetPwd ??\n !publicConfig.ssoPageComponentDisplay?.forgetPasswordBtn\n ),\n // 是否自动注册\n autoRegister:\n config.autoRegister ??\n publicConfig.ssoPageComponentDisplay.autoRegisterThenLoginHintInfo,\n registerMethods:\n config.registerMethods ??\n (publicConfig.registerTabs?.list as RegisterMethods[]),\n defaultRegisterMethod:\n config.defaultRegisterMethod ??\n (publicConfig.registerTabs.default as RegisterMethods),\n // 禁止注册\n disableRegister: !!(\n config.disableRegister ??\n !publicConfig.ssoPageComponentDisplay.registerBtn\n ),\n // publicKey\n publicKey: config.publicKey ?? publicConfig.publicKey,\n // 注册协议\n agreementEnabled: config.agreementEnabled ?? publicConfig.agreementEnabled,\n agreements: config.agreements ?? publicConfig.agreements,\n contentCss: config.contentCss ?? publicConfig.css,\n }\n\n return mergedPublicConfig\n}\n\nconst requestPublicConfig = async (\n appId: string\n): Promise<ApplicationConfig> => {\n let res: AuthingResponse<ApplicationConfig>\n\n const { get } = getGuardHttp()\n\n try {\n res = await get<ApplicationConfig>(\n `/api/v2/applications/${appId}/public-config`\n )\n } catch (error) {\n console.error('Please check your config or network')\n throw new Error('Please check your config or network')\n }\n\n if (res.code !== 200 || !res.data)\n throw new Error(res?.message ?? 'Please check your config')\n\n corsVerification(res.data.allowedOrigins, res.data.corsWhitelist)\n\n setPublicConfig(appId, res.data)\n\n return getPublicConfig(appId)\n}\n\nconst requestPageConfig = async (appId: string): Promise<GuardPageConfig> => {\n let res: AuthingResponse<GuardPageConfig>\n\n const { get } = getGuardHttp()\n\n try {\n res = await get<GuardPageConfig>(\n `/api/v2/applications/${appId}/components-public-config/guard`\n )\n } catch (error) {\n console.error('Please check your config or network')\n throw new Error('Please check your config or network')\n }\n\n if (res.code !== 200 || !res.data)\n throw new Error(res?.message ?? 'Please check your config')\n\n setPageConfig(appId, res.data)\n\n return getPageConfig(appId)\n}\n","import {\n Lang,\n LoginMethods,\n Protocol,\n} from '../../../components/AuthingGuard/types'\nimport {\n IAzureAdConnectionConfig,\n ICasConnectionConfig,\n IOAuthConnectionConfig,\n ISamlConnectionConfig,\n OIDCConnectionConfig,\n SocialConnectionItem,\n} from './userPoolConfig'\nimport { i18n } from '../../_utils/locales'\nimport { requestClient } from '../../_utils/http'\nimport { PasswordStrength } from '../../_utils'\n\nexport enum ApplicationMfaType {\n SMS = 'SMS',\n EMAIL = 'EMAIL',\n // OTP = 'OTP',\n // FACE = 'FACE',\n // FINGERPRINT = 'FINGERPRINT',\n}\n\nexport const ApplicationMfaTypeLabel: () => Record<\n ApplicationMfaType,\n string\n> = () => ({\n [ApplicationMfaType.SMS]: i18n.t('common.SMS'),\n [ApplicationMfaType.EMAIL]: i18n.t('common.EmailVerification'),\n})\n\nexport type QrcodeTabsSettings = Record<\n LoginMethods,\n Array<{\n id: string\n title: string\n isDefault?: boolean\n }>\n>\n\nexport interface OidcClientMetadata {\n grant_types: string[]\n client_id: string\n redirect_uris: string[]\n scope: string\n response_types: ResponseType[]\n}\nexport interface InternalExtendsField {\n type: 'internal'\n name: string\n label: string\n inputType: string\n required: boolean\n validateRules: any[]\n}\n\nexport interface UserExtendsField {\n type: 'user'\n id: string\n name: string\n label: string\n inputType: string\n required: boolean\n validateRules: any[]\n}\n\nexport type ExtendsField = InternalExtendsField | UserExtendsField\n\nexport interface ApplicationPasswordTabConfig {\n enabledLoginMethods?: PasswordLoginMethods[]\n}\n\nexport interface ApplicationVerifyCodeTabConfig {\n enabledLoginMethods: VerifyLoginMethods[]\n}\n\nexport interface Agreement {\n id: number\n title: string\n required: boolean\n lang: Lang\n availableAt?: number\n}\n\nexport type PasswordLoginMethods =\n | 'username-password'\n | 'email-password'\n | 'phone-password'\n\nexport type VerifyLoginMethods = 'email-code' | 'phone-code'\n\nexport type ComplateFiledsPlace = 'register' | 'login'\nexport interface ApplicationConfig {\n id: string\n allowedOrigins: string[]\n corsWhitelist: string[]\n cdnBase: string\n userPoolId: string\n rootUserPoolId: string\n publicKey: string\n internationalSmsConfig?: {\n enabled: boolean\n }\n // 登录框自定义 css 代码\n css: string\n name: string\n logo: string\n description?: string\n redirectUris: string[]\n registerDisabled: boolean\n registerTabs: {\n list: string[]\n default: string\n title: { [x: string]: string }\n }\n\n qrcodeTabsSettings: QrcodeTabsSettings\n\n loginTabs: {\n list: string[]\n default: string\n defaultV2?: string\n title: { [x: string]: string }\n }\n socialConnections: SocialConnectionItem[]\n\n complateFiledsPlace: ComplateFiledsPlace[]\n extendsFieldsEnabled: boolean\n extendsFields: ExtendsField[]\n\n identifier: string\n requestHostname: string\n identityProviders: {\n identifier: string\n protocol: Protocol\n displayName: string\n logo: string\n config:\n | ISamlConnectionConfig\n | OIDCConnectionConfig\n | ICasConnectionConfig\n | IAzureAdConnectionConfig\n | IOAuthConnectionConfig\n }[]\n\n ssoPageComponentDisplay: {\n autoRegisterThenLoginHintInfo: boolean\n forgetPasswordBtn: boolean\n idpBtns: boolean\n loginBtn: boolean\n loginByPhoneCodeTab: boolean\n loginByUserPasswordTab: boolean\n loginMethodNav: boolean\n phoneCodeInput: boolean\n registerBtn: boolean\n registerByEmailTab: boolean\n registerByPhoneTab: boolean\n registerMethodNav: boolean\n socialLoginBtns: boolean\n userPasswordInput: boolean\n wxMpScanTab: boolean\n }\n\n protocol: Protocol\n oidcConfig: OidcClientMetadata\n passwordTabConfig: ApplicationPasswordTabConfig\n verifyCodeTabConfig?: ApplicationVerifyCodeTabConfig\n\n agreementEnabled: boolean\n agreements: Agreement[]\n customPasswordStrength: any\n passwordStrength: PasswordStrength\n verifyCodeLength: number\n websocket: string\n welcomeMessage: any\n\n skipComplateFileds: boolean\n}\n\nexport const fetchAppConfig = (appId: string) =>\n requestClient.get<ApplicationConfig>(\n `/api/v2/applications/${appId}/public-config`,\n {\n credentials: 'include',\n }\n )\n","import { message } from 'antd'\nimport { User } from 'authing-js-sdk'\nimport { FormInstance } from 'antd/lib/form'\nimport React, { useCallback, useMemo, useRef } from 'react'\n\nimport { useGuardContext } from '../../context/global/context'\nimport {\n ADLoginForm,\n LdapLoginForm,\n QrCodeLoginForm,\n SocialAndIdpLogin,\n PasswordLoginForm,\n PhoneCodeLoginForm,\n} from '../../../components/AuthingGuard/Forms'\nimport {\n OTP_MFA_CODE,\n APP_MFA_CODE,\n LOGIN_METHODS_MAP,\n} from '../../../components/AuthingGuard/constants'\nimport { AuthingTabs } from '../../AuthingTabs'\nimport {\n BaseFormProps,\n GuardScenes,\n LoginMethods,\n} from '../../../components/AuthingGuard/types'\n\nimport './style.less'\nimport { useTranslation } from 'react-i18next'\n\nconst useFormActions = () => {\n const { t } = useTranslation()\n\n const {\n setValue,\n state: { guardEvents, authClient },\n } = useGuardContext()\n\n const onSuccess = useCallback(\n (user: User) => {\n message.success(t('common.LoginSuccess'))\n guardEvents.onLogin?.(user, authClient)\n },\n [authClient, guardEvents, t]\n )\n\n const onFail = useCallback(\n (error: any) => {\n if (OTP_MFA_CODE === error?.code) {\n setValue('mfaData', error.data)\n setValue('guardScenes', GuardScenes.MfaVerify)\n }\n if (APP_MFA_CODE === error?.code) {\n setValue('mfaData', error.data)\n setValue('guardScenes', GuardScenes.AppMfaVerify)\n }\n guardEvents.onLoginError?.(error, authClient)\n },\n [authClient, guardEvents, setValue]\n )\n\n return {\n onFail,\n onSuccess,\n }\n}\n\nconst useNormalLoginTabs = ({ onSuccess, onFail }: BaseFormProps) => {\n const formRef = useRef<Record<LoginMethods, FormInstance>>(\n {} as Record<LoginMethods, FormInstance>\n )\n\n const formProps = {\n onFail,\n onSuccess,\n }\n\n const LOGIN_FORM_MAP = {\n [LoginMethods.Password]: (props: any) => (\n <PasswordLoginForm\n {...props}\n ref={(v) => (formRef.current[LoginMethods.Password] = v!)}\n />\n ),\n [LoginMethods.PhoneCode]: (props: any) => (\n <PhoneCodeLoginForm\n {...props}\n ref={(v) => (formRef.current[LoginMethods.PhoneCode] = v!)}\n />\n ),\n [LoginMethods.AppQr]: (props: any) => (\n <QrCodeLoginForm type={LoginMethods.AppQr} {...props} />\n ),\n [LoginMethods.WxMinQr]: (props: any) => (\n <QrCodeLoginForm type={LoginMethods.WxMinQr} {...props} />\n ),\n [LoginMethods.LDAP]: (props: any) => (\n <LdapLoginForm\n {...props}\n ref={(v) => (formRef.current[LoginMethods.LDAP] = v!)}\n />\n ),\n [LoginMethods.WechatMpQrcode]: (props: any) => (\n <QrCodeLoginForm type={LoginMethods.WechatMpQrcode} {...props} />\n ),\n [LoginMethods.AD]: (props: any) => (\n <ADLoginForm\n {...props}\n ref={(v) => (formRef.current[LoginMethods.AD] = v!)}\n />\n ),\n }\n\n const {\n state: { config },\n } = useGuardContext()\n const {\n loginMethods = [],\n loginMethodTitleMapping,\n qrcodeTabsSettings,\n } = config\n\n let tabs: any[] = []\n\n // 兼容 密码登陆 donglyc\n let filterLoginMethods = loginMethods.filter(\n (d) => d.indexOf('password') === -1\n )\n const hasPassword = loginMethods.some((d) => d.indexOf('password') !== -1)\n if (hasPassword) filterLoginMethods.push(LoginMethods.Password)\n\n filterLoginMethods.forEach((method: LoginMethods) => {\n if (\n [LoginMethods.WechatMpQrcode, LoginMethods.WxMinQr].includes(method) &&\n qrcodeTabsSettings[method]\n ) {\n tabs.push(\n ...qrcodeTabsSettings[method].map((idp) => {\n return {\n key: idp.id,\n label: idp.title || loginMethodTitleMapping[method],\n component: LOGIN_FORM_MAP[method]({\n ...formProps,\n idp,\n }),\n }\n })\n )\n } else {\n tabs.push({\n key: method,\n label: LOGIN_METHODS_MAP()[method],\n component: LOGIN_FORM_MAP[method](formProps),\n })\n }\n })\n return {\n tabs,\n }\n}\n\nconst SHOW_SOCIAL_LOGIN_TAB = [\n LoginMethods.LDAP,\n LoginMethods.Password,\n LoginMethods.PhoneCode,\n]\nexport const LoginLayout = () => {\n const {\n state: { activeTabs, config },\n setValue,\n } = useGuardContext()\n const { qrcodeTabsSettings } = config\n\n const { onFail, onSuccess } = useFormActions()\n const { tabs } = useNormalLoginTabs({ onSuccess, onFail })\n\n const activeKey = useMemo(() => {\n const activeTab = activeTabs[GuardScenes.Login]\n if (\n [LoginMethods.WechatMpQrcode, LoginMethods.WxMinQr].includes(activeTab) &&\n qrcodeTabsSettings[activeTab]\n ) {\n return qrcodeTabsSettings[activeTab].find((item) => item.isDefault)?.id\n }\n return activeTab\n }, [activeTabs, qrcodeTabsSettings])\n\n return (\n <>\n <AuthingTabs\n tabs={tabs}\n onTabClick={(t) =>\n setValue('activeTabs', {\n ...activeTabs,\n [GuardScenes.Login]: t,\n })\n }\n activeKey={activeKey}\n />\n\n {SHOW_SOCIAL_LOGIN_TAB.includes(activeTabs[GuardScenes.Login]) && (\n <SocialAndIdpLogin onFail={onFail} onSuccess={onSuccess} />\n )}\n </>\n )\n}\n","import { Lang, Protocol } from '../types'\nimport { SocialConnectionProvider } from 'authing-js-sdk'\n\nexport interface OIDCConnectionConfig {\n issuerUrl: string\n authorizationEdpoint: string\n responseType: string\n mode: OIDCConnectionMode\n clientId: string\n clientSecret: string\n scopes: string\n redirectUri: string\n}\n\nexport interface IOAuthConnectionConfig {\n authEndPoint: string\n tokenEndPoint: string\n scope: string\n clientId: string\n clientSecret: string\n authUrlTemplate: string\n codeToTokenScript: string\n tokenToUserInfoScript: string\n tokenToUserInfoScriptFuncId: string\n codeToTokenScriptFuncId: string\n authUrl?: string // 根据模板拼接出来的授权 url\n}\n\nexport interface IAzureAdConnectionConfig {\n microsoftAzureAdDomain: string\n clientId: string\n syncUserProfileOnLogin: string\n emailVerifiedDefault: boolean\n authorizationUrl: string\n callbackUrl: string\n}\n\nexport enum OIDCConnectionMode {\n FRONT_CHANNEL = 'FRONT_CHANNEL',\n BACK_CHANNEL = 'BACK_CHANNEL',\n}\n\nexport interface ISamlConnectionConfig {\n signInEndPoint: string\n samlRequest?: string\n\n // saml assertion 验签公钥\n\n samlIdpCert: string\n\n // saml request 验签公钥\n\n samlSpCert: string\n\n // saml request 签名私钥\n\n samlSpKey: string\n\n signOutEndPoint: string\n\n signSamlRequest: boolean\n\n signatureAlgorithm: string\n\n digestAlgorithm: string\n\n protocolBinding: string\n}\n\nexport interface ICasConnectionConfig {\n casConnectionLoginUrl: string\n}\nexport interface SocialConnectionItem {\n name: string\n name_en: string\n displayName: string\n logo: string\n description: string\n identifier: string\n provider: SocialConnectionProvider\n authorizationUrl: string\n tooltip: Record<Lang, string>\n}\n\nexport interface EnterpriseConnectionItem {\n id: string\n createdAt: Date\n updatedAt: Date\n userPoolId: string\n protocol: Protocol\n identifier: string\n displayName: string\n logo: string\n enabled: boolean\n config:\n | OIDCConnectionConfig\n | ISamlConnectionConfig\n | ICasConnectionConfig\n | IAzureAdConnectionConfig\n | IOAuthConnectionConfig\n}\n\nexport interface UserPoolConfig {\n name: string\n logo: string\n socialConnections: SocialConnectionItem[]\n enterpriseConnections: EnterpriseConnectionItem[]\n}\n\n// export const fetchUserPoolConfig = (userPoolId: string) =>\n// requestClient.get<UserPoolConfig>(\n// `/api/v2/userpools/${userPoolId}/public-config`\n// )\n","import { ConfigProvider, message } from 'antd'\nimport React, { FC } from 'react'\nimport { AuthenticationClient } from 'authing-js-sdk'\n\nimport { GuardContext } from '../context/global/context'\nimport { GuardScenes } from '../../components/AuthingGuard/types'\nimport { requestClient } from '../_utils/http'\nimport {\n defaultGuardConfig,\n OTP_MFA_CODE,\n APP_MFA_CODE,\n defaultLocalesConfig,\n defaultHeaders,\n} from '../../components/AuthingGuard/constants'\nimport { GuardLayout } from '../../components/AuthingGuard/GuardLayout'\nimport {\n UserConfig,\n GuardEventsHandler,\n} from '../../components/AuthingGuard/types/GuardConfig'\n\nimport './style.less'\nimport { initI18n } from '../_utils/locales'\nconst PREFIX_CLS = 'authing-ant'\n\nmessage.config({\n prefixCls: `${PREFIX_CLS}-message`,\n})\n\ninterface AuthingGuardProps extends GuardEventsHandler {\n appId: string\n tenantId?: string\n config?: UserConfig\n visible?: boolean\n className?: string\n id?: string\n}\n\nexport const AuthingGuard: FC<AuthingGuardProps> = ({\n appId,\n tenantId,\n config = {},\n visible,\n className,\n id,\n ...guardEvents\n}) => {\n const {\n apiHost,\n appDomain,\n appHost,\n defaultLoginMethod = defaultGuardConfig.defaultLoginMethod,\n defaultScenes = defaultGuardConfig.defaultScenes,\n defaultRegisterMethod = defaultGuardConfig.defaultRegisterMethod,\n lang,\n localesConfig = defaultLocalesConfig,\n headers = defaultHeaders,\n } = config\n\n initI18n(localesConfig, lang)\n\n let realHost: string | undefined\n if (appHost) {\n realHost = appHost\n } else if (appDomain) {\n const parsedUrl = new URL(defaultGuardConfig.appHost!)\n realHost = `${parsedUrl.protocol}//${appDomain}${\n parsedUrl.port ? ':' + parsedUrl.port : ''\n }`\n } else {\n realHost = apiHost || defaultGuardConfig.appHost!\n }\n\n requestClient.setBaseUrl(realHost)\n requestClient.setLangHeader(headers?.lang)\n\n if (tenantId) {\n requestClient.setTenantHeader(headers?.['tenant-id'])\n requestClient.setTenantId(tenantId)\n }\n\n const authClient = new AuthenticationClient({\n appHost: realHost!,\n appId,\n tenantId,\n requestFrom: 'ui-components',\n lang: localesConfig.defaultLang ?? lang,\n headers,\n onError: (code, msg: any) => {\n if (code === 2020) {\n return\n }\n if ([OTP_MFA_CODE, APP_MFA_CODE].includes(code)) {\n message.info(msg)\n return\n }\n message.error(msg)\n },\n })\n\n const activeTabs = {\n [GuardScenes.Login]: defaultLoginMethod,\n [GuardScenes.Register]: defaultRegisterMethod,\n }\n\n return (\n <ConfigProvider prefixCls={PREFIX_CLS}>\n <GuardContext\n value={{\n authClient,\n config: { ...config },\n userConfig: config,\n appId,\n guardScenes: defaultScenes,\n activeTabs,\n guardTitle: config.title,\n mfaData: {\n mfaToken: '',\n },\n guardEvents,\n localesConfig: config.localesConfig,\n realHost: realHost,\n }}\n >\n <GuardLayout\n id={id}\n className={className}\n visible={visible}\n lang={lang}\n userConfig={config}\n />\n </GuardContext>\n </ConfigProvider>\n )\n}\n","import React, { useState } from 'react'\nimport ReactDOM from 'react-dom'\nimport reportWebVitals from './reportWebVitals'\nimport { Guard, GuardMode } from './components'\nimport { Button } from 'antd'\nimport * as _ from 'face-api.js'\nconst App = () => {\n const [show, setShow] = useState(false)\n const [num, setNum] = useState(1)\n return (\n <div\n style={{\n display: 'flex',\n width: '100vw',\n justifyContent: 'center',\n WebkitUserSelect: 'none',\n minHeight: '100vh',\n background: '#F5F7FA',\n }}\n >\n <Button\n onClick={() => {\n setNum(num + 1)\n setShow(true)\n }}\n >\n show\n </Button>\n <Guard\n appId=\"624700d59a2aeb0467b85307\"\n // facePlugin={_}\n // visible={show}\n config={\n {\n // mode: GuardMode.Modal,\n // host: 'https://susantest.pre.authing.cn/',\n // host: 'https://ceeefeopjemd-demo.authing.localhost',\n // host: 'https://app.nps.teamory.cn/',\n // mode: GuardMode.Modal,\n // host: 'https://hdndlegehkomkpoa-demo.test.authing-inc.co',\n }\n }\n // visible={true}\n />\n {num}\n </div>\n )\n}\n\nReactDOM.render(<App />, document.getElementById('root'))\n\nreportWebVitals()\n"],"sourceRoot":""}