@authing/react-ui-components 4.0.14-tn.0 → 4.0.15-beta.0

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/guardDocument.ts","components/Type/application.ts","reportWebVitals.ts","components/_utils/locales/index.ts","components/Guard/core/useAppendConfig.tsx","components/_utils/appendConfig.ts","components/IconFont/iconfont.ts","components/IconFont/index.tsx","components/_utils/context.tsx","components/ChangeLanguage/index.tsx","components/_utils/popupCenter.ts","components/_utils/index.ts","components/_utils/logger/interface.ts","components/_utils/corsVerification.ts","components/_utils/logger/index.ts","components/Guard/module.ts","components/_utils/config/index.ts","components/Guard/authClient.ts","components/Type/index.ts","components/AuthClientProvider/context.tsx","components/AuthClientProvider/AuthClientProvider.tsx","components/version/version.tsx","components/version/index.tsx","components/Guard/event.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/flowHandleStorage.ts","components/_utils/http.ts","components/_utils/responseManagement/index.ts","components/_utils/guardHttp.ts","components/_utils/GuardErrorCode.ts","components/Guard/sso.ts","components/Guard/core/hooks/useMultipleAccounts.ts","components/Guard/core/renderContext.tsx","components/_utils/initAppId.ts","components/IconFont/useGuardIconfont.ts","components/_utils/hooks/index.ts","components/BindTotp/businessRequest.ts","components/GuardButton/GuardButton.tsx","components/SubmitButton/index.tsx","components/MFA/interface.ts","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/BindTotp/index.tsx","components/Back/index.tsx","components/ValidatorRules/useCheckRepeat.ts","components/ValidatorRules/ValidatorFormItem.tsx","components/ValidatorRules/index.ts","components/ValidatorRules/PasswordFormItem.tsx","components/ChangePassword/businessRequest.ts","components/InputPassword/index.tsx","components/_utils/useErrorText.tsx","components/ChangePassword/core/completePassword.tsx","components/CompleteInfo/interface.ts","components/ChangePassword/core/firstLoginReset.tsx","components/ChangePassword/core/rotateReset.tsx","components/ChangePassword/core/PasswordNotSafeReset.tsx","components/ChangePassword/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/UploadImage/index.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/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/hooks/useLoginMultiple.ts","components/Login/core/withPassword/index.tsx","components/Login/core/withLDAP.tsx","components/Login/core/withAD.tsx","components/Qrcode/UiQrCode.tsx","components/Qrcode/hooks/useStatus.tsx","components/Qrcode/hooks/useImage.ts","components/Qrcode/hooks/usePreQrCode.ts","components/Qrcode/WorkQrCode.tsx","components/Qrcode/hooks/usePostQrCode.ts","components/Qrcode/index.ts","components/Login/core/withAppQrcode.tsx","components/MFA/businessRequest.ts","components/Login/core/withWechatMiniQrcode.tsx","components/Login/core/withWechatmpQrcode.tsx","components/Login/codemap.ts","components/Login/socialLogin/IdpButton/index.tsx","components/Login/socialLogin/index.tsx","components/Login/socialLogin/postMessage.ts","components/Login/multipleAccounts/panel.tsx","components/Login/multipleAccounts/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/WithCode.tsx","components/Register/index.tsx","components/SubmitSuccess/index.tsx","components/SelfUnlock/core/selfUnlock.tsx","components/IdentityBinding/IdentityBinding.tsx","components/IdentityBindingAsk/IdentityBindingAsk.tsx","components/Guard/core/renderModule.tsx","components/SelfUnlock/index.tsx","components/GuardFace/index.tsx","components/GuardSelect/index.tsx","components/TenantPortalSelect/index.tsx","components/_utils/responseManagement/interface.ts","components/Guard/core/usePlugin.ts","components/Guard/core/index.tsx","components/Guard/Guard.tsx","examples.tsx"],"names":["guardDocument","LoginMethods","OIDCConnectionMode","SocialConnectionProvider","Protocol","RegisterMethods","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","LanguageResources","translation","enUsTrans","zhCnTrans","zhTwTrans","jaJpTrans","fallbackLng","code","fallbacks","startsWith","push","includes","toLocaleLowerCase","initGuardI18n","options","callback","a","defaultLanguage","detectionOrder","lng","undefined","i18nOptions","detection","order","lookupLocalStorage","resources","debug","interpolation","escapeValue","i18n","use","LanguageDetector","initReactI18next","init","getGuardDocument","getGuardWindow","window","guardWindow","defaultView","useInitGuardAppendConfig","setForceUpdate","appId","appendConfig","useEffect","Date","now","initAppendConfig","publicConfig","setPublicConfig","pageConfig","setPageConfig","GenerateSvg","svgString","svgDOM","tempDiv","createElement","innerHTML","tempSVG","getElementsByTagName","setAttribute","id","style","position","width","height","overflow","body","firstChild","insertBefore","appendChild","readyState","setTimeout","addEventListener","loadedFn","removeEventListener","IconFont","type","className","getClassnames","xlinkHref","DefaultGuardX","finallyConfig","defaultMergedConfig","httpClient","initData","currentModule","events","isAuthFlow","contextLoaded","guardPageConfig","multipleInstance","isMultipleAccount","instance","referMultipleState","multipleAccountData","clearBackFillData","GuardXContext","React","createContext","GuardButtonContext","spin","spinChange","useGuardButtonState","useContext","useGuardPublicConfig","useGuardHttpClient","useGuardAppId","useGuardTenantId","tenantId","useGuardInitData","useGuardEvents","useGuardModule","guardX","changeModule","backModule","useGuardFinallyConfig","useGuardIsAuthFlow","useGuardMultipleInstance","LngTextMapping","label","ChangeLanguage","props","langRange","onLangChange","useTranslation","onChangeLng","useCallback","changeLanguage","showChangeLng","useMemo","global","showChangeLanguage","currentLng","Object","keys","language","currentLngText","lngMenu","menuItem","filter","map","key","isCurrent","Item","onClick","length","overlay","trigger","placement","overlayClassName","getPopupContainer","node","parentElement","popupCenter","url","w","h","document","dualScreenLeft","screenLeft","screenX","dualScreenTop","screenTop","screenY","innerWidth","documentElement","clientWidth","screen","innerHeight","clientHeight","systemZoom","availWidth","left","top","newWindow","open","focus","VALIDATE_PATTERN","email","phone","ip","host","username","validate","val","test","fieldRequiredRule","fieldRequiredRuleMessage","required","validateTrigger","message","t","name","whitespace","getDeviceName","userAgent","navigator","platform","os","indexOf","insertedRecord","appConfig","userConfig","classnames","Boolean","join","PasswordStrength","getUserRegisterParams","params","query","qs","parse","location","search","ignoreQueryPrefix","value","item","isWeChatBrowser","isLarkBrowser","isDingtalkBrowser","isSpecialBrowser","match","parser","UAParser","browser","LoggerType","PASSWORD_STRENGTH_TEXT_MAP","NoCheck","placeholder","validateMessage","Low","Middle","High","AUTO","SYMBOL_TYPE_PATTERNS","getSymbolTypeLength","pwd","pattern","getPasswordValidate","strength","customPasswordStrength","getCustomPassword","zhMessageOpen","zhMessage","enMessageOpen","enMessage","jaMessageOpen","jaMessage","jpMessageOpen","jpMessage","twMessageOpen","twMessage","validateMap","validator","r","v","Promise","reject","resolve","regex","sleep","delay","getDocumentNode","nodeName","parentNode","getLoginTypePipe","registerMethod","loginTabs","list","verifyCodeTabMethods","verifyCodeTabConfig","enabledLoginMethods","passwordTabMethods","passwordTabConfig","Phone","PhoneCode","specifyDefaultLoginMethod","lockMethod","Password","EmailCode","Email","getPasswordIdentify","identity","getCurrentLng","languages","isOriginMatched","whitelist","corsWhitelist","origin","wildcard","require","some","allowedOrigin","corsVerification","allowedOrigins","allowed","Error","Logger","INFO","log","console","JSON","stringify","this","WARN","ERROR","printType","GuardModuleType","publicConfigMap","getPublicConfig","config","pageConfigMap","getPageConfig","requestPublicConfig","get","res","error","data","setUserpoolId","userPoolId","requestGuardPageConfig","mergedPublicConfig","title","logo","loginMethods","passwordLoginMethods","defaultLoginMethod","default","disableResetPwd","ssoPageComponentDisplay","forgetPasswordBtn","autoRegister","autoRegisterThenLoginHintInfo","registerMethods","registerTabs","defaultRegisterMethod","disableRegister","registerBtn","publicKey","agreementEnabled","agreements","contentCss","css","assembledRequestHost","__internalRequest__","requestHostname","configHost","identifier","split","hostUrl","URL","splitHost","hostname","shift","port","protocol","utilAssembledRequestHost","authClient","GuardMode","AuthClientContext","useGlobalAuthClient","authClientContext","client","version","checkAuthClientProps","useGuardAuthClient","getGuardAuthClient","guardEventsFilter","openEventsMapping","eventsNameWhiteList","forEach","eventName","oldEvents","wrapperEvents","user","setUserInfo","guardEventsHijacking","eventsMapping","onLogin","success","token","setToken","setCurrentUser","onRegister","newEvents","eventsKey","InputMethod","GuardPageSene","EmailScene","defaultG2Config","escCloseable","clickCloseable","mode","Normal","getDefaultG2Config","defaultConfig","getDefaultRegisterConfig","_extends","assign","target","i","arguments","source","prototype","hasOwnProperty","call","apply","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","transform","fillRule","strokeWidth","d","SvgLoading","_ref","svgRef","titleId","viewBox","xmlns","xmlnsXlink","ref","ActionType","ForwardRef","ShieldSpin","size","customLoading","src","alt","Spin","isSSO","defaultInitData","showLoading","_closeLoopCheckQrcode","loadingComponent","flowHandleStorage","GuardStateMachine","changeModuleEvent","moduleStateHistory","stateMachineLog","uninstallPopstate","globalWindow","onPopstate","next","nextModule","moduleData","moduleName","prevModuleData","slice","isUseHistoryHijack","history","pushState","href","isEqual","back","historyPush","splice","end","actionType","ChangeModule","unshift","action","date","getTime","dataSource","historyBack","Back","setConfig","Init","getFlowHandle","updateFlowHandle","flowHandle","requestClient","fetch","json","timeoutAction","cancel","timer","path","headers","langHeader","tenantHeader","CancelToken","Axios","race","baseUrl","addQueryPrefix","method","withCredentials","cancelToken","post","postForm","formData","setBaseUrl","base","replace","DEFAULT_LANG_HEADER","setLangHeader","setTenantHeader","setTenantId","InterceptorName","errorCodeInterceptor","callBack","statusCode","num","apiCode","Math","floor","ApiCode","FLOW_END","CodeAction","CHANGE_MODULE","RENDER_MESSAGE","ErrorCode","GuardHttp","responseInterceptorMap","Map","getHeaders","responseIntercept","authFlow","requestData","initErrorCodeInterceptor","has","ERROR_CODE","set","Array","from","values","reduce","acc","cur","getRequestClient","userpoolId","getGuardHttp","useGuardHttp","trackSession","MULTIPLE_ACCOUNT_KEY","MULTIPLE_ACCOUNT_LISTS","QR_CODE_WAY","EXCLUDE_CODE_WAY","concat","MultipleAccount","originAccount","originWay","originStore","currentStore","initStore","serverSideLoginMethods","isInternationSms","localStorage","getItem","getCurrentStore","initMemberState","backfillData","memberState","firstBackFillData","memberStateCount","qrCount","normalCount","initBackfillData","tab","initWay","wayLists","find","way","account","getAccountByWay","qrCodeId","phoneCountryCode","areaCode","getServerLoginMethodByFront","front","ldap","ad","password","result","create","entries","passMethod","validateMethod","validateInternationSms","cloneDeep","currentIsInternationSms","serverWay","setLoginWay","internation","tabStatus","loginWay","photo","nickname","_updateTime","saveStore","newStore","setItem","setLoginWayByHttpData","setLoginWayByLDAPData","delUserById","getMemoUser","excludeWays","_mappingUser","sort","b","getMemoSingleUser","userId","currentUser","description","parseInt","getStore","getMemberState","getFirstBackFillData","getOriginAccount","getOriginWay","useMultipleAccounts","useState","setMultipleAccount","setMultipleAccountData","storeInstance","setStoreInstance","changeMultipleState","updateBackFillData","initFirstState","enableLoginAccountSwitch","configLists","internationalSmsConfig","enabled","RenderContext","guardProps","initState","children","forceUpdate","setEvents","authClint","setAuthClint","setHttpClient","cdnBase","setCdnBase","setError","setIsAuthFlow","i18nInit","setI18nInit","propsAppid","propsAuthClient","globalAuthClient","useInitAppId","guardStateMachine","setGuardStateMachine","Provider","Consumer","useReducer","state","payload","moduleState","onChangeModule","onBeforeChangeModule","mergedConfig","setMergedConfig","useMergeDefaultConfig","guardHttp","initGuardHttp","setAppId","initPublicConfig","all","useFetchConsoleConfig","sdkClient","globalClient","setClient","lang","AuthenticationClient","appHost","requestFrom","onError","msg","useInitGuardAuthClient","iconfontLoaded","loaded","setLoaded","initIconfont","useGuardIconfont","sessionData","typedData","userInfo","styles","recordKey","styleElt","styleSheet","createStyleSheet","head","styleSheets","cssText","selector","insertRule","rule","addRule","insertStyles","removeChild","removeStyles","__unAuthFlow__","moduleEvents","onLoad","contextValues","renderContext","RenderErrorContext","onLoadError","SocialConnectionEvent","HIDE_SOCIALS","HIDE_SOCIALS_SHOWIN_ENTERPRISE","useMediaSize","isPhoneMedia","useMediaQuery","maxWidth","parsePhone","fieldValue","countryCode","phoneNumber","country","isValid","BindTotpBusinessAction","useMethod","enterpriseConnectionObjs","socialConnectionObjs","noLoginMethods","enterpriseConnections","identityProviders","socialConnections","socials","provider","connection","hiddenSocialConnection","wechatDisplayButtonsMessage","WECHATPC","GITHUB","QQ","APPLE_WEB","ALIPAY","LINKEDIN","BAIDU","GOOGLE","WEIBO","FACEBOOK","SLACK","DINGTALK","hiddenSocialConnectionInWeChatBrowser","Message","Auth","qqbuiltDisplayButtonsMessage","WECHATMP","WECHATWORK_CORP_QRCONNECT","hiddenSocialConnectionInQQBuiltInBrowser","weWorkBuiltDisplayButtonsMessage","hiddenSocialConnectionInWeWorkBuiltInBrowser","dingTalkDisplayButtonsMessage","hiddenSocialConnectionInDingtalkBrowser","larkDisplayButtonsMessage","hiddenSocialConnectionInLarkBrowser","pcDisplayButtonsMessage","hiddenSocialConnectionInPCBrowser","isHost","postMessage","isNoMethod","socialLoginBtns","idpBtns","GuardButton","isLockButtonClick","buttonClassName","e","SubmitButton","buttonSpin","setSpin","shaking","setShaking","inputs","getElementsByClassName","saftyCode","bindTotpSecretSave","MountShaking","input","classList","add","agreement","UnMountShaking","remove","useShaking","timeOut","clearTimeout","useImperativeHandle","text","onSpin","sp","propsCls","htmlType","loading","disabled","forwardRef","MFAType","content","Paragraph","BindSuccess","secret","onBind","submitButtonRef","useRef","useForm","form","bindSuccess","current","validateFields","ConfirmTotpRecoveryCode","isFlowEnd","onGuardHandling","copyable","onFinish","onFinishFailed","rules","_","valuePropName","ImagePro","borderRadius","noSpin","imgProps","draggable","VerifyCodeFormItem","codeLength","ruleKeyword","formItemProps","validateFirst","min","VerifyCodeInput","gutter","onEenter","showDivider","onChangeProps","onChange","rest","inputRef","codeInputRef","fromClipboard","verifyCode","setVerifyCode","focusIndex","setFocusIndex","codes","handleChange","index","isNaN","String","el","pasteEvent","preventDefault","stopPropagation","paste","clipboardData","getData","_i","fill","onFocus","minWidth","minHeight","lineHeight","marginLeft","autoFocus","onKeyDown","evt","currentVal","handleKeyDown","maxLength","persist","nativeEvent","isComposing","nextValue","preValue","changeValue","SecurityCode","mfaToken","qrcode","onNext","useAsyncFn","getFieldValue","VerifyTotpFirstTime","totp","authenticator_type","authorization","bindTotp","textAlign","color","cursor","DOWNLOAD_AT","onSubmitCapture","BindTotpType","BackLogin","onBack","LOGIN","isRender","renderBack","REGISTER","defaultScenes","fontSize","display","BackCustom","GuardBindTotpView","setSecret","setQrcode","setUser","SECURITY_CODE","bindTotpType","setBindTotpType","LOGIN_INVALID","recovery_code","qrcode_data_url","bindInfo","fetchBindInfo","renderContent","BIND_SUCCESS","MFA","TOTP","resUser","useCheckRepeat","checkFn","setTimer","timeout","ValidatorFormItem","checkRepeat","checkExist","isCheckPattern","checkInternationalSms","methodContent","field","checkRepeatErrorMessage","formatErrorMessage","checkExistErrorMessage","checkRepeatFn","formatRules","CustomFormItem","FormItem","fromItemProos","passwordStrength","userPasswordStrength","userCustomPasswordStrength","UserName","ChangePasswordBusinessAction","InputPassword","autoComplete","iconRender","visible","alignItems","usePasswordErrorText","show","setPasswordErrorTextShow","getPassWordUnsafeText","marginBottom","CompletePassword","businessRequestName","isChangeComplete","onRegisterSuccess","onRegisterFailed","encrypt","encryptFunction","REGISTER_COMPLETE_INFO","postUserInfoPipeline","UNSAFE_PASSWORD_TIP","onRegisterError","prefix","FormValidateRule","CompleteInfoBaseControls","CompleteInfoExtendsControls","OmitCompleteInfo","FirstLoginReset","onReset","newPassword","ABORT_FLOW","resetPasswordByFirstLoginToken","RotateReset","onFinishCallBack","oldPassword","ResetPassword","resetPasswordByForceResetToken","PasswordNotSafeReset","ResetPasswordStrengthDetection","GuardChangePassword","explain","typeContent","GuardFirstLoginPasswordResetView","coreForm","GuardPasswordNotSafeResetView","GuardForcedPasswordResetView","number","forcedCycle","GuardNoticePasswordResetView","GuardRegisterCompletePasswordView","CompleteInfoAuthFlowAction","isPhone","propsValue","InputNumber","inputProps","setValue","valueChange","SendCodeBtn","sendDesc","beforeSend","btnRef","setSent","buttonProps","effect","countDown","setCountDown","timerRef","clearInterval","send","setInterval","prev","useSentCounter","setLoading","time","SendCode","autoSubmit","justify","align","span","submit","offset","SendCodeByEmail","scene","onSendCodeBefore","fieldName","remainProps","sendEmail","status","tips","onEmailSend","onEmailSendError","catch","SendCodeByPhone","sendPhone","onPhoneSend","onPhoneSendError","isoInfo","iso","regions","regions_en","VirtualDropdown","info","region","region_en","showSearch","dropdownClassName","bordered","listHeight","optionLabelProp","dropdownMatchSelectWidth","filterOption","option","toLowerCase","suffixIcon","InputInternationPhone","onAreaCodeChange","formValue","UploadImage","uploading","setUploading","uploadButton","PlusOutlined","marginTop","accept","listType","showUploadList","file","response","errMsg","spinning","CompleteInfo","metaData","businessRequest","verifyCodeLength","countryList","setCountryList","defaultISOType","setAreaCode","loadInitCountryList","countryMap","zh","en","PhoneAccount","baseControlMap","gender","image","datetime","select","dropdown","boolean","string","internalControlMap","SceneType","SCENE_TYPE_COMPLETE_PHONE","INFORMATION_COMPLETION_VERIFY_CODE","getMetaDateLabel","fieldsI18n","extendsFieldsI18n","generateRules","formRules","validateRules","DATE_TIME","errorMessage","RegExp","replaceAll","inputElement","userFormItem","formFieldsV2","fieldKeys","fieldValues","baseData","phoneCode","emailCode","checkResult","checkCode","valid","checkMessage","layout","DownloadType","fnName","profile","phoneToken","emailToken","registerSkipMethod","registerRequest","registerFnName","registerContent","registerProfile","Skip","Complete","fieldValuesToRegisterProfile","extendsFields","udf","fieldType","GuardCompleteInfo","skipComplateFileds","skipLoading","setSkipLoading","onSkip","GuardLoginCompleteInfoView","skip","resData","methods","GuardRegisterCompleteInfoView","selectOptions","setSelectOptions","setMetaData","loadSelectOptions","onRegisterInfoCompleted","onRegisterInfoCompletedError","inputType","extendsFieldsToMetaData","InputMethodMap","GuardDownloadATView","downloadConfig","IOS","google","microsoft","Android","renderTab","TabPane","defaultActiveKey","GuardErrorView","propsInitData","guardXInitData","messages","justifyContent","backgroundImage","backgroundSize","dangerouslySetInnerHTML","__html","FindMethodConversion","FormItemIdentify","currentMethod","checkValue","renderTemplate","InputIdentify","verifyCodeMethodsText","renderInput","identify","setIdentify","codeMethod","setCodeMethod","tempPassword","context","SCENE_TYPE_RESET","RESET_PASSWORD_VERIFY_CODE","GuardForgetPassword","onPwdResetError","onPwdReset","SUBMIT_SUCCESS","FormItemAccount","formItemPtops","runderTemplate","InputAccount","loginMethodsText","runderInput","GraphicVerifyCode","verifyCodeUrl","changeCode","Agreements","showError","acceptList","setAcceptList","isAccept","every","checked","useLoginMultipleBackFill","formKey","isOnlyInternationSms","cancelBackfill","changeCurrentMethod","parseFillData","matchLoginWay","setFieldsValue","LoginWithPassword","onLoginFailed","onLoginSuccess","saveIdentify","_firstItemInitialValue","acceptedAgreements","setAcceptedAgreements","validated","setValidated","showCaptcha","setShowCaptcha","setVerifyCodeUrl","remainCount","setRemainCount","accountLock","setAccountLock","getCaptchaUrl","pathname","loginRequest","loginInfo","onLoginRequest","loginData","mergeAdAndAccountPasswordLogin","trim","captchaCode","customData","withCustomData","onBeforeLogin","onLoginRes","INPUT_CAPTCHACODE","PASSWORD_ERROR","ACCOUNT_LOCK","MULTIPLE_ERROR_LOCK","handMode","submitText","submitButText","onValuesChange","changedValues","initialValue","LoginWithLDAP","captchaUrl","LDAP","addonAfter","LoginWithAD","AD","encryptPassword","api","credentials","fetchRes","userPasswordInput","QrCode","descriptions","containerStyle","imageStyle","onClickMaskEl","onMaskContent","classes","ready","already","expired","useStatus","statusCls","statusComponent","preFetchImage","axios","responseType","blob","fileReader","FileReader","onload","base64","readAsDataURL","useImage","Loading","cloneElement","UiQrCode","memo","reducer","WorkQrCodeComponent","sleepTime","onStatusChange","onClickMaskContent","qrCodeScanOptions","extIdpConnId","genCodeRequest","autoMergeQrCode","random","dispatch","usePreQrCode","checkedRequest","exchangeUserInfo","ticket","request","destroy","readyCheckedRequest","alreadyCheckedRequest","getStatusByRes","processReady","uniteRequestHandler","processAReady","processSuccess","processExpired","processCancel","processMFA","processError","emitEvents","processFlowByResponse","changeStatus","processResponseFlow","processLoading","flowHandlers","handler","useQrCode","referQrCode","formatterDescriptions","formatDescriptions","parseKey","processDefaultMaskClick","UI","MfaBusinessAction","LoginWithAppQrcode","codeRef","canLoop","AppQr","scannedResult","LoginWithWechatMiniQrcode","WxMinQr","LoginWithWechatmpQrcode","WechatMpQrcode","codeMap","APP_MFA_CODE","module","OTP_MFA_CODE","totpMfaEnabled","IDENTITY_BINDING","IDENTITY_BINDING_ASK","LOGIN_COMPLETE_INFO","baseLoginPathMapping","OIDC","SAML","CAS","OAUTH","AZURE_AD","AD_KERBEROS","loginUrlFieldMapping","IdpButton","initUrl","from_guard","app_id","guard_version","tenant_id","from_hosted_guard","redirected","redirect_url","iconType","block","icon","marginRight","displayName","name_en","basePath","renderBtn","SocialLogin","onMessage","event","parsedMessage","authingCode","authingMessage","authingResData","usePostMessage","onPostMessage","idpButtons","socialLoginButtons","querystring","shape","socialConnectionsBtnShape","tooltip","overlayStyle","fontFamily","idp","socialLogin","direction","flex","SelectPanel","lists","handleDel","triggerWay","finallyLists","operation","element","onDel","renderLits","triggerNode","MultipleAccountsFC","setState","MultipleAccounts","LoginWithVerifyCode","_lockMethod","setCurrentMethod","setInternationSms","SCENE_TYPE_LOGIN","LOGIN_VERIFY_CODE","loginByPhoneCode","reqContent","loginByEmailCode","AreaCodePhoneAccount","inputWays","qrcodeWays","GuardLoginView","dlm","propsMethods","intersection","useMethods","defaultMethod","renderInputWay","renderQrcodeWay","multipleQrWay","onBackFillData","qrCodeDefaultTab","useLayoutEffect","defaultQrWay","useLoginMultiple","setCanLoop","qrcodeTabsSettings","errorNumber","setErrorNumber","identifyRef","tags","isTenantConsole","isTenantDefault","ms","firstInputWay","firstQRcodeWay","useDisables","verifyCodeLogin","hiddenTab","scanLogins","defaultQrCodeWay","isDefault","onLoginError","switchText","inputNone","qrcodeNone","useSwitchStates","agree","availableAt","verifyLoginMethods","containerDOM","innerContainer","querySelector","welcomeMessage","it","backgroundColor","destroyInactiveTabPane","k","onLoginTabChange","activeKey","FORGET_PWD","margin","ANY_QUESTIONS","facePluginInstance","FaceErrorName","VerifyEmail","VerifySms","VerifyTotp","VerifyFace","AssociateFace","photoA","photoB","isExternalPhoto","useMfaBusinessRequest","isFlow","BindMFAEmail","VerifyMFAEmail","onVerify","sendCodeRef","sent","sendVerifyCode","MFA_VERIFY_CODE","mfaCode","mail","mailArr","substr","mailName","mailDesensitization","MFAEmail","userEmail","mfaLogin","setEmail","click","BindMFASms","VerifyMFASms","userPhone","phoneDesensitization","sendSmsCode","SCENE_TYPE_MFA_VERIFY","MFASms","setPhone","getFacePlugin","devicesConstraints","video","getFaceDetectorOptions","facePlugin","TinyFaceDetectorOptions","inputSize","scoreThreshold","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","FormData","append","getBase64","videoDom","canvas","ctx","getContext","clearRect","drawImage","toDataURL","faceBind","faceCheck","quitIdentifying","faceMfaEnabled","goToCheckScene","goToBindScene","autoShoot","paused","ended","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","m","__message","DescribeQuestions","typeProblemMap","0","1","2","3","4","5","6","typeOperations","uploadUrl","setUploadUrl","previewVisible","setPreviewVisible","previewImage","setPreviewImage","fileList","setFileList","typeProblem","setTypeProblem","textMap","handlePreview","reader","originFileObj","images","onSuccess","Option","TextArea","showCount","rows","onPreview","imgUrl","beforeUpload","itemRender","n","padding","border","showInfo","footer","onCancel","GuardNeedHelpView","IdentityBindingBusinessAction","IdentityBindingAction","SaveCode","UseCode","onSubmit","RecoveryTotp","recoveryCode","RecoveryCode","setCode","RecoveryCodeAuthFlow","setRecoveryCode","GuardRecoveryCodeView","useIsChangeComplete","currentMode","complateFiledsPlace","omit","RegisterWithEmail","onBeforeRegister","registeContext","device","forceLogin","generateToken","clientIp","onRegisterSuccessIntercept","registerFrom","RegisterWithCode","isPhoneChangeComplete","isEmailChangeComplete","registerByPhoneCode","needPassword","enableCompletePassword","REGISTER_PASSWORD","errMessage","registerByEmailCode","registerMessage","SCENE_TYPE_REGISTER","REGISTER_VERIFY_CODE","GuardRegisterView","verifyRegisterMethods","registerContextProps","registerInfo","loginInitData","registerContext","tabMapping","component","supportRegisterMethods","defaultValue","tabList","tabSort","Set","onRegisterTabChange","GuardSubmitSuccessView","__changeModule","countDesc","useIdentityBindingBusinessRequest","BindByPhoneCode","BindByEmailCode","BindByPassword","GuardIdentityBindingView","phoneCodeRequest","emailCodeRequest","PasswordRequest","bindMethodsMap","onBinding","onBindingError","loginMethodsBase","codeLoginMethods","GuardIdentityBindingAskView","onCreate","onCreateError","CreateUser","createLoading","createAccount","LangMAP","SelfUnlock","defaultEmail","defaultPhone","selfUnlockStrategy","encryptPassWord","SELF_UNLOCKING_VERIFY_CODE","GuardUnlockView","GuardFace","avatar","avatarProps","tag","GuardSelect","onSelect","gap","listProps","classNames","renderItem","actions","extra","Meta","GuardTenantPortalSelectView","handleSelect","tenantName","userName","tenantLogo","PREFIX_CLS","prefixCls","langMap","zhCn","zhCN","enUs","enUS","jaJp","jaJP","RenderModule","GuardButtonProvider","useGuardButtonContext","FIRST_LOGIN_PASSWORD","NOTICE_PASSWORD_RESET","FORCED_PASSWORD_RESET","SELF_UNLOCK","UNSAFE_PASSWORD_RESET","TENANT_PORTAL","codeAction","ChangeModuleApiCodeMapping","nextData","newData","renderModule","toString","renderGuardContent","locale","Modal","closeIcon","closable","onClose","keyboard","maskClosable","getContainer","useGuardFacePlugin","guardFace","initFacePlugin","GuardCore","plugin","useGuardPlugin","propsAreEqual","pre","preAttribute","currentAttribute","GuardPropsFilter","Guard","guardWindowMount","mounted","initGuardDocument","APP_MFA","COMPLETE_INFO","UNLOCK","App","WebkitUserSelect","background","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.abc48f5a.chunk.js","sourcesContent":["let guardDocument: Document\n\nexport const getGuardDocument = (): Document => {\n return guardDocument\n}\n\nexport const useAppendConfig = getGuardDocument\n\nexport const initGuardDocument = (document: Document) => {\n guardDocument = document\n}\n","import { Lang } from '..'\nimport { PasswordStrength } from '../_utils'\nexport * from 'authing-js-sdk'\n\nexport const 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 const enum OIDCConnectionMode {\n FRONT_CHANNEL = 'FRONT_CHANNEL',\n BACK_CHANNEL = 'BACK_CHANNEL',\n}\n\nexport const enum SocialConnectionProvider {\n ALIPAY = 'alipay',\n GOOGLE = 'google',\n WECHATPC = 'wechat:pc',\n WECHATMP = 'wechat:webpage-authorization',\n WECHAT_MINIPROGRAM = 'wechat:miniprogram:default',\n WECHAT_MINIPROGRAM_QRCODE = 'wechat:miniprogram:qrconnect',\n WECHAT_MINIPROGRAM_APPLAUNCH = 'wechat:miniprogram:app-launch',\n WECHATMOBILE = 'wechat:mobile',\n GITHUB = 'github',\n QQ = 'qq',\n WECHATWORK_ADDRESS_BOOK = 'wechatwork:addressbook',\n WECHATWORK_CORP_QRCONNECT = 'wechatwork:corp:qrconnect',\n WECHATWORK_SERVICEPROVIDER_QRCONNECT = 'wechatwork:service-provider:qrconnect',\n DINGTALK = 'dingtalk',\n WEIBO = 'weibo',\n APPLE = 'apple',\n APPLE_WEB = 'apple:web',\n LARK_PUBLIC = 'lark-public',\n LARK_INTERNAL = 'lark-internal',\n BAIDU = 'baidu',\n LINKEDIN = 'linkedin',\n SLACK = 'slack',\n YIDUN = 'yidun',\n QINGCLOUD = 'qingcloud',\n FACEBOOK = 'facebook',\n}\n\nexport const 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 AD_KERBEROS = 'ad-kerberos',\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 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}\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 const enum RegisterMethods {\n Email = 'email',\n Phone = 'phone',\n EmailCode = 'emailCode',\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}\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 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'\n\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 defaultISOType: string\n }\n // 登录框自定义 css 代码\n css: string\n customLoading?: string\n name: string\n logo: string\n description?: string\n redirectUris: string[]\n registerDisabled: boolean\n mergeAdAndAccountPasswordLogin: boolean\n registerTabs: {\n list: string[]\n default: string\n title: { [x: string]: string }\n }\n registerTabsConfig: {\n list: string[]\n default: string\n title: { [x: string]: string }\n registerTypeConfig: {\n emailRegisterType?: RegisterMethods[]\n phoneRegisterType?: RegisterMethods[]\n }\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 extendsFieldsI18n?: {\n [key: string]: Record<Lang, { enabled: boolean; value: string }>\n }\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 selfUnlockStrategy: 'captcha' | 'password-captcha'\n\n defaultLanguageConfig: Lang\n /**\n * 是否开启账号切换\n */\n enableLoginAccountSwitch: boolean\n /**\n * 是否开启注册密码补全\n */\n enableCompletePassword: boolean\n\n /** 是否为租户控制台应用 */\n isTenantConsole?: boolean\n\n /** 是否默认为租户应用面板应用 */\n isTenantDefault?: boolean\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","import i18n, { InitOptions, Resource } from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport LanguageDetector from 'i18next-browser-languagedetector'\nimport * as enUsTrans from './en-us'\nimport * as zhCnTrans from './zh-cn'\nimport * as zhTwTrans from './zh-tw'\nimport * as jaJpTrans from './ja-jp'\nimport { Lang } from '../../Type'\n\nconst LanguageResources: Resource = {\n 'en-US': { translation: enUsTrans },\n 'zh-CN': { translation: zhCnTrans },\n 'zh-TW': { translation: zhTwTrans },\n 'ja-JP': { translation: jaJpTrans },\n}\n\nexport interface InitGuardI18nOptions {\n // 默认显示\n defaultLanguage?: Lang | 'browser'\n}\n\n// fackbackLang\n\nexport const fallbackLng = (code = '') => {\n if (!code || code === 'en') return ['en-US']\n\n if (!code || code === 'zh') return ['zh-CN']\n\n if (!code || code === 'ja') return ['ja-JP']\n\n const fallbacks = []\n\n if (code.startsWith('en-')) {\n fallbacks.push(`en-US`)\n return fallbacks\n }\n\n if (code.startsWith('ja-')) {\n fallbacks.push(`ja-JP`)\n return fallbacks\n }\n\n if (code.startsWith('zh-')) {\n if (\n ['zh-tw', 'zh-hk', 'zh-mo', 'zh-hant'].includes(code.toLocaleLowerCase())\n ) {\n fallbacks.push(`zh-TW`)\n } else if (['zh-cn', 'zh-sg', 'zh-my'].includes(code.toLocaleLowerCase())) {\n fallbacks.push(`zh-CN`)\n } else {\n fallbacks.push(`zh-CN`)\n }\n\n return fallbacks\n }\n\n return ['en-US']\n}\n\nexport const initGuardI18n = async (\n options: InitGuardI18nOptions,\n callback: React.Dispatch<React.SetStateAction<boolean>>\n) => {\n const { defaultLanguage } = options\n\n const detectionOrder: string[] = []\n\n let lng: Lang | undefined = undefined\n\n // 如果需要跟随浏览器语言, 则添加到监测顺序\n if (defaultLanguage === 'browser') {\n detectionOrder.push(\n ...[\n 'querystring',\n 'cookie',\n 'navigator',\n 'localStorage', //不保存用户所选语言 刷新重新走浏览器语言检测\n 'htmlTag',\n 'path',\n 'subdomain',\n ]\n )\n } else {\n // 此处 defaultLanguage 可能为 Lng 也可能是 undefined\n lng = defaultLanguage\n }\n\n // 统一拼装一下 i18n 的 options\n const i18nOptions: InitOptions = {\n // 默认语言\n lng,\n detection: {\n order: detectionOrder,\n lookupLocalStorage: '_guard_i18nextLng', //与console主要业务i18n相关的key脱离\n },\n resources: LanguageResources,\n // 兜底语言\n fallbackLng,\n debug: false,\n interpolation: {\n escapeValue: false,\n },\n }\n\n // 开始初始化了嗷~\n await i18n.use(LanguageDetector).use(initReactI18next).init(i18nOptions)\n // 告知外部i18n初始化完成\n callback(true)\n}\n\nexport { i18n }\n","import { useEffect } from 'react'\nimport { GuardAppendConfig, setPublicConfig } from '../..'\nimport { initAppendConfig } from '../../_utils/appendConfig'\nimport { setPageConfig } from '../../_utils/config'\nimport { getGuardDocument } from '../../_utils/guardDocument'\n\nexport const getGuardWindow = () => {\n if (typeof window === 'undefined') {\n return undefined\n }\n\n const guardDocument = getGuardDocument()\n\n const guardWindow = guardDocument?.defaultView\n\n if (guardWindow) {\n return guardWindow\n }\n\n return window\n}\n\nexport const useGuardWindow = getGuardWindow\n\nexport const useInitGuardAppendConfig = (\n setForceUpdate: any,\n appId?: string,\n appendConfig?: GuardAppendConfig\n) => {\n useEffect(() => {\n if (!appId) return\n setForceUpdate(Date.now())\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 }, [appId, appendConfig, setForceUpdate])\n}\n","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","export const GenerateSvg = (guardDocument: Document, svgString: string) => {\n const svgDOM = () => {\n const tempDiv = guardDocument.createElement('div')\n\n tempDiv.innerHTML = svgString\n\n const tempSVG = tempDiv.getElementsByTagName('svg')[0]\n\n tempSVG.setAttribute('aria-hidden', 'true')\n tempSVG.id = 'guard-svg-string'\n tempSVG.style.position = 'absolute'\n tempSVG.style.width = '0'\n tempSVG.style.height = '0'\n tempSVG.style.overflow = 'hidden'\n\n const body = guardDocument.body\n\n body.firstChild\n ? body.insertBefore(tempSVG, body.firstChild)\n : body.appendChild(tempSVG)\n }\n\n const readyState = guardDocument.readyState\n\n if (['complete', 'loaded', 'interactive'].includes(readyState)) {\n setTimeout(() => {\n svgDOM()\n }, 0)\n } else {\n const loadedFn = function () {\n guardDocument.removeEventListener('DOMContentLoaded', loadedFn)\n\n svgDOM()\n }\n\n guardDocument.addEventListener('DOMContentLoaded', loadedFn)\n }\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, { useContext, useMemo } from 'react'\nimport {\n GuardEvents,\n GuardLocalConfig,\n GuardModuleType,\n GuardPageConfig,\n} from '..'\nimport {\n BackFillMultipleState,\n StoreInstance,\n} from '../Guard/core/hooks/useMultipleAccounts'\nimport { ModuleState } from '../Guard/GuardModule/stateMachine'\nimport { ApplicationConfig } from '../Type/application'\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 tenantId?: 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 multipleInstance: {\n /**\n * 多账号相关\n */\n isMultipleAccount: boolean\n /**\n * when: 多账号页面跳转进入登录页面\n * 携带的回填数据信息\n */\n multipleAccountData?: BackFillMultipleState\n /**\n * 多账号 store 实例\n */\n instance?: StoreInstance\n /**\n * 切换多账号 isMultipleAccount 状态\n */\n referMultipleState?: (type: 'login' | 'multiple') => void\n /**\n * 清空回填数据\n */\n clearBackFillData?: () => void\n }\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 /**\n * 多账号 状态\n */\n multipleInstance: {\n isMultipleAccount: false,\n\n instance: undefined,\n\n referMultipleState: undefined,\n\n multipleAccountData: undefined,\n\n clearBackFillData: undefined,\n },\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 useGuardXContext = () => {\n return useMemo(() => {\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}\n\nexport interface IGuardContextProvider {\n spin: boolean\n spinChange: (spin: boolean) => void\n}\n\nconst GuardButtonContext = React.createContext<IGuardContextProvider>({\n spin: false,\n spinChange: () => {},\n})\n\nexport const useGuardButtonContext = () => {\n const Provider = GuardButtonContext.Provider\n\n const GuardButtonProvider: React.FC = ({ children }) => {\n const [spin, setSpin] = React.useState(false)\n\n return (\n <Provider\n value={{\n spin: spin,\n spinChange: (spin: boolean) => {\n setSpin(spin)\n },\n }}\n >\n {children}\n </Provider>\n )\n }\n\n return {\n GuardButtonProvider,\n }\n}\n\nexport const useGuardButtonState = () => useContext(GuardButtonContext)\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 const useGuardTenantId = () => useContext(GuardXContext).tenantId\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\n/**\n * 多账号登录 store 实例\n */\nexport const useGuardMultipleInstance = () =>\n useContext(GuardXContext).multipleInstance\n","import { Dropdown, Menu } from 'antd'\nimport React, { useCallback, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { IconFont } from '../IconFont'\nimport { Lang } from '../Type'\nimport { useGuardPageConfig } from '../_utils/context'\nimport { fallbackLng } from '../_utils/locales'\nimport './style.less'\n\nexport const LngTextMapping: Record<\n Lang,\n {\n label: string\n }\n> = {\n 'zh-CN': {\n label: '简体中文',\n },\n 'zh-TW': {\n label: '繁體中文',\n },\n 'en-US': {\n label: 'English',\n },\n 'ja-JP': {\n label: '日本語',\n },\n}\n\nexport const ChangeLanguage = (props: {\n onLangChange?: (lang: Lang) => void\n langRange?: Lang[]\n}) => {\n const { langRange = ['zh-CN', 'zh-TW', 'en-US', 'ja-JP'] } = props\n const { onLangChange } = props\n const { i18n } = useTranslation()\n const guardPageConfig = useGuardPageConfig()\n\n const onChangeLng = useCallback(\n (lng: Lang) => {\n i18n.changeLanguage(lng)\n onLangChange?.(lng)\n },\n [i18n, onLangChange]\n )\n\n const showChangeLng = useMemo(() => {\n return guardPageConfig.global?.showChangeLanguage\n }, [guardPageConfig])\n const currentLng = useMemo<Lang>(() => {\n if (Object.keys(LngTextMapping).includes(i18n.language)) {\n return i18n.language as Lang\n } else {\n return (fallbackLng(i18n.language)[0] || 'en-US') as Lang\n }\n }, [i18n.language])\n\n const currentLngText = useMemo(() => {\n return (\n <>\n <span>{LngTextMapping[currentLng].label}</span>\n </>\n )\n }, [currentLng])\n\n const lngMenu = useMemo(() => {\n let menuItem: {\n key: string\n label: string\n }[] = []\n\n menuItem = Object.keys(LngTextMapping)\n .filter((lng) => langRange.includes(lng as Lang))\n .map((lng) => ({\n key: lng,\n label: LngTextMapping[lng as Lang].label,\n }))\n\n return (\n <Menu>\n {menuItem.map(({ key, label }) => {\n const isCurrent = key === currentLng\n\n return (\n <Menu.Item\n key={key}\n className={isCurrent ? 'select' : ''}\n onClick={() => {\n if (currentLng !== key) {\n onChangeLng(key as Lang)\n }\n }}\n >\n <span>{label}</span>\n {isCurrent && <IconFont type=\"authing-check-fill\" />}\n </Menu.Item>\n )\n })}\n </Menu>\n )\n }, [currentLng, langRange, onChangeLng])\n\n if (!showChangeLng || langRange.length === 0) {\n return null\n }\n\n return (\n <div className=\"g2-change-language-container\">\n <Dropdown\n overlay={lngMenu}\n trigger={['click']}\n placement=\"bottomCenter\"\n overlayClassName=\"authing-g2-change-language-menu\"\n getPopupContainer={(node) => {\n if (node?.parentElement) {\n return node.parentElement\n }\n return node\n }}\n >\n <span className=\"g2-change-language-text\">\n {currentLngText}\n <IconFont\n type=\"authing-arrow-down-s-fill\"\n className=\"down-fill-svg\"\n />\n </span>\n </Dropdown>\n </div>\n )\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 const document = guardWindow.document\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 { Rule } from 'antd/lib/form'\nimport qs from 'qs'\nimport { i18n } from './locales'\nimport { User } from 'authing-js-sdk'\nimport { GuardProps } from '../Guard'\nimport isEqual from 'lodash/isEqual'\nimport omit from 'lodash/omit'\nimport { getGuardWindow } from '../Guard/core/useAppendConfig'\nimport UAParser from 'ua-parser-js'\nimport {\n ApplicationConfig,\n ComplateFiledsPlace,\n LoginMethods,\n RegisterMethods,\n} from '../Type/application'\nimport { LngTextMapping } from '../ChangeLanguage'\nimport { Lang } from '../Type'\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\\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$/,\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 const guardWindow = getGuardWindow()\n\n if (!guardWindow) return\n\n const document = guardWindow.document\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 || styleSheet\n }\n}\n\nexport const removeStyles = (recordKey: STYLE_RECORD_KEY) => {\n if (!insertedRecord[recordKey]) {\n return\n }\n\n const styleElt = insertedRecord[recordKey]\n styleElt.parentNode?.removeChild(styleElt)\n\n insertedRecord[recordKey] = null\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\n/**\n * 在托管页下上传query中指定的用户自定义字段进行补全\n * @param params 指定上传的用户自定义字段\n */\nexport const getUserRegisterParams = (params?: string[]) => {\n const query = qs.parse(window.location.search, {\n ignoreQueryPrefix: true,\n })\n return Object.keys(query)\n .map((key) => ({\n key,\n value: query[key],\n }))\n .filter((item) => item.value)\n .filter((item) => (params ? params.includes(item.key) : true))\n}\n\n// 微信内置浏览器\nexport const isWeChatBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return (\n /MicroMessenger/i.test(navigator?.userAgent) &&\n !/wxwork/i.test(navigator.userAgent)\n )\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}\nexport const isQQBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return /MQQBrowser/i.test(navigator.userAgent)\n}\n// qq 内置浏览器\nexport const isQQBuiltInBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return / QQ/i.test(navigator.userAgent)\n}\n// 企业微信内置浏览器\nexport const isWeWorkBuiltInBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return (\n /MicroMessenger/i.test(navigator.userAgent) &&\n /wxwork/i.test(navigator.userAgent)\n )\n}\n// 特殊浏览器 后续可能会增加\n\nexport const isEdgeBrowser = () => {\n const parser = UAParser()\n\n return parser.browser.name === 'Edge'\n}\n\nexport const isWeiboBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return /Weibo/i.test(navigator.userAgent)\n}\n\nexport const isAlipayBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return /Alipay/i.test(navigator.userAgent)\n}\n\nexport const isBaiduBrowser = () => {\n if (typeof navigator === 'undefined') {\n return null\n }\n return /Baidu/i.test(navigator.userAgent)\n}\n\nexport const isWeComeBrowser = () => /wxwork/i.test(navigator.userAgent)\n\nexport const isMobile = () => {\n return window.navigator.userAgent.match(\n /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i\n )\n}\n\n/* 利用浏览器的 UA 判断是否为不支持弹窗的特殊浏览器 */\nexport const isSpecialBrowser = () => {\n // 1. 首先筛选出一定是特殊浏览器的 UA\n if (\n isWeChatBrowser() ||\n isWeComeBrowser() ||\n isLarkBrowser() ||\n isDingtalkBrowser() ||\n isQtWebEngine() ||\n isXiaomiBrowser() ||\n isQQBrowser() ||\n isMobile()\n ) {\n return true\n }\n\n // 2. 利用 ua-parser-js 进一步判断,筛选出很可能不是特殊浏览器的 UA\n // 由于一些特殊浏览器也可能会被误判为非特殊,所以需要首先经过第 1 步筛选\n const parser = UAParser()\n const nonSpecialBrowsers = [\n 'Chrome',\n 'Firefox',\n 'Safari',\n 'Opera',\n 'IE',\n 'Edge',\n ]\n if (nonSpecialBrowsers.includes(parser.browser.name ?? '')) {\n return false\n }\n\n // 3. 可能有一些 UA 没有任何特征,这种情况下一律默认为特殊浏览器\n return true\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 // eslint-disable-next-line prettier/prettier\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 const 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]\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 const getCustomPassword = () => {\n if (i18n.language === 'zh-CN' && customPasswordStrength?.zhMessageOpen) {\n return customPasswordStrength?.zhMessage\n }\n if (i18n.language === 'en-US' && customPasswordStrength?.enMessageOpen) {\n return customPasswordStrength?.enMessage\n }\n if (i18n.language === 'ja-JP' && customPasswordStrength?.jaMessageOpen) {\n return customPasswordStrength?.jaMessage\n }\n if (i18n.language === 'ja-JP' && customPasswordStrength?.jpMessageOpen) {\n return customPasswordStrength?.jpMessage\n }\n if (i18n.language === 'zh-TW' && customPasswordStrength?.twMessageOpen) {\n return customPasswordStrength?.twMessage\n }\n return customPasswordStrength?.message\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: getCustomPassword(),\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: any,\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\nexport const getDocumentNode = (node: Node & ParentNode): Document => {\n if (node.nodeName === '#document') {\n return node as Document\n }\n\n return getDocumentNode(node.parentNode as Node & ParentNode)\n}\n\n// 1. 手机号验证码注册\n// - 手机号验证码登录\n// - 手机号密码登录\n// - 非手机号的密码登录\n// 2. 邮箱验证码注册\n// - 邮箱验证码登录\n// - 邮箱密码登录\n// - 非邮箱的密码登录\n// 3. 邮箱密码注册\n// - 邮箱密码登录\n// - 邮箱验证码登录\n// - 非邮箱的密码登录\n\nexport const getLoginTypePipe = (\n publicConfig: ApplicationConfig,\n registerMethod: RegisterMethods\n) => {\n const loginTabs = publicConfig?.loginTabs.list // 支持的登录方式\n const verifyCodeTabMethods =\n publicConfig?.verifyCodeTabConfig?.enabledLoginMethods ?? [] // 支持的验证码登录方式\n const passwordTabMethods =\n publicConfig?.passwordTabConfig?.enabledLoginMethods ?? [] // 支持的密码登录方式\n // 通过手机验证码注册成功\n if (registerMethod === RegisterMethods.Phone) {\n if (\n loginTabs.includes(LoginMethods.PhoneCode) &&\n verifyCodeTabMethods.includes('phone-code')\n ) {\n // situation 1 手机号验证码登录\n return {\n specifyDefaultLoginMethod: LoginMethods.PhoneCode,\n lockMethod: 'phone-code',\n }\n } else if (\n loginTabs.includes(LoginMethods.Password) &&\n passwordTabMethods.includes('phone-password')\n ) {\n // situation 2 手机号密码登录\n return { specifyDefaultLoginMethod: LoginMethods.Password }\n } else {\n return undefined\n }\n }\n // 通过邮箱验证码注册成功\n if (registerMethod === RegisterMethods.EmailCode) {\n if (\n loginTabs.includes(LoginMethods.PhoneCode) &&\n verifyCodeTabMethods.includes('email-code')\n ) {\n // situation 1 邮箱验证码登录\n return {\n specifyDefaultLoginMethod: LoginMethods.PhoneCode,\n lockMethod: 'email-code',\n }\n } else if (\n loginTabs.includes(LoginMethods.Password) &&\n passwordTabMethods.includes('email-password')\n ) {\n // situation 2 邮箱密码登录\n return { specifyDefaultLoginMethod: LoginMethods.Password }\n } else {\n return undefined\n }\n }\n // 通过邮箱密码注册成功\n if (registerMethod === RegisterMethods.Email) {\n if (\n loginTabs.includes(LoginMethods.Password) &&\n passwordTabMethods.includes('email-password')\n ) {\n // situation 1 邮箱密码登录\n return { specifyDefaultLoginMethod: LoginMethods.Password }\n } else if (\n loginTabs.includes(LoginMethods.PhoneCode) &&\n verifyCodeTabMethods.includes('email-code')\n ) {\n // situation 2 邮箱验证码登录\n return {\n specifyDefaultLoginMethod: LoginMethods.PhoneCode,\n lockMethod: 'email-code',\n }\n } else {\n return undefined\n }\n }\n}\n\n// 对用户输入的数据进行校验判断是否是手机号或者邮箱\nexport const getPasswordIdentify = (identity: string): string => {\n return validate('phone', identity) || validate('email', identity)\n ? identity\n : ''\n}\n\nexport const getCurrentLng = () => {\n if (Object.keys(LngTextMapping).includes(i18n.language)) {\n return i18n.language as Lang\n } else {\n return i18n?.languages?.[i18n?.languages?.length - 1] as Lang\n }\n}\n","export const enum LoggerType {\n INFO = 'INFO',\n WARN = 'WARN',\n ERROR = 'ERROR',\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","export const enum GuardModuleType {\n ERROR = 'error', //错误页\n LOGIN = 'login', //登录页\n REGISTER = 'register', //注册页\n MFA = 'mfa', // 二次 mfa 认证页\n FORGET_PWD = 'forgetPassword', // 忘记密码页\n FORCED_PASSWORD_RESET = 'forcedPasswordReset', // 登陆安全策略 密码轮换页\n NOTICE_PASSWORD_RESET = 'noticePasswordReset', //提示修改密码页\n FIRST_LOGIN_PASSWORD = 'firstLoginPassword', //首次登录修改密码页\n UNSAFE_PASSWORD_RESET = 'unsafePasswordReset', // 密码强度不符合要求修改密码页\n DOWNLOAD_AT = 'downloadAT', //下载 Authenticator 页\n BIND_TOTP = 'bindTotp', // 绑定 TOTP页\n ANY_QUESTIONS = 'anyQuestions', // 问题反馈页\n LOGIN_COMPLETE_INFO = 'loginCompleteInfo', // 登录信息补全\n REGISTER_PASSWORD = 'registerPassword', // 验证码注册拉起密码补全页\n REGISTER_COMPLETE_INFO = 'registerCompleteInfo', //注册信息补全页\n RECOVERY_CODE = 'recoveryCode', // MFA 恢复码展示页\n SUBMIT_SUCCESS = 'submitSuccess', // 提交成功展示页\n IDENTITY_BINDING_ASK = 'identityBindingAsk', // 身份源绑定 问询页\n IDENTITY_BINDING = 'identityBinding', // 身份源绑定页\n SELF_UNLOCK = 'selfUnlock', // 自助解锁页\n /** 多租户门户选择页 */\n TENANT_PORTAL = 'tenant_portal',\n}\nexport interface GuardModuleAction {\n action: string\n module?: GuardModuleType\n message?: string\n initData?: any\n}\n","import { assembledRequestHost as utilAssembledRequestHost } from '..'\nimport { GuardLocalConfig } from '../../Guard/config'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { AuthingResponse } from '../http'\nimport { GuardHttp } from '../guardHttp'\nimport { corsVerification } from '../corsVerification'\nimport { Logger } from '../logger'\nimport { GuardPageConfig } from '../../Type'\nimport {\n ApplicationConfig,\n LoginMethods,\n RegisterMethods,\n} from '../../Type/application'\n\nlet publicConfigMap: Record<string, ApplicationConfig> = {}\n\nexport const getPublicConfig = (appId: string) => publicConfigMap?.[appId]\n\nexport const setPublicConfig = (appId: string, config: ApplicationConfig) => {\n return (publicConfigMap[appId] = config)\n}\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\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 httpClient.setUserpoolId(res.data.userPoolId)\n\n return getPublicConfig(appId)\n}\n\nconst 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 useMergeDefaultConfig = (\n defaultConfig: GuardLocalConfig,\n config?: Partial<GuardLocalConfig>\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\n/**\n * 请求服务console关于guard的配置\n * @param forceUpdate\n * @param appId\n * @param config\n * @param httpClient\n * @param setError\n */\nexport const useFetchConsoleConfig = (\n forceUpdate: number,\n appId?: string,\n config?: GuardLocalConfig,\n httpClient?: GuardHttp,\n setError?: any\n) => {\n const [publicConfig, setPublicConfig] = useState<ApplicationConfig>()\n const [pageConfig, setPageConfig] = useState<GuardPageConfig>()\n const initPublicConfig = useCallback(async () => {\n if (httpClient && appId) {\n if (!getPublicConfig(appId)) {\n try {\n await Promise.all([\n await requestPublicConfig(appId, httpClient),\n await requestGuardPageConfig(appId, httpClient),\n ])\n } catch (error) {\n setError(error)\n }\n }\n setPublicConfig(getPublicConfig(appId))\n setPageConfig(getPageConfig(appId))\n }\n }, [appId, httpClient, setError])\n\n useEffect(() => {\n initPublicConfig()\n }, [initPublicConfig, forceUpdate])\n\n return useMemo(() => {\n if (publicConfig && config && pageConfig) {\n return {\n finallyConfig: {\n ...mergedPublicConfig(config, publicConfig),\n host: assembledRequestHost(config, publicConfig),\n },\n guardPageConfig: pageConfig,\n }\n } else {\n return {\n finallyConfig: undefined,\n guardPageConfig: undefined,\n }\n }\n }, [config, pageConfig, publicConfig])\n}\n","import { AuthenticationClient } from 'authing-js-sdk'\nimport { Lang } from 'authing-js-sdk/build/main/types'\nimport { useEffect, useMemo, useState } from 'react'\nimport { useGlobalAuthClient } from '../AuthClientProvider/AuthClientProvider'\nimport version from '../version'\nimport { GuardLocalConfig } from './config'\n\nlet authClient: AuthenticationClient\n\nconst checkAuthClientProps = (\n client: AuthenticationClient,\n props: {\n appId: string\n tenantId?: string\n }\n): boolean => {\n const { appId, tenantId } = props\n\n if (client.options.appId !== appId) {\n throw new Error(\n 'AuthClientProvider 与 Guard AppId 初始化不同,请检查初始化时传入的 AppId 是否正确'\n )\n }\n\n if (tenantId && client.options.tenantId !== tenantId) {\n throw new Error(\n 'AuthClientProvider 与 Guard TenantId 初始化不同,请检查初始化时传入的 TenantId 是否正确'\n )\n }\n\n return true\n}\n\nexport const initGuardAuthClient = (\n config: GuardLocalConfig,\n appId: 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: lang as Lang,\n requestFrom: `Guard@${version}`,\n onError: (code, msg: any) => {\n console.error(code, msg)\n },\n })\n } catch (error: any) {\n throw error\n }\n }\n\n return authClient\n}\n\nexport const useInitGuardAuthClient = (props: {\n config?: GuardLocalConfig\n appId?: string\n authClient?: AuthenticationClient\n setError?: any\n tenantId?: string\n}) => {\n const { config, appId, setError, tenantId } = props\n const globalClient = useGlobalAuthClient()\n\n const [client, setClient] = useState<AuthenticationClient>()\n\n useEffect(() => {\n if (!config || !appId) return\n\n const host = config.host\n const lang = config.lang\n const propsAuthClient = props?.authClient\n\n // 优先检测 props 中的 authClient 对象\n if (propsAuthClient) {\n try {\n checkAuthClientProps(propsAuthClient, { appId, tenantId })\n\n setClient(propsAuthClient)\n\n return\n } catch (error) {\n setError(error)\n }\n }\n // 如果 props 中的 authClient 对象不存在,则检测全局的 authClient 对象\n if (globalClient) {\n try {\n checkAuthClientProps(globalClient, { appId, tenantId })\n\n setClient(globalClient)\n\n return\n } catch (error) {\n setError(error)\n }\n }\n\n // 如果全局的 authClient 对象也不存在,则初始化一个新的 authClient 对象\n try {\n const authClient = new AuthenticationClient({\n appHost: host,\n tenantId: tenantId,\n appId,\n lang: lang as Lang,\n requestFrom: `Guard@${version}`,\n onError: (code, msg: any) => {\n console.error(code, msg)\n },\n })\n\n setClient(authClient)\n } catch (error) {\n setError(error)\n }\n }, [appId, config, globalClient, props?.authClient, setError, tenantId])\n\n useMemo(() => {\n if (!client) return\n authClient = client\n }, [client])\n\n return client\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 { AuthenticationClient, CommonMessage, User } from 'authing-js-sdk'\nimport { GuardModuleType } from '../Guard/module'\nimport { FacePlugin } from '../_utils/facePlugin/interface'\nimport { ApplicationConfig } from './application'\nexport * from './application'\nexport type { CommonMessage, User }\n\nexport type Lang = 'zh-CN' | 'en-US' | 'zh-TW' | 'ja-JP'\n\nexport const enum GuardMode {\n Modal = 'modal',\n Normal = 'normal',\n}\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 authClient?: AuthenticationClient\n}\n\nexport interface GuardAppendConfig {\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?: string\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 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: any) => 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': 'JP',\n 'de-DE': 'DE',\n 'zh-CN': 'CN',\n}\n\nexport const enum InputMethod {\n EmailCode = 'email-code',\n PhoneCode = 'phone-code',\n}\n\nexport const enum GuardPageSene {\n Global = 'global',\n}\n\nexport interface GuardPageConfig {\n [GuardPageSene.Global]: {\n showChangeLanguage: boolean\n defaultLanguage: Lang | 'browser'\n }\n}\n\nexport const enum EmailScene {\n // 通知模版\n // - 欢迎邮件 WELCOME\n WELCOME_EMAIL = 'WELCOME_EMAIL',\n // - 首次创建用户通知 FIRST_LOGIN_VERIFY\n FIRST_CREATED_USER = 'FIRST_CREATED_USER',\n\n // 注册/登录验证码模板 VERIFY_CODE\n // - 注册验证码\n REGISTER_VERIFY_CODE = 'REGISTER_VERIFY_CODE',\n // - 登录验证码\n LOGIN_VERIFY_CODE = 'LOGIN_VERIFY_CODE',\n // - MFA 验证\n MFA_VERIFY_CODE = 'MFA_VERIFY_CODE',\n // - 信息补全验证码\n INFORMATION_COMPLETION_VERIFY_CODE = 'INFORMATION_COMPLETION_VERIFY_CODE',\n\n // 验证模版 VERIFY_EMAIL\n // - 首次邮箱登录验证\n FIRST_EMAIL_LOGIN_VERIFY = 'FIRST_EMAIL_LOGIN_VERIFY',\n // - 在控制台发起验证\n CONSOLE_CONDUCTED_VERIFY = 'CONSOLE_CONDUCTED_VERIFY',\n\n // 重置密码模版 RESET_PASSWORD\n // - 重置密码验证码\n RESET_PASSWORD_VERIFY_CODE = 'RESET_PASSWORD_VERIFY_CODE',\n\n // 邮箱绑定模版 CHANGE_EMAIL\n // - 邮箱绑定验证码\n EMAIL_BIND_VERIFY_CODE = 'EMAIL_BIND_VERIFY_CODE',\n // - 邮箱解绑验证码\n EMAIL_UNBIND_VERIFY_CODE = 'EMAIL_UNBIND_VERIFY_CODE',\n // 自助解锁验证码\n SELF_UNLOCKING_VERIFY_CODE = 'SELF_UNLOCKING_VERIFY_CODE',\n}\n","import { AuthenticationClient } from 'authing-js-sdk'\nimport React from 'react'\n\nexport interface AuthClientContextProps {\n client: AuthenticationClient\n}\n\nexport const AuthClientContext = React.createContext<\n AuthClientContextProps | undefined\n>(undefined)\n","import React, { useContext } from 'react'\nimport { AuthClientContext, AuthClientContextProps } from './context'\n\nexport const AuthClientProvider: React.FC<AuthClientContextProps> = (props) => {\n const { children, client } = props\n\n const Provider = AuthClientContext.Provider\n\n return <Provider value={{ client }}>{children}</Provider>\n}\n\nexport const useGlobalAuthClient = () => {\n const authClientContext = useContext(AuthClientContext)\n\n return authClientContext?.client\n}\n","export default '4.0.9-rc.2'","import version from './version'\n\nexport default version\n","/* eslint-disable prettier/prettier */\nimport { 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'\nimport { StoreInstance } from './core/hooks/useMultipleAccounts'\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\n/**\n * 包裹用户 Events\n * 这里为必须存在的 Events\n * @param eventName 事件名\n * @param events 事件列表\n * @param callback 事件触发时前置函数\n */\nconst wrapperEvents = <\n N extends keyof GuardEvents,\n T extends Required<GuardEvents>[N] = Required<GuardEvents>[N]\n>(\n eventName: N,\n events: GuardEvents,\n callback: (oldEvent: any, ...props: Parameters<T>) => ReturnType<T>\n) => {\n // 对于特殊event进行处理\n const oldEvents = events[eventName]\n // @ts-ignore TODO: 后续类型处理\n events[eventName] = (...props: Parameters<T>) => {\n callback(oldEvents, ...props)\n return props\n }\n}\n\nexport const guardEventsFilter = (\n props: any,\n multipleInstance?: StoreInstance,\n openEventsMapping?: boolean\n) => {\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 // 保证必须存在 onLogin 函数\n wrapperEvents<'onLogin'>('onLogin', events, (oldEvents, ...props) => {\n const [user] = props\n multipleInstance?.setUserInfo(user)\n oldEvents && oldEvents(...props)\n })\n\n return guardEventsHijacking(events, openEventsMapping)\n}\n\nconst eventsMapping: Partial<GuardEvents> = {\n onLogin: (user, client) => {\n message.success(i18n.t('common.LoginSuccess'))\n\n if (user) {\n user?.token && client.setToken(user.token)\n client.setCurrentUser(user)\n }\n\n return [user, client]\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 // 必须执行的\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\nexport const GuardEventsCamelToKebabMapping = {\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 onEmailSend: 'email-send',\n onEmailSendError: 'email-send-error',\n onPhoneSend: 'phone-send',\n onPhoneSendError: '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 onLangChange: 'lang-change',\n onBeforeChangeModule: 'before-change-module',\n} as const\n\nexport interface GuardEventsKebabToCamelType {\n // 加载完成,userPool 配置和应用配置(如果有 appId)加载完成\n load: GuardEvents['onLoad']\n // 加载失败\n 'load-error': GuardEvents['onLoadError']\n // 登录前,即表单校验完成,请求接口前\n 'before-login': GuardEvents['onBeforeLogin']\n // 用户登录成功\n login: GuardEvents['onLogin']\n // 用户登录失败\n 'login-error': GuardEvents['onLoginError']\n // 注册前,即表单校验完成,请求接口前\n 'before-register': GuardEvents['onBeforeRegister']\n // 注册成功\n register: GuardEvents['onRegister']\n // 注册失败\n 'register-error': GuardEvents['onRegisterError']\n // 邮件发送成功\n 'email-send': GuardEvents['onEmailSend']\n // 邮件发送失败\n 'email-send-error': GuardEvents['onEmailSendError']\n // 手机验证码发送成功\n 'phone-send': GuardEvents['onPhoneSend']\n // 手机验证码发送失败\n 'phone-send-error': GuardEvents['onPhoneSendError']\n // 重置密码成功\n 'pwd-reset': GuardEvents['onPwdReset']\n // 重置密码失败\n 'pwd-reset-error': GuardEvents['onPwdResetError']\n // 表单关闭事件\n close: GuardEvents['onClose']\n // 登录的 tab 切换\n 'login-tab-change': GuardEvents['onLoginTabChange']\n // 注册的 tab 切换\n 'register-tab-change': GuardEvents['onRegisterTabChange']\n // 注册信息补充完毕\n 'register-info-completed': GuardEvents['onRegisterInfoCompleted']\n // 注册信息补充失败\n 'register-info-completed-error': GuardEvents['onRegisterInfoCompletedError']\n // 语言切换\n 'lang-change': GuardEvents['onLangChange']\n // 切换模块前\n 'before-change-module': GuardEvents['onBeforeChangeModule']\n}\n","import {\n getDefaultG2Config,\n IG2Config,\n IG2Events,\n IG2FCProps,\n IG2FCViewProps,\n} from '../Type'\nimport { AuthenticationClient, User } from 'authing-js-sdk'\nimport { QrCodeAuthenticationClient } from 'authing-js-sdk/build/main/lib/authentication/QrCodeAuthenticationClient'\nimport {\n Agreement,\n LoginMethods,\n PasswordLoginMethods,\n SocialConnectionProvider,\n} from '../Type/application'\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 * 关闭二维码状态check轮询(console上使用)\n */\n _closeLoopCheckQrcode?: boolean\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 // TODO 具体的类型定义\n loginInfo: any,\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 interface GuardLoginInitData {\n specifyDefaultLoginMethod?: LoginMethods //指定登录页默认登录方式\n _firstItemInitialValue?: string //第一个输入框的回填值\n _lockMethod?: string //锁定登录方式\n}\n\nexport const getDefaultLoginConfig = (): LoginConfig => ({\n ...getDefaultG2Config(),\n})\n","import { AuthenticationClient, User } from 'authing-js-sdk'\nimport { IG2FCProps, IG2Config, getDefaultG2Config, IG2Events } from '../Type'\nimport { Agreement, RegisterMethods } from '../Type/application'\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 // TODO 类型定义补充\n registerInfo: any,\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: #0080ff;\\n stroke-width: 8.2;\\n stroke-dasharray: 100 220;\\n animation: dash 40s infinite linear forwards;\\n stroke-linecap: round;\\n stroke-linejoin: round;\\n\\n }\\n #path-b {\\n fill: none;\\n stroke: #eaebee;\\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.3cf0104f.svg\";\nexport { ForwardRef as ReactComponent };","import { 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 const 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: Partial<GuardLocalConfig> = {}\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.globalWindow()?.addEventListener('popstate', this.onPopstate)\n\n this.historyPush(initData, ActionType.Init)\n }\n\n uninstallPopstate = () => {\n this.globalWindow()?.removeEventListener('popstate', this.onPopstate)\n }\n\n globalWindow = (): Window | undefined => {\n const guardWindow = getGuardWindow()\n\n return guardWindow ?? undefined\n }\n\n next = (nextModule: GuardModuleType, initData: any) => {\n const globalWindow = this.globalWindow()\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 if (this.isUseHistoryHijack()) {\n globalWindow?.history.pushState(\n nextModule,\n '',\n globalWindow?.location.href\n )\n }\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\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\n this.stateMachineLog[this.order++] = {\n action: ActionType.Back,\n date: new Date().getTime(),\n dataSource: data,\n }\n }\n\n setConfig = (config: Partial<GuardLocalConfig>) => {\n this.config = config\n }\n\n isUseHistoryHijack = () => {\n return this.globalWindow()?.location.href !== 'about:blank'\n }\n\n onPopstate = () => {\n this.back()\n }\n}\n\n// export const useHistoryHijack = (back?: () => void) => {\n// const globalWindow = getGuardWindow()\n\n// const isUseHistoryHijack = useMemo(\n// () => globalWindow?.location.href !== 'about:blank',\n\n// [globalWindow?.location.href]\n// )\n\n// const next = (state: any = {}) => {\n// if (!isUseHistoryHijack) {\n// return\n// }\n\n// globalWindow?.history.pushState(state, '', globalWindow?.location.href)\n// }\n\n// useEffect(() => {\n// if (!isUseHistoryHijack) {\n// return () => {}\n// }\n\n// const onPopstate = () => {\n// back?.()\n// }\n\n// back && globalWindow?.addEventListener('popstate', onPopstate)\n\n// return () => {\n// back && globalWindow?.removeEventListener('popstate', onPopstate)\n// }\n// }, [back, globalWindow, isUseHistoryHijack])\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'\nimport { useGuardPublicConfig } from '../_utils/context'\n\n//@ts-ignore\nimport { ReactComponent as ShieldSpinLoading } from './loading.svg'\ninterface IG2SpinProps {\n size?: number\n}\n\nexport const ShieldSpin = (props: IG2SpinProps) => {\n const publicConfig = useGuardPublicConfig()\n let size = props.size ? props.size : 50\n\n return (\n <div\n style={{\n width: size,\n height: size,\n }}\n >\n {publicConfig?.customLoading ? (\n <img src={publicConfig.customLoading} alt=\"\" width={size} />\n ) : (\n <ShieldSpinLoading />\n )}\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 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 _closeLoopCheckQrcode: false,\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","let flowHandleStorage: string | undefined\n\nexport const getFlowHandle = () => {\n return flowHandleStorage\n}\n\nexport const useFlowHandle = getFlowHandle\n\nexport const updateFlowHandle = (flowHandle: string) => {\n flowHandleStorage = flowHandle\n}\n\nexport const useUpdateFlowHandle = updateFlowHandle\n","import qs from 'qs'\nimport { i18n } from './locales'\nimport { CodeAction } from './responseManagement/interface'\nimport Axios, { AxiosRequestConfig, CancelTokenSource } from 'axios'\nimport { getCurrentLng } from '.'\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 flowHandle?: string\n}\n\nexport interface AuthingGuardResponse<T = any> extends AuthingResponse<T> {\n onGuardHandling?: () => CodeAction\n isFlowEnd?: boolean\n}\n\nconst timeoutAction = (cancel: CancelTokenSource['cancel']) => {\n const timer: number = 10\n return new Promise((resolve) => {\n setTimeout(() => {\n const response = {\n data: {\n code: -1,\n },\n }\n resolve(response)\n\n cancel() // 发送终止信号\n }, timer * 1000)\n })\n}\n\nrequestClient.get = async <T>(\n path: string,\n query: Record<string, any> = {},\n init?: AxiosRequestConfig\n): Promise<AuthingResponse<T>> => {\n // let controller = new AbortController()\n // let signal = controller.signal\n\n const headers: Record<string, any> = {\n ...init?.headers,\n 'Content-Type': 'application/json',\n [requestClient.langHeader]: getCurrentLng(),\n }\n\n if (requestClient.tenantId !== '')\n headers[requestClient.tenantHeader] = requestClient.tenantId\n try {\n const CancelToken = Axios.CancelToken\n const source = CancelToken.source()\n\n const res: any = await Promise.race([\n timeoutAction(source.cancel),\n Axios(\n `${requestClient.baseUrl}${path}${qs.stringify(query, {\n addQueryPrefix: true,\n })}`,\n {\n method: 'GET',\n ...init,\n withCredentials: true,\n headers,\n cancelToken: source.token,\n }\n ),\n ])\n return res?.data\n } catch (e) {\n return Promise.resolve({\n code: -2,\n })\n }\n}\n\nrequestClient.post = async <T>(\n path: string,\n data: any,\n config?: {\n headers: any\n }\n): Promise<AuthingResponse<T>> => {\n // let controller = new AbortController()\n // let signal = controller.signal\n\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 try {\n const CancelToken = Axios.CancelToken\n const source = CancelToken.source()\n\n const res: any = await Promise.race([\n timeoutAction(source.cancel),\n Axios(`${requestClient.baseUrl}${path}`, {\n data,\n method: 'POST',\n withCredentials: true,\n cancelToken: source.token,\n headers: {\n 'Content-Type': 'application/json',\n ...config?.headers,\n [requestClient.langHeader]: getCurrentLng(),\n },\n }),\n ])\n return res?.data\n } catch (e) {\n return Promise.resolve({\n code: -2,\n })\n }\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\nrequestClient.postForm = async <T>(\n path: string,\n formData: any,\n config?: {\n headers: any\n }\n): Promise<AuthingResponse<T>> => {\n // let controller = new AbortController()\n // let signal = controller.signal\n try {\n const CancelToken = Axios.CancelToken\n const source = CancelToken.source()\n\n const res: any = await Promise.race([\n timeoutAction(source.cancel),\n Axios(`${requestClient.baseUrl}${path}`, {\n method: 'POST',\n data: formData,\n withCredentials: true,\n cancelToken: source.token,\n headers: {\n ...config?.headers,\n [requestClient.langHeader]: getCurrentLng(),\n },\n }),\n ])\n\n return res?.data\n } catch (e) {\n return Promise.resolve({\n code: -2,\n })\n }\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 { message } from 'antd'\nimport { getHundreds } from '..'\nimport { AuthingGuardResponse, AuthingResponse } from '../http'\nimport { i18n } from '../locales'\nimport { ApiCode, 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.code === -1) {\n message.error(i18n.t('common.timeout'))\n\n return res\n }\n if (res.code === -2) {\n message.error(i18n.t('common.fetchError'))\n\n return res\n }\n\n if (!res.statusCode) return res\n\n const statusCode = res.statusCode\n\n const apiCode = res.apiCode\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 if (apiCode === ApiCode.FLOW_END) {\n return callBack(CodeAction.FLOW_END, res)\n } else {\n return callBack(CodeAction.CHANGE_MODULE, res)\n }\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","import version from '../version'\nimport { getFlowHandle } from './flowHandleStorage'\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?: any\n ): Promise<AuthingGuardResponse<T>> => {\n const res = await requestClient.get<T>(path, query, {\n ...config,\n headers: { ...this.headers, ...config?.headers },\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 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 flowHandle = getFlowHandle()\n\n const requestData = {\n action,\n data,\n flowHandle,\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","export const 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 { User } from 'authing-js-sdk'\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>(`/cas/session`, {})\n}\n","/* eslint-disable prettier/prettier */\n/**\n * 整体的思路:\n * 在所有登录方式中,当进行登录时保存登录方式(FE侧自定义)\n * 之后在登录成功(onLogin)中,触发store的方法保存用户信息以及对应的登录方式进入localStorage。\n * 当用户再次打开页面时,拿出数据进行对比。(主要对比 LoginWay ),TODO: 这里的代码主要显得乱的原因是因为枚举的不正当使用。(主要要和Server端进行互相映射,后续维护时可优化)\n *\n * 核心思路:登录成功时,保存的FE侧自定义 LoginWay\n * 再次打开页面时,初始化时先根据 FE 自定义的 LoginWay 跳转到不同的 tab 下(way)下使用 account 进行回填。TODO: 这里也可优化,应该在登录成功时候就进行 LoginWay 的格式化,而非转来转去。(但是这样无法直观的体现是哪种方式进行登录)\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { cloneDeep } from 'lodash'\nimport { SelectOptions } from '../../../Login/multipleAccounts/panel'\nimport { getPublicConfig } from '../../../_utils/config'\n\nconst MULTIPLE_ACCOUNT_KEY = '__authing__multiple_accounts'\n\n// 多账号计算 way 方式\nconst MULTIPLE_ACCOUNT_LISTS: LoginWay[] = [\n 'email',\n 'phone',\n 'password',\n 'phone-code',\n 'email-code',\n 'ad',\n 'ldap',\n 'ldap-password',\n 'ldap-email',\n 'ldap-phone',\n]\n\n// 扫码登录方式\nexport const QR_CODE_WAY: LoginWay[] = [\n 'wechat-miniprogram-qrcode',\n 'wechatmp-qrcode',\n 'app-qrcode',\n]\n\n// 展示多账号时 默认排除的登录方式\nconst EXCLUDE_CODE_WAY: LoginWay[] = QR_CODE_WAY.concat('social')\n\n/**\n * 登录时所有支持的登录列表(前端定义列表)\n * 这里稍微有点乱 因为Login中的登录方式和这里的不匹配,暂时放在了一起\n */\nexport type LoginWay =\n | 'email' // 邮箱密码登录\n | 'phone' // 手机号密码登录\n | 'password' // 用户名登录\n | 'phone-code' // 手机号验证码登录\n | 'email-code' // 邮箱验证码登录\n | 'social' // 社会化登录\n | 'wechat-miniprogram-qrcode' // 小程序扫码登录\n | 'wechatmp-qrcode' // 公众号扫码登录方式\n | 'app-qrcode' // App 扫码登录方式\n | 'ad' // AD 登录方式\n | 'ldap' // LDAP 登录方式\n | 'ldap-password'\n | 'ldap-email'\n | 'ldap-phone'\n\n/**\n * when: 多账号页面跳转进入登录页面\n * 携带的回填数据信息\n */\nexport interface BackFillMultipleState\n extends Omit<\n User,\n | 'id'\n | 'name'\n | 'nickname'\n | 'username'\n | 'phone'\n | 'email'\n | 'photo'\n | '_updateTime'\n > {\n /**\n * 回填的账号名称 邮箱/用户名/手机\n */\n account: string\n}\n\n/**\n * Store instance\n */\nexport type StoreInstance = ReturnType<MultipleAccount['getStore']>\n\n/**\n * originStore 类型\n */\ninterface MultipleStore {\n [appId: string]: CurrentStore\n}\n\n/**\n * 当前 userId 对应的类型\n */\nexport interface CurrentStore {\n [id: string]: User\n}\n\nexport interface User {\n /**\n * userId\n */\n id: string\n /**\n * Tab 栏状态\n */\n tab: 'input' | 'qrcode'\n /**\n * 登录方式\n */\n way: LoginWay\n /**\n * 姓名\n */\n name?: string | null\n /**\n * 昵称\n */\n nickname?: string | null\n /**\n * 用户名\n */\n username?: string | null\n /**\n * 手机号\n */\n phone?: string | null\n /**\n * 邮箱\n */\n email?: string | null\n /**\n * 头像\n */\n photo?: string | null\n /**\n * qrCodeId 对应的ID\n */\n qrCodeId?: string\n /**\n * 国际化短信区号\n */\n phoneCountryCode?: string\n /**\n * 国际化短信选择框回填\n */\n areaCode?: string\n /**\n * 登录时间\n */\n _updateTime?: string\n}\n\nclass MultipleAccount {\n /**\n * 原始的登录账号\n */\n private originAccount: string = ''\n private originWay: string = ''\n /**\n * 原始的 localStore 值\n */\n private originStore: MultipleStore = {}\n /**\n * 当前 AppId Store\n */\n private currentStore: MultipleStore[string] = {}\n /**\n * 单账号直接回填\n */\n private firstBackFillData?: BackFillMultipleState\n /**\n * server 返回支持的登录方式\n */\n private serverSideLoginMethods: LoginWay[]\n\n /**\n * 是否显示多账号登录页面\n * true 存在\n */\n private memberState: boolean\n /**\n * 二维码登录时的ID\n */\n private qrCodeId?: string\n /**\n * 国际化短信前缀 区号\n */\n private phoneCountryCode?: string\n /**\n * 国际化短信前缀 选中地区编号\n */\n private areaCode?: string\n private tabStatus?: 'qrcode' | 'input'\n /**\n * 当前登录二级状态\n */\n private loginWay?: LoginWay\n private appId: string\n /**\n * 是否开启国际化短信\n */\n private isInternationSms?: boolean\n\n constructor() {\n // 二级别Tab\n this.loginWay = undefined\n // 一级Tab\n this.tabStatus = undefined\n this.qrCodeId = undefined\n // 国际化短信\n this.phoneCountryCode = undefined\n this.areaCode = undefined\n\n this.originStore = {}\n this.currentStore = {}\n\n this.appId = ''\n this.memberState = false\n this.firstBackFillData = undefined\n this.serverSideLoginMethods = []\n }\n\n /**\n * 页面首次加载时初始化 Store\n * 从 LocalStore 中拿值 放到这里来\n */\n private initStore = (\n appId: string,\n options: {\n serverSideLoginMethods: LoginWay[]\n isInternationSms: boolean\n }\n ) => {\n const { serverSideLoginMethods, isInternationSms } = options\n this.appId = appId\n this.isInternationSms = isInternationSms\n this.serverSideLoginMethods = serverSideLoginMethods\n // TODO: 单独抽离 utils 方法 localStorage\n this.originStore =\n JSON.parse(localStorage.getItem(MULTIPLE_ACCOUNT_KEY) || '{}') || {}\n\n // 当前 Appid 中所有的内容\n this.currentStore = this.getCurrentStore(this.originStore)\n // 初始化回填页面 & 回填数据\n const { backfillData, memberState } = this.initMemberState()\n this.firstBackFillData = backfillData\n this.memberState = memberState\n }\n\n /**\n * 初始化记住账号相关信息\n * @param normalCount\n * @returns\n */\n private initMemberState = () => {\n // 获取到对应的 验证码个数,默认的个数\n const { qrCount, normalCount } = this.memberStateCount()\n // 登录是否渲染多账号状态\n let memberState = false\n // 需要回填的数据\n let backfillData: BackFillMultipleState | undefined\n if (normalCount > 1) {\n // 多个有效的账号\n memberState = true\n } else if (normalCount === 1) {\n // 单个有效账号\n backfillData = this.initBackfillData('input')\n memberState = false\n } else if (qrCount >= 1) {\n // 仅有二维码\n memberState = false\n backfillData = this.initBackfillData('qrCode')\n }\n return {\n memberState,\n backfillData,\n }\n }\n\n /**\n * 获取当前ID下有效账号个数\n * @returns qrCount 有效的二维码登录个数 normalCount 有效的账号登录方式\n */\n private memberStateCount = () => {\n let qrCount = 0\n let normalCount = 0\n const values = Object.values(this.currentStore)\n for (const value of values) {\n const { tab } = value\n // 1. 扫码登录\n if (tab === 'qrcode') {\n qrCount++\n }\n // 2. 正常回填的个数\n if (tab === 'input') {\n normalCount++\n }\n }\n return {\n qrCount,\n normalCount,\n }\n }\n\n /**\n * 初始化第一次的数据 TODO: 逻辑有点脏 待整理\n */\n private initBackfillData = (initWay: 'qrCode' | 'input') => {\n // TODO: backfillData 回填时考虑 AD 和 LDAP 对应的账号\n const wayLists = initWay === 'qrCode' ? QR_CODE_WAY : MULTIPLE_ACCOUNT_LISTS\n const userLists = Object.values(this.currentStore)\n const user = userLists.find((i) => wayLists.includes(i.way))\n // 如果是扫码的用户 回填状态就可以了\n if (user && wayLists.includes(user.way)) {\n const data =\n initWay === 'qrCode'\n ? {\n account: '',\n way: user.way,\n }\n : this.getAccountByWay(user.way, user)\n\n return {\n ...data,\n tab: user.tab,\n qrCodeId: user.qrCodeId,\n phoneCountryCode: user.phoneCountryCode,\n areaCode: user.areaCode,\n }\n }\n }\n\n /**\n * 根据前端存储的登录方式返回后端映射方式\n * @param front\n */\n private getServerLoginMethodByFront = (front: LoginWay) => {\n // 排除 social 方式 TODO: Mappint 常量抽离\n const mapping: Record<Exclude<LoginWay, 'social'>, string> = {\n ldap: 'ldap',\n 'ldap-password': 'ldap',\n 'ldap-phone': 'ldap',\n 'ldap-email': 'ldap',\n ad: 'ad',\n email: 'email-password',\n password: 'username-password',\n phone: 'phone-password',\n 'email-code': 'phone-code',\n 'phone-code': 'phone-code',\n 'wechat-miniprogram-qrcode': 'wechat-miniprogram-qrcode',\n 'wechatmp-qrcode': 'wechatmp-qrcode',\n 'app-qrcode': 'app-qrcode',\n }\n if (front !== 'social') {\n return mapping[front]\n }\n }\n\n /**\n * 当前 Store DONE\n */\n private getCurrentStore = (originStore: MultipleStore) => {\n const currentStore = originStore[this.appId] || {}\n const serverSideLoginMethods = this.serverSideLoginMethods\n const result = Object.create(null)\n\n for (const [key, value] of Object.entries(currentStore)) {\n // 1. 过滤 Server 关闭的账号\n const passMethod = this.validateMethod(value, serverSideLoginMethods)\n // 2. 校验国际化短信 过滤\n const passMsm = this.validateInternationSms(value)\n if (passMsm && passMethod) {\n result[key] = cloneDeep(value)\n }\n }\n return result\n }\n\n /**\n * 国际化短信过滤\n * true 表示通过 需要保留\n * false 表示不通过 需要过滤\n */\n private validateInternationSms = (user: User) => {\n if (user.way !== 'phone-code') {\n return true\n }\n const isInternationSms = this.isInternationSms\n const { phoneCountryCode, areaCode } = user\n // 这个用户是否是国际化短信登录\n const currentIsInternationSms = phoneCountryCode || areaCode\n return isInternationSms ? currentIsInternationSms : !currentIsInternationSms\n }\n\n /**\n * 校验有效的登录方式账号\n * @param user\n * @param serverSideLoginMethods\n * @returns\n */\n private validateMethod = (user: User, serverSideLoginMethods: LoginWay[]) => {\n const { way } = user\n const serverWay = this.getServerLoginMethodByFront(way)\n const validateInternationSms = this.validateInternationSms(user)\n return (\n validateInternationSms &&\n serverWay &&\n serverSideLoginMethods.includes(serverWay as any)\n )\n }\n\n /**\n *\n * @param tab 一级Tab状态\n * @param way 二级Tab状态\n * @param id 二维码登录时 记录对应的二维码 ID\n */\n private setLoginWay = (\n tab: 'input' | 'qrcode',\n way: LoginWay,\n id?: string,\n internation?: {\n phoneCountryCode: string\n areaCode: string\n }\n ) => {\n this.tabStatus = tab\n this.loginWay = way\n this.qrCodeId = id\n // 国际化短信的区号\n if (internation) {\n const { phoneCountryCode, areaCode } = internation\n this.phoneCountryCode = phoneCountryCode\n this.areaCode = areaCode\n }\n }\n\n /**\n * 设置/更新 store 内的用户信息\n */\n private setUserInfo = (\n user: Omit<User & { id: string }, 'way' | 'tab' | 'phoneCountryCode'>\n ) => {\n // 排除 ad 登录方式\n if (!user || !this.loginWay || !this.tabStatus || this.loginWay === 'ad') {\n console.log(`User or LoginWay does not exist.`)\n return\n }\n const { photo, nickname, phone, username, email, id, name } = user\n this.currentStore[id] = Object.assign({\n way: this.loginWay, // 登录方式\n tab: this.tabStatus, // 当前大tab 扫码 or 输入\n photo,\n nickname,\n phone,\n username,\n name,\n email,\n id,\n qrCodeId: this.qrCodeId,\n phoneCountryCode: this.phoneCountryCode,\n areaCode: this.areaCode,\n _updateTime: Date.now(),\n })\n this.saveStore()\n }\n\n /**\n * 持久化保存\n */\n private saveStore = () => {\n const newStore = Object.assign({}, this.originStore, {\n [this.appId]: this.currentStore,\n })\n localStorage.setItem(MULTIPLE_ACCOUNT_KEY, JSON.stringify(newStore))\n }\n\n /**\n * 根据登录的 account 判断本次登录的方式\n * @param account 登录输入的账号\n * @param param1 登录成功返回的相关信息 用户名/手机号/邮箱\n * @returns\n */\n private setLoginWayByHttpData = (\n account: string,\n data: {\n username?: string\n phone?: string\n email?: string\n }\n ) => {\n // TODO: 临时保存对应的account\n this.originAccount = account\n this.originWay = 'password'\n const { username, phone, email } = data\n switch (account) {\n case username:\n return this.setLoginWay('input', 'password')\n case phone:\n return this.setLoginWay('input', 'phone')\n case email:\n return this.setLoginWay('input', 'email')\n }\n }\n\n /**\n * 根据登录的 account 判断本次LDAP登录方式\n * @param account 登录输入的账号\n * @param param1 登录成功返回的相关信息 用户名/手机号/邮箱\n * @returns\n */\n private setLoginWayByLDAPData = (\n account: string,\n data: {\n name?: string\n phone?: string\n email?: string\n }\n ) => {\n this.originAccount = account\n this.originWay = 'ldap'\n const { name, phone, email } = data\n switch (account) {\n case name:\n return this.setLoginWay('input', 'ldap-password')\n case phone:\n return this.setLoginWay('input', 'ldap-phone')\n case email:\n return this.setLoginWay('input', 'ldap-email')\n // MFA 情况都不匹配,那么直接处理 name\n default:\n return this.setLoginWay('input', 'ldap-password')\n }\n }\n\n /**\n * 根据用户 ID 删除 localStorage 中当前用户 ID\n */\n private delUserById = (id: string) => {\n // 1. 在 current Store 中删除当前ID\n if (id in this.currentStore) {\n delete this.currentStore[id]\n // 2. 更新 localStorage\n this.saveStore()\n }\n return id\n }\n\n /**\n * 获得多账号登录页面的所有用户列表\n * @param excludeWays\n */\n private getMemoUser = (excludeWays: LoginWay[] = EXCLUDE_CODE_WAY) => {\n const currentStore = this.currentStore\n const result: SelectOptions[] = []\n\n for (const item of Object.values(currentStore)) {\n const { way } = item\n const value = this._mappingUser(item)\n if (!excludeWays.includes(way)) {\n result.push(value)\n }\n }\n // 这里没有过滤\n return result.sort((a, b) => b._updateTime - a._updateTime).slice(0, 3)\n }\n\n /**\n * 根据 id 获得当前已登录的用户信息\n * @param userId\n * @returns User / undefined\n */\n private getMemoSingleUser: (\n id: string\n ) => { way: LoginWay; account: string } | undefined = (userId: string) => {\n // 根据登录方式进行过滤映射\n const currentUser = this.currentStore[userId]\n if (currentUser) {\n // 根据登录方式进行处理\n const { way, phoneCountryCode, areaCode } = currentUser\n const { account, way: parseWay } = this.getAccountByWay(way, currentUser)\n return {\n account,\n way: parseWay,\n // fix: 回填时需要携带国际化信息。\n phoneCountryCode,\n areaCode,\n }\n }\n }\n\n /**\n * 该方法仅仅需要回填账号的登录方式,其他都不计入\n * 当用户名/手机号/邮箱/AD/LDAP 相同时,根据登录顺序匹配不同的账号\n * 根据记住的用户登录方式获取对应的登录账户名\n * @param way\n * @param user\n * @returns\n */\n private getAccountByWay: (\n way: LoginWay,\n user: User\n ) => { way: LoginWay; account: string } = (way: LoginWay, user: User) => {\n const { email, phone, username, name } = user\n // 根据对应的 LoginWay 进行返回\n switch (way) {\n case 'email':\n return { account: email!, way: 'password' }\n case 'email-code':\n return { account: email!, way: 'phone-code' }\n case 'phone-code':\n return { account: phone!, way: 'phone-code' }\n case 'phone':\n return { account: phone!, way: 'password' }\n case 'password':\n return { account: username!, way: 'password' }\n case 'ad':\n return { account: name!, way: 'ad' }\n case 'ldap-password':\n return { account: name!, way: 'ldap' }\n case 'ldap-email':\n return { account: email!, way: 'ldap' }\n case 'ldap-phone':\n return { account: phone!, way: 'ldap' }\n default:\n throw new Error(`已登录用户匹配不到的登录方式`)\n }\n }\n\n private _mappingUser = (value: User) => {\n const {\n id,\n photo,\n name,\n nickname,\n username,\n email,\n phone,\n _updateTime,\n phoneCountryCode,\n } = value\n // 1. 姓名 > 昵称 > username\n const title = name || nickname || username || undefined\n // 2. 处理手机号是否是国家化显示\n const parsePhone = phoneCountryCode ? `${phoneCountryCode} ${phone}` : phone\n // 3. phone > email\n const description = parsePhone || email || undefined\n return {\n title,\n description,\n id,\n photo: photo || '',\n // 国际化 phoneCountryCode\n _updateTime: parseInt(_updateTime || '0'),\n }\n }\n\n /**\n * 外部暴露方法\n */\n getStore = () => {\n return {\n initStore: this.initStore,\n // 当前登录方式\n setLoginWay: this.setLoginWay,\n // 设置用户信息\n setUserInfo: this.setUserInfo,\n // TODO: 脏逻辑\n setLoginWayByHttpData: this.setLoginWayByHttpData,\n setLoginWayByLDAPData: this.setLoginWayByLDAPData,\n // 获得当前 AppId 下对应的数据\n getMemoUser: this.getMemoUser,\n // 获得当前 userId 下的对应单个用户信息\n getMemoSingleUser: this.getMemoSingleUser,\n // 删除记录的登录账号\n delUserById: this.delUserById,\n // 是否存在已经登陆账号 > 1\n getMemberState: () => this.memberState,\n // 首次需要回填的数据 单账号记住登录下\n getFirstBackFillData: () => this.firstBackFillData,\n // 原始的登录账号和密码\n getOriginAccount: () => this.originAccount,\n getOriginWay: () => this.originWay,\n }\n }\n}\n\n/**\n * MultipleAccounts 相关 Hook\n * Finally Config 类型过滤\n */\nconst useMultipleAccounts = ({\n appId,\n finallyConfig,\n}: {\n appId?: string\n finallyConfig?: any\n}) => {\n // 页面状态,两种 'isMultipleAccount' TODO: 改成 reducer\n const [isMultipleAccount, setMultipleAccount] = useState(false)\n // 页面记住的数据 给一个初始值\n const [multipleAccountData, setMultipleAccountData] = useState<\n undefined | BackFillMultipleState\n >(undefined)\n\n const [storeInstance, setStoreInstance] = useState<StoreInstance | undefined>(\n undefined\n )\n\n /**\n * 修改登录页是否是多账号登录的状态\n */\n const changeMultipleState = useCallback((type: 'login' | 'multiple') => {\n const boolean = type === 'multiple'\n setMultipleAccount(boolean)\n }, [])\n\n /**\n * 当从账号进入登录页时,更新登录页需要回填的信息\n * 账号信息 & 登录方式\n */\n const updateBackFillData = useCallback((data: BackFillMultipleState) => {\n // 当访完成一次之后 立即清空该数据\n setMultipleAccountData(data)\n }, [])\n\n /**\n * 清空数据\n */\n const clearBackFillData = useCallback(() => {\n setMultipleAccountData(undefined)\n }, [])\n\n /**\n * 更新页面状态 & 数据回填\n */\n const referMultipleState = useCallback(\n (type: 'login' | 'multiple', data?: BackFillMultipleState) => {\n changeMultipleState(type)\n if (data) {\n // updateBackFillData\n updateBackFillData(data)\n }\n },\n [updateBackFillData, changeMultipleState]\n )\n\n /**\n * 初始化数据 & 初始化登录页面渲染状态\n */\n const initFirstState = useCallback(\n (storeInstance: StoreInstance) => {\n const type = storeInstance.getMemberState() ? 'multiple' : 'login'\n // 根据初始值 初始化数据\n referMultipleState(type, storeInstance.getFirstBackFillData())\n },\n [referMultipleState]\n )\n\n useEffect(() => {\n if (!appId || !finallyConfig) {\n return\n }\n const publicConfig = getPublicConfig(appId)\n\n if (!publicConfig?.enableLoginAccountSwitch) {\n return\n }\n // 最终支持的登录方式 用于过滤有效登录方式\n const serverSideLoginMethods = finallyConfig?.loginMethods || []\n // 输入框 邮箱/用户名/手机号 + 密码\n const configLists = finallyConfig?.passwordLoginMethods || []\n // 是否支持国际化短信\n const isInternationSms =\n publicConfig?.internationalSmsConfig?.enabled || false\n // 创建实例\n const instance = new MultipleAccount()\n // 获取实例\n const storeInstance = instance.getStore()\n // 增加一个多的 国际化短信是否开启\n storeInstance.initStore(appId, {\n serverSideLoginMethods: [...configLists, ...serverSideLoginMethods],\n isInternationSms,\n })\n setStoreInstance(storeInstance)\n // 根据 instance 中的状态和数据初始化登录页面状态\n initFirstState(storeInstance)\n }, [appId, finallyConfig, referMultipleState, initFirstState])\n\n return useMemo(() => {\n return {\n instance: storeInstance,\n isMultipleAccount,\n referMultipleState,\n multipleAccountData,\n clearBackFillData,\n }\n }, [\n storeInstance,\n isMultipleAccount,\n referMultipleState,\n multipleAccountData,\n clearBackFillData,\n ])\n}\n\nexport default useMultipleAccounts\n","import { GuardProps } from '..'\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useState,\n} from 'react'\nimport { useInitGuardAuthClient } from '../authClient'\nimport { GuardEvents, guardEventsFilter } from '../event'\nimport { insertStyles, removeStyles } from '../../_utils'\nimport { getDefaultGuardLocalConfig } from '../config'\nimport { GuardModuleType } from '../module'\n\nimport {\n GuardStateMachine,\n initGuardStateMachine,\n ModuleState,\n} from '../GuardModule/stateMachine'\nimport { SessionData, trackSession } from '../sso'\nimport {\n getPublicConfig,\n useMergeDefaultConfig,\n useFetchConsoleConfig,\n} from '../../_utils/config'\nimport { GuardHttp, initGuardHttp } from '../../_utils/guardHttp'\nimport { initGuardI18n } from '../../_utils/locales'\nimport { useGuardXContext } from '../../_utils/context'\nimport { useGuardIconfont } from '../../IconFont/useGuardIconfont'\nimport { useInitGuardAppendConfig } from './useAppendConfig'\nimport { useInitAppId } from '../../_utils/initAppId'\nimport { updateFlowHandle } from '../../_utils/flowHandleStorage'\nimport { ApplicationConfig } from '../../Type/application'\nimport { AuthenticationClient } from 'authing-js-sdk'\nimport { Lang } from '../../Type'\n\n// hooks\nimport useMultipleAccounts from './hooks/useMultipleAccounts'\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 { tenantId, config } = guardProps\n // 强制刷新\n const [forceUpdate, setForceUpdate] = useState(Date.now())\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 [cdnBase, setCdnBase] = useState<string>()\n const [error, setError] = useState()\n const [isAuthFlow, setIsAuthFlow] = useState(true)\n const [i18nInit, setI18nInit] = useState(false)\n const appId = useInitAppId(guardProps.appId, guardProps.authClient, setError)\n\n useInitGuardAppendConfig(setForceUpdate, appId, guardProps.appendConfig)\n\n // 状态机\n const [\n guardStateMachine,\n setGuardStateMachine,\n ] = useState<GuardStateMachine>()\n\n const { Provider } = useGuardXContext()\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 // Flow Handle init\n useEffect(() => {\n if (initState.initData?.flowHandle) {\n updateFlowHandle(initState.initData.flowHandle)\n }\n }, [initState.initData])\n\n // Change Module\n const onChangeModule = useCallback(\n async (moduleName: GuardModuleType, initData: any = {}) => {\n if (\n !events?.onBeforeChangeModule ||\n (await events.onBeforeChangeModule(moduleName, initData))\n ) {\n changeModule({\n type: moduleName,\n payload: {\n initData: initData ?? {},\n },\n })\n }\n },\n [events]\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 httpClient.setAppId(appId)\n tenantId && httpClient.setTenantId(tenantId)\n\n setHttpClient(httpClient)\n }, [appId, defaultMergedConfig, tenantId])\n\n /**\n *\n */\n const { finallyConfig, guardPageConfig } = useFetchConsoleConfig(\n forceUpdate,\n appId,\n defaultMergedConfig,\n httpClient,\n setError\n )\n\n const multipleInstance = useMultipleAccounts({\n appId,\n finallyConfig,\n })\n\n // // guardPageConfig\n // const guardPageConfig = useGuardPageConfig(\n // forceUpdate,\n // error,\n // appId,\n // httpClient,\n // setError\n // )\n\n const sdkClient = useInitGuardAuthClient({\n config: finallyConfig,\n appId,\n tenantId,\n setError,\n authClient: guardProps.authClient,\n })\n\n // iconfont\n const iconfontLoaded = useGuardIconfont(cdnBase)\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 useEffect(() => {\n if (!appId) return\n\n const publicConfig = getPublicConfig(appId)\n\n if (!publicConfig) return\n\n setPublicConfig(publicConfig)\n\n setCdnBase(publicConfig.cdnBase)\n }, [appId, finallyConfig])\n\n // I18n\n useEffect(() => {\n if (guardPageConfig && publicConfig && defaultMergedConfig) {\n const { defaultLanguage } = guardPageConfig.global\n initGuardI18n(\n {\n defaultLanguage:\n (defaultMergedConfig?.lang as Lang) ?? defaultLanguage,\n },\n setI18nInit\n )\n }\n }, [defaultMergedConfig, guardPageConfig, publicConfig, setI18nInit])\n\n // AuthClient\n useEffect(() => {\n setAuthClint(sdkClient)\n }, [sdkClient])\n\n // initEvents\n useEffect(() => {\n if (!defaultMergedConfig) return\n\n const events = guardEventsFilter(\n {\n ...guardProps,\n },\n multipleInstance.instance,\n defaultMergedConfig?.openEventsMapping\n )\n setEvents(events)\n }, [guardProps, multipleInstance, defaultMergedConfig])\n\n // 状态机相关\n useEffect(() => {\n const guardStateMachine = initGuardStateMachine(onChangeModule, initState)\n setGuardStateMachine(guardStateMachine)\n\n return () => {\n guardStateMachine.uninstallPopstate()\n }\n }, [initState, onChangeModule])\n\n // 自定义 CSS 处理\n useEffect(() => {\n if (finallyConfig && finallyConfig.contentCss)\n insertStyles(finallyConfig.contentCss, 'appConfig')\n\n return () => removeStyles('appConfig')\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 guardStateMachine?.next(moduleName, initData)\n },\n backModule: () => {\n guardStateMachine?.back()\n },\n }\n }, [events, 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 // 保证 store 加载完成\n multipleInstance,\n // 保证 i18n 初始化完成\n i18nInit,\n ]\n\n return !list.includes(undefined) && !list.includes(false)\n }, [\n appId,\n events,\n defaultMergedConfig,\n finallyConfig,\n httpClient,\n moduleEvents,\n publicConfig,\n authClint,\n guardPageConfig,\n iconfontLoaded,\n multipleInstance,\n i18nInit,\n ])\n\n // TODO 触发 onLoad 事件\n useEffect(() => {\n if (!contextLoaded || error) return\n\n events?.onLoad?.(authClint!)\n }, [authClint, contextLoaded, error, events])\n\n const contextValues = useMemo(\n () =>\n contextLoaded\n ? {\n contextLoaded,\n isAuthFlow,\n defaultMergedConfig,\n finallyConfig,\n publicConfig,\n httpClient,\n appId,\n tenantId,\n events,\n ...moduleEvents,\n initData: moduleState.initData,\n currentModule: moduleState,\n guardPageConfig,\n // 多账号相关信息 store 实例\n multipleInstance,\n }\n : {\n defaultMergedConfig,\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 tenantId,\n multipleInstance,\n ]\n )\n\n const renderContext = useMemo(() => {\n if (!contextValues) return null\n return <Provider value={contextValues}>{children}</Provider>\n }, [Provider, children, contextValues])\n\n const RenderErrorContext = useCallback(() => {\n events?.onLoadError?.(error)\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, events])\n\n const render = useMemo(() => {\n if (error) return <RenderErrorContext />\n\n if (contextLoaded || Boolean(defaultMergedConfig)) return renderContext\n\n return null\n }, [\n contextLoaded,\n defaultMergedConfig,\n error,\n renderContext,\n RenderErrorContext,\n ])\n\n return render\n}\n","import { AuthenticationClient } from 'authing-js-sdk'\nimport { useEffect, useMemo } from 'react'\nimport { useGlobalAuthClient } from '../AuthClientProvider'\n\nexport interface UseInitAppidProps {\n propsAppid?: string\n propsAuthClient?: AuthenticationClient\n setError?: any\n}\n\nexport const useInitAppId = (\n propsAppid?: string,\n propsAuthClient?: AuthenticationClient,\n setError?: any\n) => {\n const globalAuthClient = useGlobalAuthClient()\n\n const appId = useMemo(() => {\n if (propsAppid) {\n return propsAppid\n } else if (propsAuthClient && propsAuthClient.options.appId) {\n return propsAuthClient.options.appId\n } else if (globalAuthClient && globalAuthClient.options.appId) {\n return globalAuthClient.options.appId\n }\n\n return undefined\n }, [globalAuthClient, propsAppid, propsAuthClient])\n\n useEffect(() => {\n if (appId) return\n\n setError?.(new Error('appId is required'))\n }, [appId, setError])\n\n return appId\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { getGuardWindow } from '../Guard/core/useAppendConfig'\nimport { GenerateSvg } from './iconfont'\nimport Axios from 'axios'\nexport const useGuardIconfont = (cdnBase?: string, setError?: any) => {\n const [loaded, setLoaded] = useState<boolean>(false)\n\n const initIconfont = useCallback(async () => {\n if (!cdnBase) return\n\n try {\n const res = await Axios(`${cdnBase}/svg-string/guard`)\n\n const body = res.data\n\n const guardWindow = getGuardWindow()\n\n if (!guardWindow) return\n GenerateSvg(guardWindow.document, body)\n\n setLoaded(true)\n } catch (error) {\n setError?.(error)\n }\n }, [cdnBase, setError])\n\n useEffect(() => {\n initIconfont()\n }, [initIconfont])\n\n return loaded\n}\n","import { useRef, useCallback, useEffect } from 'react'\nimport { useMediaQuery } from 'react-responsive'\nimport phone from 'phone'\n// import { LanguageMap } from '../../Type'\nimport {\n isDingtalkBrowser,\n isLarkBrowser,\n // isQQBrowser,\n isQQBuiltInBrowser,\n isSpecialBrowser,\n isWeChatBrowser,\n isWeWorkBuiltInBrowser,\n} from '..'\nimport { GuardLocalConfig } from '../../Guard'\nimport { getGuardWindow } from '../../Guard/core/useAppendConfig'\nimport {\n ApplicationConfig,\n SocialConnectionItem,\n SocialConnectionProvider,\n} from '../../Type/application'\nexport interface PhoneValidResult {\n isValid: boolean\n phoneNumber: string\n countryIso2: string\n countryIso3: string\n countryCode: string\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\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}\n\n/**\n * 解析手机号\n * @param fieldValue 字段值\n * @param areaCode 区号\n * @returns\n */\nexport const parsePhone = (\n isInternationSms: boolean,\n fieldValue: string,\n areaCode: string = 'CN'\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\nexport const enum SocialConnectionEvent {\n Message = 'message',\n Auth = 'auth',\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 let enterpriseConnectionObjs: ApplicationConfig['identityProviders']\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 & { action?: string })[]\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\n // 在所有身份源下都要隐藏\n const hiddenSocialConnection = [\n 'wechat:mobile',\n 'wechat:miniprogram:app-launch',\n 'wechat:miniprogram:default',\n 'apple',\n 'yidun',\n ]\n\n switch (true) {\n // 微信内置浏览器\n case isWeChatBrowser():\n // 显示 点击提示\n const wechatDisplayButtonsMessage = [\n SocialConnectionProvider.WECHATPC,\n SocialConnectionProvider.GITHUB,\n SocialConnectionProvider.QQ,\n SocialConnectionProvider.APPLE_WEB,\n SocialConnectionProvider.ALIPAY,\n SocialConnectionProvider.LINKEDIN,\n SocialConnectionProvider.BAIDU,\n SocialConnectionProvider.GOOGLE,\n SocialConnectionProvider.WEIBO,\n SocialConnectionProvider.FACEBOOK,\n SocialConnectionProvider.SLACK,\n SocialConnectionProvider.DINGTALK,\n 'wechatwork:mobile',\n 'instagram',\n 'qingcloud',\n 'gitee',\n 'gitlab',\n ]\n\n // 各个浏览器下特殊的身份源隐藏规则\n const hiddenSocialConnectionInWeChatBrowser: string[] = [\n SocialConnectionProvider.WECHATPC,\n ]\n\n socialConnectionObjs = socialConnectionObjs\n .filter(\n (item) =>\n ![\n ...hiddenSocialConnection,\n ...hiddenSocialConnectionInWeChatBrowser,\n ].includes(item.provider)\n )\n .map((item) => {\n if (wechatDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n enterpriseConnectionObjs = enterpriseConnectionObjs\n .filter(\n (item: any) =>\n !(item?.provider && hiddenSocialConnection.includes(item.provider))\n )\n .map((item: any) => {\n if (wechatDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n break\n // qq 内置浏览器\n case isQQBuiltInBrowser():\n const qqbuiltDisplayButtonsMessage = [\n SocialConnectionProvider.WECHATPC,\n SocialConnectionProvider.WECHATMP,\n SocialConnectionProvider.APPLE_WEB,\n SocialConnectionProvider.GOOGLE,\n SocialConnectionProvider.ALIPAY,\n SocialConnectionProvider.WECHATWORK_CORP_QRCONNECT,\n SocialConnectionProvider.DINGTALK,\n 'wechatwork:agency:qrconnect',\n 'wechatwork:mobile',\n ]\n // 各个浏览器下特殊的身份源隐藏规则\n const hiddenSocialConnectionInQQBuiltInBrowser = [\n SocialConnectionProvider.WECHATMP,\n ]\n socialConnectionObjs = socialConnectionObjs\n .filter(\n (item) =>\n ![\n ...hiddenSocialConnection,\n ...hiddenSocialConnectionInQQBuiltInBrowser,\n ].includes(item.provider)\n )\n .map((item) => {\n if (qqbuiltDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n enterpriseConnectionObjs = enterpriseConnectionObjs\n .filter(\n (item: any) =>\n !(item?.provider && hiddenSocialConnection.includes(item.provider))\n )\n .map((item: any) => {\n if (qqbuiltDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n break\n // 企业微信内置浏览器\n case isWeWorkBuiltInBrowser():\n const weWorkBuiltDisplayButtonsMessage = [\n SocialConnectionProvider.WECHATPC,\n SocialConnectionProvider.WECHATMP,\n SocialConnectionProvider.GITHUB,\n SocialConnectionProvider.QQ,\n SocialConnectionProvider.APPLE_WEB,\n SocialConnectionProvider.ALIPAY,\n SocialConnectionProvider.LINKEDIN,\n SocialConnectionProvider.BAIDU,\n SocialConnectionProvider.GOOGLE,\n SocialConnectionProvider.WEIBO,\n SocialConnectionProvider.FACEBOOK,\n SocialConnectionProvider.SLACK,\n SocialConnectionProvider.DINGTALK,\n 'wechatwork:mobile',\n 'instagram',\n 'qingcloud',\n 'gitee',\n 'gitlab',\n ]\n // 各个浏览器下特殊的身份源隐藏规则\n const hiddenSocialConnectionInWeWorkBuiltInBrowser = [\n SocialConnectionProvider.WECHATMP,\n ]\n socialConnectionObjs = socialConnectionObjs\n .filter(\n (item) =>\n ![\n ...hiddenSocialConnection,\n ...hiddenSocialConnectionInWeWorkBuiltInBrowser,\n ].includes(item.provider)\n )\n .map((item) => {\n if (weWorkBuiltDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n enterpriseConnectionObjs = enterpriseConnectionObjs\n .filter(\n (item: any) =>\n !(item?.provider && hiddenSocialConnection.includes(item.provider))\n )\n .map((item: any) => {\n if (weWorkBuiltDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n break\n // 钉钉内置浏览器\n case isDingtalkBrowser():\n const dingTalkDisplayButtonsMessage = [\n SocialConnectionProvider.WECHATPC,\n SocialConnectionProvider.WECHATMP,\n SocialConnectionProvider.QQ,\n SocialConnectionProvider.APPLE_WEB,\n SocialConnectionProvider.GOOGLE,\n SocialConnectionProvider.ALIPAY,\n SocialConnectionProvider.WECHATWORK_CORP_QRCONNECT,\n 'wechatwork:agency:qrconnect',\n 'wechatwork:mobile',\n ]\n\n // 各个浏览器下特殊的身份源隐藏规则\n const hiddenSocialConnectionInDingtalkBrowser = [\n SocialConnectionProvider.WECHATMP,\n ]\n\n socialConnectionObjs = socialConnectionObjs\n .filter(\n (item) =>\n ![\n ...hiddenSocialConnection,\n ...hiddenSocialConnectionInDingtalkBrowser,\n ].includes(item.provider)\n )\n .map((item) => {\n if (dingTalkDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n enterpriseConnectionObjs = enterpriseConnectionObjs\n .filter(\n (item: any) =>\n !(item?.provider && hiddenSocialConnection.includes(item.provider))\n )\n .map((item: any) => {\n if (dingTalkDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n break\n // 飞书内置浏览器\n case isLarkBrowser():\n const larkDisplayButtonsMessage = [\n SocialConnectionProvider.WECHATPC,\n SocialConnectionProvider.WECHATMP,\n SocialConnectionProvider.GITHUB,\n SocialConnectionProvider.QQ,\n SocialConnectionProvider.APPLE_WEB,\n SocialConnectionProvider.ALIPAY,\n SocialConnectionProvider.LINKEDIN,\n SocialConnectionProvider.BAIDU,\n SocialConnectionProvider.GOOGLE,\n SocialConnectionProvider.WEIBO,\n SocialConnectionProvider.FACEBOOK,\n SocialConnectionProvider.SLACK,\n SocialConnectionProvider.DINGTALK,\n 'gitlab',\n 'gitee',\n 'instagram',\n 'wechatwork:agency:qrconnect',\n 'wechatwork:mobile',\n ]\n\n // 各个浏览器下特殊的身份源隐藏规则\n const hiddenSocialConnectionInLarkBrowser = [\n SocialConnectionProvider.WECHATMP,\n ]\n\n socialConnectionObjs = socialConnectionObjs\n .filter(\n (item) =>\n ![\n ...hiddenSocialConnection,\n ...hiddenSocialConnectionInLarkBrowser,\n ].includes(item.provider)\n )\n .map((item) => {\n if (larkDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n enterpriseConnectionObjs = enterpriseConnectionObjs\n .filter(\n (item: any) =>\n !(item?.provider && hiddenSocialConnection.includes(item.provider))\n )\n .map((item: any) => {\n if (larkDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n break\n // pc 浏览器\n default:\n const pcDisplayButtonsMessage = [\n SocialConnectionProvider.WECHATMP,\n 'wechatwork:mobile',\n ]\n\n // 各个浏览器下特殊的身份源隐藏规则\n const hiddenSocialConnectionInPCBrowser = [\n SocialConnectionProvider.WECHATMP,\n ]\n\n socialConnectionObjs = socialConnectionObjs\n .filter(\n (item) =>\n ![\n ...hiddenSocialConnection,\n ...hiddenSocialConnectionInPCBrowser,\n ].includes(item.provider)\n )\n .map((item) => {\n if (pcDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n enterpriseConnectionObjs = enterpriseConnectionObjs\n .filter(\n (item: any) =>\n !(item?.provider && hiddenSocialConnection.includes(item.provider))\n )\n .map((item: any) => {\n if (pcDisplayButtonsMessage.includes(item.provider)) {\n item.action = SocialConnectionEvent.Message\n } else {\n item.action = SocialConnectionEvent.Auth\n }\n return item\n })\n break\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 { getGuardHttp } from '../_utils/guardHttp'\n\nexport const 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 { Button } from 'antd'\nimport React, { useMemo } from 'react'\nimport { ButtonProps } from 'antd/lib/button'\nimport { useGuardButtonState } from '../_utils/context'\nimport './styles.less'\n\nexport interface GuardButtonProps extends ButtonProps {}\n\nexport const GuardButton: React.FC<GuardButtonProps> = (props) => {\n const { spin } = useGuardButtonState()\n\n const { type } = props\n\n const isLockButtonClick = useMemo(() => {\n return spin\n }, [spin])\n\n const buttonClassName = useMemo(() => {\n let { className } = props\n\n if (type) {\n className += ` guard-button-link-like`\n }\n\n if (isLockButtonClick) {\n className += ' guard-button-disabled'\n }\n\n return className\n }, [isLockButtonClick, props, type])\n\n return (\n <Button\n {...props}\n className={buttonClassName}\n onClick={(e) => {\n if (isLockButtonClick) {\n // // 阻止事件冒泡\n // e.stopPropagation()\n return\n }\n\n if (props.onClick) {\n props.onClick(e)\n }\n }}\n />\n )\n}\n","import React, {\n forwardRef,\n useState,\n useImperativeHandle,\n useEffect,\n} from 'react'\nimport { useShaking } from '../_utils/hooks'\nimport { GuardButton } from '../GuardButton'\nimport { useGuardButtonState } from '../_utils/context'\nimport { ButtonProps } from 'antd/lib/button'\n\ninterface SubmitButtonProps extends ButtonProps {\n text?: string\n className?: string\n onClick?: any\n disabled?: boolean\n}\nconst SubmitButton = (props: SubmitButtonProps, ref: any) => {\n const { spinChange, spin: buttonSpin } = useGuardButtonState()\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 UnMountShaking()\n }, 1000)\n }\n\n return () => {\n clearTimeout(timeOut)\n }\n }, [UnMountShaking, shaking])\n\n useImperativeHandle(ref, () => ({\n onError: (text?: string) => {\n setSpin(false)\n MountShaking()\n setShaking(true)\n spinChange(false)\n },\n onSpin: (sp: boolean) => {\n setSpin(sp)\n spinChange(sp)\n },\n }))\n\n let propsCls = props.className ? props.className : ''\n // let shakingCls = shaking ? 'shaking' : ''\n let shakingCls = ''\n return (\n <GuardButton\n {...props}\n size={props?.size ?? 'large'}\n type={props?.type ?? 'primary'}\n htmlType={props?.htmlType ?? 'submit'}\n loading={spin}\n disabled={buttonSpin ? true : props?.disabled ?? spin}\n onClick={props.onClick ? props.onClick : () => {}}\n className={`authing-g2-submit-button ${propsCls} ${shakingCls}`}\n >\n {props.text}\n </GuardButton>\n )\n}\nexport default forwardRef(SubmitButton)\n","import { getDefaultG2Config, IG2Config, IG2Events, IG2FCProps } from '../Type'\nimport { AuthenticationClient, User } from 'authing-js-sdk'\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 const 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 { 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 fromClipboard = useRef<boolean>(false)\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 if (Boolean(val) && Boolean(inputRef.current[index + 1])) {\n setFocusIndex(index + 1)\n }\n\n // 验证码填写完成后 直接触发 onFinish\n if (\n codes.filter((code) => Boolean(code)).length >= length &&\n index >= length - 1\n ) {\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 onFocus={() => setFocusIndex(index)}\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={2}\n onChange={(evt) => {\n evt.persist()\n if (fromClipboard.current) {\n fromClipboard.current = false\n return false\n }\n // @ts-ignore\n if (evt.nativeEvent.isComposing) {\n return\n }\n\n const nextValue = evt.target.value\n /**\n * https://github.com/devfolioco/react-otp-input/issues/322\n * ios 下 otp 自动填充在chrome内核浏览器下会触发两次 并且第一次会直接塞otp复制的值(maxlength 限制无效) 如 1246 第二次则根据maxlength 截取塞 12\n * 针对这种情况取第一次值隔离第二次调用\n * safari 是单个input 塞对应的值\n */\n if (nextValue.length === length) {\n fromClipboard.current = true\n onChange(nextValue.split(''))\n setFocusIndex(length - 1)\n return\n }\n const preValue = verifyCode[index] || ''\n const changeValue =\n nextValue.split('').filter((item) => item !== preValue)[0] ||\n nextValue.slice(-1)\n\n handleChange(changeValue, 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: '#215AE5',\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 { 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 { 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'\nimport { BackCustom } from '../Back'\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 renderBack = useMemo(() => {\n const onBack = () => {\n changeModule?.(GuardModuleType.MFA, {\n ...initData,\n current: MFAType.TOTP,\n })\n }\n\n return <BackCustom onBack={onBack}>{t('common.backToVerify')}</BackCustom>\n }, [changeModule, initData, t])\n\n return (\n <>\n {bindInfo.loading ? (\n <Spin />\n ) : (\n <div className=\"g2-view-container g2-bind-totp\">\n {renderBack}\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 React, { useCallback, useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GuardModuleType } from '..'\nimport { GuardButton } from '../GuardButton'\nimport { IconFont } from '../IconFont'\nimport { useGuardFinallyConfig, useGuardModule } from '../_utils/context'\nimport './styles.less'\n\nexport interface BackProps {\n isRender?: boolean\n}\n\nexport const BackLogin: React.FC<BackProps> = (props) => {\n const { changeModule } = useGuardModule()\n\n const config = useGuardFinallyConfig()\n\n const { t } = useTranslation()\n\n const onBack = useCallback(() => changeModule?.(GuardModuleType.LOGIN), [\n changeModule,\n ])\n\n const { isRender = true } = props\n\n const renderBack = useMemo(() => {\n if (!isRender) return null\n\n const whitelist = [GuardModuleType.LOGIN, GuardModuleType.REGISTER]\n\n // 初始场景不是 登录 或者注册时候,不显示返回按钮\n if (config.defaultScenes && !whitelist.includes(config.defaultScenes)) {\n return null\n }\n\n return (\n <GuardButton\n type=\"link\"\n onClick={onBack}\n className=\"g2-view-mfa-back-hover\"\n >\n <IconFont type=\"authing-arrow-left-s-line\" style={{ fontSize: 24 }} />\n <span>{t('common.backLoginPage')}</span>\n </GuardButton>\n )\n }, [isRender, config.defaultScenes, onBack, t])\n\n return (\n <div className=\"g2-view-back\" style={{ display: 'inherit' }}>\n {renderBack}\n </div>\n )\n}\n\nexport interface BackCustomProps extends BackProps {\n onBack?: () => void\n}\n\nexport const BackCustom: React.FC<BackCustomProps> = (props) => {\n const { changeModule } = useGuardModule()\n\n const { t } = useTranslation()\n\n const {\n onBack = () => changeModule?.(GuardModuleType.LOGIN),\n isRender = true,\n children = t('common.backLoginPage'),\n } = props\n\n const renderBack = useMemo(() => {\n if (!isRender) return null\n\n return (\n <GuardButton\n type=\"link\"\n onClick={onBack}\n className=\"g2-view-mfa-back-hover\"\n >\n <IconFont type=\"authing-arrow-left-s-line\" style={{ fontSize: 24 }} />\n <span>{children}</span>\n </GuardButton>\n )\n }, [children, isRender, onBack])\n\n return (\n <div className=\"g2-view-back\" style={{ display: 'inherit' }}>\n {renderBack}\n </div>\n )\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 { 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 checkRepeat = false,\n checkExist = false,\n method,\n name,\n required,\n areaCode, //国际化区号\n isCheckPattern = true,\n ...formItemProps\n } = props\n const publicConfig = useGuardPublicConfig()\n const { get } = useGuardHttp()\n const { t } = useTranslation()\n\n const checkInternationalSms = useMemo(() => {\n return (\n publicConfig.internationalSmsConfig?.enabled &&\n method === 'phone' &&\n isCheckPattern\n )\n }, [isCheckPattern, method, publicConfig.internationalSmsConfig?.enabled])\n\n const methodContent = useMemo(() => {\n if (method === 'email')\n return {\n field: t('common.emailLabel'),\n checkRepeatErrorMessage: t('common.checkEmail'),\n formatErrorMessage: t('common.emailFormatError'),\n checkExistErrorMessage: t('common.noFindEmail'),\n pattern: VALIDATE_PATTERN.email,\n }\n else if (method === 'username') {\n return {\n field: t('common.username'),\n checkRepeatErrorMessage: t('common.checkUserName'),\n checkExistErrorMessage: t('common.noFindUsername'),\n formatErrorMessage: t('common.usernameFormatError'),\n pattern: VALIDATE_PATTERN.username,\n }\n } else\n return {\n field: t('common.phone'),\n checkRepeatErrorMessage: t('common.checkPhone'),\n checkExistErrorMessage: t('common.noFindPhone'),\n formatErrorMessage: t('common.phoneFormateError'),\n pattern:\n !isCheckPattern && publicConfig.internationalSmsConfig?.enabled\n ? /^[0-9]*$/\n : VALIDATE_PATTERN.phone, //开启国际化短信,但不限制pattern eg:单手机号密码登录方式时🤢\n }\n }, [isCheckPattern, method, publicConfig.internationalSmsConfig?.enabled, 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 (checkExist) {\n Boolean(data)\n ? resolve(true)\n : reject(methodContent.checkExistErrorMessage)\n }\n if (checkRepeat) {\n Boolean(data)\n ? reject(methodContent.checkRepeatErrorMessage)\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 || checkExist) {\n rules.push({\n validator: checkRepeatFn,\n validateTrigger: [],\n })\n }\n\n return rules\n }, [\n required,\n methodContent.field,\n formatRules,\n checkRepeat,\n checkExist,\n 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 { 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 checkExist?: boolean\n areaCode?: string //国际化区号\n /**\n * 控制内部FormItem组件关于pattern的校验规则\n */\n isCheckPattern?: boolean\n}\n\nexport interface ValidatorFormItemMetaProps extends ValidatorFormItemProps {\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 { useGuardInitData, 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 const initData = useGuardInitData<any>()\n let { passwordStrength, customPasswordStrength } = publicConfig\n const {\n passwordStrength: userPasswordStrength,\n customPasswordStrength: userCustomPasswordStrength,\n } = initData\n\n if (userPasswordStrength || userCustomPasswordStrength) {\n passwordStrength = userPasswordStrength\n customPasswordStrength = userCustomPasswordStrength\n }\n\n return publicConfig ? (\n <Form.Item\n validateTrigger={['onChange', 'onBlur']}\n validateFirst={true}\n name=\"password\"\n rules={[\n ...getPasswordValidate(\n passwordStrength,\n customPasswordStrength,\n fieldRequiredRuleMessage\n ),\n ...(rules ?? []),\n ]}\n {...fromItemProos}\n />\n ) : (\n <Form.Item {...props} />\n )\n}\n","import { getGuardHttp } from '../_utils/guardHttp'\n\nexport const enum ChangePasswordBusinessAction {\n ResetPassword = 'reset-password-first-time',\n FirstLoginReset = 'reset-password-forced',\n ResetPasswordStrengthDetection = 'reset-password-strength-detection',\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 { Input } from 'antd'\nimport { PasswordProps } from 'antd/lib/input'\nimport React from 'react'\nimport { IconFont } from '../IconFont'\nexport const InputPassword = React.forwardRef<\n React.RefObject<Input>,\n PasswordProps\n>((props, ref) => {\n return (\n <Input.Password\n autoComplete=\"off\"\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 React, { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\n\nexport const usePasswordErrorText = () => {\n const { t } = useTranslation()\n const [show, setPasswordErrorTextShow] = useState(false)\n return {\n setPasswordErrorTextShow,\n getPassWordUnsafeText: () => {\n return (\n <>\n {show ? (\n <div\n style={{\n marginBottom: 23,\n fontSize: 12,\n color: '#E8353E',\n display: 'block',\n }}\n >\n {t('common.passwordUnsafeTip')}\n </div>\n ) : (\n <></>\n )}\n </>\n )\n },\n }\n}\n","import React, { useRef, useCallback } from 'react'\nimport { Form } from 'antd'\nimport CustomFormItem from '../../ValidatorRules'\nimport { InputPassword } from '../../InputPassword'\nimport { useMediaSize } from '../../_utils/hooks'\nimport { IconFont } from '../../IconFont'\nimport { useTranslation } from 'react-i18next'\nimport SubmitButton from '../../SubmitButton'\nimport { RegisterCompletePasswordInitData } from '../../CompleteInfo/interface'\nimport {\n useGuardEvents,\n useGuardInitData,\n useGuardModule,\n useGuardPublicConfig,\n} from '../../_utils/context'\nimport { GuardModuleType } from '../../Guard'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { getGuardHttp } from '../../_utils/guardHttp'\nimport { usePasswordErrorText } from '../../_utils/useErrorText'\nimport { ApiCode } from '../../_utils/responseManagement/interface'\nexport const CompletePassword: React.FC = () => {\n const { t } = useTranslation()\n\n const events = useGuardEvents()\n\n const [form] = Form.useForm()\n\n const { isPhoneMedia } = useMediaSize()\n\n const { post } = getGuardHttp()\n const {\n businessRequestName,\n content,\n isChangeComplete,\n onRegisterSuccess,\n onRegisterFailed,\n } = useGuardInitData<RegisterCompletePasswordInitData>()\n\n let submitButtonRef = useRef<any>(null)\n\n const { changeModule } = useGuardModule()\n // 密码加密公钥\n const { publicKey } = useGuardPublicConfig()\n\n let client = useGuardAuthClient()\n\n const encrypt = client.options.encryptFunction\n const {\n getPassWordUnsafeText,\n setPasswordErrorTextShow,\n } = usePasswordErrorText()\n const onFinish = useCallback(\n async (values: any) => {\n // 密码加密处理(邮箱验证码是通过 post 直接发送需要加密 其他通过 sdk 在内部加密了 这一步无需加密)\n const password = await encrypt!(values.password, publicKey)\n\n submitButtonRef.current?.onSpin(true)\n\n if (isChangeComplete) {\n // 需要进行信息补全\n changeModule?.(GuardModuleType.REGISTER_COMPLETE_INFO, {\n businessRequestName,\n content: {\n ...content,\n password,\n },\n onRegisterSuccess,\n onRegisterFailed,\n })\n return\n } else {\n // 直接注册\n try {\n if (businessRequestName === 'registerByEmailCode') {\n const {\n statusCode,\n apiCode,\n data,\n onGuardHandling,\n message,\n } = await post('/api/v2/register-email-code', {\n ...content,\n password,\n postUserInfoPipeline: false,\n })\n submitButtonRef.current.onSpin(false)\n if (statusCode === 200) {\n onRegisterSuccess(data)\n // events?.onRegister?.(data, authClient)\n // changeModule?.(GuardModuleType.LOGIN)\n } else {\n if (statusCode === ApiCode.UNSAFE_PASSWORD_TIP) {\n setPasswordErrorTextShow(true)\n }\n onGuardHandling?.()\n onRegisterFailed(apiCode, data, message)\n events?.onRegisterError?.({\n code: apiCode,\n data,\n message,\n })\n }\n } else if (businessRequestName === 'registerByPhoneCode') {\n // TODO: 修改 Rustful\n const {\n data,\n statusCode,\n apiCode,\n onGuardHandling,\n message,\n } = await post(`/api/v2/register-phone-code`, {\n ...content,\n password,\n postUserInfoPipeline: false,\n })\n if (statusCode === 200) {\n submitButtonRef.current?.onSpin(false)\n onRegisterSuccess(data)\n } else {\n if (apiCode === ApiCode.UNSAFE_PASSWORD_TIP) {\n setPasswordErrorTextShow(true)\n }\n onGuardHandling?.()\n submitButtonRef.current?.onSpin(false)\n onRegisterFailed(apiCode, data, message)\n events?.onRegisterError?.({\n apiCode,\n data,\n message,\n })\n }\n }\n } catch (error: any) {\n submitButtonRef.current?.onSpin(false)\n // const { code, message: errorMessage, data } = error\n // if (code === ApiCode.UNSAFE_PASSWORD_TIP) {\n // setPasswordErrorTextShow(true)\n // }\n // submitButtonRef.current.onError()\n // message.error(errorMessage)\n // onRegisterFailed(code, data, errorMessage)\n // events?.onRegisterError?.({\n // code,\n // data,\n // message,\n // })\n }\n }\n },\n [\n businessRequestName,\n changeModule,\n content,\n encrypt,\n events,\n isChangeComplete,\n onRegisterFailed,\n onRegisterSuccess,\n post,\n publicKey,\n setPasswordErrorTextShow,\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 autoFocus={!isPhoneMedia}\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 {getPassWordUnsafeText()}\n <Form.Item className=\"authing-g2-sumbit-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 { 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 key: any\n value: any\n }[],\n authClient: AuthenticationClient\n ) => void\n onRegisterInfoCompletedError?: (\n error: CommonMessage,\n udfs: {\n key: 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:\n | 'registerByEmail'\n | 'registerByPhoneCode'\n | 'registerByEmailCode'\n onRegisterFailed: Function\n onRegisterSuccess: Function\n}\n\nexport interface RegisterCompletePasswordInitData\n extends RegisterCompleteInfoInitData {\n isChangeComplete: boolean\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 'registerByEmailCode' = 'email',\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'\nimport { useMediaSize } from '../../_utils/hooks'\nimport { usePasswordErrorText } from '../../_utils/useErrorText'\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 const { isPhoneMedia } = useMediaSize()\n\n let submitButtonRef = useRef<any>(null)\n const {\n getPassWordUnsafeText,\n setPasswordErrorTextShow,\n } = usePasswordErrorText()\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, message: msg } = 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 if (apiCode === ApiCode.UNSAFE_PASSWORD_TIP) {\n message.error(msg)\n setPasswordErrorTextShow(true)\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 autoFocus={!isPhoneMedia}\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputNewPwd')}\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 {getPassWordUnsafeText()}\n <Form.Item className=\"authing-g2-sumbit-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'\nimport { useMediaSize } from '../../_utils/hooks'\nimport { usePasswordErrorText } from '../../_utils/useErrorText'\n\ninterface RotateResetProps {\n onReset: any\n onFinishCallBack?: any\n}\n\nexport const RotateReset = (props: RotateResetProps) => {\n const { t } = useTranslation()\n\n const { onReset, onFinishCallBack } = props\n\n let [form] = Form.useForm()\n\n const { publicKey } = useGuardPublicConfig()\n\n let authClient = useGuardAuthClient()\n\n const { isPhoneMedia } = useMediaSize()\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 const {\n getPassWordUnsafeText,\n setPasswordErrorTextShow,\n } = usePasswordErrorText()\n const onFinish = async (values: any) => {\n if (onFinishCallBack instanceof Function) {\n const data = await onFinishCallBack(values)\n if (data.code === ApiCode.UNSAFE_PASSWORD_TIP) {\n message.error(data.message)\n setPasswordErrorTextShow(true)\n }\n return\n }\n let { password, oldPassword } = values\n submitButtonRef?.current?.onSpin(true)\n\n if (isAuthFlow) {\n const { apiCode, onGuardHandling, message: msg } = 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 if (apiCode === ApiCode.UNSAFE_PASSWORD_TIP) {\n message.error(msg)\n setPasswordErrorTextShow(true)\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: 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 <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 autoFocus={!isPhoneMedia}\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.inputNewPwd')}\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 {getPassWordUnsafeText()}\n <Form.Item className=\"authing-g2-sumbit-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 { 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'\nimport { useMediaSize } from '../../_utils/hooks'\nimport { usePasswordErrorText } from '../../_utils/useErrorText'\ninterface PasswordNotSafeResetProps {\n onReset: any\n}\nexport const PasswordNotSafeReset: React.FC<PasswordNotSafeResetProps> = ({\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 const { isPhoneMedia } = useMediaSize()\n\n let submitButtonRef = useRef<any>(null)\n const {\n getPassWordUnsafeText,\n setPasswordErrorTextShow,\n } = usePasswordErrorText()\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, message: msg } = await authFlow(\n ChangePasswordBusinessAction.ResetPasswordStrengthDetection,\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 if (apiCode === ApiCode.UNSAFE_PASSWORD_TIP) {\n message.error(msg)\n setPasswordErrorTextShow(true)\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 autoFocus={!isPhoneMedia}\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputNewPwd')}\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 {getPassWordUnsafeText()}\n <Form.Item className=\"authing-g2-sumbit-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 { CompletePassword } from './core/completePassword'\nimport { FirstLoginReset } from './core/firstLoginReset'\nimport { RotateReset } from './core/rotateReset'\nimport { PasswordNotSafeReset } from './core/PasswordNotSafeReset'\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 GuardPasswordNotSafeResetView: 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 = <PasswordNotSafeReset onReset={onReset} />\n\n return (\n <GuardChangePassword\n title={`${t('common.welcome')} ${config.title}`}\n explain={t('common.unsafePasswordChangeText')}\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\nexport const GuardNoticePasswordResetView: React.FC = () => {\n const { t } = useTranslation()\n\n const { changeModule } = useGuardModule()\n\n const initData = useGuardInitData<{\n forcedCycle: number\n onFinishCallBack: any\n }>()\n\n const onReset = () => {\n message.success(t('common.updatePsswordSuccess'))\n setTimeout(() => {\n changeModule?.(GuardModuleType.LOGIN)\n }, 500)\n }\n\n const coreForm = (\n <RotateReset\n onReset={onReset}\n onFinishCallBack={initData.onFinishCallBack}\n />\n )\n\n return (\n <GuardChangePassword\n title={t('user.modifyPwd')}\n explain={t('user.modifyNoticePwdText', {\n number: initData.forcedCycle,\n })}\n >\n {coreForm}\n </GuardChangePassword>\n )\n}\n\nexport const GuardRegisterCompletePasswordView: React.FC = () => {\n const { t } = useTranslation()\n\n const config = useGuardFinallyConfig()\n\n return (\n <GuardChangePassword\n title={`${t('common.welcome')} ${config.title}`}\n explain={t('common.registerCompletePasswordDesc')}\n >\n <CompletePassword />\n </GuardChangePassword>\n )\n}\n","import { User } from 'authing-js-sdk'\nimport { getGuardHttp } from '../_utils/guardHttp'\nimport { CompleteInfoRequest, RegisterCompleteInfoInitData } from './interface'\n\nexport const 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: RegisterCompleteInfoInitData['businessRequestName'],\n content: any,\n profile: any\n) => {\n const { post } = getGuardHttp()\n\n if (fnName === 'registerByEmail') {\n const phoneToken = profile.phoneToken\n\n delete profile.phoneToken\n\n return post(`/api/v2/register-email`, {\n ...content,\n profile: {\n ...content.profile,\n ...profile,\n },\n phoneToken,\n postUserInfoPipeline: true,\n })\n } else if (fnName === 'registerByPhoneCode') {\n const emailToken = profile?.emailToken\n\n delete profile?.emailToken\n return post(`/api/v2/register-phone-code`, {\n ...content,\n profile: {\n ...content.profile,\n ...profile,\n },\n emailToken,\n postUserInfoPipeline: true,\n })\n } else if (fnName === 'registerByEmailCode') {\n const phoneToken = profile.phoneToken\n\n delete profile.phoneToken\n return post('/api/v2/register-email-code', {\n ...content,\n profile: {\n ...content.profile,\n ...profile,\n },\n phoneToken,\n postUserInfoPipeline: true,\n }) as Promise<User>\n }\n}\n\nexport const registerSkipMethod = (\n fnName: RegisterCompleteInfoInitData['businessRequestName'],\n content: any\n) => {\n const { post } = getGuardHttp()\n\n if (fnName === 'registerByEmail') {\n return post(`/api/v2/register-email`, content)\n } else if (fnName === 'registerByPhoneCode') {\n return post(`/api/v2/register-phone-code`, content)\n } else if (fnName === 'registerByEmailCode') {\n return post('/api/v2/register-email-code', content)\n }\n}\n\nexport const registerRequest = async (\n action: CompleteInfoAuthFlowAction,\n registerFnName: RegisterCompleteInfoInitData['businessRequestName'],\n registerContent: any,\n registerProfile?: any\n) => {\n if (action === CompleteInfoAuthFlowAction.Skip) {\n return await registerSkipMethod(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, { useEffect, useState } from 'react'\n\nexport interface InputNumberProps extends InputProps {}\n\nconst isPhone = (propsValue?: string | number | readonly string[]) =>\n /^[0-9]*$/.test(String(propsValue))\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 isPhone(propsValue) ? propsValue : ''\n )\n\n const valueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value)\n onChange?.(e)\n }\n\n useEffect(() => {\n setValue(isPhone(propsValue) ? propsValue : '')\n }, [propsValue])\n\n return (\n <Input\n autoComplete=\"off\"\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'\nimport { i18n } from '../_utils/locales'\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 } ${i18n.language === 'ja-JP' ? 'send-code-btn-jp' : ''}`}\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 { i18n } from '../_utils/locales'\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 return (\n <>\n <Row justify=\"space-between\" align=\"middle\">\n <Col\n span={/ja/.test(i18n.language) ? 9 : 15}\n className=\"g2-send-code-input-col\"\n >\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={/ja/.test(i18n.language) ? 14 : 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 './style.less'\nimport { useTranslation } from 'react-i18next'\nimport { validate } from '../_utils'\nimport { InputProps } from 'antd/lib/input'\nimport { SendCode } from './index'\nimport { getGuardHttp } from '../_utils/guardHttp'\nimport { EmailScene } from '../Type'\nimport { useGuardEvents } from '../_utils/context'\nimport { useGuardAuthClient } from '../Guard/authClient'\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 const events = useGuardEvents()\n const authClient = useGuardAuthClient()\n const { post } = getGuardHttp()\n const sendEmail = async (email: string) => {\n if (!email) {\n message.error(t('login.inputEmail'))\n return {\n status: false,\n error: {\n code: 400,\n message: t('login.inputEmail'),\n },\n }\n }\n if (!validate('email', email)) {\n message.error(t('common.emailFormatError'))\n return {\n status: false,\n error: {\n code: 400,\n message: t('common.emailFormatError'),\n },\n }\n }\n try {\n const { code, message: tips, apiCode } = await post(\n '/api/v2/email/send',\n {\n email,\n scene,\n }\n )\n if (apiCode === 2080) {\n // 一分钟只能发一次邮箱验证码的提示信息,特殊处理\n message.error(tips)\n return {\n status: false,\n error: {\n code: apiCode,\n message: tips,\n },\n }\n }\n if (code === 200) {\n return {\n status: true,\n }\n } else {\n message.error(t('login.sendCodeTimeout'))\n return {\n status: false,\n error: {\n code,\n message: t('login.sendCodeTimeout'),\n },\n }\n }\n // await await authClient.sendEmail(email, scene)\n // onSend?.()\n } catch (error) {\n // onError?.(error)\n return { status: false, error }\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 const { status, error } = await sendEmail(email)\n if (status) {\n events?.onEmailSend?.(authClient, scene)\n } else {\n events?.onEmailSendError?.(error, authClient, scene)\n }\n return status\n })\n .catch((e: any) => {\n events?.onEmailSendError?.(e, authClient, scene)\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'\nimport { useGuardEvents } from '../_utils/context'\nimport { useGuardHttp } from '../_utils/guardHttp'\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 events = useGuardEvents()\n const { post } = useGuardHttp()\n\n const sendPhone = async (phone: string, countryCode?: string) => {\n try {\n // await authClient.sendSmsCode(phone, countryCode, scene)\n /**\n * 这个 post 方法请求时,接口报错或者超时 code 会返回 -1、-2,这个时候全局会给出提示,并且不会抛错\n * 会继续走下面逻辑,不走 catch\n * post 方法:packages/react-components/components/_utils/http.ts\n * 响应拦截:packages/react-components/components/_utils/responseManagement/index.ts\n */\n const data = await post('/api/v2/sms/send', {\n phone,\n phoneCountryCode: countryCode,\n scene,\n })\n const { code, statusCode, message: msg } = data\n // 200 表示请求成功,不报错\n if (statusCode === 200 || code === 200) {\n return { status: true }\n } else {\n // 由于使用项目中 post 方法进行请求,外层进行了处理,不会抛错,catch 不会走,在这对 code 进行针对处理\n // 'ECONNABORTED' 不知道是不是只有 sdk 报错,所以我在接口这也写了,防止接口也会1报这个错\n if ((code as any) === 'ECONNABORTED') {\n message.error(t('login.sendCodeTimeout'))\n return {\n status: false,\n error: data,\n }\n }\n // code 不是 -1、-2 时,并且 msg 存在, 那么进行报错\n if (!(code === -1 || code === -2)) {\n msg && message.error(msg)\n }\n // 这里看之前 sdk catch 中把整个 error对象传递的,所以报错时我就把整个返回值当作 error 对象传递了,而不是单独传递 message\n // 看的本文件 117行 onPhoneSendError 函数接受的 error 类型是一个对象「只包含 code、message」\n return { status: false, error: data }\n }\n // return { status: true }\n } catch (error: any) {\n if (error.code === 'ECONNABORTED') {\n message.error(t('login.sendCodeTimeout'))\n return {\n status: false,\n error,\n }\n }\n const { message: msg } = JSON.parse(error.message)\n message.error(msg)\n return {\n status: false,\n error,\n }\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 const { status, error } = await sendPhone(\n phoneNumber,\n countryCode\n )\n if (status) {\n events?.onPhoneSend?.(authClient, scene)\n } else {\n events?.onPhoneSendError?.(error, authClient, scene)\n }\n return status\n })\n .catch((e: any) => {\n events?.onPhoneSendError?.(e, authClient, scene)\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 /**\n * 回填的国际化区号\n */\n regionCode?: string\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\n // 只能单次遍历了\n\n // const [open, setOpen] = useState(false)\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 region: info.regions,\n region_en: info.regions_en,\n }\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 if (option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0) {\n return true\n }\n if (option.region.toLowerCase().indexOf(input.toLowerCase()) >= 0) {\n return true\n }\n if (option.region_en.toLowerCase().indexOf(input.toLowerCase()) >= 0) {\n return true\n }\n return false\n // return option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0\n }}\n suffixIcon={\n <>\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}\n","import Input, { InputProps } from 'antd/lib/input'\nimport React, { useEffect, 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\n const [value, setValue] = useState(\n /^[^a-zA-Z]*$/.test(String(formValue)) ? formValue : ''\n )\n\n // 当formValue变化时候\n useEffect(() => {\n setValue(/^[^a-zA-Z]*$/.test(String(formValue)) ? formValue : '')\n }, [formValue])\n\n const valueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value)\n onChange?.(e)\n }\n\n return (\n <>\n <Input\n autoComplete=\"off\"\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 maxLength={20}\n />\n </>\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 { useGuardFinallyConfig } from '../_utils/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 { host } = useGuardFinallyConfig()\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={`${host}/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 React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Form, Input, Select, DatePicker, message } from 'antd'\nimport { useTranslation } from 'react-i18next'\nimport { useAsyncFn } from 'react-use'\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 { SceneType } from 'authing-js-sdk'\nimport CustomFormItem from '../../ValidatorRules'\nimport { fieldRequiredRule, getCurrentLng } from '../../_utils'\nimport { SendCodeByEmail } from '../../SendCode/SendCodeByEmail'\nimport { SendCodeByPhone } from '../../SendCode/SendCodeByPhone'\nimport { useGuardPublicConfig } from '../../_utils/context'\nimport { parsePhone } from '../../_utils/hooks'\nimport { InputInternationPhone } from '../../Login/core/withVerifyCode/InputInternationPhone'\nimport { EmailScene } from '../../Type'\nimport { UploadImage } from '../../UploadImage'\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(\n config?.internationalSmsConfig?.defaultISOType || 'CN'\n )\n\n const { get, post } = 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 + ` (${key})`,\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 maxLength={20}\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={props.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; label?: string }) => (\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={props.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; label?: string }) => (\n <>\n <CustomFormItem.Email\n className=\"authing-g2-input-form\"\n name=\"email\"\n checkRepeat={true}\n label={props.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 maxLength={50} // 手机号限长 20 字符,多种组合是 50 字符\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.INFORMATION_COMPLETION_VERIFY_CODE}\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 getMetaDateLabel = useCallback(\n (metaData: CompleteInfoMetaData) => {\n let label: string = ''\n\n const fieldsI18n = config.extendsFieldsI18n?.[metaData.name]\n\n const currentLng = getCurrentLng()\n\n if (fieldsI18n?.[currentLng]?.enabled && fieldsI18n?.[currentLng].value) {\n label = fieldsI18n?.[currentLng].value\n } else {\n label = metaData.label || metaData.name\n }\n\n return label\n },\n [config.extendsFieldsI18n]\n )\n\n const generateRules = useCallback(\n (metaData: CompleteInfoMetaData) => {\n const formRules = []\n\n const label = getMetaDateLabel(metaData)\n\n const rules = metaData.validateRules ?? []\n\n const required = metaData.required ?? false\n\n if (required) {\n formRules.push({\n type:\n metaData.type === CompleteInfoExtendsControls.DATE_TIME\n ? ('object' as const)\n : undefined,\n required: true,\n validateTrigger: 'onChange',\n message: t('login.noEmpty', { label: label }),\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 validateTrigger: 'onBlur',\n message: rule.errorMessage || '请填写数字',\n })\n break\n case 'regExp':\n formRules.push({\n validateTrigger: 'onBlur',\n pattern: new RegExp((rule.content as any).replaceAll('/', '')),\n message: rule.errorMessage,\n })\n break\n default:\n break\n }\n })\n\n return formRules\n },\n [getMetaDateLabel, 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 const label = getMetaDateLabel(metaData)\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 label: label,\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 // 国家名和性别的控件需要单独和name匹配\n if (['country', 'gender'].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, getMetaDateLabel, 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 const fieldKeys = Object.keys(values)\n // 先过滤掉 为空的字段\n .filter((key) => values[key] !== undefined && values[key] !== '')\n\n submitButtonRef.current?.onSpin(true)\n\n const fieldValues = fieldKeys\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\n try {\n // 对特殊字段提前进行 precheck 不然直接调用注册接口失败也会导致上一步验证码失效\n // 用户名 check\n if (fieldKeys.includes('username')) {\n const { data: checkResult, code: checkCode } = await get(\n '/api/v2/users/is-user-exists',\n {\n username: values.username,\n }\n )\n // checkResult 为 true 时 代表用户名已存在 直接报message 并且不调用注册接口\n if (checkCode === 200 && checkResult) {\n message.error(t('common.userNameIsExists'))\n return\n }\n }\n // 手机验证码check\n if (fieldKeys.includes('phone')) {\n const options: any = {\n phone: values.phone,\n phoneCode: values.phoneCode,\n }\n if (isInternationSms) {\n const { countryCode } = parsePhone(\n isInternationSms,\n values.phone,\n areaCode\n )\n options.phoneCountryCode = countryCode\n }\n const {\n statusCode: checkCode,\n data: { valid, message: checkMessage },\n } = await post('/api/v2/sms/preCheckCode', options)\n if (checkCode !== 200 || !valid) {\n message.error(checkMessage)\n return\n }\n }\n // 邮箱验证码check\n if (fieldKeys.includes('email')) {\n const {\n statusCode: checkCode,\n data: { valid, message: checkMessage },\n } = await post('/api/v2/email/preCheckCode', {\n email: values.email,\n emailCode: values.emailCode,\n })\n if (checkCode !== 200 || !valid) {\n message.error(checkMessage)\n return\n }\n }\n\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 onSubmitCapture={() => submitButtonRef.current.onSpin(true)}\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-sumbit-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 './styles.less'\nimport { useGuardModule, useGuardPublicConfig } from '../_utils/context'\nimport { BackCustom } from '../Back'\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 renderBack = useMemo(() => {\n const onBack = () => backModule?.()\n\n return <BackCustom onBack={onBack}>{t('common.backToMFA')}</BackCustom>\n }, [backModule, t])\n\n return (\n <div className=\"g2-view-container g2-download-authenticator\">\n {renderBack}\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 {\n CompleteInfoBaseControls,\n CompleteInfoExtendsControls,\n CompleteInfoMetaData,\n CompleteInfoRequest,\n CompleteInfoRule,\n ExtendsField,\n} from '../CompleteInfo/interface'\nimport { ApplicationConfig } from '../Type/application'\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.map<CompleteInfoRule>((rule) => ({\n type: rule.type,\n content: rule.content,\n errorMessage: rule.error,\n })),\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 udf: { key: string; value: string }[] = []\n const registerProfile: Record<string, any> = {}\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.phoneToken = code\n\n if (name === 'email') registerProfile.emailToken = code\n\n registerProfile[name] = value\n } else if (fieldType === 'user') {\n udf.push({\n key: name,\n value,\n })\n }\n })\n\n return { registerProfile, udf }\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 useGuardButtonState,\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardInitData,\n useGuardMultipleInstance,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport {\n authFlow,\n CompleteInfoAuthFlowAction,\n registerRequest,\n} from './businessRequest'\nimport { extendsFieldsToMetaData, fieldValuesToRegisterProfile } from './utils'\nimport { GuardButton } from '../GuardButton'\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 { spinChange } = useGuardButtonState()\n\n const [skipLoading, setSkipLoading] = useState(false)\n\n const onSkip = async () => {\n spinChange(true)\n setSkipLoading(true)\n\n await businessRequest(CompleteInfoAuthFlowAction.Skip)\n setSkipLoading(false)\n spinChange(false)\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 <GuardButton\n className=\"g2-completeInfo-header-skip\"\n type=\"link\"\n loading={skipLoading}\n onClick={() => onSkip()}\n >\n {!skipLoading && (\n <IconFont type=\"authing-a-share-forward-line1\" />\n )}\n <span>{t('common.skip')}</span>\n </GuardButton>\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 { instance: multipleInstance } = useGuardMultipleInstance()\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 // 第一次登录的信息 TODO: 脏逻辑 没时间\n const originAccount = multipleInstance?.getOriginAccount()\n const methods: any =\n multipleInstance?.getOriginWay() === 'password'\n ? multipleInstance?.setLoginWayByHttpData\n : multipleInstance?.setLoginWayByLDAPData\n resData &&\n multipleInstance &&\n originAccount &&\n methods(originAccount, resData)\n\n if (isFlowEnd) {\n // TODO: 这里同样需要记录登录方式\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 publicConfig = useGuardPublicConfig()\n\n const events = useGuardEvents()\n\n const authClient = useGuardAuthClient()\n\n const { get } = useGuardHttpClient()\n\n const config = useGuardFinallyConfig()\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, udf } = fieldValuesToRegisterProfile(\n extendsFields,\n data?.fieldValues\n )\n const content = {\n ...initData.content,\n params: JSON.stringify(\n JSON.parse(\n initData.content?.params ? initData.content?.params : '[]'\n ).concat(udf)\n ),\n }\n const user: any = await registerRequest(\n action,\n initData.businessRequestName,\n content,\n registerProfile\n )\n if (user.statusCode === 200) {\n initData.onRegisterSuccess(user.data)\n events?.onRegisterInfoCompleted?.(user.data, content, authClient)\n } else {\n user?.onGuardHandling?.()\n const { apiCode, message: errorMessage, data } = user\n initData.onRegisterFailed(apiCode, data, errorMessage)\n events?.onRegisterInfoCompletedError?.(\n {\n code: apiCode,\n message: errorMessage,\n },\n content,\n authClient\n )\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 { 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, useMediaSize } from '../../_utils/hooks'\nimport { EmailScene } from '../../Type'\nimport { usePasswordErrorText } from '../../_utils/useErrorText'\nimport { getGuardHttp } from '../../_utils/guardHttp'\nimport { ApiCode } from '../../_utils/responseManagement/interface'\nimport { useGuardPublicConfig } from '../../_utils/context'\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 submitButtonRef = useRef<any>(null)\n const { isPhoneMedia } = useMediaSize()\n const { post } = getGuardHttp()\n let authClient = useGuardAuthClient()\n const { publicKey } = useGuardPublicConfig()\n const verifyCodeLength = props.publicConfig.verifyCodeLength ?? 4\n // 是否开启了国际化短信功能\n const isInternationSms =\n props.publicConfig.internationalSmsConfig?.enabled || false\n const {\n getPassWordUnsafeText,\n setPasswordErrorTextShow,\n } = usePasswordErrorText()\n const onFinish = async (values: any) => {\n let identify = values.identify\n let code = values.code\n let tempPassword = values.password\n let context = new Promise(() => {})\n const newPassword = await authClient.options?.encryptFunction?.(\n tempPassword,\n publicKey\n )\n if (codeMethod === 'email') {\n context = post('/api/v2/users/password/reset', {\n email: identify,\n code,\n newPassword,\n })\n // context = client.resetPasswordByEmailCode(identify, code, newPassword)\n }\n if (codeMethod === 'phone') {\n const { phoneNumber: phone, countryCode: phoneCountryCode } = parsePhone(\n isInternationSms,\n identify\n )\n context = post('/api/v2/users/password/reset', {\n phone,\n code,\n newPassword,\n phoneCountryCode,\n })\n // context = client.resetPasswordByPhoneCode(\n // phoneNumber,\n // code,\n // newPassword,\n // countryCode\n // )\n }\n\n context\n .then((r: any) => {\n const { code } = r\n if (code === ApiCode.UNSAFE_PASSWORD_TIP) {\n setPasswordErrorTextShow(true)\n }\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.RESET_PASSWORD_VERIFY_CODE}\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 checkExist={true}\n >\n <InputIdentify\n methods={['email-code', 'phone-code']}\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n autoFocus={!isPhoneMedia}\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 } else {\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 {getPassWordUnsafeText()}\n <Form.Item className=\"authing-g2-sumbit-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, { useMemo } from 'react'\nimport { ErrorInitData } from './interface'\nimport { i18n } from '../_utils/locales'\nimport './styles.less'\nimport { useGuardInitData } from '../_utils/context'\n\nexport interface ErrorProps {\n error?: Error\n}\n\nexport const GuardErrorView: React.FC<ErrorProps> = (propsInitData) => {\n const guardXInitData = useGuardInitData<ErrorInitData>()\n\n const messages = useMemo(() => {\n const error = propsInitData?.error ?? guardXInitData?.error\n\n return `${error?.message}` ?? `${i18n.t('user.contactAdministrator')}`\n }, [guardXInitData?.error, propsInitData?.error])\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 <div\n style={{\n width: 240,\n height: 160,\n backgroundImage:\n 'url(https://authing-files.oss-cn-zhangjiakou.aliyuncs.com/authing-guard/authing_error.svg)',\n backgroundSize: 'contain',\n }}\n />\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, Rule } 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_PATTERN } from '../../../_utils'\nimport { phone } from 'phone'\nimport {\n useGuardHttpClient,\n useGuardPublicConfig,\n} from '../../../_utils/context'\nimport { useCheckRepeat } from '../../../ValidatorRules/useCheckRepeat'\nimport { parsePhone } from '../../../_utils/hooks'\nimport { VerifyLoginMethods } from '../../../Type/application'\nexport interface FormItemIdentifyProps extends FormItemProps {\n checkRepeat?: boolean // 重复性校验\n checkExist?: boolean //存在性校验\n methods: VerifyLoginMethods[]\n currentMethod: 'phone-code' | 'email-code' //当前 input 输入\n areaCode?: string //国际化手机号区号\n}\n\nconst FindMethodConversion = {\n 'phone-code': 'phone',\n 'email-code': 'email',\n}\n\nexport const FormItemIdentify: React.FC<FormItemIdentifyProps> = (props) => {\n const {\n methods,\n areaCode = 'CN',\n currentMethod,\n checkRepeat,\n checkExist,\n ...formItemProps\n } = props\n const publicConfig = useGuardPublicConfig()\n const { t } = useTranslation()\n\n const { get } = useGuardHttpClient()\n\n const checkInternationalSms =\n publicConfig.internationalSmsConfig?.enabled &&\n currentMethod === 'phone-code'\n\n const methodContent = useMemo(() => {\n if (currentMethod === 'email-code')\n return {\n field: t('common.emailLabel'),\n checkRepeatErrorMessage: t('common.checkEmail'),\n checkExistErrorMessage: t('common.noFindEmail'),\n formatErrorMessage: t('login.inputCorrectPhone'),\n pattern: VALIDATE_PATTERN.email,\n }\n else\n return {\n field: t('common.phone'),\n checkRepeatErrorMessage: t('common.checkPhone'),\n checkExistErrorMessage: t('common.noFindPhone'),\n formatErrorMessage: t('login.inputCorrectPhone'),\n pattern: VALIDATE_PATTERN.phone,\n }\n }, [currentMethod, t])\n\n const checkRepeatRet = (\n value: any,\n resolve: (value: unknown) => void,\n reject: (reason?: any) => void\n ) => {\n let checkValue = value\n if (currentMethod === 'phone-code' && checkInternationalSms) {\n const { phoneNumber } = parsePhone(\n checkInternationalSms,\n checkValue,\n areaCode\n )\n checkValue = phoneNumber\n }\n get<boolean>(`/api/v2/users/find`, {\n userPoolId: publicConfig?.userPoolId,\n key: checkValue,\n type: FindMethodConversion[currentMethod],\n }).then(({ data }) => {\n if (checkExist) {\n Boolean(data)\n ? resolve(true)\n : reject(methodContent.checkExistErrorMessage)\n }\n if (checkRepeat) {\n Boolean(data)\n ? reject(methodContent.checkRepeatErrorMessage)\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 (\n !value ||\n phone(value, { country: areaCode }).isValid ||\n phone(value).isValid\n )\n return Promise.resolve()\n return Promise.reject(t('common.i18nCheckErrorMessage'))\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\n // 必填项的默认校验规则\n const rules = [...fieldRequiredRule(t('common.phoneOrEmail'))]\n\n // 格式校验\n rules.push(formatRules)\n\n // 是否校验重复\n if (checkRepeat || checkExist) {\n rules.push({\n validator: checkRepeatFn,\n validateTrigger: [],\n })\n }\n\n return rules\n }, [t, formatRules, checkRepeat, checkExist, checkRepeatFn])\n // TODO 未来抽离\n const renderTemplate = useMemo(() => {\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 (\n <CustomFormItem.Phone\n {...formItemProps}\n areaCode={areaCode}\n checkRepeat={checkRepeat}\n checkExist={checkExist}\n />\n )\n case 'email-code':\n return (\n <CustomFormItem.Email\n {...formItemProps}\n checkRepeat={checkRepeat}\n checkExist={checkExist}\n />\n )\n }\n }, [\n areaCode,\n checkExist,\n checkRepeat,\n currentMethod,\n formItemProps,\n methods.length,\n rules,\n ])\n\n return <>{renderTemplate}</>\n}\n","import Input, { InputProps } from 'antd/lib/input'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { IconFont } from '../../../IconFont'\nimport { InputNumber } from '../../../InputNumber'\nimport { VerifyLoginMethods } from '../../../Type/application'\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: 2,\n },\n 'phone-code': {\n t: publicConfig?.internationalSmsConfig?.enabled\n ? t('common.areaCodePhone')\n : t('common.phoneNumber'),\n sort: 1,\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 maxLength={50} // 手机号限长 20 字符,多种组合是 50 字符\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 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 {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\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 onReset={onReset} publicConfig={publicConfig} />\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 '../../../Type/application'\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 (\n <CustomFormItem.Phone {...formItemPtops} isCheckPattern={false} />\n )\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 { InputNumber } from '../../../InputNumber'\nimport { PasswordLoginMethods } from '../../../Type/application'\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: 1,\n },\n 'phone-password': {\n t: t('common.phoneNumber'),\n sort: 0,\n },\n 'username-password': {\n t: t('common.username'),\n sort: 2,\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={20} placeholder={placeholder} {...inputProps} />\n )\n\n // 手机号限长 20 字符,多种组合是 50 字符\n return <Input maxLength={50} 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 '../../../Type/application'\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","/* eslint-disable prettier/prettier */\nimport { FormInstance } from 'antd/lib/form'\nimport { useEffect, useCallback, useRef, useLayoutEffect } from 'react'\nimport {\n BackFillMultipleState,\n LoginWay,\n} from '../../Guard/core/hooks/useMultipleAccounts'\nimport { useGuardMultipleInstance } from '../../_utils/context'\n\n/**\n * 多账号登录下 账户 & 登录方式自动回填\n * TODO: HOOK 参数有时间整理成为对象,开始没有想到有这么多\n * 调用地方 core 中需要回填的两个登录方式\n */\nfunction useLoginMultipleBackFill(options: {\n form: FormInstance<any>\n way: LoginWay\n formKey: string\n backfillData?: BackFillMultipleState\n isOnlyInternationSms?: boolean\n setAreaCode?: React.Dispatch<React.SetStateAction<string>>\n cancelBackfill?: boolean\n changeCurrentMethod?: (account: string) => void\n}) {\n const {\n form,\n way,\n formKey,\n backfillData,\n isOnlyInternationSms,\n setAreaCode,\n cancelBackfill,\n changeCurrentMethod,\n } = options\n // 获得格式化后的回填 account,如果是国际化选择框,还需要改变对应选项\n const parseFillData = useCallback(() => {\n const prefix = isOnlyInternationSms\n ? ''\n : backfillData?.phoneCountryCode\n ? backfillData?.phoneCountryCode + ` `\n : ''\n\n const content = backfillData?.account || ''\n\n const account = prefix + content\n\n return {\n account,\n areaCode: backfillData?.areaCode,\n }\n }, [isOnlyInternationSms, backfillData])\n\n // initData 如果存在值表示已经回填过了\n useEffect(() => {\n const matchLoginWay = backfillData?.way === way\n if (backfillData && matchLoginWay && !cancelBackfill) {\n const { account, areaCode } = parseFillData()\n areaCode && setAreaCode?.(areaCode)\n changeCurrentMethod?.(account)\n form.setFieldsValue({\n [formKey]: account,\n })\n }\n }, [\n backfillData,\n cancelBackfill,\n form,\n formKey,\n way,\n setAreaCode,\n parseFillData,\n changeCurrentMethod,\n ])\n}\n\n/**\n * 多账号统一状态管理\n * @param setLoginWay\n * @returns\n */\nfunction useLoginMultiple(setLoginWay: React.Dispatch<any>) {\n const multipleQrWay = useRef<string>()\n // 多账号实例\n const {\n instance: multipleInstance,\n referMultipleState,\n isMultipleAccount,\n multipleAccountData: backfillData,\n } = useGuardMultipleInstance()\n\n const onBackFillData = useCallback(\n (data: BackFillMultipleState) => {\n const { way, qrCodeId } = data\n const qrCodeDefaultTab = qrCodeId ? way + qrCodeId : way\n multipleQrWay.current = qrCodeDefaultTab\n setLoginWay(way)\n },\n [setLoginWay]\n )\n\n // 没办法了 TODO: 我真的是没办法了... 只有Default方式去硬逻辑加载\n if (backfillData?.qrCodeId) {\n multipleQrWay.current = backfillData.way + backfillData?.qrCodeId\n }\n\n useLayoutEffect(() => {\n // 非多账号登录页面 并且存在返回值\n if (!isMultipleAccount && backfillData) {\n onBackFillData(backfillData)\n }\n }, [isMultipleAccount, backfillData, onBackFillData])\n\n return {\n isMultipleAccount,\n multipleInstance,\n referMultipleState,\n backfillData,\n defaultQrWay: multipleQrWay.current,\n }\n}\n\nexport { useLoginMultipleBackFill, useLoginMultiple }\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 { 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'\nimport { useMediaSize } from '../../../_utils/hooks'\nimport {\n useGuardFinallyConfig,\n useGuardInitData,\n useGuardPublicConfig,\n} from '../../../_utils/context'\nimport { GuardLoginInitData } from '../../interface'\nimport {\n Agreement,\n LoginMethods,\n PasswordLoginMethods,\n} from '../../../Type/application'\nimport {\n BackFillMultipleState,\n StoreInstance,\n} from '../../../Guard/core/hooks/useMultipleAccounts'\nimport { useForm } from 'antd/lib/form/Form'\nimport { useLoginMultipleBackFill } from '../../hooks/useLoginMultiple'\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 saveIdentify?: (type: LoginMethods, identity: string) => void\n /**\n * 根据输入的账号 & 返回获得对应的登录方法\n */\n multipleInstance?: StoreInstance\n /**\n * 多账号回填的数据\n */\n backfillData?: BackFillMultipleState\n}\n\nexport const LoginWithPassword = (props: LoginWithPasswordProps) => {\n const {\n agreements,\n onLoginFailed,\n onLoginSuccess,\n saveIdentify,\n multipleInstance,\n backfillData,\n } = props\n\n const [form] = useForm()\n\n const {\n _firstItemInitialValue = '',\n specifyDefaultLoginMethod,\n } = useGuardInitData<GuardLoginInitData>()\n\n useLoginMultipleBackFill({\n form,\n way: LoginMethods.Password,\n formKey: 'account',\n backfillData,\n cancelBackfill: LoginMethods.Password === specifyDefaultLoginMethod,\n })\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n const { isPhoneMedia } = useMediaSize()\n const [validated, setValidated] = useState(false)\n\n let { t } = useTranslation()\n let { post } = useGuardHttp()\n let client = useGuardAuthClient()\n\n const publicConfig = useGuardPublicConfig()\n const config = useGuardFinallyConfig()\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 = publicConfig?.mergeAdAndAccountPasswordLogin\n ? '/api/v2/login/ad-all-in-one'\n : '/api/v2/login/account'\n let account = loginData.identity && loginData.identity.trim()\n let password = loginData.password\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: config?.isHost\n ? getUserRegisterParams(['login_page_context'])\n : undefined,\n autoRegister: props.autoRegister,\n withCustomData: false,\n }\n const res = await post(url, body)\n\n return res\n },\n [\n config?.isHost,\n encrypt,\n post,\n props,\n publicConfig?.mergeAdAndAccountPasswordLogin,\n ]\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\n setAccountLock(false)\n\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, values.account)\n }\n\n const onLoginRes = (res: AuthingGuardResponse, account: string) => {\n const { code, apiCode, message: msg, data, onGuardHandling } = res\n submitButtonRef?.current?.onSpin(false)\n // 更新本次登录方式\n data &&\n multipleInstance &&\n multipleInstance.setLoginWayByHttpData(account, data)\n\n if (code === 200) {\n onLoginSuccess(data, msg)\n } else {\n if (apiCode === ErrorCode.INPUT_CAPTCHACODE) {\n setVerifyCodeUrl(getCaptchaUrl())\n setShowCaptcha(true)\n }\n\n if (apiCode === ErrorCode.PASSWORD_ERROR) {\n if ((data as any)?.remainCount ?? false) {\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 apiCode === ErrorCode.ACCOUNT_LOCK ||\n apiCode === ErrorCode.MULTIPLE_ERROR_LOCK\n ) {\n // 账号锁定\n setAccountLock(true)\n }\n\n // 响应拦截器处理通用错误以及changeModule\n // 本次请求成功 && 当前请求\n const handMode = onGuardHandling?.()\n if (handMode) {\n }\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 const formValuesChange = (changedValues: Record<string, any>) => {\n if (changedValues?.account && saveIdentify) {\n saveIdentify(LoginMethods.Password, changedValues?.account)\n }\n }\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 form={form}\n onValuesChange={formValuesChange}\n >\n <FormItemAccount\n name=\"account\"\n className=\"authing-g2-input-form\"\n passwordLoginMethods={props.passwordLoginMethods}\n initialValue={\n specifyDefaultLoginMethod === LoginMethods.Password\n ? _firstItemInitialValue\n : ''\n }\n // TODO\n // 开启国际化手机号场景且只有手机号情况下 不应再根据区号去验证手机号\n >\n <InputAccount\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n autoFocus={!isPhoneMedia}\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 className=\"authing-g2-sumbit-form\">\n <SubmitButton\n // TODO 产品还没想好 暂时不上\n // disabled={\n // !!agreements.find((item) => item.required && !acceptedAgreements)\n // }\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 { 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 { useGuardHttpClient } from '../../_utils/context'\nimport { CodeAction } from '../../_utils/responseManagement/interface'\nimport { useMediaSize } from '../../_utils/hooks'\nimport { Agreement, LoginMethods } from '../../Type/application'\nimport {\n BackFillMultipleState,\n StoreInstance,\n} from '../../Guard/core/hooks/useMultipleAccounts'\nimport { useLoginMultipleBackFill } from '../hooks/useLoginMultiple'\n\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 * 根据输入的账号 & 返回获得对应的登录方法\n */\n multipleInstance?: StoreInstance\n /**\n * 多账号回填的数据\n */\n backfillData?: BackFillMultipleState\n}\n\nexport const LoginWithLDAP = (props: LoginWithLDAPProps) => {\n const {\n agreements,\n onLoginSuccess,\n onLoginFailed,\n multipleInstance,\n backfillData,\n } = props\n\n const [form] = Form.useForm()\n\n // const { responseIntercept } = useGuardHttpClient()\n useLoginMultipleBackFill({\n form,\n way: 'ldap',\n formKey: 'account',\n backfillData,\n })\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n\n const { isPhoneMedia } = useMediaSize()\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\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 data &&\n multipleInstance &&\n multipleInstance.setLoginWayByLDAPData(username, data)\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 form={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 autoFocus={!isPhoneMedia}\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 className=\"authing-g2-sumbit-form\">\n <SubmitButton\n // disabled={\n // !!agreements.find((item) => item.required && !acceptedAgreements)\n // }\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 { useForm } from 'antd/lib/form/Form'\nimport { LoginMethods } from 'authing-js-sdk'\nimport React, { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport {\n BackFillMultipleState,\n StoreInstance,\n} from '../../Guard/core/hooks/useMultipleAccounts'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { IconFont } from '../../IconFont'\nimport { InputPassword } from '../../InputPassword'\nimport { Agreements } from '../../Register/components/Agreements'\nimport SubmitButton from '../../SubmitButton'\nimport { Agreement } from '../../Type/application'\nimport version from '../../version/version'\nimport { fieldRequiredRule } from '../../_utils'\nimport {\n useGuardAppId,\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardPublicConfig,\n} from '../../_utils/context'\nimport { useMediaSize } from '../../_utils/hooks'\nimport { requestClient } from '../../_utils/http'\nimport { i18n } from '../../_utils/locales'\nimport { CodeAction } from '../../_utils/responseManagement/interface'\n// import { useLoginMultipleBackFill } from '../hooks/useLoginMultiple'\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 * 回填的数据\n */\n backfillData?: BackFillMultipleState\n /**\n * 根据输入的账号 & 返回获得对应的登录方法\n */\n multipleInstance?: StoreInstance\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 { host } = useGuardFinallyConfig()\n\n const appId = useGuardAppId()\n\n const { responseIntercept } = useGuardHttpClient()\n\n const { t } = useTranslation()\n\n const { isPhoneMedia } = useMediaSize()\n\n let client = useGuardAuthClient()\n\n // const { post } = useGuardHttpClient()\n\n const [form] = useForm()\n\n // useLoginMultipleBackFill({\n // form,\n // way: 'ad',\n // formKey: 'account',\n // backfillData,\n // })\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\n\n const encrypt = client.options.encryptFunction\n\n const encryptPassword = await encrypt!(password, props.publicKey)\n\n // todo\n try {\n const api = `${host}/api/v2/ad/verify-user`\n\n const fetchRes = await fetch(api, {\n method: 'POST',\n body: JSON.stringify({ username, password: encryptPassword }),\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 // // 更新本次登录方式\n // data && multipleInstance && multipleInstance.setLoginWay('input', 'ad')\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 form={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 autoFocus={!isPhoneMedia}\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={\n publicConfig?.mergeAdAndAccountPasswordLogin\n ? t('common.jobNumber')\n : t('login.inputAdUsername')\n }\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={\n publicConfig?.mergeAdAndAccountPasswordLogin\n ? t('login.inputPwd')\n : t('login.inputAdPwd')\n }\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 className=\"authing-g2-sumbit-form\">\n <SubmitButton\n // disabled={\n // !!agreements.find(\n // (item) => item.required && !acceptedAgreements\n // )\n // }\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, { ReactElement, useMemo } from 'react'\nimport className from 'classnames'\nimport './index.less'\nimport { useImage } from './hooks/useImage'\nimport { useStatus } from './hooks/useStatus'\nimport { ShieldSpin } from '../ShieldSpin'\nimport { CodeStatusDescriptions } from './WorkQrCode'\nimport { useTranslation } from 'react-i18next'\n\n// 目前 UI 支持的状态(满载)\nexport type CodeStatus =\n | 'loading'\n | 'ready'\n | 'already'\n | 'success'\n | 'error'\n | 'expired'\n | 'cancel'\n | 'MFA'\n\nexport const prefix = 'refactor'\n\nexport interface UiQrProps {\n /**\n * Loading 组件\n */\n loadingComponent?: React.ReactElement\n /**\n * 二维码组件三种状态\n * ready 准备状态\n * already 已扫描状态\n * success 扫描成功/登录成功状态\n * error 错误状态(超时、网络错误)\n */\n status: CodeStatus\n /**\n * 二维码 URL\n */\n src?: string\n /**\n * 二维码底部内容\n */\n descriptions: CodeStatusDescriptions\n /**\n * 外层 container 样式\n */\n containerStyle?: React.CSSProperties\n /**\n * 内层 container 样式(图片)\n */\n imageStyle?: React.CSSProperties\n /**\n * 二维码图片准备好的回调\n */\n onLoad?: () => void\n /**\n * 点击遮罩中的内容区\n * status 当前组件所处状态\n */\n onClickMaskEl?: (status: CodeStatus) => void\n /**\n * 点击全部遮罩区域\n * status 当前组件所处状态\n */\n onMaskContent?: (status: CodeStatus) => void\n}\n\nconst QrCode: React.FC<UiQrProps> = (props) => {\n const {\n status,\n loadingComponent,\n src,\n descriptions,\n containerStyle,\n imageStyle,\n onLoad,\n onClickMaskEl,\n onMaskContent,\n } = props\n const { t } = useTranslation()\n const [statusCls, statusComponent] = useStatus(status)\n\n const [baseUrl] = useImage(src, {\n onLoad,\n })\n\n const classes = className(`${prefix}-qrcode`, statusCls)\n\n const Loading = useMemo(() => {\n return loadingComponent || <ShieldSpin />\n }, [loadingComponent])\n\n return (\n <div className={classes} style={containerStyle}>\n {status === 'loading' ? (\n Loading\n ) : (\n <>\n <span\n className={`${prefix}__image-wrapper`}\n onClick={() => onMaskContent && onMaskContent(status)}\n >\n {statusComponent && (\n <div className={`${prefix}-qrcode__mask`}>\n {React.cloneElement(statusComponent as ReactElement, {\n onClick: (e: React.MouseEvent) => {\n onClickMaskEl && onClickMaskEl(status)\n ;(statusComponent as ReactElement).props.onClick?.(e)\n },\n })}\n </div>\n )}\n <img\n className={`${prefix}__image`}\n src={baseUrl}\n alt={t('common.qrcode')}\n style={imageStyle}\n />\n </span>\n {/* 统一的处理模板 */}\n <div className={`${prefix}__desc`}>{descriptions[status]}</div>\n </>\n )}\n </div>\n )\n}\n\nconst UiQrCode = React.memo(QrCode)\n\nexport { UiQrCode }\n","import React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { IconFont } from '../../IconFont'\nimport { CodeStatus, prefix } from '../UiQrCode'\n\n/**\n * 根据不同状态添加不同的元素\n * 维护不同状态的处理\n */\nconst useStatus = (status: CodeStatus) => {\n const classes = `${prefix}-qrcode--${status}`\n\n const { t } = useTranslation()\n\n /**\n * 不同状态的中间组件\n * TODO: 应该外部传入 具体看后续需求吧,如果有非统一状态外部覆盖\n * 否则保持内部统一模板无需改动\n */\n const componentMapping = useMemo(() => {\n const mapping: Record<CodeStatus, React.ReactNode> = {\n loading: null,\n ready: null,\n already: (\n <>\n <IconFont\n type=\"authing-checkbox-circle-fill\"\n style={{ width: '40px', height: '40px' }}\n />\n <span className={`${prefix}-inner__title--already`}>\n {t('login.scanSuccess')}\n </span>\n </>\n ),\n cancel: (\n <>\n <IconFont\n type=\"authing-refer-qr-code\"\n style={{ width: '40px', height: '40px' }}\n />\n <span className={`${prefix}-inner__title--refer`}>\n {t('login.qrcodeRefer')}\n </span>\n </>\n ),\n expired: (\n <>\n <IconFont\n type=\"authing-refer-qr-code\"\n style={{ width: '40px', height: '40px' }}\n />\n <span className={`${prefix}-inner__title--refer`}>\n {t('login.qrcodeRefer')}\n </span>\n </>\n ),\n error: (\n <>\n <IconFont\n type=\"authing-refer-qr-code\"\n style={{ width: '40px', height: '40px' }}\n />\n <span className={`${prefix}-inner__title--refer`}>\n {t('login.qrcodeNetWorkError')}\n </span>\n </>\n ),\n success: (\n <>\n <IconFont\n type=\"authing-checkbox-circle-fill\"\n style={{ width: '40px', height: '40px' }}\n />\n <span className={`${prefix}-inner__title--already`}>\n {t('login.scanSuccess')}\n </span>\n </>\n ),\n MFA: null,\n }\n return mapping[status]\n }, [status, t])\n\n return [classes, componentMapping]\n}\n\nexport { useStatus }\n","import { useCallback, useEffect, useState } from 'react'\nimport axios from 'axios'\n\nconst useImage = (\n src: string | undefined,\n options: {\n onLoad?: () => void\n }\n) => {\n const [baseUrl, setBaseUrl] = useState<string>()\n\n const { onLoad } = options\n\n /**\n * 预加载图片,转 base64。触发 onLoad,仅此而已\n */\n const preFetchImage = useCallback(async () => {\n const { data: blob } = await axios.get(src!, {\n responseType: 'blob',\n })\n const fileReader = new FileReader()\n\n fileReader.onload = (e: ProgressEvent<FileReader>) => {\n const base64 = e.target?.result as string\n setBaseUrl(base64)\n onLoad && onLoad()\n }\n fileReader.readAsDataURL(blob)\n }, [src, onLoad])\n\n // 每次 render 都会请求 不应该\n useEffect(() => {\n if (src) {\n preFetchImage()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src])\n\n return [baseUrl]\n}\n\nexport { useImage }\n","import { useReducer } from 'react'\nimport { CodeStatus } from '../UiQrCode'\n\nexport type ReducerType = 'change' | 'changeStatus' | 'changeDesc'\n\nexport type RootState = {\n /**\n * 状态\n */\n status: CodeStatus\n /**\n * 底部描述\n */\n // description: React.ReactNode\n /**\n * 当前二维码 URL\n */\n src?: string\n /**\n * 二维码随机值\n */\n random?: string\n}\n\nconst reducer = (\n state: RootState,\n action: {\n type: ReducerType\n payload: Partial<RootState>\n }\n) => {\n switch (action.type) {\n case 'changeStatus':\n if (state.status === action.payload.status) {\n return state\n }\n return { ...state, ...action.payload }\n // case 'changeDesc':\n // if (state.description === action.payload.description) {\n // return state\n // }\n // return { ...state, ...action.payload }\n case 'change':\n return { ...state, ...action.payload }\n default:\n return state\n }\n}\n\n/**\n * QrCode 准备阶段 Hook\n */\nconst usePreQrCode = () => {\n /**\n * reducer 控制\n */\n const [state, dispatch] = useReducer(reducer, {\n status: 'loading',\n // description: '',\n src: undefined,\n random: undefined,\n })\n\n return {\n state,\n dispatch,\n }\n}\n\nexport { usePreQrCode }\n","import React, {\n forwardRef,\n ForwardRefRenderFunction,\n useCallback,\n useImperativeHandle,\n useMemo,\n} from 'react'\nimport { ShieldSpin } from '../ShieldSpin'\nimport { useGuardHttpClient } from '../_utils/context'\nimport { usePreQrCode } from './hooks/usePreQrCode'\nimport { QrCodeResponse, useQrCode } from './hooks/usePostQrCode'\nimport { CodeStatus, UiQrCode, UiQrProps } from './UiQrCode'\n\n/**\n * 二维码不同状态下的底部描述文字\n */\nexport type CodeStatusDescriptions = Partial<\n Record<\n Exclude<CodeStatus, 'loading'>,\n React.ReactNode | ((referQrCode?: () => void) => React.ReactNode)\n >\n>\n\nexport interface WorkQrCodeRef {\n referQrCode: () => Promise<\n | {\n random: string\n url: string\n }\n | undefined\n >\n}\n\ninterface WorkQrCodeProps extends Omit<UiQrProps, 'description' | 'status'> {\n /**\n * 二维码场景\n */\n scene: 'WXAPP_AUTH' | 'APP_AUTH' | 'WECHATMP_AUTH'\n /**\n * 不同状态请求文字\n */\n descriptions: CodeStatusDescriptions\n /**\n * 睡眠时间 默认 1000\n */\n sleepTime?: number\n /**\n * 每当状态变化时,触发的 callback 。\n */\n onStatusChange?: (status: CodeStatus, data: QrCodeResponse) => void\n /**\n * 不同状态下点击遮罩中间区域方法\n */\n onClickMaskContent?: (status: CodeStatus) => void\n /**\n * 不同二维码下生成配置\n */\n qrCodeScanOptions?: any\n}\n\nconst WorkQrCodeComponent: ForwardRefRenderFunction<any, WorkQrCodeProps> = (\n props,\n ref\n) => {\n const {\n scene,\n descriptions,\n sleepTime = 1000,\n onStatusChange,\n onClickMaskContent,\n qrCodeScanOptions = {},\n ...rest\n } = props\n\n const {\n context,\n customData,\n withCustomData,\n extIdpConnId,\n } = qrCodeScanOptions\n\n const { get, post } = useGuardHttpClient()\n\n /**\n * 生成图片\n */\n const genCodeRequest = useCallback(\n () =>\n post<{ random: string; url: string }>(`/api/v2/qrcode/gene`, {\n autoMergeQrCode: false,\n scene,\n /**\n * 请求上下文,将会传递到 Pipeline 中\n */\n context,\n /**\n * 是否获取用户自定义数据\n */\n params: customData,\n /**\n * 是否获取用户自定义数据\n */\n withCustomData,\n /**\n * 多租户用的额外的 Idp Id。\n */\n extIdpConnId,\n }),\n [scene, post, context, customData, extIdpConnId, withCustomData]\n )\n\n const { state, dispatch } = usePreQrCode()\n\n /**\n * 状态检查方法\n */\n const checkedRequest = useCallback(\n async () => get(`/api/v2/qrcode/check?random=${state.random}`),\n [state.random, get]\n )\n\n /**\n * 交换用户信息方法\n */\n const exchangeUserInfo = useCallback(\n async (ticket: string) =>\n post(`/api/v2/qrcode/userinfo`, {\n ticket,\n }),\n [post]\n )\n\n useQrCode(\n {\n state,\n dispatch,\n sleepTime,\n descriptions,\n onStatusChange,\n },\n\n {\n genCodeRequest,\n exchangeUserInfo,\n readyCheckedRequest: checkedRequest,\n alreadyCheckedRequest: checkedRequest,\n }\n )\n\n /**\n * 二维码渲染完成后重置状态\n */\n const onLoadQrcCode = () => {\n dispatch({\n type: 'changeStatus',\n payload: {\n status: 'ready',\n },\n })\n }\n\n /**\n * 刷新二维码方法\n */\n const referQrCode = useCallback(() => {\n dispatch({\n type: 'changeStatus',\n payload: {\n status: 'loading',\n },\n })\n }, [dispatch])\n\n /**\n * 内置的默认遮罩点击事件\n */\n const processDefaultMaskClick = (status: CodeStatus) => {\n switch (status) {\n case 'cancel':\n case 'expired':\n case 'error':\n referQrCode()\n break\n default:\n break\n }\n }\n\n /**\n * 点击遮罩触发\n * @param status\n */\n const handlerMaskClick = (status: CodeStatus) => {\n if (onClickMaskContent) {\n onClickMaskContent(status)\n } else {\n processDefaultMaskClick(status)\n }\n }\n\n useImperativeHandle(\n ref,\n () => {\n return {\n referQrCode,\n }\n },\n [referQrCode]\n )\n\n /**\n * 渲染时进行格式化描述\n */\n const formatterDescriptions = useMemo(() => {\n let formatDescriptions: CodeStatusDescriptions = {}\n descriptions &&\n Object.keys(descriptions).forEach((key) => {\n const parseKey = key as keyof CodeStatusDescriptions\n const value = descriptions[parseKey]\n if (typeof value === 'function') {\n formatDescriptions[parseKey] = value(referQrCode)\n } else {\n formatDescriptions[parseKey] = value\n }\n })\n return formatDescriptions\n }, [descriptions, referQrCode])\n\n return (\n <UiQrCode\n src={state.src}\n descriptions={formatterDescriptions}\n status={state.status}\n loadingComponent={<ShieldSpin />}\n onLoad={onLoadQrcCode}\n onMaskContent={handlerMaskClick}\n {...rest}\n ></UiQrCode>\n )\n}\n\nconst WorkQrCode = forwardRef(WorkQrCodeComponent)\nexport { WorkQrCode }\n","import { useCallback, useEffect } from 'react'\nimport { sleep } from '../../_utils'\nimport { useGuardFinallyConfig } from '../../_utils/context'\nimport { AuthingGuardResponse, AuthingResponse } from '../../_utils/http'\nimport { CodeStatus } from '../UiQrCode'\nimport { CodeStatusDescriptions } from '../WorkQrCode'\nimport { ReducerType, RootState } from './usePreQrCode'\n\nexport interface QrCodeResponse {\n /**\n * 根据状态确定不同的流程\n */\n status: number\n /**\n * 返回的随机值\n */\n random: number\n /**\n * 返回的用户信息\n */\n userInfo?: any\n /**\n * 扫码成功后 Tick 换取用户信息\n */\n ticket?: string\n /**\n * MFA 状态下的返回\n */\n scannedResult?: AuthingResponse\n}\n\n/**\n * 二维码请求相关\n */\ninterface QrCodeRequest {\n genCodeRequest?: () => Promise<\n AuthingGuardResponse<{\n random: string\n url: string\n }>\n >\n /**\n * 未扫码下的请求方法\n */\n readyCheckedRequest?: () => Promise<AuthingGuardResponse<QrCodeResponse>>\n /**\n * 已经扫码下的请求方法(待确认)\n */\n alreadyCheckedRequest?: () => Promise<AuthingGuardResponse<QrCodeResponse>>\n /**\n * 使用 ticket 交换用户信息\n */\n exchangeUserInfo?: (ticket: string) => Promise<any>\n}\n\ninterface QrCodeOptions {\n state: RootState\n dispatch: React.Dispatch<{\n type: ReducerType\n payload: Partial<RootState>\n }>\n descriptions: CodeStatusDescriptions\n /**\n * check 轮询间隔时间\n */\n sleepTime?: number\n /**\n * 状态改变时触发事件,仅在 Server 返回的二维码状态改变时进行触发\n */\n onStatusChange?: (status: CodeStatus, data: QrCodeResponse) => void\n}\n\n/**\n * 二维码处理阶段\n * 二维码处理阶段分为两个主要流程\n * 1. 同一状态下的轮询逻辑处理\n * 2. 根据不同返回状态码进行处理\n */\nexport const useQrCode = (options: QrCodeOptions, request: QrCodeRequest) => {\n let destroy = false\n\n const { state, dispatch, sleepTime, onStatusChange } = options\n\n const finallyConfig = useGuardFinallyConfig()\n\n const {\n readyCheckedRequest,\n alreadyCheckedRequest,\n exchangeUserInfo,\n genCodeRequest,\n } = request\n\n /**\n * 根据 Server 返回的状态码决定对应的二维码展示状态\n * @param res\n * @returns\n */\n const getStatusByRes = useCallback((res: QrCodeResponse) => {\n const lists: CodeStatus[] = [\n 'expired',\n 'ready',\n 'already',\n 'success',\n 'cancel',\n 'MFA',\n 'error',\n ]\n const index = res.status + 1\n return lists[index]\n }, [])\n\n // 根据响应\n const processReady = async () => {\n if (\n state.status === 'ready' &&\n readyCheckedRequest &&\n !finallyConfig?._closeLoopCheckQrcode\n ) {\n sleepTime && (await sleep(sleepTime))\n // 再次发起请求\n uniteRequestHandler(readyCheckedRequest)\n }\n }\n\n // already 待确认状态的请求方法\n const processAReady = async () => {\n if (\n state.status === 'already' &&\n alreadyCheckedRequest &&\n !finallyConfig?._closeLoopCheckQrcode\n ) {\n sleepTime && (await sleep(sleepTime))\n uniteRequestHandler(alreadyCheckedRequest)\n }\n }\n\n // TODO: 方法留着,以后业务扩充。当状态改变时,内部需要处理的状态\n // success 下的处理\n const processSuccess = () => {\n if (state.status === 'success') {\n // changeDesc(descriptions.success)\n }\n }\n\n // 处理过期\n const processExpired = () => {\n if (state.status === 'expired') {\n // changeDesc(descriptions.expired)\n }\n }\n\n // 处理用户取消确认\n const processCancel = () => {\n if (state.status === 'cancel') {\n // changeDesc(descriptions.cancel)\n }\n }\n\n // 处理 MFA 状态的函数\n const processMFA = () => {\n if (state.status === 'MFA') {\n // changeDesc(descriptions.MFA)\n }\n }\n\n // Server 返回未知错误\n const processError = () => {\n // 修改 status 同时修改\n if (state.status === 'error') {\n // changeDesc(descriptions.error)\n }\n }\n\n /**\n * 触发事件\n * @param status\n * @param data\n */\n const emitEvents = async (status: CodeStatus, data: QrCodeResponse) => {\n if (data.ticket && exchangeUserInfo) {\n const { data: user } = await exchangeUserInfo(data.ticket)\n onStatusChange && onStatusChange(status, { ...user, ticket: data.ticket })\n } else {\n onStatusChange && onStatusChange(status, data)\n }\n }\n\n /**\n * Server 接口返回才会进入:根据不同返回码进行流转\n */\n const processFlowByResponse: (res: QrCodeResponse) => void = (\n res: QrCodeResponse\n ) => {\n if (destroy) {\n return\n }\n const prev = state.status\n const next = getStatusByRes(res)\n const statusWillChange = prev !== next\n // 状态已经改变 交给状态的 Handler 来改变\n if (statusWillChange) {\n // 改变状态\n changeStatus(next)\n // 触发改变状态的用户事件\n emitEvents(next, res)\n return\n }\n // 状态未改变 交给 ResponseFlow 处理\n processResponseFlow(res)\n }\n\n /**\n * Loading 状态的处理函数\n */\n const processLoading = async () => {\n // 重新切换为 Loading 时,重新调用生成二维码的方式\n if (genCodeRequest) {\n const { data } = await genCodeRequest()\n if (data) {\n const { url, random } = data\n dispatch({\n type: 'change',\n payload: {\n src: url,\n random,\n },\n })\n }\n }\n }\n\n /**\n * 响应状态未改变下的 Flow 处理\n * @param res\n */\n const processResponseFlow = (res: QrCodeResponse) => {\n // 未改变状态 进入处理流程\n switch (res.status) {\n // 过期\n case -1:\n processExpired()\n break\n // 未扫码状态\n case 0:\n processReady()\n break\n // 已经扫码\n case 1:\n processAReady()\n break\n // 成功状态\n case 2:\n processSuccess()\n break\n // 取消状态\n case 3:\n processCancel()\n break\n // mfa 状态\n case 4:\n processMFA()\n break\n // 未知错误\n case 5:\n processError()\n break\n default:\n throw new Error(`不满足的Server Code:${res.status}`)\n }\n }\n\n /**\n * 更改状态\n * @param status\n * @returns\n */\n const changeStatus = (status: CodeStatus) =>\n dispatch({\n type: 'changeStatus',\n payload: {\n status,\n },\n })\n\n /**\n * 更改描述\n * @param description\n * @returns\n */\n // const changeDesc = (description?: ReactNode) =>\n // dispatch({\n // type: 'changeDesc',\n // payload: {\n // description,\n // },\n // })\n\n /**\n * 共用的统一的请求处理\n */\n const uniteRequestHandler = async (\n request: () => Promise<AuthingGuardResponse<QrCodeResponse>>\n ) => {\n try {\n // 状态切换时 请求还在请求中,所以状态切换完毕后\n const { data } = await request()\n if (data) {\n await processFlowByResponse(data)\n } else {\n throw new Error(`返回数据不匹配`)\n }\n } catch (e: any) {\n changeStatus('error')\n }\n }\n\n // 每个状态下的处理函数\n const flowHandlers = {\n loading: processLoading,\n ready: processReady,\n already: processAReady,\n success: processSuccess,\n error: processError,\n expired: processExpired,\n cancel: processCancel,\n MFA: processMFA,\n }\n\n // 每次状态变化流转下一个 flowHandler\n useEffect(() => {\n const handler = flowHandlers[state.status]\n handler()\n return () => {\n // 阻止上一次 Render 内的作用域方法\n // eslint-disable-next-line react-hooks/exhaustive-deps\n destroy = true\n }\n }, [state.status])\n}\n","import { UiQrCode } from './UiQrCode'\nimport { WorkQrCode } from './WorkQrCode'\n\ntype IQrCode = typeof WorkQrCode & {\n UI: typeof UiQrCode\n}\n\nconst QrCode = WorkQrCode as IQrCode\n\nQrCode.UI = UiQrCode\n\nexport { QrCode }\n","import { QrCode } from '../../Qrcode'\nimport React, { useRef } from 'react'\nimport { CodeStatus } from '../../Qrcode/UiQrCode'\nimport { QrCodeResponse } from '../../Qrcode/hooks/usePostQrCode'\nimport { message } from 'antd'\nimport { useGuardEvents, useGuardHttpClient } from '../../_utils/context'\nimport { WorkQrCodeRef } from '../../Qrcode/WorkQrCode'\nimport { useTranslation } from 'react-i18next'\nimport { StoreInstance } from '../../Guard/core/hooks/useMultipleAccounts'\nimport { LoginMethods } from '../..'\nimport { useGuardAuthClient } from '../../Guard/authClient'\n\ninterface LoginWithAppQrcodeProps {\n // onLogin: any\n onLoginSuccess: any\n canLoop: boolean\n // qrCodeScanOptions: any\n multipleInstance?: StoreInstance\n}\n\nexport const LoginWithAppQrcode = (props: LoginWithAppQrcodeProps) => {\n const codeRef = useRef<WorkQrCodeRef>()\n\n const { canLoop } = props\n\n const { responseIntercept } = useGuardHttpClient()\n\n const events = useGuardEvents()\n\n const authClient = useGuardAuthClient()\n\n const { t } = useTranslation()\n\n if (!canLoop) {\n return null\n }\n\n const descriptions = {\n already: (referQrCode: () => void) => (\n <span className=\"qrcode__again-scan\" onClick={referQrCode}>\n {t('login.scanAgain')}\n </span>\n ),\n ready: t('login.appScanLogin'),\n success: t('common.LoginSuccess'),\n MFA: t('common.LoginSuccess'),\n }\n\n /**\n * Sever Status 发生变化\n * @param status\n * @param data\n */\n const onStatusChange = async (status: CodeStatus, data: QrCodeResponse) => {\n switch (status) {\n case 'success':\n if (events?.onBeforeLogin) {\n const isContinue = await events?.onBeforeLogin(\n { type: LoginMethods.AppQr, data },\n authClient\n )\n if (!isContinue) {\n break\n }\n }\n props.multipleInstance &&\n props.multipleInstance.setLoginWay('qrcode', LoginMethods.AppQr)\n props.onLoginSuccess(data)\n break\n case 'error':\n if (data.scannedResult) {\n const { message: msg } = data.scannedResult\n message.error(msg)\n }\n break\n case 'MFA':\n if (data.scannedResult) {\n const { onGuardHandling } = responseIntercept(data.scannedResult)\n onGuardHandling?.()\n }\n break\n default:\n break\n }\n }\n\n return (\n <QrCode\n ref={codeRef}\n scene=\"APP_AUTH\"\n descriptions={descriptions}\n onStatusChange={onStatusChange}\n imageStyle={{\n height: '166px',\n width: '166px',\n }}\n />\n )\n}\n","import { useGuardIsAuthFlow } from '../_utils/context'\nimport { getGuardHttp } from '../_utils/guardHttp'\n\nexport const 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 { message } from 'antd'\nimport React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { QrCode } from '../../Qrcode'\nimport { QrCodeResponse } from '../../Qrcode/hooks/usePostQrCode'\nimport { CodeStatus } from '../../Qrcode/UiQrCode'\nimport { useGuardEvents, useGuardHttpClient } from '../../_utils/context'\nimport { StoreInstance } from '../../Guard/core/hooks/useMultipleAccounts'\nimport { LoginMethods } from '../..'\nimport { isWeChatBrowser } from '../../_utils'\nimport { useGuardAuthClient } from '../../Guard/authClient'\n\ninterface LoginWithWechatMiniQrcodeProps {\n // onLogin: any\n onLoginSuccess: any\n canLoop: boolean\n qrCodeScanOptions: any\n // 当前登录方式 对应的id\n id: string\n multipleInstance?: StoreInstance\n}\n\nexport const LoginWithWechatMiniQrcode = (\n props: LoginWithWechatMiniQrcodeProps\n) => {\n const { canLoop, qrCodeScanOptions } = props\n\n const { t } = useTranslation()\n\n const { responseIntercept } = useGuardHttpClient()\n\n const events = useGuardEvents()\n\n const authClient = useGuardAuthClient()\n\n if (!canLoop) {\n return null\n }\n\n const descriptions = {\n already: (referQrCode: () => void) => (\n <span className=\"qrcode__again-scan\" onClick={referQrCode}>\n {t('login.scanAgain')}\n </span>\n ),\n ready: isWeChatBrowser()\n ? t('common.loginWithWechatmpQrcodeTipsTitle')\n : t('login.wechatScanLogin'),\n success: t('common.LoginSuccess'),\n MFA: t('common.LoginSuccess'),\n }\n\n /**\n * 状态发生变化时的处理函数\n * @param status\n * @param data\n */\n const onStatusChange = async (status: CodeStatus, data: QrCodeResponse) => {\n switch (status) {\n case 'success':\n if (events?.onBeforeLogin) {\n const isContinue = await events?.onBeforeLogin(\n { type: LoginMethods.WxMinQr, data },\n authClient\n )\n if (!isContinue) {\n break\n }\n }\n\n props.multipleInstance &&\n props.multipleInstance.setLoginWay(\n 'qrcode',\n LoginMethods.WxMinQr,\n props.id\n )\n\n props.onLoginSuccess(data)\n break\n case 'error':\n // 怎么模拟这里的 error\n if (data.scannedResult) {\n const { message: msg } = data.scannedResult\n message.error(msg)\n }\n break\n case 'MFA':\n const { onGuardHandling } = responseIntercept(data.scannedResult!)\n onGuardHandling?.()\n break\n default:\n break\n }\n }\n\n return (\n <QrCode\n scene=\"WXAPP_AUTH\"\n descriptions={descriptions}\n onStatusChange={onStatusChange}\n qrCodeScanOptions={qrCodeScanOptions}\n imageStyle={{\n height: '166px',\n width: '166px',\n }}\n />\n )\n}\n","import React from 'react'\nimport { useGuardEvents, useGuardHttpClient } from '../../_utils/context'\nimport { message } from 'antd'\nimport { QrCode } from '../../Qrcode'\nimport { CodeStatus } from '../../Qrcode/UiQrCode'\nimport { QrCodeResponse } from '../../Qrcode/hooks/usePostQrCode'\nimport { useTranslation } from 'react-i18next'\nimport { StoreInstance } from '../../Guard/core/hooks/useMultipleAccounts'\nimport { LoginMethods } from '../..'\nimport { isWeChatBrowser } from '../../_utils'\nimport { useGuardAuthClient } from '../../Guard/authClient'\ninterface LoginWithWechatmpQrcodeProps {\n // onLogin: any\n onLoginSuccess: any\n canLoop: boolean\n qrCodeScanOptions: any\n // 当前登录方式 对应的id\n id: string\n /**\n * 多账号存储实例\n */\n multipleInstance?: StoreInstance\n}\n\nexport const LoginWithWechatmpQrcode = (\n props: LoginWithWechatmpQrcodeProps\n) => {\n const { canLoop, qrCodeScanOptions } = props\n\n const { t } = useTranslation()\n\n const { responseIntercept } = useGuardHttpClient()\n\n const events = useGuardEvents()\n\n const authClient = useGuardAuthClient()\n\n if (!canLoop) {\n return null\n }\n\n const descriptions = {\n already: (referQrCode: () => void) => (\n <span className=\"qrcode__again-scan\" onClick={referQrCode}>\n {t('login.scanAgain')}\n </span>\n ),\n ready: isWeChatBrowser()\n ? t('common.loginWithWechatmpQrcodeTipsTitle')\n : t('login.wechatScanLogin'),\n success: t('common.LoginSuccess'),\n MFA: t('common.LoginSuccess'),\n }\n\n /**\n * 状态发生变化时的处理函数\n * @param status\n * @param data\n */\n const onStatusChange = async (status: CodeStatus, data: QrCodeResponse) => {\n switch (status) {\n case 'success':\n if (events?.onBeforeLogin) {\n const isContinue = await events?.onBeforeLogin(\n { type: LoginMethods.WechatMpQrcode, data },\n authClient\n )\n if (!isContinue) {\n break\n }\n }\n props.multipleInstance &&\n props.multipleInstance.setLoginWay(\n 'qrcode',\n LoginMethods.WechatMpQrcode,\n props.id\n )\n\n props.onLoginSuccess(data)\n break\n case 'error':\n // 怎么模拟这里的 error\n if (data.scannedResult) {\n const { message: msg } = data.scannedResult\n message.error(msg)\n }\n break\n case 'MFA':\n const { onGuardHandling } = responseIntercept(data.scannedResult!)\n onGuardHandling?.()\n break\n default:\n break\n }\n }\n\n return (\n <QrCode\n scene=\"WECHATMP_AUTH\"\n descriptions={descriptions}\n onStatusChange={onStatusChange}\n qrCodeScanOptions={qrCodeScanOptions}\n imageStyle={{\n height: '166px',\n width: '166px',\n }}\n />\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 { Avatar, message } from 'antd'\nimport qs from 'qs'\nimport React, { useCallback } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { getGuardWindow } from '../../../Guard/core/useAppendConfig'\nimport { GuardButton } from '../../../GuardButton'\nimport { IconFont } from '../../../IconFont'\nimport { Protocol } from '../../../Type/application'\nimport version from '../../../version/version'\nimport { isSpecialBrowser, popupCenter } from '../../../_utils'\nimport { useGuardTenantId } from '../../../_utils/context'\nimport { SocialConnectionEvent } from '../../../_utils/hooks'\nimport { i18n } from '../../../_utils/locales'\n\nconst baseLoginPathMapping: Partial<Record<Protocol, string | null>> = {\n [Protocol.OIDC]: '/connections/oidc/init',\n [Protocol.SAML]: '/connections/saml/init',\n [Protocol.CAS]: '/connections/cas/init',\n [Protocol.OAUTH]: '/connections/oauth2/init',\n [Protocol.AZURE_AD]: '/connections/azure-ad/init',\n [Protocol.AD_KERBEROS]: '/connections/ad-kerberos/init',\n}\n\nconst loginUrlFieldMapping: Partial<Record<Protocol, string>> = {\n [Protocol.OIDC]: 'oidcConnectionLoginUrl',\n [Protocol.SAML]: 'samlRequest',\n [Protocol.CAS]: 'casConnectionLoginUrl',\n [Protocol.OAUTH]: 'authUrl',\n [Protocol.AZURE_AD]: 'authorizationUrl',\n [Protocol.AD_KERBEROS]: 'authorizationUrl',\n}\n\nexport const IdpButton = (props: any) => {\n // TODO: 能不能加个类型\n const { i, appId, appHost, isHost } = props\n\n const { t } = useTranslation()\n const tenantId = useGuardTenantId()\n\n const renderBtn = useCallback(() => {\n const query: Record<string, any> = {\n from_guard: '1',\n app_id: appId,\n guard_version: `Guard@${version}`,\n ...(tenantId && { tenant_id: tenantId }),\n }\n\n if (isHost) {\n delete query.from_guard\n query.from_hosted_guard = '1'\n\n if (isSpecialBrowser()) {\n query.redirected = '1'\n\n const guardWindow = getGuardWindow()\n if (guardWindow) {\n // 如果 isHost 是 true,则从 url 获取 finish_login_url 作为 social.authorize 方法的 targetUrl 参数\n query.redirect_url = qs.parse(guardWindow.location.search)?.[\n 'finish_login_url'\n ]\n }\n }\n }\n\n if (i?.provider) {\n // 社交身份源\n const iconType = `authing-${i.provider.replace(/:/g, '-')}`\n\n const onLogin = () => {\n if (i.action === SocialConnectionEvent.Message) {\n message.error(\n t('login.socialConnectionMessage', {\n provider:\n i.displayName ??\n (i18n.language === 'zh-CN' ? i.name : i.name_en) ??\n i.provider,\n })\n )\n } else if (i.action === SocialConnectionEvent.Auth) {\n const initUrl = `${appHost}/connections/social/${\n i.identifier\n }?${qs.stringify(query)}`\n if (query.redirected) {\n window.location.replace(initUrl)\n } else {\n popupCenter(initUrl)\n }\n }\n }\n\n return (\n <GuardButton\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 </GuardButton>\n )\n } else {\n let initUrl: string\n\n if (isHost) {\n // 托管登录页,直接写死登录 URL\n query.identifier = i.identifier\n\n const basePath = baseLoginPathMapping[i.protocol as Protocol]\n if (!basePath) {\n return null\n }\n\n initUrl = `${appHost}${basePath}?${qs.stringify(query)}`\n } else {\n const field = loginUrlFieldMapping[i.protocol as Protocol]\n if (!field) {\n return null\n }\n\n // 嵌入式组件,从配置字段获取登录 URL\n initUrl = i.config[field]\n }\n\n return (\n <GuardButton\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={() => {\n if (query.redirected) {\n window.location.replace(initUrl)\n } else {\n popupCenter(initUrl)\n }\n }}\n >\n {t('login.loginBy', {\n name: i.displayName,\n })}\n </GuardButton>\n )\n }\n }, [appId, i, t, isHost, appHost, tenantId])\n return renderBtn()\n}\n","import { message, Space, Tooltip } from 'antd'\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 { isSpecialBrowser, popupCenter } from '../../_utils'\nimport querystring from 'query-string'\nimport { IconFont } from '../../IconFont'\nimport './style.less'\nimport { useMediaSize, SocialConnectionEvent } from '../../_utils/hooks'\nimport { useGuardPublicConfig, useGuardTenantId } 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'\nimport { GuardButton } from '../../GuardButton'\nimport { ApplicationConfig, SocialConnectionItem } from '../../Type/application'\nimport { StoreInstance } from '../../Guard/core/hooks/useMultipleAccounts'\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 * 根据输入的账号 & 返回获得对应的登录方法\n */\n multipleInstance?: StoreInstance\n}\n\nexport const SocialLogin: React.FC<SocialLoginProps> = ({\n appId,\n config,\n onLoginFailed,\n onLoginSuccess,\n enterpriseConnectionObjs,\n socialConnectionObjs,\n multipleInstance,\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 { isPhoneMedia } = useMediaSize()\n\n const onMessage = usePostMessage()\n\n const tenantId = useGuardTenantId()\n\n useEffect(() => {\n const onPostMessage = (evt: MessageEvent) => {\n const res = onMessage(evt)\n if (!res) return\n\n // 更新本次登录方式\n multipleInstance && multipleInstance.setLoginWay('input', 'social')\n\n const { code, data, onGuardHandling } = res\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 }\n\n const guardWindow = getGuardWindow()\n\n guardWindow?.addEventListener('message', onPostMessage)\n return () => {\n guardWindow?.removeEventListener('message', onPostMessage)\n }\n }, [onLoginFailed, multipleInstance, 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 appHost={config?.host}\n userPoolId={userPoolId}\n isHost={config?.isHost}\n />\n )\n })\n\n const socialLoginButtons = socialConnectionObjs.map((item: any) => {\n let iconType = `authing-${item.provider.replace(/:/g, '-')}`\n\n const query: Record<string, any> = {\n from_guard: '1',\n app_id: appId,\n guard_version: `Guard@${version}`,\n }\n\n if (tenantId) {\n query.tenant_id = tenantId\n }\n\n if (config?.isHost) {\n query.from_hosted_guard = '1'\n\n if (isSpecialBrowser()) {\n query.redirected = '1'\n\n const guardWindow = getGuardWindow()\n if (guardWindow) {\n // 如果 isHost 是 true,则从 url 获取 finish_login_url 作为 social.authorize 方法的 targetUrl 参数\n query.redirect_url = querystring.parse(guardWindow.location.search)?.[\n 'finish_login_url'\n ]\n }\n }\n }\n\n const onLogin = () => {\n if (item.action === SocialConnectionEvent.Message) {\n message.error(\n t('login.socialConnectionMessage', {\n provider:\n item.displayName ??\n (i18n.language === 'zh-CN' ? item.name : item.name_en) ??\n item.provider,\n })\n )\n } else if (item.action === SocialConnectionEvent.Auth) {\n const initUrl = `${config.host}/connections/social/${\n item.identifier\n }?${querystring.stringify(query)}`\n\n if (query.redirected) {\n window.location.replace(initUrl)\n } else {\n popupCenter(initUrl)\n }\n }\n }\n\n const shape = config.socialConnectionsBtnShape\n if (shape === 'button') {\n return (\n <GuardButton\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 </GuardButton>\n )\n } else if (shape === 'icon') {\n return isPhoneMedia ? (\n <GuardButton\n className=\"g2-social-login-item\"\n onClick={onLogin}\n icon={<IconFont type={`${iconType}-fill`} />}\n ></GuardButton>\n ) : (\n <Tooltip\n key={item.id}\n title={item.tooltip?.[i18n.language as Lang] || item.name}\n trigger={['hover', 'click', 'contextMenu']}\n >\n <GuardButton\n className=\"g2-social-login-item\"\n onClick={onLogin}\n icon={<IconFont type={`${iconType}-fill`} />}\n ></GuardButton>\n </Tooltip>\n )\n } else {\n return noLoginMethods ? (\n <GuardButton\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 </GuardButton>\n ) : isPhoneMedia ? (\n <GuardButton\n className=\"g2-social-login-item\"\n onClick={onLogin}\n key={item.id}\n icon={<IconFont type={`${iconType}-fill`} />}\n ></GuardButton>\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 <GuardButton\n className=\"g2-social-login-item\"\n onClick={onLogin}\n icon={<IconFont type={`${iconType}-fill`} />}\n ></GuardButton>\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: 16,\n }}\n />\n )}\n <Space\n size={noLoginMethods ? 0 : 8}\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 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 flowHandle,\n } = parsedMessage\n\n const res = responseIntercept({\n statusCode,\n apiCode,\n data: authingResData,\n message: authingMessage,\n code: authingCode,\n flowHandle,\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 { Popover } from 'antd'\nimport React, { useMemo, useCallback } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { IconFont } from '../../IconFont'\nimport { useMediaSize } from '../../_utils/hooks'\nimport './style.less'\n\ninterface SelectPanelProps {\n lists: SelectOptions[]\n /**\n * 点击删除\n */\n handleDel: (id: string) => void\n /**\n * 点击 li\n */\n onClick: (id: string) => void\n}\n\nexport interface SelectOptions {\n /**\n * 头像\n */\n photo?: string\n /**\n * 标题\n */\n title?: string\n /**\n * 描述\n */\n description?: string\n /**\n * 用户 ID 唯一标识符\n */\n id: string | 'other'\n /**\n * 显示操作栏 default: true\n */\n operation?: boolean\n /**\n * 登录时间\n */\n _updateTime: number\n /**\n * 替代图片元素\n */\n element?: React.ReactElement\n}\n\nconst SelectPanel: React.FC<SelectPanelProps> = (props) => {\n const { lists, handleDel, onClick } = props\n const { t } = useTranslation()\n\n const { isPhoneMedia } = useMediaSize()\n\n const triggerWay = useMemo(() => {\n return isPhoneMedia ? 'click' : 'hover'\n }, [isPhoneMedia])\n\n const finallyLists = useMemo(() => {\n return [\n ...lists,\n {\n operation: false,\n id: 'other',\n title: t('login.useOtherAccount'),\n element: (\n <div className=\"g2-multiple__icon--add-line\">\n <IconFont\n style={{ fontSize: 24, color: '#4E5969' }}\n type=\"authing-add-line\"\n ></IconFont>\n </div>\n ),\n },\n ]\n }, [lists, t])\n\n const onDel = useCallback(\n (e: React.MouseEvent, id: string) => {\n handleDel(id)\n e.stopPropagation()\n },\n [handleDel]\n )\n\n const renderLits = useMemo(() => {\n return finallyLists.map((option) => {\n const {\n photo,\n title,\n description,\n id,\n operation = true,\n element,\n } = option as SelectOptions\n return (\n <li className=\"g2-multiple__li\" key={id} onClick={() => onClick(id)}>\n {element ? (\n element\n ) : (\n <img className=\"g2-multiple__avatar\" alt=\"\" src={photo} />\n )}\n\n <section className=\"g2-multiple__body\">\n {title && <span className=\"g2-multiple__title\">{title}</span>}\n <span\n className={title ? 'g2-multiple__desc' : 'g2-multiple__title'}\n >\n {description}\n </span>\n </section>\n {operation && (\n <span\n className=\"g2-multiple__op\"\n onClick={(e) => e.stopPropagation()}\n >\n <Popover\n trigger={triggerWay}\n overlayClassName=\"g2-multiple__op-wrapper\"\n getPopupContainer={(triggerNode) => triggerNode}\n content={\n <div\n className=\"g2-multiple__del\"\n onClick={(e: React.MouseEvent) => onDel(e, id)}\n >\n <IconFont\n style={{\n fontSize: 20,\n marginRight: 8,\n }}\n type=\"authing-indeterminate-circle-line\"\n />\n {t('common.del')}\n </div>\n }\n >\n <div className=\"g2-multiple__icon\">\n <IconFont type=\"authing-more-fill\"></IconFont>\n </div>\n </Popover>\n </span>\n )}\n </li>\n )\n })\n }, [finallyLists, onClick, onDel, t, triggerWay])\n\n return <ul className=\"g2-multiple\">{renderLits}</ul>\n}\n\nexport { SelectPanel }\n","import React, { useCallback, useState } from 'react'\nimport { SelectPanel } from './panel'\nimport {\n LoginWay,\n StoreInstance,\n} from '../../Guard/core/hooks/useMultipleAccounts'\nimport { GuardModuleType } from '../../Guard'\n\ninterface MultipleAccountsProps {\n /**\n * 多账号存储实例\n */\n multipleInstance?: StoreInstance\n /**\n * 切换 Guard 方法\n */\n changeModule?: (moduleName: GuardModuleType, initData?: any) => Promise<void>\n /**\n * 切换多账号状态\n */\n referMultipleState?: (\n type: 'login' | 'multiple',\n data?: { account: string; way: LoginWay }\n ) => void\n}\n\nconst MultipleAccountsFC: React.FC<MultipleAccountsProps> = (props) => {\n const [, setState] = useState<number>(0)\n const { multipleInstance, referMultipleState } = props\n\n // 默认只有一个多选实例\n const lists = multipleInstance?.getMemoUser()\n const forceUpdate = useCallback(() => setState(Math.random), [])\n\n if (!lists) {\n // 这里应该额外处理下 其实本质上应该是存在的\n return null\n }\n\n /**\n * 用户手动删除记录的用户\n */\n const handleDelAccount = (id: string) => {\n multipleInstance?.delUserById(id)\n const lists = multipleInstance?.getMemoUser()\n if (lists?.length === 0) {\n // 7.15: 如果仅剩一个需求跳转\n referMultipleState?.('login')\n } else {\n forceUpdate()\n }\n }\n\n /**\n * jump Login Page\n * 点击 li\n * 根据对应不同的内容进行回填上去\n */\n const changeState = (id: string | 'other') => {\n // way && account\n const data = multipleInstance?.getMemoSingleUser(id)\n referMultipleState?.('login', data)\n }\n\n return (\n <SelectPanel\n lists={lists}\n onClick={changeState}\n handleDel={handleDelAccount}\n />\n )\n}\n\nconst MultipleAccounts = React.memo(MultipleAccountsFC)\n\nexport { MultipleAccounts }\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 { SceneType } from 'authing-js-sdk'\nimport { SendCodeByPhone } from '../../../SendCode/SendCodeByPhone'\nimport {\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardInitData,\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 { parsePhone, useMediaSize } from '../../../_utils/hooks'\nimport { EmailScene, InputMethod } from '../../../Type'\nimport { CodeAction } from '../../../_utils/responseManagement/interface'\nimport { GuardLoginInitData } from '../../interface'\nimport { LoginMethods } from '../../../Type/application'\nimport { useLoginMultipleBackFill } from '../../hooks/useLoginMultiple'\n\nconst LoginWithVerifyCode = (props: any) => {\n const publicConfig = useGuardPublicConfig()\n\n const config = useGuardFinallyConfig()\n\n const {\n _firstItemInitialValue = '',\n specifyDefaultLoginMethod,\n _lockMethod,\n } = useGuardInitData<GuardLoginInitData>()\n const {\n agreements,\n methods,\n autoRegister,\n submitButText,\n onLoginFailed,\n onLoginSuccess,\n saveIdentify,\n multipleInstance,\n backfillData,\n } = props\n\n const verifyCodeLength = publicConfig?.verifyCodeLength ?? 4\n\n const { post } = useGuardHttpClient()\n\n const { isPhoneMedia } = useMediaSize()\n\n // 是否开启了国际化短信功能\n const isInternationSms =\n publicConfig?.internationalSmsConfig?.enabled || false\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n\n const [validated, setValidated] = useState(false)\n\n const [identify, setIdentify] = useState('')\n\n const [currentMethod, setCurrentMethod] = useState<InputMethod>(\n specifyDefaultLoginMethod ? _lockMethod ?? methods[0] : methods[0]\n )\n // 是否仅开启国际化短信\n const [isOnlyInternationSms, setInternationSms] = useState(false)\n // 区号 默认\n const [areaCode, setAreaCode] = useState(\n publicConfig?.internationalSmsConfig?.defaultISOType || 'CN'\n )\n\n let [form] = Form.useForm()\n\n const changeCurrentMethod = (v: string) => {\n setIdentify(v)\n if (methods.length === 1) return\n if (validate('email', v)) {\n setCurrentMethod(InputMethod.EmailCode)\n } else {\n // 放开手机号校验 方便同时开启邮箱和短信国际化手机号通过\n setCurrentMethod(InputMethod.PhoneCode)\n }\n }\n\n useLoginMultipleBackFill({\n form,\n way: LoginMethods.PhoneCode,\n formKey: 'identify',\n backfillData,\n isOnlyInternationSms,\n setAreaCode,\n cancelBackfill: specifyDefaultLoginMethod === LoginMethods.PhoneCode,\n changeCurrentMethod,\n })\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 form={form}\n fieldName={'identify'}\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 form={form}\n fieldName={'identify'}\n scene={EmailScene.LOGIN_VERIFY_CODE}\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 publicConfig &&\n publicConfig.internationalSmsConfig?.enabled\n ) {\n setInternationSms(true)\n }\n }, [publicConfig, methods])\n\n const loginByPhoneCode = async (values: any) => {\n const reqContent: any = {\n phone: values.phoneNumber,\n code: values.code,\n customData: config?.isHost\n ? getUserRegisterParams(['login_page_context'])\n : undefined,\n autoRegister: autoRegister,\n withCustomData: false,\n }\n\n if (publicConfig && publicConfig.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 // 邮箱验证码登录\n const loginByEmailCode = async (values: any) => {\n const reqContent = {\n email: values.identify,\n code: values.code,\n customData: config?.isHost\n ? getUserRegisterParams(['login_page_context'])\n : undefined,\n autoRegister: autoRegister,\n withCustomData: false,\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, apiCode, data, onGuardHandling } = res\n\n submitButtonRef.current?.onSpin(false)\n if (code === 200) {\n onLoginSuccess(data)\n } else {\n const handMode = onGuardHandling?.()\n // 向上层抛出错误 执行绑定失败钩子\n handMode === CodeAction.RENDER_MESSAGE &&\n onLoginFailed(apiCode ?? code, data)\n }\n return\n }\n\n // 其实这里应该是保存两个 一个是 countryCode 一个是对应的 code\n multipleInstance &&\n multipleInstance.setLoginWay(\n 'input',\n currentMethod === 'phone-code' ? 'phone-code' : 'email-code',\n undefined,\n isInternationSms\n ? {\n phoneCountryCode,\n areaCode,\n }\n : undefined\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 autoRegister\n ? `${t('common.login')} / ${t('common.register')}`\n : t('common.login')\n }, [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\n const formValuesChange = (changedValues: Record<string, any>) => {\n if (changedValues?.identify && saveIdentify) {\n saveIdentify(LoginMethods.PhoneCode, changedValues?.identify)\n }\n }\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 onValuesChange={formValuesChange}\n >\n <FormItemIdentify\n initialValue={\n specifyDefaultLoginMethod === LoginMethods.PhoneCode\n ? _firstItemInitialValue\n : ''\n }\n name=\"identify\"\n className={\n isOnlyInternationSms\n ? 'authing-g2-input-form remove-padding'\n : 'authing-g2-input-form'\n }\n methods={methods}\n checkExist={!autoRegister}\n currentMethod={currentMethod}\n areaCode={areaCode}\n >\n {isOnlyInternationSms ? (\n <AreaCodePhoneAccount autoFocus={!isPhoneMedia} />\n ) : (\n <InputIdentify\n className=\"authing-g2-input\"\n size=\"large\"\n autoFocus={!isPhoneMedia}\n value={identify}\n methods={methods}\n onChange={(e) => {\n let v = e.target.value\n changeCurrentMethod(v)\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 className=\"authing-g2-sumbit-form\">\n <SubmitButton\n text={submitText}\n className=\"password\"\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\n}\n\nexport { LoginWithVerifyCode }\n","import React, {\n useEffect,\n useLayoutEffect,\n useState,\n useRef,\n useMemo,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { message, Popover, Tabs, Tag, 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'\nimport { MultipleAccounts } from './multipleAccounts'\n\nimport { GuardModuleType } from '../Guard/module'\nimport { IconFont } from '../IconFont'\nimport { ChangeLanguage } from '../ChangeLanguage'\nimport { fallbackLng, i18n } from '../_utils/locales'\n\nimport './styles.less'\nimport {\n useGuardAppId,\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardInitData,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport { getPasswordIdentify } from '../_utils'\nimport { LoginWithVerifyCode } from './core/withVerifyCode'\nimport { useMediaSize, useMethod } from '../_utils/hooks'\nimport { getGuardDocument } from '../_utils/guardDocument'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { GuardLoginInitData } from './interface'\nimport { GuardButton } from '../GuardButton'\nimport { LoginMethods, VerifyLoginMethods } from '../Type/application'\nimport { useLoginMultiple } from './hooks/useLoginMultiple'\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 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 // TODO P0 需求暂时先取消掉\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 { specifyDefaultLoginMethod } = useGuardInitData<GuardLoginInitData>()\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\n const agreementEnabled = config?.agreementEnabled\n\n const { t } = useTranslation()\n\n const [loginWay, setLoginWay] = useState(\n specifyDefaultLoginMethod || defaultMethod\n )\n\n const {\n defaultQrWay,\n backfillData,\n multipleInstance,\n isMultipleAccount,\n referMultipleState,\n } = useLoginMultiple(setLoginWay)\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 const identifyRef = useRef<Record<string, string>>({} as any)\n\n /** 页面相关标签 */\n const tags = useMemo(() => {\n return ([\n publicConfig?.isTenantConsole && {\n name: i18n.t('login.tenant.consoleManage'),\n },\n publicConfig?.isTenantDefault && {\n name: t('login.tenant.ssoPad'),\n },\n ] as Array<{\n name: string\n color?: string\n backgroundColor?: string\n }>).filter(Boolean)\n }, [publicConfig, t])\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\n ? ms.filter((method) => qrcodeWays.includes(method))\n : [] //取到扫码登录类型\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 // 如果存在多账号的二维码方式\n if (defaultQrWay) {\n return defaultQrWay\n }\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 }, [defaultQrWay, defaultMethod, qrcodeTabsSettings])\n\n const onLoginSuccess = (data: any, message?: string) => {\n // data._message = Message\n // 保存本次登录方式\n events?.onLogin?.(data, client)\n }\n\n // 保存用户输入的手机号、邮箱,在点击 问题反馈时带上\n const saveIdentify = (type: LoginMethods, identity: string) => {\n identifyRef.current = {\n ...identifyRef.current,\n [type]: getPasswordIdentify(identity),\n }\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 fallbackLng(i18n.language).find((lng) =>\n lng.includes(agree.lang)\n ) &&\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 // 无表单登录方式,且不是手机端\n const document = getGuardDocument()\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'] = isNoMethod ? '456px' : '280px'\n containerDOM.classList.add('no-login-methods-view')\n return () => {\n // @ts-ignore\n containerDOM.style['min-height'] = '540px'\n containerDOM.classList.remove('no-login-methods-view')\n }\n }\n }\n }, [isNoMethod, isPhoneMedia, noLoginMethods])\n\n useEffect(() => {\n const document = getGuardDocument()\n\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 {!isMultipleAccount && renderInputWay && renderQrcodeWay && (\n <div className=\"g2-qrcode-switch\">\n {/* <div className=\"switch-text\">{switchText}</div> */}\n <Popover\n placement=\"leftTop\"\n visible={true}\n content={switchText}\n overlayClassName={\n switchText === i18n.t('login.moreWays')\n ? 'long-switch-text'\n : 'switch-text'\n }\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 <div className=\"g2-view-header\">\n <img src={config?.logo} alt=\"\" className=\"icon\" />\n <div className=\"title\">\n {isMultipleAccount\n ? t('login.selectLoginAccount')\n : config?.title}\n </div>\n {!!publicConfig?.welcomeMessage && (\n <div className=\"title-description\">\n {publicConfig?.welcomeMessage[i18n.language]}\n </div>\n )}\n {/* 提供头部打标签的功能 */}\n {tags?.map?.((it, i) => (\n <Tag\n className=\"authing-header-tag\"\n style={{\n color: it?.color,\n backgroundColor: it?.backgroundColor,\n }}\n key={i}\n >\n {it.name}\n </Tag>\n ))}\n </div>\n {isMultipleAccount ? (\n <MultipleAccounts\n multipleInstance={multipleInstance}\n referMultipleState={referMultipleState}\n changeModule={changeModule}\n />\n ) : (\n <>\n {renderInputWay && (\n <div className={inputNone}>\n <div className={`g2-view-tabs`}>\n <Tabs\n destroyInactiveTabPane={true}\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 backfillData={backfillData}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n onBeforeLogin={onBeforeLogin}\n saveIdentify={saveIdentify}\n passwordLoginMethods={\n config?.passwordLoginMethods ?? []\n }\n agreements={agreements}\n multipleInstance={multipleInstance}\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 saveIdentify={saveIdentify}\n agreements={agreements}\n methods={verifyLoginMethods}\n backfillData={backfillData}\n multipleInstance={multipleInstance}\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 backfillData={backfillData}\n multipleInstance={multipleInstance}\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 backfillData={backfillData}\n multipleInstance={multipleInstance}\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 <GuardButton\n type=\"link\"\n className=\"link-like forget-password-link\"\n onClick={() =>\n changeModule?.(GuardModuleType.FORGET_PWD, {})\n }\n >\n {t('login.forgetPwd')}\n </GuardButton>\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 identify: identifyRef.current[loginWay],\n })\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 <GuardButton\n type=\"link\"\n className=\"link-like register-link\"\n onClick={() =>\n changeModule?.(GuardModuleType.REGISTER, {})\n }\n >\n {t('common.registerImmediate')}\n </GuardButton>\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 defaultActiveKey={defaultQrCodeWay}\n onChange={(k: any) => {\n message.destroy()\n events?.onLoginTabChange?.(k)\n }}\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 id={item.id}\n multipleInstance={multipleInstance}\n onLoginSuccess={onLoginSuccess}\n canLoop={canLoop}\n qrCodeScanOptions={{\n extIdpConnId: item.id,\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 multipleInstance={multipleInstance}\n onLoginSuccess={onLoginSuccess}\n canLoop={canLoop}\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 id={item.id}\n multipleInstance={multipleInstance}\n onLoginSuccess={onLoginSuccess}\n canLoop={canLoop}\n qrCodeScanOptions={{\n extIdpConnId: item.id,\n }}\n />\n </Tabs.TabPane>\n )\n )}\n </Tabs>\n </div>\n )}\n </>\n )}\n <div className=\"g2-social-login\">\n <SocialLogin\n appId={appId}\n config={config!}\n multipleInstance={multipleInstance}\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 { GuardModuleType } from '../../Guard/module'\nimport { useGuardModule } from '../context'\nimport { FacePlugin } from './interface'\n\nlet facePluginInstance: FacePlugin\n\nexport const getFacePlugin = () => {\n if (!facePluginInstance) {\n return undefined\n }\n\n return facePluginInstance\n}\n\nexport const useFacePlugin = () => {\n const { changeModule } = useGuardModule()\n\n if (!facePluginInstance) {\n changeModule?.(GuardModuleType.ERROR, {\n error: new Error('为使用 face 模块,请先安装 face-api-guard 插件'),\n })\n\n return undefined\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 React, { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { VerifyCodeInput } from '../VerifyCodeInput'\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'\nimport { EmailScene } from '../../Type'\nimport { getGuardHttp } from '../../_utils/guardHttp'\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 await form.validateFields()\n submitButtonRef.current?.onSpin(false)\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 }\n }\n return (\n <>\n <p className=\"authing-g2-mfa-title\">{t('common.mfaCertification')}</p>\n <p className=\"authing-g2-mfa-tips\">{t('common.bindEmailDoc')}</p>\n <Form\n form={form}\n onSubmitCapture={() => submitButtonRef.current.onSpin(true)}\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 { post } = getGuardHttp()\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 const { code, message: tips, apiCode } = await post(\n '/api/v2/email/send',\n {\n email,\n scene: EmailScene.MFA_VERIFY_CODE,\n }\n )\n if (apiCode === 2080) {\n // 一分钟只能发一次邮箱验证码的提示信息,特殊处理\n message.error(tips)\n return false\n }\n if (code === 200) {\n setSent(true)\n return true\n } else {\n message.error(t('login.sendCodeTimeout'))\n return false\n }\n // await authClient.sendEmail(email!, EmailScene.MFA_VERIFY_CODE)\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('common.mfaCertification')}</p>\n <p className=\"authing-g2-mfa-tips\">\n {sent\n ? `${t('login.verifyCodeSended')} ${mailDesensitization(email)}`\n : t('common.emailMfaCheck')}\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 { 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 await form.validateFields()\n submitButtonRef.current?.onSpin(false)\n try {\n onBind(phone)\n } catch (e) {\n // do nothing\n submitButtonRef.current?.onError()\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 maxLength={20}\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 maxLength={20}\n />\n )\n }\n },\n [areaCode, form, isInternationSms, setAreaCode, t]\n )\n return (\n <>\n <h3 className=\"authing-g2-mfa-title\">{t('common.mfaCertification')}</h3>\n <p className=\"authing-g2-mfa-tips\">{t('login.bindPhoneInfo')}</p>\n <Form\n form={form}\n onSubmitCapture={() => submitButtonRef.current.onSpin(true)}\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 : t('common.SmsMfaCheck'),\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('common.mfaCertification')}</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(\n publicConfig?.internationalSmsConfig?.defaultISOType || 'CN'\n )\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 facePlugin = getFacePlugin()\n\n if (facePlugin) {\n const { TinyFaceDetectorOptions } = facePlugin\n return new TinyFaceDetectorOptions({ inputSize, scoreThreshold })\n }\n}\n\nexport function getCurrentFaceDetectionNet() {\n const facePlugin = getFacePlugin()\n\n if (facePlugin) {\n const { nets } = facePlugin\n\n return nets.tinyFaceDetector\n }\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 const 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 { useGuardButtonState, 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 { spinChange } = useGuardButtonState()\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 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 spinChange(true)\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\n spinChange(false)\n\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 spinChange(true)\n\n const result = await verifyRequest(requestData)\n\n spinChange(false)\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 facePlugin = getFacePlugin()\n\n if (!facePlugin) return\n\n const { detectSingleFace } = facePlugin\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.mfaCertification')}</h3>\n {faceState === 'ready' || mfaBackContext?.mfaBackState === 'login' ? (\n <>\n <p className=\"authing-g2-mfa-tips\">{t('common.faceText2')}</p>\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 // 设置状态之前 校验是否支持面容 (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 <p className=\"authing-g2-mfa-tips\">{t('common.faceCheck')}</p>\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'\nimport { GuardButton } from '../../GuardButton'\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.mfaCertification')}</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('common.mfaCertification')}</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 <GuardButton\n type=\"link\"\n onClick={() => {\n changeModule(GuardModuleType.RECOVERY_CODE, {\n ...initData,\n })\n }}\n >\n {t('common.useRecoverCode')}\n </GuardButton>\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 { IconFont } from '../../IconFont'\nimport { GuardMFAInitData, MFAType } from '../interface'\nimport { i18n } from '../../_utils/locales'\nimport './style.less'\nimport { useGuardInitData } from '../../_utils/context'\nimport { GuardButton } from '../../GuardButton'\nimport { getFacePlugin } from '../../_utils/facePlugin'\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) =>\n Object.keys(methodTitleMapping).includes(item.mfaPolicy)\n )\n .filter((item) => item.mfaPolicy !== currentMethod)\n .filter((item) => {\n if (item.mfaPolicy === MFAType.FACE) {\n const facePlugin = getFacePlugin()\n\n return Boolean(facePlugin)\n }\n\n return true\n })\n .sort((a, b) => a.sort - b.sort)\n .map((item) => (\n <GuardButton\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 </GuardButton>\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, { useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GuardModuleType } from '../Guard/module'\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'\nimport { BackCustom, BackLogin } from '../Back'\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 __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 const renderBack = useMemo(() => {\n if (currentMethod === MFAType.FACE && mfaBackState === 'check') {\n return (\n <BackCustom\n onBack={() => {\n setCurrentMethod(\n initData.applicationMfa.find(\n (item) => item.mfaPolicy === MFAType.FACE\n )\n ? MFAType.FACE\n : initData.applicationMfa?.sort((a, b) => a.sort - b.sort)[0]\n .mfaPolicy\n )\n setShowMethods(true)\n setMfaBackState('login')\n }}\n >\n {t('common.backToVerify')}\n </BackCustom>\n )\n }\n\n return <BackLogin />\n }, [currentMethod, initData.applicationMfa, mfaBackState, t])\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 {renderBack}\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, message, 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'\nimport { useGuardInitData } from '../../_utils/context'\ninterface describeQuestionsProps {\n appId: string\n host: string\n onSuccess: any\n}\n\nexport const DescribeQuestions = (props: describeQuestionsProps) => {\n const { t } = useTranslation()\n const initData = useGuardInitData<{ identify: string }>()\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 } else {\n submitButtonRef?.current?.onSpin(false)\n message.error(res.message)\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 initialValue={initData?.identify}\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 maxLength={50} // 手机号限长 20 字符,多种组合是 50 字符\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-sumbit-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 { getGuardHttp, useGuardHttp } from '../_utils/guardHttp'\nexport const 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 captchaCode: string\n}\n\nexport const enum IdentityBindingAction {\n CreateUser = 'create-federation-account',\n BindByPassword = 'bind-identity-by-password',\n BindByPhoneCode = 'bind-identity-by-phone-code',\n BindByEmailCode = 'bind-identity-by-email-code',\n}\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 { authFlow } = useGuardHttp()\n\n const request = {\n [IdentityBindingBusinessAction.PhoneCode]: (params: PhoneCodeParams) => {\n return authFlow(IdentityBindingAction.BindByPhoneCode, params)\n },\n [IdentityBindingBusinessAction.EmailCode]: (params: EmailCodeParams) => {\n return authFlow(IdentityBindingAction.BindByEmailCode, params)\n },\n [IdentityBindingBusinessAction.Password]: (params: PasswordParams) => {\n return authFlow(IdentityBindingAction.BindByPassword, 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 'authing-js-sdk'\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-sumbit-form submit-form\">\n <SubmitButton text={t('common.sure')} ref={submitButtonRef} />\n </Form.Item>\n </Form>\n </>\n )\n}\n","import React, { useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GuardModuleType } from '..'\nimport { User } from 'authing-js-sdk'\nimport { BackCustom } from '../Back'\nimport { useGuardAuthClient } from '../Guard/authClient'\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 { 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\n const renderBack = useMemo(() => {\n return (\n <BackCustom\n onBack={() =>\n changeModule?.(GuardModuleType.MFA, {\n ...initData,\n current: MFAType.TOTP,\n })\n }\n >\n {t('common.backToVerify')}\n </BackCustom>\n )\n }, [changeModule, initData, t])\n\n return (\n <div className=\"g2-view-container g2-mfa-recovery-code\">\n {renderBack}\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 { t } = useTranslation()\n\n const renderBack = useMemo(() => {\n return (\n <BackCustom\n onBack={() =>\n changeModule?.(GuardModuleType.MFA, {\n ...initData,\n current: MFAType.TOTP,\n })\n }\n >\n {t('common.backToVerify')}\n </BackCustom>\n )\n }, [changeModule, initData, t])\n\n return (\n <div className=\"g2-view-container g2-mfa-recovery-code\">\n {renderBack}\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 { useGuardAuthClient } from '../../Guard/authClient'\nimport { getDeviceName, getUserRegisterParams } 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 {\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardModule,\n} from '../../_utils/context'\nimport { GuardModuleType } from '../../Guard'\nimport { useMediaSize } from '../../_utils/hooks'\nimport { ApiCode } from '../../_utils/responseManagement/interface'\nimport { usePasswordErrorText } from '../../_utils/useErrorText'\nimport { Agreement, ApplicationConfig } from '../../Type/application'\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 const { isPhoneMedia } = useMediaSize()\n const authClient = useGuardAuthClient()\n const [form] = Form.useForm()\n const config = useGuardFinallyConfig()\n const isChangeComplete = useIsChangeComplete('email')\n const { changeModule } = useGuardModule()\n const { post } = useGuardHttpClient()\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n const [validated, setValidated] = useState(false)\n const {\n getPassWordUnsafeText,\n setPasswordErrorTextShow,\n } = usePasswordErrorText()\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.Email,\n data: {\n identity: values.email,\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 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 // 加密密码\n const encrypt = authClient.options.encryptFunction\n const encryptPassword = await encrypt!(password, config.publicKey!)\n\n const context = registeContext ?? {}\n\n // 注册使用的详情信息\n const registerContent = {\n email,\n password: encryptPassword,\n profile: {\n browser:\n typeof navigator !== 'undefined' ? navigator.userAgent : null,\n device: getDeviceName(),\n },\n forceLogin: false,\n generateToken: true,\n clientIp: undefined,\n params: config?.isHost\n ? JSON.stringify(getUserRegisterParams(['login_page_context']))\n : undefined,\n context: JSON.stringify(context),\n phoneToken: undefined,\n }\n\n // onRegisterSuccess 注册成功后需要回到对应的登录页面\n const onRegisterSuccessIntercept = (user: any) => {\n onRegisterSuccess(user, {\n registerFrom: RegisterMethods.Email,\n account: email,\n })\n }\n if (isChangeComplete) {\n changeModule?.(GuardModuleType.REGISTER_COMPLETE_INFO, {\n businessRequestName: 'registerByEmail',\n content: {\n ...registerContent,\n },\n onRegisterSuccess: onRegisterSuccessIntercept,\n onRegisterFailed,\n })\n\n return\n }\n\n const { statusCode, data, message: errorMessage, apiCode } = await post(\n `/api/v2/register-email`,\n {\n ...registerContent,\n postUserInfoPipeline: false,\n }\n )\n\n if (statusCode === 200) {\n onRegisterSuccessIntercept(data)\n } else {\n if (apiCode === ApiCode.UNSAFE_PASSWORD_TIP) {\n setPasswordErrorTextShow(true)\n }\n submitButtonRef.current.onError()\n onRegisterFailed(apiCode, data, errorMessage)\n message.error(errorMessage)\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 onSubmitCapture={() => submitButtonRef.current.onSpin(true)}\n onFinish={(values: any) => {\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 maxLength={50} // 手机号限长 20 字符,多种组合是 50 字符\n autoFocus={!isPhoneMedia}\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 {getPassWordUnsafeText()}\n <Form.Item className=\"authing-g2-sumbit-form\">\n <SubmitButton\n // disabled={\n // !!agreements.find((item) => item.required && !acceptedAgreements)\n // }\n text={t('common.register')}\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import { Form, message } from 'antd'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport {\n fieldRequiredRule,\n getDeviceName,\n getUserRegisterParams,\n validate,\n} from '../../_utils'\nimport { Agreements } from '../components/Agreements'\nimport SubmitButton from '../../SubmitButton'\nimport { IconFont } from '../../IconFont'\nimport { SceneType } from 'authing-js-sdk'\nimport { SendCodeByPhone } from '../../SendCode/SendCodeByPhone'\nimport { InputInternationPhone } from '../../Login/core/withVerifyCode/InputInternationPhone'\nimport { parsePhone, useMediaSize } from '../../_utils/hooks'\nimport { useIsChangeComplete } from '../utils'\nimport { useGuardFinallyConfig, useGuardModule } from '../../_utils/context'\nimport { GuardModuleType } from '../../Guard'\nimport { useGuardHttp } from '../../_utils/guardHttp'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { FormItemIdentify } from '../../Login/core/withVerifyCode/FormItemIdentify'\nimport { InputIdentify } from '../../Login/core/withVerifyCode/inputIdentify'\nimport { EmailScene, InputMethod } from '../..'\nimport { SendCodeByEmail } from '../../SendCode/SendCodeByEmail'\nimport {\n Agreement,\n ApplicationConfig,\n RegisterMethods,\n} from '../../Type/application'\n\nexport interface RegisterWithCodeProps {\n // onRegister: Function\n onRegisterSuccess: Function\n onRegisterFailed: Function\n onBeforeRegister?: Function\n agreements: Agreement[]\n publicConfig?: ApplicationConfig\n registeContext?: any\n methods: any[]\n}\n\n/**\n * 手机 Code 注册\n * @param param0\n * @returns\n */\nexport const RegisterWithCode: React.FC<RegisterWithCodeProps> = ({\n onRegisterSuccess,\n onRegisterFailed,\n onBeforeRegister,\n agreements,\n publicConfig,\n registeContext,\n methods = [],\n}) => {\n const { t } = useTranslation()\n\n const isPhoneChangeComplete = useIsChangeComplete('phone')\n\n const isEmailChangeComplete = useIsChangeComplete('email')\n\n const config = useGuardFinallyConfig()\n\n const { isPhoneMedia } = useMediaSize()\n\n const authClient = useGuardAuthClient()\n\n const { changeModule } = useGuardModule()\n\n const { post } = useGuardHttp()\n\n const submitButtonRef = useRef<any>(null)\n\n const [form] = Form.useForm()\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n\n const [validated, setValidated] = useState(false)\n\n // 区号 默认\n const [areaCode, setAreaCode] = useState(\n publicConfig?.internationalSmsConfig?.defaultISOType || 'CN'\n )\n\n const verifyCodeLength = publicConfig?.verifyCodeLength ?? 4\n\n const [currentMethod, setCurrentMethod] = useState(methods[0])\n\n const [identify, setIdentify] = useState('')\n // 是否仅开启国际化短信\n const [isOnlyInternationSms, setInternationSms] = useState(false)\n // 是否开启了国际化短信功能\n const isInternationSms =\n publicConfig?.internationalSmsConfig?.enabled || false\n\n useEffect(() => {\n // 开启国际化配置且登录方式为手机号码时\n if (\n methods.length === 1 &&\n methods[0] === 'phone-code' &&\n publicConfig &&\n publicConfig.internationalSmsConfig?.enabled\n ) {\n setInternationSms(true)\n }\n }, [methods, publicConfig])\n\n const registerByPhoneCode = useCallback(\n async (values: any) => {\n const needPassword =\n config.passwordLoginMethods?.includes('phone-password') &&\n publicConfig?.enableCompletePassword\n\n submitButtonRef.current?.onSpin(true)\n\n values.phone = values.identify\n if (onBeforeRegister) {\n try {\n const canRegister = await onBeforeRegister(\n {\n type: RegisterMethods.Phone,\n data: {\n identity: 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 try {\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, code } = values\n\n const context = registeContext ?? {}\n\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 // // 托管模式下注册携带query上自定义参数login_page_context\n // params: config?.isHost\n // ? getUserRegisterParams(['login_page_context'])\n // : undefined,\n // }\n\n // if (isInternationSms) {\n // options.phoneCountryCode = phoneCountryCode\n // }\n\n const registerContent = {\n phone: phoneNumber,\n code,\n phoneCountryCode: isInternationSms ? phoneCountryCode : undefined,\n // password: undefined, // TODO: 手机号验证码不需要密码\n profile: {\n browser:\n typeof navigator !== 'undefined' ? navigator.userAgent : null,\n device: getDeviceName(),\n },\n forceLogin: false,\n generateToken: true,\n clientIp: undefined,\n params: config?.isHost\n ? JSON.stringify(getUserRegisterParams(['login_page_context']))\n : undefined,\n context: JSON.stringify(context),\n emailToken: undefined,\n }\n // onRegisterSuccess 注册成功后需要回到对应的登录页面\n const onRegisterSuccessIntercept = (user: any) => {\n onRegisterSuccess(user, {\n registerFrom: RegisterMethods.Phone,\n account: isInternationSms ? '' : phoneNumber,\n })\n }\n\n if (needPassword) {\n // 判断验证码是否正确\n const {\n statusCode: checkCode,\n data: { valid, message: checkMessage },\n } = await post('/api/v2/sms/preCheckCode', {\n phone: phoneNumber,\n phoneCode: code,\n phoneCountryCode,\n })\n // 验证码校验通过 进入密码补全流程\n if (checkCode === 200 && valid) {\n changeModule?.(GuardModuleType.REGISTER_PASSWORD, {\n businessRequestName: 'registerByPhoneCode',\n content: {\n ...registerContent,\n },\n isChangeComplete: isPhoneChangeComplete,\n onRegisterSuccess: onRegisterSuccessIntercept,\n onRegisterFailed,\n })\n return\n } else {\n submitButtonRef.current.onError()\n message.error(checkMessage)\n return\n }\n } else {\n // 看看是否要跳转到 信息补全\n if (isPhoneChangeComplete) {\n // 判断验证码是否正确\n const {\n statusCode: checkCode,\n data: { valid, message: checkMessage },\n } = await post('/api/v2/sms/preCheckCode', {\n phone: phoneNumber,\n phoneCode: code,\n phoneCountryCode,\n })\n\n if (checkCode === 200 && valid) {\n changeModule?.(GuardModuleType.REGISTER_COMPLETE_INFO, {\n businessRequestName: 'registerByPhoneCode',\n content: {\n ...registerContent,\n },\n onRegisterSuccess: onRegisterSuccessIntercept,\n onRegisterFailed,\n })\n return\n } else {\n submitButtonRef.current.onError()\n message.error(checkMessage)\n return\n }\n }\n\n /**\n * 手机号注册接口\n */\n const { data, statusCode, apiCode, message: errMessage } = await post(\n `/api/v2/register-phone-code`,\n {\n ...registerContent,\n postUserInfoPipeline: false,\n }\n )\n if (statusCode === 200) {\n submitButtonRef.current?.onSpin(false)\n onRegisterSuccessIntercept(data)\n } else {\n submitButtonRef.current.onError()\n message.error(errMessage)\n !needPassword && onRegisterFailed(apiCode, data, errMessage)\n }\n }\n } catch (error: any) {\n // TODO 确认无误后 删除 catch\n const { message: errorMessage, code, data } = error\n submitButtonRef.current.onError()\n message.error(errorMessage)\n !needPassword && onRegisterFailed(code, data, errorMessage)\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n },\n [\n config?.isHost,\n config.passwordLoginMethods,\n onBeforeRegister,\n authClient,\n form,\n agreements?.length,\n acceptedAgreements,\n registeContext,\n isInternationSms,\n areaCode,\n post,\n changeModule,\n isPhoneChangeComplete,\n onRegisterSuccess,\n onRegisterFailed,\n publicConfig?.enableCompletePassword,\n ]\n )\n\n const registerByEmailCode = useCallback(\n async (values: any) => {\n const needPassword =\n config.passwordLoginMethods?.includes('email-password') &&\n publicConfig?.enableCompletePassword\n submitButtonRef.current.onSpin(true)\n values.email = values.identify\n if (onBeforeRegister) {\n try {\n const canRegister = await onBeforeRegister(\n {\n type: RegisterMethods.EmailCode,\n data: {\n identity: values.email,\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, code } = values\n\n const context = registeContext ?? {}\n // 注册使用的详情信息\n const registerContent = {\n email,\n code,\n profile: {\n browser:\n typeof navigator !== 'undefined' ? navigator.userAgent : null,\n device: getDeviceName(),\n },\n context: JSON.stringify(context),\n generateToken: true,\n // 托管模式下注册携带query上自定义参数login_page_context\n params: config?.isHost\n ? JSON.stringify(getUserRegisterParams(['login_page_context'])) // 特殊处理 resetful api\n : undefined,\n }\n\n // onRegisterSuccess 注册成功后需要回到对应的登录页面\n const onRegisterSuccessIntercept = (user: any) => {\n onRegisterSuccess(user, {\n registerFrom: RegisterMethods.EmailCode,\n account: email,\n })\n }\n\n if (needPassword) {\n // 判断验证码是否正确\n const {\n statusCode: checkCode,\n data: { valid, message: checkMessage },\n } = await post('/api/v2/email/preCheckCode', {\n email: email,\n emailCode: code,\n })\n // 验证码校验通过 进入密码补全流程\n if (checkCode === 200 && valid) {\n changeModule?.(GuardModuleType.REGISTER_PASSWORD, {\n businessRequestName: 'registerByEmailCode', //用于判断后续使用哪个注册api\n content: {\n ...registerContent,\n },\n isChangeComplete: isEmailChangeComplete,\n onRegisterSuccess: onRegisterSuccessIntercept,\n onRegisterFailed,\n })\n return\n } else {\n submitButtonRef.current.onError()\n message.error(checkMessage)\n return\n }\n } else {\n // 看看是否要跳转到 信息补全\n if (isEmailChangeComplete) {\n // 判断验证码是否正确\n const {\n statusCode: checkCode,\n data: { valid, message: checkMessage },\n } = await post('/api/v2/email/preCheckCode', {\n email: email,\n emailCode: code,\n })\n if (checkCode === 200 && valid) {\n changeModule?.(GuardModuleType.REGISTER_COMPLETE_INFO, {\n businessRequestName: 'registerByEmailCode', //用于判断后续使用哪个注册api\n content: {\n ...registerContent,\n },\n onRegisterSuccess: onRegisterSuccessIntercept,\n onRegisterFailed,\n })\n return\n } else {\n submitButtonRef.current.onError()\n message.error(checkMessage)\n return\n }\n }\n // 注册\n const {\n statusCode,\n data,\n apiCode,\n onGuardHandling,\n message: registerMessage,\n } = await post('/api/v2/register-email-code', {\n ...registerContent,\n postUserInfoPipeline: false,\n })\n submitButtonRef.current.onSpin(false)\n if (statusCode === 200) {\n onRegisterSuccessIntercept(data)\n } else {\n onGuardHandling?.()\n onRegisterFailed(apiCode, data, registerMessage)\n }\n }\n } catch (error: any) {\n const { message: errorMessage, code, data } = error\n submitButtonRef.current.onError()\n message.error(errorMessage)\n !needPassword && onRegisterFailed(code, data, message)\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n },\n [\n config?.isHost,\n config.passwordLoginMethods,\n onBeforeRegister,\n authClient,\n form,\n agreements?.length,\n acceptedAgreements,\n registeContext,\n post,\n changeModule,\n isEmailChangeComplete,\n onRegisterSuccess,\n onRegisterFailed,\n publicConfig?.enableCompletePassword,\n ]\n )\n\n const onFinish = useCallback(\n async (values) => {\n if (currentMethod === InputMethod.EmailCode) {\n await registerByEmailCode(values)\n } else if (currentMethod === InputMethod.PhoneCode) {\n await registerByPhoneCode(values)\n }\n },\n [currentMethod, registerByEmailCode, registerByPhoneCode]\n )\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_REGISTER}\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_REGISTER}\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.REGISTER_VERIFY_CODE}\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 // 为了 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\n return (\n <div className=\"authing-g2-register-email\">\n <Form\n form={form}\n name=\"emailRegister\"\n autoComplete=\"off\"\n onSubmitCapture={() => submitButtonRef.current.onSpin(true)}\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current.onError()}\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 checkRepeat={true}\n required={true}\n >\n {isOnlyInternationSms ? (\n <AreaCodePhoneAccount autoFocus={!isPhoneMedia} />\n ) : (\n <InputIdentify\n className=\"authing-g2-input\"\n size=\"large\"\n autoFocus={!isPhoneMedia}\n value={identify}\n methods={methods}\n onChange={(e) => {\n let v = e.target.value\n setIdentify(v)\n if (methods.length === 1) return\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 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 className=\"authing-g2-sumbit-form\">\n <SubmitButton\n // disabled={\n // !!agreements.find((item) => item.required && !acceptedAgreements)\n // }\n text={t('common.register')}\n ref={submitButtonRef}\n />\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 { ChangeLanguage } from '../ChangeLanguage'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { GuardModuleType } from '../Guard/module'\nimport { RegisterWithEmail } from './core/WithEmail'\nimport { RegisterWithCode } from './core/WithCode'\nimport { getLoginTypePipe, tabSort } from '../_utils'\nimport { fallbackLng, i18n } from '../_utils/locales'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport { GuardLoginInitData } from '../Login/interface'\nimport { RegisterMethods } from '../Type/application'\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 verifyRegisterMethods = useMemo<string[]>(() => {\n const verifyLoginMethods = []\n const { registerMethods } = config\n if (registerMethods?.includes(RegisterMethods.EmailCode)) {\n verifyLoginMethods.push('email-code')\n }\n if (registerMethods?.includes(RegisterMethods.Phone)) {\n verifyLoginMethods.push('phone-code')\n }\n\n return verifyLoginMethods\n }, [config])\n\n const registerContextProps = useMemo(\n () => ({\n onRegisterSuccess: (\n data: any = {},\n registerInfo: {\n registerFrom: RegisterMethods\n account: string\n }, //以何种方式注册成功\n message?: string\n ) => {\n const initData = getLoginTypePipe(\n publicConfig,\n registerInfo.registerFrom\n )\n const loginInitData: GuardLoginInitData = {}\n if (initData) {\n loginInitData.specifyDefaultLoginMethod =\n initData.specifyDefaultLoginMethod\n\n initData?.lockMethod &&\n (loginInitData._lockMethod = initData.lockMethod)\n\n loginInitData._firstItemInitialValue = registerInfo.account\n }\n events?.onRegister?.(data, authClient)\n changeModule?.(GuardModuleType.LOGIN, loginInitData)\n },\n onRegisterFailed: (code: number, data: any = {}, message?: string) => {\n // if (message) Message.error(message)\n\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) =>\n fallbackLng(i18n.language).find((lng) =>\n lng.includes(agree.lang)\n ) && agree?.availableAt !== 1\n ) ?? []\n : [],\n publicConfig: publicConfig,\n methods: verifyRegisterMethods,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n agreementEnabled,\n config?.agreements,\n events?.onBeforeRegister,\n i18n.language,\n verifyRegisterMethods,\n ]\n )\n\n const tabMapping: Record<\n string,\n { component: React.ReactNode; name: string }\n > = useMemo(() => {\n let verifyCodeLogin: string = ''\n if (verifyRegisterMethods.length > 1) {\n verifyCodeLogin = t('common.verifyCodeRegister')\n } else {\n if (verifyRegisterMethods.includes('phone-code')) {\n verifyCodeLogin = t('common.phoneVerifyCode')\n } else if (verifyRegisterMethods.includes('email-code')) {\n verifyCodeLogin = t('common.emailVerifyCode')\n } else {\n verifyCodeLogin = t('common.verifyCodeRegister')\n }\n }\n return {\n [RegisterMethods.Email]: {\n component: <RegisterWithEmail {...registerContextProps} />,\n name: t('common.PasswordRegister'),\n },\n [RegisterMethods.Phone]: {\n component: <RegisterWithCode {...registerContextProps} />,\n name: verifyCodeLogin,\n },\n }\n }, [registerContextProps, t, verifyRegisterMethods])\n\n const renderTab = useMemo(() => {\n const { registerMethods, defaultRegisterMethod } = config\n\n // TODO 过滤支持的方式\n const supportRegisterMethods = registerMethods?.filter((method) =>\n [\n RegisterMethods.Email,\n RegisterMethods.EmailCode,\n RegisterMethods.Phone,\n ].includes(method)\n )\n const showRegisterMethods = [\n ...new Set(\n supportRegisterMethods?.map((method) => {\n switch (method) {\n case RegisterMethods.EmailCode:\n case RegisterMethods.Phone:\n return RegisterMethods.Phone\n case RegisterMethods.Email:\n return RegisterMethods.Email\n default:\n return method\n }\n })\n ),\n ]\n\n return tabSort(defaultRegisterMethod!, showRegisterMethods!)?.map(\n (method) => (\n <Tabs.TabPane tab={tabMapping[method].name} key={method}>\n {tabMapping[method].component}\n </Tabs.TabPane>\n )\n )\n }, [config, 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 destroyInactiveTabPane={true}\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 React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Form } from 'antd'\nimport { fieldRequiredRule, validate, getPasswordIdentify } from '../../_utils'\nimport SubmitButton from '../../SubmitButton'\nimport { IconFont } from '../../IconFont'\nimport { InputPassword } from '../../InputPassword'\nimport { 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, useMediaSize } from '../../_utils/hooks'\nimport { EmailScene } from '../../Type'\nimport { useGuardHttp } from '../../_utils/guardHttp'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport {\n useGuardEvents,\n useGuardInitData,\n useGuardPublicConfig,\n} from '../../_utils/context'\n\nexport enum InputMethodMap {\n email = 'email-code',\n phone = 'phone-code',\n}\nexport const SelfUnlock = ({\n identifyRef,\n}: {\n identifyRef?: React.MutableRefObject<string>\n}) => {\n const { t } = useTranslation()\n let [form] = Form.useForm()\n let [identify, setIdentify] = useState('')\n let [codeMethod, setCodeMethod] = useState<'phone' | 'email'>('phone')\n let submitButtonRef = useRef<any>(null)\n const { isPhoneMedia } = useMediaSize()\n let authClient = useGuardAuthClient()\n const events = useGuardEvents()\n\n const initData = useGuardInitData<{\n defaultEmail: 'string'\n defaultPhone: 'string'\n }>()\n\n useEffect(() => {\n if (initData.defaultEmail) {\n setIdentify(initData.defaultEmail)\n form.setFieldsValue({\n identify: initData.defaultEmail,\n })\n setCodeMethod('email')\n }\n if (initData.defaultPhone) {\n setIdentify(initData.defaultPhone)\n form.setFieldsValue({\n identify: initData.defaultPhone,\n })\n setCodeMethod('phone')\n }\n }, [initData, form])\n\n useEffect(() => {\n if (identifyRef) {\n identifyRef.current = getPasswordIdentify(identify)\n }\n }, [identify, identifyRef])\n\n const { authFlow } = useGuardHttp()\n\n const {\n publicKey,\n verifyCodeLength,\n internationalSmsConfig,\n selfUnlockStrategy = 'password-captcha', // 'captcha' | 'password-captcha'\n } = useGuardPublicConfig()\n\n // 是否开启了国际化短信功能\n const isInternationSms = internationalSmsConfig?.enabled || false\n\n const onFinish = async (values: any) => {\n let identify = values.identify\n\n let code = values.code\n\n let password = values.password || ''\n\n const encryptPassWord = await authClient.options?.encryptFunction?.(\n password,\n publicKey\n )\n // 密码,经过加密后的, 仅“验证码”时不传 password 字段\n password =\n selfUnlockStrategy === 'password-captcha' ? encryptPassWord : undefined\n\n if (codeMethod === 'email') {\n const { isFlowEnd, data, onGuardHandling } = await authFlow(\n 'unlock-account-by-email',\n {\n email: identify, // 用户输入的邮箱\n code, // 验证码\n password,\n }\n )\n submitButtonRef.current?.onSpin(false)\n if (isFlowEnd) {\n events?.onLogin?.(data, authClient!) // 登录成功\n } else {\n onGuardHandling?.()\n }\n }\n if (codeMethod === 'phone') {\n const { phoneNumber } = parsePhone(isInternationSms, identify)\n const { isFlowEnd, data, onGuardHandling } = await authFlow(\n 'unlock-account-by-phone',\n {\n phone: phoneNumber, // 用户输入的邮箱\n code, // 验证码\n password,\n }\n )\n submitButtonRef.current?.onSpin(false)\n if (isFlowEnd) {\n events?.onLogin?.(data, authClient!) // 登录成功\n } else {\n onGuardHandling?.()\n }\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.SELF_UNLOCKING_VERIFY_CODE}\n maxLength={verifyCodeLength}\n data={identify}\n onSendCodeBefore={async () => {\n await form.validateFields(['identify'])\n }}\n value={identify}\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 autoFocus={!isPhoneMedia}\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 } else {\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 {selfUnlockStrategy === 'password-captcha' && (\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('user.inputOldPwd')}\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-sumbit-form submit-form\">\n <SubmitButton\n className=\"forget-password\"\n text={t('common.unlock')}\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\n}\n","import { Tabs } from 'antd'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GuardModuleType } from '..'\nimport { BackCustom, BackLogin } from '../Back'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { LoginWithPassword } from '../Login/core/withPassword'\nimport { LoginWithVerifyCode } from '../Login/core/withVerifyCode'\nimport { PasswordLoginMethods } from '../Type/application'\nimport {\n useGuardButtonState,\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardInitData,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport { fallbackLng, 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 { 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 { spinChange } = useGuardButtonState()\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 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 },\n 'email-code': async (data: any) => {\n const { identity: email, code } = data\n return await emailCodeRequest({ email, code })\n },\n password: async (data: any) => {\n const { identity: account, password } = data\n\n const encrypt = authClient.options.encryptFunction\n\n const captchaCode = data.captchaCode && data.captchaCode.trim()\n\n const encryptPassword = await encrypt!(password, publicKey!)\n\n return await PasswordRequest({\n account,\n password: encryptPassword,\n captchaCode,\n })\n },\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 spinChange(true)\n\n const res = await bindMethodsMap[\n type as 'phone-code' | 'email-code' | 'password'\n ]?.(data)\n\n const { isFlowEnd } = res\n\n spinChange(false)\n\n if (isFlowEnd) {\n // 🤮 TODO 日后必要优化\n return {\n ...res,\n apiCode: 200,\n code: 200,\n }\n }\n\n return res\n }\n\n const agreements = useMemo(\n () =>\n agreementEnabled\n ? config?.agreements?.filter(\n (agree) =>\n fallbackLng(i18n.language).find((lng) =>\n lng.includes(agree.lang)\n ) && !!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 const renderBack = useMemo(() => {\n if (initData.source === GuardModuleType.IDENTITY_BINDING_ASK)\n return (\n <BackCustom onBack={() => backModule?.()}>\n {t('common.back')}\n </BackCustom>\n )\n\n return <BackLogin />\n }, [backModule, initData.source, t])\n\n return (\n <div className=\"g2-view-container g2-view-identity-binding\">\n {renderBack}\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 React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useAsyncFn } from 'react-use'\nimport { GuardModuleType } from '..'\nimport { BackLogin } from '../Back'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { GuardButton } from '../GuardButton'\nimport { IconFont } from '../IconFont'\nimport { IdentityBindingAction } from '../IdentityBinding/businessRequest'\nimport {\n useGuardButtonState,\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 { authFlow } = useGuardHttp()\n\n const authClient = useGuardAuthClient()\n\n const events = useGuardEvents()\n\n const { spinChange } = useGuardButtonState()\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 spinChange(true)\n const { code, onGuardHandling, data, isFlowEnd } = await authFlow(\n IdentityBindingAction.CreateUser\n )\n\n spinChange(false)\n\n if (isFlowEnd) {\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 <BackLogin />\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 <GuardButton\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 </GuardButton>\n <GuardButton\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 </GuardButton>\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 GuardNoticePasswordResetView,\n GuardPasswordNotSafeResetView,\n GuardRegisterCompletePasswordView,\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 useGuardButtonContext,\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 jaJP from 'antd/lib/locale/ja_JP'\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'\nimport { updateFlowHandle } from '../../_utils/flowHandleStorage'\nimport { GuardUnlockView } from '../../SelfUnlock'\nimport { GuardTenantPortalSelectView } from '../../TenantPortalSelect'\n\nconst PREFIX_CLS = 'authing-ant'\n\nmessage.config({\n prefixCls: `${PREFIX_CLS}-message`,\n})\n\nexport const enum LangMAP {\n zhCn = 'zh-CN',\n enUs = 'en-US',\n jaJp = 'ja-JP',\n}\n\nconst langMap = {\n [LangMAP.zhCn]: zhCN,\n [LangMAP.enUs]: enUS,\n [LangMAP.jaJp]: jaJP,\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 { GuardButtonProvider } = useGuardButtonContext()\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.NOTICE_PASSWORD_RESET]: (key: string) => (\n <GuardNoticePasswordResetView 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 [GuardModuleType.REGISTER_PASSWORD]: (key: string) => (\n <GuardRegisterCompletePasswordView key={key} />\n ),\n // 自助解锁\n [GuardModuleType.SELF_UNLOCK]: (key: string) => (\n <GuardUnlockView key={key} />\n ),\n [GuardModuleType.UNSAFE_PASSWORD_RESET]: (key) => (\n <GuardPasswordNotSafeResetView key={key} />\n ),\n [GuardModuleType.TENANT_PORTAL]: (key) => <GuardTenantPortalSelectView />,\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 // 判断有没有 flowHandle\n res.flowHandle && updateFlowHandle(res.flowHandle)\n\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 // 传入的渲染指令不正确的情况处理\n if (!moduleName || !ComponentsMapping[moduleName]) {\n return (\n <GuardErrorView\n error={\n new Error(`未知错误!moduleName 为 <b>${moduleName}</b> 无法识别`)\n }\n />\n )\n }\n return ComponentsMapping[moduleName](new Date().toString())\n } else if (loadingComponent) {\n return loadingComponent\n }\n\n return null\n }, [ComponentsMapping, contextLoaded, loadingComponent, moduleName])\n\n const visible = useMemo(() => {\n return guardProps.visible\n }, [guardProps.visible])\n\n const renderGuardContent = useMemo(() => {\n return <GuardButtonProvider>{renderModule}</GuardButtonProvider>\n }, [GuardButtonProvider, renderModule])\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 closable={defaultMergedConfig.clickCloseable ?? true}\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\">{renderGuardContent}</div>\n </Modal>\n ) : (\n <div className=\"authing-g2-render-module\">{renderGuardContent}</div>\n )}\n </ConfigProvider>\n )\n}\n","import React, { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\n\nimport { GuardModuleType } from '../Guard'\nimport { SelfUnlock } from './core/selfUnlock'\n\nimport { ImagePro } from '../ImagePro'\nimport { useGuardFinallyConfig, useGuardModule } from '../_utils/context'\n\nexport const GuardUnlockView: React.FC = () => {\n const { t } = useTranslation()\n\n const config = useGuardFinallyConfig()\n\n const { changeModule } = useGuardModule()\n\n const identifyRef = useRef('')\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.selfUnlock')}</div>\n <div className=\"title-explain\">{t('login.selfUnlockText')}</div>\n </div>\n <div className=\"g2-view-tabs\">\n <SelfUnlock identifyRef={identifyRef} />\n </div>\n <div className=\"g2-tips-line\">\n <span>{t('user.unlockTip')} &nbsp;</span>\n <span\n className=\"link-like\"\n onClick={() =>\n changeModule?.(GuardModuleType.ANY_QUESTIONS, {\n identify: identifyRef.current,\n })\n }\n >\n {t('common.feedback')}\n </span>\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 './styles.less'\n\nimport Avatar, { AvatarProps } from 'antd/lib/avatar'\nimport Tag, { TagProps } from 'antd/lib/tag'\nimport React from 'react'\n\nexport interface GuardFaceProps {\n /** 顶部 avatar 头像展示 */\n avatar: AvatarProps | string\n /** 标题头部 */\n title: React.ReactNode\n /** 标题描述 */\n description?: React.ReactNode\n /** 标签功能 */\n tags?: TagProps[]\n}\n\n/** 顶部通用区域封装,同时兼容样式的层叠和功能的自定义 */\nexport const GuardFace = (props: GuardFaceProps) => {\n const { avatar, title, description, tags } = props\n const avatarProps: AvatarProps =\n typeof avatar === 'string'\n ? { shape: 'square', size: 48, src: avatar }\n : avatar\n return (\n <div className=\"g2-view-header\">\n <Avatar className=\"g2-view-avatar icon\" {...avatarProps} />\n <div className=\"title\">{title}</div>\n <div className=\"title-description\">{description}</div>\n {tags?.map?.((tag, i) => (\n <Tag key={i} className=\"authing-header-tag\" {...tag} />\n ))}\n </div>\n )\n}\n","import './styles.less'\n\nimport { Avatar, List } from 'antd'\nimport { AvatarProps } from 'antd/lib/avatar'\nimport { ListItemProps, ListProps } from 'antd/lib/list'\nimport classNames from 'classnames'\nimport React, { CSSProperties } from 'react'\n\nexport interface GuardSelectItem {\n /** avatar 头像展示 */\n avatar?: AvatarProps | string\n /** 标题 */\n title?: React.ReactNode\n /** 描述 */\n description?: React.ReactNode\n /** 右侧操作组 */\n actions?: ListItemProps['actions']\n /** 右侧额外的渲染内容 */\n extra?: ListItemProps['extra']\n /** 数据项子内容,便于自定义 */\n children?: React.ReactNode\n /** 其他元字段 */\n [key: string]: any\n}\n\nexport interface GuardSelectProps<T = any> extends ListProps<any> {\n /**数据项之间的间隙,默认`20px` */\n gap?: CSSProperties['marginBottom']\n /** 数据源 */\n dataSource: T[]\n\n onSelect?: (item?: T, index?: number) => void\n}\n\n/** 选择列表组件 兼容绝大多数选择场景 */\nexport const GuardSelect = <D extends GuardSelectItem = any>(\n props: GuardSelectProps<D>\n) => {\n const { dataSource, onSelect, gap = 20, ...listProps } = props\n\n return (\n <List\n split={false}\n size=\"small\"\n {...listProps}\n className={classNames(listProps.className, 'authing-guard-select-list')}\n dataSource={dataSource}\n renderItem={(item, i) => (\n <List.Item\n actions={item?.actions}\n extra={item?.extra}\n key={i}\n onClick={() => onSelect?.(item, i)}\n className={classNames('authing-guard-select-list-item')}\n style={dataSource?.length !== i + 1 ? { marginBottom: gap } : {}}\n >\n <List.Item.Meta\n avatar={\n typeof item?.avatar === 'string' ? (\n <Avatar size={40} src={item.avatar} />\n ) : (\n <Avatar size={40} {...item.avatar} />\n )\n }\n title={item?.title}\n description={item?.description}\n />\n </List.Item>\n )}\n />\n )\n}\n","import './styles.less'\n\nimport React, { useCallback } from 'react'\n\nimport { useGuardInitData } from '../_utils/context'\nimport { GuardFace } from '../GuardFace'\nimport { GuardSelect } from '../GuardSelect'\nimport { IconFont } from '../IconFont'\n\n/** 租户门户选择状态机返回数据类型 */\nexport interface TenantPortalSelectType {\n title: string\n description: string\n logo: string\n list: {\n tenantId: string\n tenantLogo: string\n tenantName: string\n userName: string\n }[]\n}\n\nexport const GuardTenantPortalSelectView = () => {\n const {\n list,\n title,\n description,\n logo,\n } = useGuardInitData<TenantPortalSelectType>()\n\n const handleSelect = useCallback((item?: typeof dataSource[number]) => {\n console.log('选择了', item)\n }, [])\n\n const dataSource = list?.map?.((it) => ({\n ...it,\n title: it.tenantName,\n description: it.userName,\n avatar: { size: 40, src: it.tenantLogo },\n extra:\n (\n <IconFont\n type=\"authing-arrow-left-s-line\" // 没有右箭头,使用左箭头旋转\n className=\"authing-gaurd-select-extra-icon\"\n />\n ) ?? [],\n }))\n return (\n <div className=\"g2-view-container\">\n <div className=\"g2-view-container-inner\">\n <GuardFace title={title} description={description} avatar={logo} />\n {dataSource?.length && (\n <GuardSelect dataSource={dataSource} onSelect={handleSelect} />\n )}\n </div>\n </div>\n )\n}\n","import { GuardModuleType } from '../../Guard'\n\nexport const enum CodeAction {\n // 切换 Module\n CHANGE_MODULE = 'changeModule',\n // 渲染 错误信息\n RENDER_MESSAGE = 'renderMessage',\n // 流程 结束\n FLOW_END = 'flowEnd',\n}\n\nexport const 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 UNLOCK = 1643,\n\n FLOW_END = 1600,\n\n FIRST_LOGIN_PASSWORD = 1639,\n\n FORCED_PASSWORD_RESET = 2058,\n\n UNSAFE_PASSWORD_TIP = 2061,\n\n UNSAFE_PASSWORD_RESET = 2071,\n\n TENANT_PORTAL = 1644,\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 [ApiCode.UNLOCK]: GuardModuleType.SELF_UNLOCK,\n [ApiCode.UNSAFE_PASSWORD_RESET]: GuardModuleType.UNSAFE_PASSWORD_RESET,\n [ApiCode.TENANT_PORTAL]: GuardModuleType.TENANT_PORTAL,\n}\n","import { initFacePlugin } from '../../_utils/facePlugin'\nimport { FacePlugin } from '../../_utils/facePlugin/interface'\nimport isEqual from 'lodash/isEqual'\n\nexport const useGuardPlugin: any = (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 { useGuardPlugin } from './usePlugin'\n\nexport interface GuardCoreProps {\n guardProps: GuardProps\n initState: ModuleState\n}\n\nexport const GuardCore = (props: GuardCoreProps) => {\n const { guardProps, initState } = props\n\n useGuardPlugin(guardProps)\n\n return (\n <RenderContext guardProps={guardProps} initState={initState}>\n <RenderModule guardProps={guardProps} />\n </RenderContext>\n )\n}\n","import { memo, useEffect, useRef, useState } from 'react'\nimport { GuardEvents } from './event'\nimport { GuardAppendConfig, IG2FCProps } from '../Type'\nimport { GuardLocalConfig } from './config'\nimport { GuardModuleType } from './module'\nimport 'moment/locale/zh-cn'\nimport { GuardCore } from './core/index'\nimport { getDocumentNode, GuardPropsFilter } from '../_utils'\nimport React from 'react'\nimport { initGuardDocument } from '../_utils/guardDocument'\n\nexport interface GuardProps extends GuardEvents, IG2FCProps {\n config?: Partial<GuardLocalConfig>\n appendConfig?: GuardAppendConfig\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\n const ref = useRef<HTMLDivElement>(null)\n\n const [guardWindowMount, mounted] = useState<boolean>(false)\n\n // 锁定 Guard 中 window 指向\n useEffect(() => {\n if (!ref?.current) return\n\n const guardDocument = getDocumentNode(ref.current)\n\n initGuardDocument(guardDocument)\n\n mounted(true)\n }, [])\n\n // 首页 init 数据\n const initState: ModuleState = {\n moduleName: config?.defaultScenes ?? GuardModuleType.LOGIN,\n initData: config?.defaultInitData ?? {},\n }\n\n return (\n <div ref={ref}>\n {guardWindowMount && (\n <GuardCore guardProps={props} initState={initState} />\n )}\n </div>\n )\n}, propsAreEqual)\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport reportWebVitals from './reportWebVitals'\nimport { Guard, GuardModuleType } from './components'\n\nconst App = () => {\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 <Guard\n appId=\"632bd97db0cdf9256da0e1f2\"\n // appId=\"635725aa4f8c83a7ba0f74db\"\n config={{\n // defaultScenes:GuardModuleType.,\n host: 'http://fdgsdfgds.authing.localhost:3000',\n defaultScenes: GuardModuleType.LOGIN,\n }}\n tenantId=\"632bd8c2d5256617def23cc5\"\n />\n {/* <Guard\n appId=\"632bd97db0cdf9256da0e1f2\"\n config={{\n // defaultScenes:GuardModuleType.,\n host: 'http://nnljmlfkhileicmi.authing.localhost:3000',\n contentCss: '',\n isHost: true,\n __internalRequest__: true,\n openEventsMapping: false,\n defaultScenes: GuardModuleType.MULTIPLE_TENANT_SELECT,\n }}\n // tenantId=\"632bd8c2d5256617def23cc5\"\n /> */}\n\n {/* <Guard\n appId=\"632bd97db0cdf9256da0e1f2\"\n config={{\n // defaultScenes:GuardModuleType.,\n host: 'http://nnljmlfkhileicmi.authing.localhost:3000',\n contentCss: '',\n isHost: true,\n __internalRequest__: true,\n openEventsMapping: false,\n defaultScenes: GuardModuleType.MULTIPLE_TENANT_SELECT,\n }}\n // tenantId=\"632bd8c2d5256617def23cc5\"\n /> */}\n </div>\n )\n}\n\nReactDOM.render(<App />, document.getElementById('root'))\n\nreportWebVitals()\n"],"sourceRoot":""}