@authing/react-ui-components 4.4.3-lulu.7 → 4.4.3-lulu.8

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.
Files changed (217) hide show
  1. package/dist/asset-manifest.json +6 -6
  2. package/dist/index.html +1 -1
  3. package/dist/static/css/{2.e17a473e.chunk.css → 2.8c7f5216.chunk.css} +1 -1
  4. package/dist/static/css/2.8c7f5216.chunk.css.map +1 -0
  5. package/dist/static/js/{main.a4cb4283.chunk.js → main.e4fe5ad6.chunk.js} +2 -2
  6. package/dist/static/js/main.e4fe5ad6.chunk.js.map +1 -0
  7. package/package.json +1 -1
  8. package/dist/static/css/2.e17a473e.chunk.css.map +0 -1
  9. package/dist/static/js/main.a4cb4283.chunk.js.map +0 -1
  10. package/lib/index.min.css +0 -2
  11. package/lib/index.min.js +0 -2
  12. package/lib/index.min.js.LICENSE.txt +0 -59
  13. package/lib/static/media/loading.3cf0104f.svg +0 -32
  14. package/types/AuthClientProvider/AuthClientProvider.d.ts +0 -6
  15. package/types/AuthClientProvider/context.d.ts +0 -6
  16. package/types/AuthClientProvider/index.d.ts +0 -1
  17. package/types/Back/index.d.ts +0 -12
  18. package/types/BindTotp/businessRequest.d.ts +0 -5
  19. package/types/BindTotp/core/bindSuccess.d.ts +0 -6
  20. package/types/BindTotp/core/securityCode.d.ts +0 -8
  21. package/types/BindTotp/index.d.ts +0 -3
  22. package/types/BindTotp/interface.d.ts +0 -20
  23. package/types/ChangeLanguage/index.d.ts +0 -10
  24. package/types/ChangePassword/businessRequest.d.ts +0 -9
  25. package/types/ChangePassword/core/PasswordNotSafeReset.d.ts +0 -6
  26. package/types/ChangePassword/core/completePassword.d.ts +0 -2
  27. package/types/ChangePassword/core/firstLoginReset.d.ts +0 -6
  28. package/types/ChangePassword/core/rotateReset.d.ts +0 -7
  29. package/types/ChangePassword/index.d.ts +0 -11
  30. package/types/CompleteInfo/businessRequest.d.ts +0 -9
  31. package/types/CompleteInfo/core/completeInfo.d.ts +0 -12
  32. package/types/CompleteInfo/index.d.ts +0 -11
  33. package/types/CompleteInfo/interface.d.ts +0 -103
  34. package/types/CompleteInfo/utils.d.ts +0 -28
  35. package/types/CopyAbleText/index.d.ts +0 -5
  36. package/types/DownloadAuthenticator/index.d.ts +0 -3
  37. package/types/DownloadAuthenticator/interface.d.ts +0 -12
  38. package/types/Error/index.d.ts +0 -6
  39. package/types/Error/interface.d.ts +0 -8
  40. package/types/ForgetPassword/InputPassword/index.d.ts +0 -4
  41. package/types/ForgetPassword/core/inputIdentify.d.ts +0 -7
  42. package/types/ForgetPassword/core/resetPassword.d.ts +0 -16
  43. package/types/ForgetPassword/index.d.ts +0 -2
  44. package/types/ForgetPassword/interface.d.ts +0 -19
  45. package/types/Guard/Guard.d.ts +0 -10
  46. package/types/Guard/GuardModule/stateMachine.d.ts +0 -38
  47. package/types/Guard/authClient.d.ts +0 -14
  48. package/types/Guard/config.d.ts +0 -17
  49. package/types/Guard/core/hooks/useAgreements.d.ts +0 -14
  50. package/types/Guard/core/hooks/useGuardView.d.ts +0 -7
  51. package/types/Guard/core/hooks/useMultipleAccounts.d.ts +0 -324
  52. package/types/Guard/core/index.d.ts +0 -8
  53. package/types/Guard/core/renderContext.d.ts +0 -8
  54. package/types/Guard/core/renderModule.d.ts +0 -11
  55. package/types/Guard/core/useAppendConfig.d.ts +0 -4
  56. package/types/Guard/core/usePlugin.d.ts +0 -3
  57. package/types/Guard/event.d.ts +0 -103
  58. package/types/Guard/index.d.ts +0 -4
  59. package/types/Guard/module.d.ts +0 -42
  60. package/types/Guard/sso.d.ts +0 -19
  61. package/types/GuardButton/GuardButton.d.ts +0 -6
  62. package/types/GuardButton/index.d.ts +0 -1
  63. package/types/GuardFace/index.d.ts +0 -16
  64. package/types/GuardSelect/index.d.ts +0 -29
  65. package/types/IconFont/iconfont.d.ts +0 -1
  66. package/types/IconFont/index.d.ts +0 -8
  67. package/types/IconFont/useGuardIconfont.d.ts +0 -1
  68. package/types/IdentityBinding/IdentityBinding.d.ts +0 -5
  69. package/types/IdentityBinding/businessRequest.d.ts +0 -36
  70. package/types/IdentityBinding/index.d.ts +0 -2
  71. package/types/IdentityBinding/interface.d.ts +0 -27
  72. package/types/IdentityBindingAsk/IdentityBindingAsk.d.ts +0 -3
  73. package/types/IdentityBindingAsk/index.d.ts +0 -2
  74. package/types/IdentityBindingAsk/interface.d.ts +0 -21
  75. package/types/ImagePro/index.d.ts +0 -15
  76. package/types/InputNumber/index.d.ts +0 -5
  77. package/types/InputPassword/index.d.ts +0 -2
  78. package/types/Invitation/Application/index.d.ts +0 -3
  79. package/types/Invitation/AuthenticationBind/index.d.ts +0 -3
  80. package/types/Invitation/Complete/index.d.ts +0 -3
  81. package/types/Invitation/Error/index.d.ts +0 -3
  82. package/types/Invitation/Success/index.d.ts +0 -2
  83. package/types/Invitation/interface.d.ts +0 -66
  84. package/types/LazyloadImage/index.d.ts +0 -12
  85. package/types/Login/codemap.d.ts +0 -2
  86. package/types/Login/core/withAD.d.ts +0 -21
  87. package/types/Login/core/withAppQrcode.d.ts +0 -9
  88. package/types/Login/core/withAuthingOtpPush/BeforeLogin.d.ts +0 -17
  89. package/types/Login/core/withAuthingOtpPush/HowBindClient.d.ts +0 -2
  90. package/types/Login/core/withAuthingOtpPush/HowGetAppLoginUrl.d.ts +0 -2
  91. package/types/Login/core/withAuthingOtpPush/HowUsePushLogin.d.ts +0 -2
  92. package/types/Login/core/withAuthingOtpPush/PendingLogin.d.ts +0 -7
  93. package/types/Login/core/withAuthingOtpPush/PushLoginGuideModal.d.ts +0 -3
  94. package/types/Login/core/withAuthingOtpPush/PushLoginGuideSelector.d.ts +0 -9
  95. package/types/Login/core/withAuthingOtpPush/index.d.ts +0 -3
  96. package/types/Login/core/withAuthingOtpPush/types.d.ts +0 -28
  97. package/types/Login/core/withLDAP.d.ts +0 -22
  98. package/types/Login/core/withPassword/FormItemAccount.d.ts +0 -6
  99. package/types/Login/core/withPassword/GraphicVerifyCode.d.ts +0 -7
  100. package/types/Login/core/withPassword/InputAccount.d.ts +0 -7
  101. package/types/Login/core/withPassword/index.d.ts +0 -28
  102. package/types/Login/core/withVerifyCode/FormItemIdentify.d.ts +0 -11
  103. package/types/Login/core/withVerifyCode/InputInternationPhone.d.ts +0 -7
  104. package/types/Login/core/withVerifyCode/VirtualDropdown.d.ts +0 -12
  105. package/types/Login/core/withVerifyCode/index.d.ts +0 -8
  106. package/types/Login/core/withVerifyCode/inputIdentify.d.ts +0 -7
  107. package/types/Login/core/withWechatMiniQrcode.d.ts +0 -11
  108. package/types/Login/core/withWechatmpQrcode.d.ts +0 -14
  109. package/types/Login/hooks/useLoginMultiple.d.ts +0 -65
  110. package/types/Login/index.d.ts +0 -5
  111. package/types/Login/interface.d.ts +0 -41
  112. package/types/Login/multipleAccounts/index.d.ts +0 -22
  113. package/types/Login/multipleAccounts/panel.d.ts +0 -46
  114. package/types/Login/resetAccountName/businessRequest.d.ts +0 -6
  115. package/types/Login/resetAccountName/index.d.ts +0 -3
  116. package/types/Login/socialLogin/IdpButton/index.d.ts +0 -2
  117. package/types/Login/socialLogin/PasskeyButton/index.d.ts +0 -7
  118. package/types/Login/socialLogin/index.d.ts +0 -18
  119. package/types/Login/socialLogin/postMessage.d.ts +0 -7
  120. package/types/MFA/VerifyCodeInput/VerifyCodeFormItem.d.ts +0 -8
  121. package/types/MFA/VerifyCodeInput/index.d.ts +0 -14
  122. package/types/MFA/businessRequest.d.ts +0 -67
  123. package/types/MFA/codemap.d.ts +0 -2
  124. package/types/MFA/core/email.d.ts +0 -23
  125. package/types/MFA/core/face.d.ts +0 -2
  126. package/types/MFA/core/face_deps.d.ts +0 -11
  127. package/types/MFA/core/passkey.d.ts +0 -16
  128. package/types/MFA/core/sms.d.ts +0 -28
  129. package/types/MFA/core/totp.d.ts +0 -20
  130. package/types/MFA/index.d.ts +0 -9
  131. package/types/MFA/interface.d.ts +0 -44
  132. package/types/MFA/mfaMethods/index.d.ts +0 -8
  133. package/types/Message/index.d.ts +0 -9
  134. package/types/NeedHelpView/core/describeQuestions.d.ts +0 -8
  135. package/types/NeedHelpView/index.d.ts +0 -2
  136. package/types/NewSubmitSuccess/index.d.ts +0 -2
  137. package/types/NewSubmitSuccess/interface.d.ts +0 -19
  138. package/types/Qrcode/UiQrCode.d.ts +0 -51
  139. package/types/Qrcode/WorkQrCode.d.ts +0 -41
  140. package/types/Qrcode/hooks/useImage.d.ts +0 -4
  141. package/types/Qrcode/hooks/usePostQrCode.d.ts +0 -72
  142. package/types/Qrcode/hooks/usePreQrCode.d.ts +0 -31
  143. package/types/Qrcode/hooks/useStatus.d.ts +0 -7
  144. package/types/Qrcode/index.d.ts +0 -7
  145. package/types/RecoveryCode/businessRequest.d.ts +0 -5
  146. package/types/RecoveryCode/core/saveCode.d.ts +0 -5
  147. package/types/RecoveryCode/core/useCode.d.ts +0 -7
  148. package/types/RecoveryCode/index.d.ts +0 -5
  149. package/types/RecoveryCode/interface.d.ts +0 -8
  150. package/types/Register/codemap.d.ts +0 -2
  151. package/types/Register/components/Agreements/index.d.ts +0 -11
  152. package/types/Register/core/WithCode.d.ts +0 -17
  153. package/types/Register/core/WithEmail.d.ts +0 -13
  154. package/types/Register/core/WithEmailCode.d.ts +0 -11
  155. package/types/Register/core/WithPhone.d.ts +0 -10
  156. package/types/Register/index.d.ts +0 -2
  157. package/types/Register/interface.d.ts +0 -25
  158. package/types/Register/utils.d.ts +0 -1
  159. package/types/SelectAccount/index.d.ts +0 -3
  160. package/types/SelectAccount2Login/index.d.ts +0 -3
  161. package/types/SelfUnlock/core/selfUnlock.d.ts +0 -8
  162. package/types/SelfUnlock/index.d.ts +0 -2
  163. package/types/SelfUnlock/interface.d.ts +0 -15
  164. package/types/SendCode/SendCodeBtn.d.ts +0 -10
  165. package/types/SendCode/SendCodeByEmail.d.ts +0 -13
  166. package/types/SendCode/SendCodeByPhone.d.ts +0 -17
  167. package/types/SendCode/index.d.ts +0 -9
  168. package/types/ShieldSpin/index.d.ts +0 -7
  169. package/types/SingleComponent/SingleComponent.d.ts +0 -3
  170. package/types/SingleComponent/index.d.ts +0 -3
  171. package/types/SubmitButton/index.d.ts +0 -10
  172. package/types/SubmitSuccess/index.d.ts +0 -2
  173. package/types/SubmitSuccess/interface.d.ts +0 -17
  174. package/types/TenantPortalSelect/index.d.ts +0 -3
  175. package/types/TenantPortalSelect/interface.d.ts +0 -33
  176. package/types/Type/application.d.ts +0 -346
  177. package/types/Type/index.d.ts +0 -88
  178. package/types/UploadImage/index.d.ts +0 -5
  179. package/types/ValidatorRules/PasswordFormItem.d.ts +0 -6
  180. package/types/ValidatorRules/ValidatorFormItem.d.ts +0 -8
  181. package/types/ValidatorRules/index.d.ts +0 -32
  182. package/types/ValidatorRules/useCheckRepeat.d.ts +0 -1
  183. package/types/VerifyCodeInput/index.d.ts +0 -10
  184. package/types/_utils/GuardErrorCode.d.ts +0 -12
  185. package/types/_utils/appendConfig.d.ts +0 -4
  186. package/types/_utils/clipboard.d.ts +0 -1
  187. package/types/_utils/config/index.d.ts +0 -110
  188. package/types/_utils/context.d.ts +0 -164
  189. package/types/_utils/corsVerification.d.ts +0 -1
  190. package/types/_utils/countryList.d.ts +0 -7
  191. package/types/_utils/errorFace.d.ts +0 -12
  192. package/types/_utils/facePlugin/index.d.ts +0 -4
  193. package/types/_utils/facePlugin/interface.d.ts +0 -5
  194. package/types/_utils/flowHandleStorage.d.ts +0 -4
  195. package/types/_utils/getCaptchaUrl.d.ts +0 -1
  196. package/types/_utils/guardDocument.d.ts +0 -3
  197. package/types/_utils/guardHttp.d.ts +0 -28
  198. package/types/_utils/hooks/index.d.ts +0 -43
  199. package/types/_utils/http.d.ts +0 -33
  200. package/types/_utils/index.d.ts +0 -100
  201. package/types/_utils/initAppId.d.ts +0 -7
  202. package/types/_utils/locales/en-us/index.d.ts +0 -4
  203. package/types/_utils/locales/index.d.ts +0 -8
  204. package/types/_utils/locales/ja-jp/index.d.ts +0 -4
  205. package/types/_utils/locales/zh-cn/index.d.ts +0 -4
  206. package/types/_utils/locales/zh-tw/index.d.ts +0 -4
  207. package/types/_utils/logger/index.d.ts +0 -15
  208. package/types/_utils/logger/interface.d.ts +0 -5
  209. package/types/_utils/passkey.d.ts +0 -3
  210. package/types/_utils/popupCenter.d.ts +0 -9
  211. package/types/_utils/responseManagement/index.d.ts +0 -3
  212. package/types/_utils/responseManagement/interface.d.ts +0 -28
  213. package/types/_utils/tenant.d.ts +0 -19
  214. package/types/_utils/useErrorText.d.ts +0 -5
  215. package/types/index.d.ts +0 -7
  216. package/types/version/index.d.ts +0 -2
  217. package/types/version/version.d.ts +0 -2
@@ -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/_utils/flowHandleStorage.ts","components/ChangeLanguage/index.tsx","components/version/version.tsx","components/version/index.tsx","components/_utils/http.ts","components/Guard/module.ts","components/Guard/authClient.ts","components/Type/index.ts","components/AuthClientProvider/context.tsx","components/AuthClientProvider/AuthClientProvider.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/GuardErrorCode.ts","components/Guard/sso.ts","components/Guard/core/hooks/useMultipleAccounts.ts","components/_utils/tenant.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/Guard/core/hooks/useGuardView.ts","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/utils.tsx","components/CompleteInfo/core/completeInfo.tsx","components/DownloadAuthenticator/index.tsx","components/CompleteInfo/index.tsx","components/ForgetPassword/core/resetPassword.tsx","components/Error/index.tsx","components/Login/core/withVerifyCode/FormItemIdentify.tsx","components/ForgetPassword/core/inputIdentify.tsx","components/ForgetPassword/InputPassword/index.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/Guard/core/hooks/useAgreements.ts","components/Login/hooks/useLoginMultiple.ts","components/_utils/getCaptchaUrl.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/Login/resetAccountName/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/resetAccountName/index.tsx","components/Login/core/withVerifyCode/inputIdentify.tsx","components/Login/core/withAuthingOtpPush/PushLoginGuideSelector.tsx","components/LazyloadImage/index.tsx","components/Login/core/withAuthingOtpPush/HowBindClient.tsx","components/Login/core/withAuthingOtpPush/HowUsePushLogin.tsx","components/Login/core/withAuthingOtpPush/HowGetAppLoginUrl.tsx","components/Login/core/withAuthingOtpPush/PushLoginGuideModal.tsx","components/Login/core/withAuthingOtpPush/BeforeLogin.tsx","components/Login/core/withAuthingOtpPush/PendingLogin.tsx","components/Login/core/withAuthingOtpPush/index.tsx","components/MFA/businessRequest.ts","components/Login/socialLogin/PasskeyButton/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/_utils/passkey.ts","components/MFA/core/passkey.tsx","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/SelectAccount/index.tsx","components/SelectAccount2Login/index.tsx","components/GuardFace/index.tsx","components/GuardSelect/index.tsx","components/TenantPortalSelect/index.tsx","components/NewSubmitSuccess/index.tsx","components/Invitation/Application/index.tsx","components/Message/index.tsx","components/Invitation/interface.ts","components/Invitation/AuthenticationBind/index.tsx","components/Invitation/Complete/index.tsx","components/Invitation/Error/index.tsx","components/Invitation/Success/index.tsx","components/_utils/responseManagement/interface.ts","components/Guard/core/usePlugin.ts","components/Guard/core/index.tsx","components/Guard/Guard.tsx","components/_utils/guardHttp.ts","components/_utils/responseManagement/index.ts","components/_utils/popupCenter.ts","components/_utils/index.ts","components/_utils/logger/interface.ts","components/_utils/corsVerification.ts","components/_utils/logger/index.ts","components/_utils/config/index.ts","examples.tsx"],"names":["guardDocument","LoginMethods","OIDCConnectionMode","SocialConnectionProvider","Protocol","RegisterMethods","RegisterSortMethods","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","phoneRegex","defaultLanguageConfig","tenantInstance","isForeignUserpool","GuardXContext","React","createContext","GuardButtonContext","spin","spinChange","useGuardButtonState","useContext","useGuardPublicConfig","useGuardHttpClient","useGuardAppId","useGuardTenantId","tenantId","useGuardInitData","flowHandleStorage","useGuardCurrentModule","useGuardEvents","useGuardModule","guardX","changeModule","backModule","useGuardFinallyConfig","useGuardIsAuthFlow","useGuardMultipleInstance","useGuardPhoneRegex","useGuardDefaultLanguage","useRobotVerify","customSecurityEnabled","appRobotVerify","userpoolRobotVerify","useIsForeignUserpool","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","version","getFlowHandle","updateFlowHandle","flowHandle","requestClient","fetch","res","json","timeoutAction","cancel","Promise","resolve","data","timer","get","path","query","headers","langHeader","getCurrentLng","tenantHeader","CancelToken","Axios","source","race","baseUrl","qs","stringify","addQueryPrefix","method","withCredentials","cancelToken","token","post","config","postForm","formData","setBaseUrl","base","replace","DEFAULT_LANG_HEADER","setLangHeader","setTenantHeader","setTenantId","GuardModuleType","authClient","GuardMode","AuthClientContext","useGlobalAuthClient","authClientContext","client","checkAuthClientProps","Error","useGuardAuthClient","getGuardAuthClient","guardEventsFilter","openEventsMapping","eventsNameWhiteList","name","forEach","eventName","oldEvents","wrapperEvents","user","setUserInfo","guardEventsHijacking","eventsMapping","onLogin","success","t","setToken","setCurrentUser","onRegister","newEvents","eventsKey","InputMethod","GuardPageSene","EmailScene","defaultG2Config","escCloseable","clickCloseable","mode","Normal","host","getDefaultG2Config","defaultConfig","getDefaultRegisterConfig","_extends","assign","target","i","arguments","prototype","hasOwnProperty","call","apply","this","_objectWithoutProperties","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","transform","fillRule","strokeWidth","d","SvgLoading","_ref","svgRef","title","titleId","viewBox","xmlns","xmlnsXlink","ref","ActionType","ForwardRef","ShieldSpin","size","customLoading","src","alt","Spin","isSSO","defaultInitData","showLoading","_closeLoopCheckQrcode","loadingComponent","ErrorCode","GuardStateMachine","changeModuleEvent","moduleStateHistory","stateMachineLog","uninstallPopstate","globalWindow","onPopstate","next","nextModule","moduleData","moduleName","prevModuleData","slice","isUseHistoryHijack","history","pushState","location","href","isEqual","back","historyPush","splice","end","actionType","ChangeModule","unshift","action","date","getTime","dataSource","historyBack","Back","setConfig","Init","trackSession","getGuardHttp","MULTIPLE_ACCOUNT_KEY","MULTIPLE_ACCOUNT_LISTS","QR_CODE_WAY","EXCLUDE_CODE_WAY","concat","MultipleAccount","originAccount","originWay","originStore","currentStore","initStore","serverSideLoginMethods","isInternationSms","JSON","parse","localStorage","getItem","getCurrentStore","initMemberState","backfillData","memberState","firstBackFillData","memberStateCount","qrCount","normalCount","initBackfillData","values","tab","initWay","wayLists","find","way","account","getAccountByWay","qrCodeId","phoneCountryCode","areaCode","getServerLoginMethodByFront","front","ldap","ad","email","password","phone","result","create","entries","value","passMethod","validateMethod","validateInternationSms","cloneDeep","currentIsInternationSms","serverWay","setLoginWay","internation","tabStatus","loginWay","photo","nickname","username","loginAccount","usertype","_updateTime","saveStore","console","log","newStore","setItem","setLoginWayByHttpData","setLoginWayByLDAPData","delUserById","getMemoUser","excludeWays","item","_mappingUser","sort","b","getMemoSingleUser","userId","currentUser","description","parseInt","getStore","getMemberState","getFirstBackFillData","getOriginAccount","getOriginWay","useMultipleAccounts","useState","setMultipleAccount","setMultipleAccountData","storeInstance","setStoreInstance","changeMultipleState","updateBackFillData","initFirstState","getPhoneInLoginPageContext","getPublicConfig","enableLoginAccountSwitch","loginMethods","configLists","passwordLoginMethods","internationalSmsConfig","enabled","MultipleTenant","getCurrentTenantId","$tenantId","getCurrentTenantInfo","$config","tenantInfo","isTenantConsole","isTenantSSO","isTenantDefault","isTenantSSOLaunchPad","RenderContext","guardProps","initState","children","deviceId","forceUpdate","setEvents","authClint","setAuthClint","setHttpClient","cdnBase","setCdnBase","error","setError","setIsAuthFlow","i18nInit","setI18nInit","propsAppid","propsAuthClient","globalAuthClient","useInitAppId","setDefaultLanguageConfig","setIsForeignUserpool","guardStateMachine","setGuardStateMachine","Provider","Consumer","useReducer","state","payload","moduleState","onChangeModule","onBeforeChangeModule","useMergeDefaultConfig","initGuardHttp","setAppId","setDeviceId","deviceFuncEnabled","browserFingerprint","createDevice","browserId","useFetchConsoleConfig","useMultipleTenant","sdkClient","globalClient","setClient","lang","AuthenticationClient","appHost","requestFrom","onError","msg","useInitGuardAuthClient","iconfontLoaded","loaded","setLoaded","initIconfont","document","useGuardIconfont","sessionData","typedData","userInfo","contentCss","insertStyles","removeStyles","Boolean","__unAuthFlow__","catch","moduleEvents","list","str","regexRules","userpoolLevel","regexFromString","onLoad","contextValues","renderContext","RenderErrorContext","onLoadError","ERROR","SocialConnectionEvent","HIDE_SOCIALS","HIDE_SOCIALS_SHOWIN_ENTERPRISE","useMediaSize","isPhoneMedia","useMediaQuery","maxWidth","parsePhone","fieldValue","countryCode","phoneNumber","country","isValid","split","BindTotpBusinessAction","GuardButton","isLockButtonClick","buttonClassName","e","SubmitButton","buttonSpin","setSpin","shaking","setShaking","inputs","getElementsByClassName","agreements","saftyCode","bindTotpSecretSave","MountShaking","Array","from","input","classList","add","agreement","UnMountShaking","remove","useShaking","timeOut","clearTimeout","useImperativeHandle","text","onSpin","sp","propsCls","htmlType","loading","disabled","forwardRef","MFAType","authFlow","content","Paragraph","BindSuccess","secret","onBind","submitButtonRef","useRef","useForm","form","bindSuccess","current","validateFields","ConfirmTotpRecoveryCode","isFlowEnd","onGuardHandling","copyable","onFinish","onFinishFailed","rules","validator","_","reject","valuePropName","ImagePro","borderRadius","noSpin","imgProps","w","h","draggable","ImagePro2","maskRef","onMouseMove","marginRight","fill","clip-path","VerifyCodeFormItem","codeLength","ruleKeyword","formItemProps","validateTrigger","validateFirst","message","required","min","VerifyCodeInput","gutter","onEenter","showDivider","onChangeProps","onChange","rest","inputRef","codeInputRef","fromClipboard","verifyCode","setVerifyCode","focusIndex","setFocusIndex","focus","codes","handleChange","val","index","num","isNaN","String","el","pasteEvent","preventDefault","stopPropagation","paste","clipboardData","getData","_i","onFocus","minWidth","minHeight","lineHeight","marginLeft","autoFocus","onKeyDown","evt","currentVal","handleKeyDown","maxLength","persist","nativeEvent","isComposing","nextValue","preValue","changeValue","pattern","Math","floor","SecurityCode","mfaToken","qrcode","onNext","useGuardHttp","useAsyncFn","getFieldValue","VerifyTotpFirstTime","totp","join","statusCode","authenticator_type","authorization","bindTotp","textAlign","color","cursor","DOWNLOAD_AT","onSubmitCapture","autoRegister","BindTotpType","BackLogin","onBack","LOGIN","isRender","renderBack","whitelist","REGISTER","defaultScenes","fontSize","display","BackCustom","useGuardView","currentTab","changeTab","$$guard","viewContext","currentView","onAfterChangeModule","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","VALIDATE_PATTERN","checkRepeatFn","userPoolId","formatRules","fieldRequiredRule","CustomFormItem","FormItem","Password","fieldRequiredRuleMessage","fromItemProos","passwordStrength","customPasswordStrength","userPasswordStrength","userCustomPasswordStrength","getPasswordValidate","Email","Phone","UserName","CustomName","ChangePasswordBusinessAction","InputPassword","autoComplete","iconRender","visible","alignItems","usePasswordErrorText","show","setPasswordErrorTextShow","getPassWordUnsafeText","marginBottom","CompletePassword","businessRequestName","isChangeComplete","onRegisterSuccess","onRegisterFailed","publicKey","encrypt","encryptFunction","REGISTER_COMPLETE_INFO","postUserInfoPipeline","apiCode","ApiCode","UNSAFE_PASSWORD_TIP","onRegisterError","placeholder","prefix","pwd","FormValidateRule","CompleteInfoBaseControls","CompleteInfoExtendsControls","OmitCompleteInfo","FirstLoginReset","onReset","newPassword","ABORT_FLOW","resetPasswordByFirstLoginToken","RotateReset","onFinishCallBack","oldPassword","ResetPassword","resetPasswordByForceResetToken","PasswordNotSafeReset","ResetPasswordStrengthDetection","GuardChangePassword","explain","typeContent","logo","GuardFirstLoginPasswordResetView","coreForm","GuardPasswordNotSafeResetView","GuardForcedPasswordResetView","number","forcedCycle","GuardNoticePasswordResetView","GuardRegisterCompletePasswordView","CompleteInfoAuthFlowAction","isPhone","propsValue","test","InputNumber","inputProps","setValue","valueChange","v","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","validate","tips","onEmailSend","onEmailSendError","SendCodeByPhone","codeFieldName","captchaCode","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","url","spinning","extendsFieldsToMetaData","extendsFields","selectOptions","inputType","validateRules","rule","errorMessage","fieldValuesToRegisterProfile","fieldValues","udf","registerProfile","fieldType","phoneToken","emailToken","getI18nValue","record","i18nObj","i18nLan","MomentPicker","CompleteInfo","metaData","businessRequest","extendsFieldsI18n","verifyCodeLength","countryList","setCountryList","defaultISOType","setAreaCode","loadInitCountryList","countryMap","zh","en","PhoneAccount","baseControlMap","gender","classnames","image","datetime","select","dropdown","boolean","string","textarea","TextArea","rows","internalControlMap","SceneType","SCENE_TYPE_COMPLETE_PHONE","INFORMATION_COMPLETION_VERIFY_CODE","getMetaDateLabel","fieldsI18n","generateRules","formRules","RegExp","replaceAll","inputElement","userFormItem","formFieldsV2","fieldKeys","baseData","phoneCode","emailCode","checkResult","checkCode","valid","checkMessage","layout","DownloadType","registerMethod","fnName","profile","registerSkipMethod","registerRequest","registerFnName","registerContent","Skip","Complete","GuardCompleteInfo","skipComplateFileds","skipLoading","setSkipLoading","onSkip","GuardLoginCompleteInfoView","skip","resData","methods","GuardRegisterCompleteInfoView","setSelectOptions","setMetaData","loadSelectOptions","params","onRegisterInfoCompleted","onRegisterInfoCompletedError","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","context","r","setPhoneOrEmailText","setPolicyStrength","setCustomPasswordStrength","setControlShow","setResetToken","resetPasswordToken","setUserId","SCENE_TYPE_RESET","RESET_PASSWORD_VERIFY_CODE","InputPasswordForget","GuardForgetPassword","resetPwdCustomLogo","controlShow","policyStrength","phoneOrEmailText","resetToken","needBack","goBack","submitBtnRef","getFieldsValue","repeatPassword","onPwdResetError","onPwdReset","New_SUBMIT_SUCCESS","PasswordStrength","NoCheck","Low","Middle","High","AUTO","Custom","getPasswordValidateRules","FormItemAccount","validPasswordLoginMethods","formItemPtops","runderTemplate","InputAccount","runderInput","GraphicVerifyCode","verifyCodeUrl","changeCode","Agreements","showError","acceptList","setAcceptList","checkedAgreements","agreementsContext","checkAllAgreements","unCheckAllAgreements","useAgreements","isAccept","every","nodeName","checked","useLoginMultipleBackFill","formKey","isOnlyInternationSms","cancelBackfill","changeCurrentMethod","parseFillData","matchLoginWay","setFieldsValue","getCaptchaUrl","URL","pathname","search","LoginWithPassword","onLoginFailed","onLoginSuccess","saveIdentify","_firstItemInitialValue","specifyDefaultLoginMethod","acceptedAgreements","setAcceptedAgreements","validated","setValidated","robotVerify","showCaptcha","setShowCaptcha","setVerifyCodeUrl","remainCount","setRemainCount","accountLock","setAccountLock","loginRequest","loginInfo","onLoginRequest","loginData","mergeAdAndAccountPasswordLogin","identity","trim","isHost","getUserRegisterParams","customData","withCustomData","onBeforeLogin","onLoginRes","INPUT_CAPTCHACODE","PASSWORD_ERROR","ACCOUNT_LOCK","MULTIPLE_ERROR_LOCK","handMode","CodeAction","RENDER_MESSAGE","submitText","submitButText","registerDisabled","registerMethods","EmailCode","i18nFields","i18nMap","Map","tabMethodsFields","set","getSortLabels","onValuesChange","changedValues","passwordTabConfig","validLoginMethods","initialValue","LoginWithLDAP","captchaUrl","LDAP","addonAfter","LoginWithAD","responseIntercept","AD","encryptPassword","api","credentials","fetchRes","ssoPageComponentDisplay","userPasswordInput","QrCode","descriptions","containerStyle","imageStyle","onClickMaskEl","onMaskContent","classes","ready","already","expired","useStatus","statusCls","statusComponent","preFetchImage","axios","responseType","blob","fileReader","FileReader","onload","base64","readAsDataURL","useImage","classPrefix","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","sleep","uniteRequestHandler","processAReady","processSuccess","processExpired","processCancel","processMFA","processError","emitEvents","processFlowByResponse","changeStatus","processResponseFlow","processLoading","flowHandlers","handler","useQrCode","referQrCode","formatterDescriptions","formatDescriptions","parseKey","processDefaultMaskClick","UI","ResetAccountBusinessAction","LoginWithAppQrcode","codeRef","canLoop","AppQr","scannedResult","LoginWithWechatMiniQrcode","isWeChatBrowser","WxMinQr","LoginWithWechatmpQrcode","WechatMpQrcode","codeMap","APP_MFA_CODE","module","OTP_MFA_CODE","totpMfaEnabled","IDENTITY_BINDING","IDENTITY_BINDING_ASK","LOGIN_COMPLETE_INFO","IDENTITY_BINDING_NO_ASK","RESET_ACCOUNT_NAME","SELECT_ACCOUNT_2_LOGIN","baseLoginPathMapping","OIDC","SAML","CAS","OAUTH","AZURE_AD","AD_KERBEROS","loginUrlFieldMapping","IdpButton","initUrl","from_guard","app_id","guard_version","tenant_id","from_hosted_guard","isSpecialBrowser","redirected","redirect_url","provider","iconType","identifier","block","icon","Message","displayName","name_en","Auth","popupCenter","basePath","protocol","renderBtn","SocialLogin","enterpriseConnectionObjs","socialConnectionObjs","noLoginMethods","onMessage","event","parsedMessage","authingCode","authingMessage","authingResData","usePostMessage","onPostMessage","idpButtons","socialLoginButtons","querystring","shape","socialConnectionsBtnShape","tooltip","overlayStyle","fontFamily","idp","socialLogin","direction","flex","idpBtns","socialLoginBtns","SelectPanel","lists","handleDel","triggerWay","finallyLists","operation","element","onDel","renderLits","triggerNode","MultipleAccountsFC","setState","MultipleAccounts","SpecifyCodeMethods","ResetAccountName","ResetName","LoginWithVerifyCode","_lockMethod","specifyCodeMethod","setCurrentMethod","setInternationSms","isOnlyEmailCode","setIsOnlyEmailCode","changeMethod","PhoneCode","SCENE_TYPE_LOGIN","LOGIN_VERIFY_CODE","loginByPhoneCode","reqContent","loginByEmailCode","AreaCodePhoneAccount","onBlur","PushLoginGuideSelector","defaultValue","showArrow","LazyloadImage","loadStatus","setLoadStatus","Image","HowBindClient","qrcodeInfo","padding","boxSizing","backgroundColor","HowUsePushLogin","HowGetAppLoginUrl","PushLoginGudeModal","onClose","howBindClient","howGetAppLoginUrl","howUsePushLogin","selector","setSelector","selectorOptions","componentMap","closeIcon","BeforeLogin","onPushSuccess","signinByPush","pushLoginStatus","setAccount","onPushLogin","_message","pushCodeId","setVisible","authingOtpPushTabConfig","onchangePushLoginStatus","PendingLogin","background","border","onCancelLogin","LoginWithAuthingOtpPush","loginStatus","setLoginStatus","setPushCodeId","setPushLoginStatus","clearTimer","checkPushCodeStatus","getUserInfo","accessToken","access_token","tokenSet","_userInfo","AuthingOtpPush","loginStatusMap","before","defaultAccount","pending","MfaBusinessAction","PasskeyButton","abortController","setAbortController","createAbortSignal","abort","controller","AbortController","signal","handleLogin","initializeApi","initializeRes","initializeJson","challenge","onInitGuardHandling","mediation","getWebauthnCredential","assertion","finalizeApi","credential","finalizeRes","finalizeJson","code2","tips2","onFinishGuardHandling","inputWays","Passkey","qrcodeWays","computedTabName","substring","GuardLoginView","isResetPage","dlm","defaultLoginMethod","propsMethods","intersection","useMethods","defaultMethod","renderInputWay","renderQrcodeWay","agreementEnabled","multipleQrWay","onBackFillData","qrCodeDefaultTab","useLayoutEffect","defaultQrWay","useLoginMultiple","setCanLoop","qrcodeTabsSettings","errorNumber","setErrorNumber","identifyRef","tenantProvider","tags","ms","firstInputWay","firstQRcodeWay","disableResetPwd","disableRegister","useDisables","hiddenTab","scanLogins","defaultQrCodeWay","isDefault","getPasswordIdentify","onLoginError","switchText","inputNone","qrcodeNone","useSwitchStates","agree","availableAt","verifyLoginMethods","verifyCodeTabConfig","enabledLoginMethods","enterpriseConnections","identityProviders","socialConnections","socials","connection","hiddenSocialConnection","wechatDisplayButtonsMessage","WECHATPC","GITHUB","QQ","APPLE_WEB","ALIPAY","LINKEDIN","BAIDU","GOOGLE","WEIBO","FACEBOOK","SLACK","DINGTALK","hiddenSocialConnectionInWeChatBrowser","isQQBuiltInBrowser","qqbuiltDisplayButtonsMessage","WECHATMP","WECHATWORK_CORP_QRCONNECT","hiddenSocialConnectionInQQBuiltInBrowser","isWeWorkBuiltInBrowser","weWorkBuiltDisplayButtonsMessage","hiddenSocialConnectionInWeWorkBuiltInBrowser","isDingtalkBrowser","dingTalkDisplayButtonsMessage","hiddenSocialConnectionInDingtalkBrowser","isLarkBrowser","larkDisplayButtonsMessage","hiddenSocialConnectionInLarkBrowser","pcDisplayButtonsMessage","hiddenSocialConnectionInPCBrowser","postMessage","isNoMethod","useMethod","containerDOM","innerContainer","querySelector","loginMethodsI18nDisplaySettings","passwordI18n","verifyCodeI18n","adI18n","ldapI18n","PasswordTab","default","CodeTab","tabs","LdapTab","ADTab","WxMiniQrTab","AppQrTab","WechatMpQrTab","AuthingOtpPushTab","PasskeyTab","tabMap","GeneralLoginComponent","total","tabName","getSortTabs","QrCodeTabMap","CodeLoginComponent","qrCodeMap","loginMethodsSort","qrCodeSortConfig","sortWithType","findIndex","welcomeMessage","it","destroyInactiveTabPane","k","onLoginTabChange","activeKey","flat","FORGET_PWD","margin","ANY_QUESTIONS","facePluginInstance","FaceErrorName","VerifyEmail","VerifySms","VerifyTotp","VerifyFace","AssociateFace","photoA","photoB","isExternalPhoto","GetPasskeyBindChallenge","GetPasskeyVerifyChallenge","useMfaBusinessRequest","isFlow","PasskeyBind","PasskeyVerify","BindMFAEmail","VerifyMFAEmail","onVerify","sendCodeRef","sent","sendVerifyCode","MFA_VERIFY_CODE","mfaCode","requestData","mailDesensitization","MFAEmail","userEmail","mfaLogin","setEmail","click","BindMFASms","VerifyMFASms","userPhone","phoneDesensitization","sendSmsCode","SCENE_TYPE_MFA_VERIFY","MFASms","mfaPhone","mfaPhoneCountryCode","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","_FACE_SCORE","mfa","faceScore","loadFromUri","navigator","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","PASSKEY","MFAMethods","onChangeMethod","applicationMfa","otherMethods","mfaPolicy","2021","1700","1701","1702","500","6001","602","registerPasskey","createWebauthnCredential","attestation","warn","verifyPasskey","BindPasskey","mfaConfigsMap","bindPasskey","VerifyPasskey","handleVerifyPasskey","MFAPasskey","passkeyEnabled","ComponentsMapping","mfaEmail","GuardMFAView","showMethods","__codePaser","m","mfaBindConfigs","changeable","__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","showCount","onPreview","imgUrl","beforeUpload","itemRender","n","showInfo","footer","onCancel","GuardNeedHelpView","SUBMIT_SUCCESS","IdentityBindingBusinessAction","IdentityBindingAction","SaveCode","UseCode","onSubmit","RecoveryTotp","recoveryCode","RecoveryCode","setCode","RecoveryCodeAuthFlow","setRecoveryCode","GuardRecoveryCodeView","useIsChangeComplete","currentMode","complateFiledsPlace","omit","RegisterWithEmail","onBeforeRegister","registeContext","browser","userAgent","device","getDeviceName","forceLogin","generateToken","clientIp","onRegisterSuccessIntercept","registerFrom","AccountForm","RegisterWithCode","isPhoneChangeComplete","isEmailChangeComplete","setCaptchaCode","registerByPhoneCode","needPassword","enableCompletePassword","REGISTER_PASSWORD","errMessage","registerByEmailCode","registerMessage","SCENE_TYPE_REGISTER","REGISTER_VERIFY_CODE","GuardRegisterView","verifyRegisterMethods","registerContextProps","registerInfo","getLoginTypePipe","loginInitData","lockMethod","registerContext","tabMapping","verifyCodeLogin","component","setActiveKey","defaultRegisterMethod","transformMethod","filterRegisterMethods","Set","getI18nLabel","onRegisterTabChange","GuardSubmitSuccessView","__changeModule","countDesc","useIdentityBindingBusinessRequest","BindByPhoneCode","RegisterByPhoneCode","BindByEmailCode","RegisterByEmailCode","BindByPassword","RegisterByPassword","GuardIdentityBindingView","skipAsk","bindType","phoneCodeRequest","emailCodeRequest","PasswordRequest","bindMethodsMap","onBinding","onBindingError","loginMethodsBase","codeLoginMethods","bindText","GuardIdentityBindingAskView","onCreate","onCreateError","CreateUser","createLoading","createAccount","LangMAP","SelfUnlock","defaultEmail","defaultPhone","selfUnlockStrategy","encryptPassWord","SELF_UNLOCKING_VERIFY_CODE","GuardUnlockView","GuardSelectAccountView","renderList","accounts","GuardSelectAccount2LoginView","myself","users","avatar","GuardFace","avatarProps","tag","GuardSelect","onSelect","gap","listProps","classNames","renderItem","actions","extra","Meta","GuardTenantPortalSelectView","http","handleSelect","onTenantSelect","origin","isUserPool","tenantName","userName","tenantLogo","GuardNewSubmitSuccessView","GuardApplicationView","onFinishHandle","MESSAGE","userPool","inviter","VERIFY_CODE","closeCheckSendUser","GuardMessageView","useRegisterHandleHook","verifyType","INVITE_SUCCESS","GuardAuthenticationView","verifyCodeRef","setDisabled","sendVerifyCodeMethod","setVerifyType","verifyAccount","descConstants","constants","prioritySMS","desc","receiverType","smsCode","priorityEmail","some","reSendVerifyCode","onRegisterHandle","formValues","captcha","extendsFieldsOptions","enabledInfoFill","needCompleteData","INVITE_COMPLETE","originModule","INVITE_AUTH","originContext","onSend","verifyCodeMaxErrCount","GuardInviteCompleteView","canBack","registerInfoFillMsg","nextStepHandle","phonePassCodeForInformationCompletion","emailPassCodeForInformationCompletion","Reflect","has","deleteProperty","complete","GuardInviteExpireView","INVITE_EXPIRE","GuardInviteSuccessView","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","FLOW_SELECT_ACCOUNT","TENANT_PORTAL","APPLY_INVITATION","INVITE_PAGE_EXPIRE","initErrorCodeInterceptor","codeAction","CHANGE_MODULE","ChangeModuleApiCodeMapping","nextData","FLOW_END","newData","renderModule","toString","renderGuardContent","locale","Modal","closable","keyboard","maskClosable","getContainer","__internalRequest__","useGuardFacePlugin","guardFace","initFacePlugin","GuardCore","plugin","useGuardPlugin","propsAreEqual","pre","GuardPropsFilter","Guard","guardWindowMount","mounted","initGuardDocument","getDocumentNode","InterceptorName","APP_MFA","COMPLETE_INFO","UNLOCK","GuardHttp","responseInterceptorMap","getHeaders","callBack","ERROR_CODE","getHundreds","errorCodeInterceptor","reduce","acc","cur","getRequestClient","userpoolId","guardHttp","dualScreenLeft","screenLeft","screenX","dualScreenTop","screenTop","screenY","innerWidth","documentElement","clientWidth","screen","innerHeight","clientHeight","systemZoom","availWidth","left","top","newWindow","open","ip","whitespace","platform","os","insertedRecord","appConfig","userConfig","styles","recordKey","styleElt","styleSheet","createStyleSheet","head","styleSheets","cssText","insertRule","addRule","parentNode","removeChild","ignoreQueryPrefix","match","parser","UAParser","LoggerType","PASSWORD_STRENGTH_TEXT_MAP","validateMessage","SYMBOL_TYPE_PATTERNS","getSymbolTypeLength","strength","getCustomPassword","zhMessageOpen","zhMessage","enMessageOpen","enMessage","jaMessageOpen","jaMessage","jpMessageOpen","jpMessage","twMessageOpen","twMessage","validateMap","regex","customValidateTrigger","delay","mail","mailArr","substr","preAttribute","currentAttribute","loginTabs","verifyCodeTabMethods","passwordTabMethods","languages","exec","i18nConfig","labels","login_page_context","isOriginMatched","corsWhitelist","wildcard","require","allowedOrigin","corsVerification","allowedOrigins","allowed","Logger","INFO","WARN","printType","publicConfigMap","pageConfigMap","getPageConfig","requestPublicConfig","setUserpoolId","requestGuardPageConfig","mergedConfig","setMergedConfig","mergedPublicConfig","autoRegisterThenLoginHintInfo","validRegisterMethods","transformSortMethod","hasPasskey","supported","forgetPasswordBtn","registerTabs","registerBtn","css","initPublicConfig","all","assembledRequestHost","configHost","publicConfigHost","configUrl","hostname","requestHostname","App","WebkitUserSelect","err","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.a4cb4283.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 { MFAType } from '../MFA/interface'\nimport { PasswordStrength } from '../_utils'\nexport * from 'authing-js-sdk'\n\nexport enum LoginMethods {\n LDAP = 'ldap',\n AppQr = 'app-qrcode',\n Password = 'password',\n PhoneCode = 'phone-code',\n EmailCode = 'email-code', // 这是前端单独加的,后端只会返回 phone-code\n WxMinQr = 'wechat-miniprogram-qrcode', // 对应社会化登录的 wechat:miniprogram:qrconnect(小程序扫码登录)\n AD = 'ad', // 对应企业身份源的 Windows AD 登录\n WechatMpQrcode = 'wechatmp-qrcode', // 微信扫码关注登录\n AuthingOtpPush = 'authing-otp-push', // App 扫码登录\n Passkey = 'passkey', // passkey\n}\n\nexport enum OIDCConnectionMode {\n FRONT_CHANNEL = 'FRONT_CHANNEL',\n BACK_CHANNEL = 'BACK_CHANNEL',\n}\n\nexport 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 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 enum RegisterMethods {\n Email = 'email',\n Phone = 'phone',\n EmailCode = 'emailCode',\n}\n\nexport enum RegisterSortMethods {\n Email = 'email-password',\n Phone = 'phone-code',\n EmailCode = 'email-code',\n}\n\nexport interface QrCodeItem {\n id: string\n title: string\n isDefault?: boolean\n}\n\nexport type QrcodeTabsSettings = Record<LoginMethods, Array<QrCodeItem>>\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\n// 密码登录注册支持\nexport interface ApplicationPasswordTabConfig {\n enabledLoginMethods?: PasswordLoginMethods[]\n validRegisterMethods?: string[]\n validLoginMethods?: string[]\n}\n\n// 验证码登录注册支持\nexport interface ApplicationVerifyCodeTabConfig {\n enabledLoginMethods: VerifyLoginMethods[]\n validRegisterMethods?: string[]\n validLoginMethods?: string[]\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 TabFieldsI18nItem {\n key: string\n label: string\n labelEn: string\n i18n: {\n [propName in Lang]?: string\n }\n}\n\ninterface LoginTypeI18nProps {\n tab: {\n default: string\n i18n: {\n [propName: string]: string\n }\n }\n}\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\n // 登录框自定义 css 代码\n css: string\n customLoading?: string\n name: string\n logo: string\n description?: string\n deviceFuncEnabled?: boolean\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 qrCodeSortConfig: {\n loginMethodsSort?: string[]\n }\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 loginMethodsI18nDisplaySettings: {\n password?: LoginTypeI18nProps\n verifyCode?: LoginTypeI18nProps\n ad?: LoginTypeI18nProps\n ldap?: LoginTypeI18nProps\n }\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 mfaBindConfigs?: { mfa: MFAType; changeable: boolean }[]\n\n defaultLanguageConfig: Lang\n /**\n * 是否开启账号切换\n */\n enableLoginAccountSwitch: boolean\n /**\n * 是否开启注册密码补全\n */\n enableCompletePassword: boolean\n /**\n * 登录注册排序\n */\n tabMethodsSortConfig: {\n loginMethodsSort: string[]\n }\n // i18n\n tabMethodsFields: TabFieldsI18nItem[]\n\n regexRules?: { key: string; appLevel: string; userpoolLevel: string }[]\n /** 是否为租户控制台应用 */\n isTenantConsole?: boolean\n\n /** 是否默认为租户应用面板应用 */\n isTenantDefault?: boolean\n\n /** 租户详情 */\n tenantInfo?: Record<string, any>\n passkeyEnabled: boolean\n /** mfa 相关 */\n mfa: {\n faceScore: number\n }\n\n authingOtpPushTabConfig: {\n enabledLoginMethods: Array<string> | null\n validLoginMethods: Array<string> | null\n validRegisterMethods: Array<string> | null\n }\n /** 是否开启自定义安全规则 */\n customSecurityEnabled: boolean\n /** 应用的人机验证策略,始终开启、不开启、设置条件触发 */\n appRobotVerify: 'always_enable' | 'disable' | 'condition_set'\n /** 用户池的人机验证策略,始终开启、不开启、设置条件触发 */\n userpoolRobotVerify: 'always_enable' | 'disable' | 'condition_set'\n closeCheckSendUser?: 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, { ReactNode, useContext, useMemo } from 'react'\nimport {\n GuardEvents,\n GuardLocalConfig,\n GuardModuleType,\n GuardPageConfig,\n Lang,\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'\nimport { MultipleTenant } from './tenant'\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 phoneRegex: RegExp | null\n defaultLanguageConfig: Lang\n /** 租户信息获取和操作处理相关 */\n tenantInstance?: MultipleTenant\n\n /** 判断是否是国外的用户池 */\n isForeignUserpool: boolean\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 phoneRegex: null,\n defaultLanguageConfig: 'zh-CN',\n\n tenantInstance: undefined,\n\n isForeignUserpool: false,\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<{\n value: Partial<IGuardContext>\n children: ReactNode\n }> = ({ value, children }) => {\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<{\n value: Partial<IGuardContext>\n children: ReactNode\n }> = ({ value, children }) => {\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: ReactNode }> = ({\n children,\n }) => {\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 currentModule: guardX.currentModule,\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\n// 手机号正则\nexport const useGuardPhoneRegex = () => useContext(GuardXContext).phoneRegex\n/**\n * 默认语言\n */\nexport const useGuardDefaultLanguage = () =>\n useContext(GuardXContext).defaultLanguageConfig\n\n/** 用来操作和获取租户相关的内容 */\nexport const useGuardTenantProvider = () =>\n useContext(GuardXContext).tenantInstance\n\n/** 当前人机验证策略 */\nexport const useRobotVerify = () => {\n const {\n customSecurityEnabled,\n appRobotVerify,\n userpoolRobotVerify,\n } = useGuardPublicConfig()\n\n return customSecurityEnabled ? appRobotVerify : userpoolRobotVerify\n}\n\n/** 当前用户池是否是国外用户池 */\nexport const useIsForeignUserpool = () =>\n useContext(GuardXContext).isForeignUserpool\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 { 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","export default '4.4.3-lulu.6'","import version from './version'\n\nexport default version\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","export 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 IDENTITY_BINDING_NO_ASK = 'identityBindingNoAsk', // 身份源绑定页不问询\n SELF_UNLOCK = 'selfUnlock', // 自助解锁页\n FLOW_SELECT_ACCOUNT = 'flowSelectAccount', // 选择登录账号\n SELECT_ACCOUNT_2_LOGIN = 'selectAccout2Login', // 选择登录身份\n /** 多租户门户选择页 */\n TENANT_PORTAL = 'tenant-portal',\n New_SUBMIT_SUCCESS = 'newSubmitSuccess', // 提交成功展示页\n RESET_ACCOUNT_NAME = 'resetAccountName',\n APPLY_INVITATION = 'applyInvitation',\n MESSAGE = 'message',\n INVITE_AUTH = 'inviteAuth',\n INVITE_COMPLETE = 'inviteComplete',\n INVITE_EXPIRE = 'inviteExpire', // 邀请链接过期\n INVITE_PAGE_EXPIRE = 'invitePageExpire', // 页面过期\n INVITE_SUCCESS = 'inviteSuccess', // 邀请成功\n}\nexport interface GuardModuleAction {\n action: string\n module?: GuardModuleType\n message?: string\n initData?: any\n}\n","import { AuthenticationClient } from 'authing-js-sdk'\nimport { 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 React from 'react'\nimport { 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 enum GuardMode {\n Modal = 'modal',\n Normal = 'normal',\n}\n\nexport interface IG2FCProps extends IG2Events {\n appId?: string\n tenantId?: string\n deviceId?: 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 style?: React.CSSProperties\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 enum InputMethod {\n EmailCode = 'email-code',\n PhoneCode = 'phone-code',\n}\n\nexport enum GuardPageSene {\n Global = 'global',\n}\n\nexport interface GuardPageConfig {\n [GuardPageSene.Global]: {\n showChangeLanguage: boolean\n defaultLanguage: Lang | 'browser'\n }\n}\n\nexport 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 VERIFY_CODE = '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, { ReactNode, useContext } from 'react'\nimport { AuthClientContext, AuthClientContextProps } from './context'\n\nexport const AuthClientProvider: React.FC<\n AuthClientContextProps & {\n children: ReactNode\n }\n> = (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","/* eslint-disable prettier/prettier */\nimport { message } from 'antd'\nimport { User } from 'authing-js-sdk'\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 { TenantPortalEvents } from '../TenantPortalSelect/interface'\nimport { i18n } from '../_utils/locales'\nimport { StoreInstance } from './core/hooks/useMultipleAccounts'\n\ninterface OnAfterChangeModuleOptions {\n currentView: string\n currentModule: GuardModuleType\n currentTab?: string\n data?: any\n}\n\nexport interface GuardEvents\n extends LoginEvents,\n RegisterEvents,\n CompleteInfoEvents,\n ForgetPasswordEvents,\n IdentityBindingEvents,\n IdentityBindingAskEvents,\n TenantPortalEvents {\n onBeforeChangeModule?: (\n key: GuardModuleType,\n initData?: any\n ) => boolean | Promise<boolean>\n onAfterChangeModule?: (options: OnAfterChangeModuleOptions) => void\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: User & { encryptedPassword?: string }, 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 onAfterChangeModule: 'after-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 'after-change-module': GuardEvents['onAfterChangeModule']\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 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?: string[]\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?: string[]\n defaultRegisterMethod?: string\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 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 { ForgetPasswordConfig } from '../ForgetPassword/interface'\nimport { getDefaultLoginConfig, LoginConfig } from '../Login/interface'\nimport { getDefaultRegisterConfig, RegisterConfig } from '../Register/interface'\nimport { ShieldSpin } from '../ShieldSpin'\n\nexport interface GuardLocalConfig\n extends RegisterConfig,\n LoginConfig,\n ForgetPasswordConfig {\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","export enum ErrorCode {\n OTP_MFA_CODE = 1635,\n APP_MFA_CODE = 1636,\n INPUT_CAPTCHACODE = 2000,\n USER_EXISTENCE = 2026,\n LOGIN_INVALID = 2021,\n PASSWORD_ERROR = 2333,\n USER_NOT_EXIST = 2004,\n MULTIPLE_ERROR_LOCK = 2057,\n SELECT_ACCOUNT_2_LOGIN = 2930,\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'\nimport { getPhoneInLoginPageContext } from '../../../_utils'\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 | 'authing-otp-push'\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 'authing-otp-push': 'authing-otp-push',\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<\n User & { id: string; loginAccount?: string; usertype?: string },\n 'way' | 'tab' | 'phoneCountryCode'\n > // 添加扩展字段登录名\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 {\n photo,\n nickname,\n phone,\n username,\n email,\n id,\n name,\n loginAccount,\n usertype,\n } = user\n if (usertype !== '2') {\n this.currentStore[id] = Object.assign({\n way: this.loginWay, // 登录方式\n tab: this.tabStatus, // 当前大tab 扫码 or 输入\n photo,\n nickname,\n phone,\n username: loginAccount || username,\n usertype,\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 */\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 default:\n return this.setLoginWay('input', 'password')\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 case 'authing-otp-push':\n return { account: username! || phone!, way: 'authing-otp-push' }\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 way,\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 way,\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\n // login_page_context 中有 phone 字段,说明是从官网带着手机号跳转过来的\n // 要定位到手机号验证码登录模块\n const phone = getPhoneInLoginPageContext()\n if (phone) {\n return\n }\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 { useMemo } from 'react'\nimport { ApplicationConfig } from '../Type'\n\n/** **当前租户应用** 下的租户信息获取和操作处理,将租户相关的处理收拢 */\nexport class MultipleTenant {\n private $config: ApplicationConfig | null\n private $tenantId: string | null\n\n // 不直接使用变量而使用函数形式,是为了后续更加容易扩展并获取实时数据\n constructor(tenantId: string, config: ApplicationConfig) {\n this.$tenantId = tenantId ?? null\n this.$config = config ?? null\n }\n\n /** 获取租户ID */\n public getCurrentTenantId = () => {\n return this.$tenantId\n }\n\n /** 获取租户详情 */\n public getCurrentTenantInfo = () => {\n return this.$config?.tenantInfo\n }\n\n /**是否为【租户控制台】 */\n public isTenantConsole = () => {\n return this.$config?.isTenantConsole\n }\n /** 是否为租户【单点登录】 */\n public isTenantSSO = () => {\n return this.$tenantId && this.$config?.isTenantDefault === false\n }\n /** 是否为租户【单点登录面板】 */\n public isTenantSSOLaunchPad = () => {\n return this.$tenantId && this.$config?.isTenantDefault === true\n }\n}\n\n/** 初始化多租户实例 */\nexport const useMultipleTenant = (\n tenantId: string,\n publicConfig: ApplicationConfig\n) => {\n const tenantInstance = useMemo(() => {\n if (!publicConfig) return\n return new MultipleTenant(tenantId, publicConfig)\n }, [publicConfig, tenantId])\n return tenantInstance\n}\n","import { GuardProps } from '..'\nimport React, {\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useState,\n} from 'react'\nimport { useInitGuardAuthClient } from '../authClient'\nimport { GuardEvents, guardEventsFilter } from '../event'\nimport { insertStyles, regexFromString, 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'\nimport { i18n } from '../../_utils/locales'\n\n// hooks\nimport useMultipleAccounts from './hooks/useMultipleAccounts'\nimport { useMultipleTenant } from '../../_utils/tenant'\nimport Axios from 'axios'\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 children: ReactNode\n}> = ({ guardProps, initState, children }) => {\n const { tenantId, deviceId, config } = guardProps\n\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 const [defaultLanguageConfig, setDefaultLanguageConfig] = useState<Lang>()\n\n const [isForeignUserpool, setIsForeignUserpool] = useState(false)\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 const httpClient = initGuardHttp(defaultMergedConfig.host)\n httpClient.setAppId(appId)\n tenantId && httpClient.setTenantId(tenantId)\n if (deviceId) {\n httpClient.setDeviceId(deviceId)\n } else if (publicConfig?.deviceFuncEnabled) {\n authClint?.browserFingerprint?.createDevice().then(() => {\n const browserId = localStorage.getItem('browserId')\n browserId && httpClient.setDeviceId(browserId)\n })\n }\n\n setHttpClient(httpClient)\n }, [appId, defaultMergedConfig, tenantId, deviceId, publicConfig, authClint])\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 const tenantInstance = useMultipleTenant(tenantId!, publicConfig!)\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 // 优先使用用户自定义 host\n if (httpClient && finallyConfig && !config?.host) {\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 setDefaultLanguageConfig(i18n.language as Lang)\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 // 是否是国外用户池\n useEffect(() => {\n const baseUrl = finallyConfig?.host\n\n if (appId && baseUrl) {\n try {\n Axios.get<\n any,\n {\n data: {\n code: number\n data: boolean\n message: string\n }\n }\n >(`${baseUrl}/api/v2/application/${appId}/check-app-is-show-code`)\n .then((res) => {\n const { code, data } = res?.data || {}\n if (code === 200) {\n setIsForeignUserpool(data)\n }\n })\n .catch((error) => {\n console.log('error', error)\n })\n } catch (error) {\n console.log('error', error)\n }\n }\n }, [appId, finallyConfig?.host])\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 defaultLanguageConfig,\n tenantInstance,\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 defaultLanguageConfig,\n tenantInstance,\n ])\n\n const phoneRegex = useMemo(() => {\n const str =\n publicConfig?.regexRules?.find((item) => item.key === 'phone')\n ?.userpoolLevel ?? ''\n if (str) {\n try {\n const regex = regexFromString(str)\n return regex\n } catch (error) {}\n }\n return null\n }, [publicConfig?.regexRules])\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 phoneRegex,\n defaultLanguageConfig,\n tenantInstance,\n isForeignUserpool,\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 phoneRegex,\n defaultLanguageConfig,\n tenantInstance,\n isForeignUserpool,\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 'wechatwork:qrconnect:of:authing:agency',\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 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 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 enum MFAType {\n SMS = 'SMS',\n EMAIL = 'EMAIL',\n TOTP = 'OTP',\n FACE = 'FACE',\n PASSKEY = 'PASSKEY',\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 mfaPhoneCountryCode?: string\n mfaPhone?: string\n mfaEmail?: string\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, { useRef, useState } from 'react'\nimport { GuardButton } from '../GuardButton'\nimport { getClassnames } from '../_utils'\nimport { i18n } from '../_utils/locales'\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={{\n width: w,\n height: '100%',\n borderRadius: borderRadius,\n ...style,\n }}\n className=\"g2-base-imagepro\"\n draggable={false}\n alt={alt || 'image'}\n onLoad={() => setLoaded(true)}\n />\n </div>\n )\n}\n\nexport const ImagePro2 = (props: ImageProProps) => {\n let { borderRadius, noSpin, alt, style, ...imgProps } = props\n let [loaded, setLoaded] = useState(noSpin === true ? true : false)\n const maskRef = useRef<any>(null)\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-imagepro-container2',\n 'g2-base-image-background-animation',\n loaded ? 'loaded' : 'unload',\n props?.className,\n ])}\n onClick={(e: any) => {\n setLoaded(false)\n props?.onClick && props?.onClick(e)\n if (maskRef.current) {\n maskRef.current.classList.remove('g2-base-imagepro-mask-show')\n }\n }}\n id=\"g2-base-imagepro-container\"\n onMouseMove={() => {\n if (maskRef.current) {\n maskRef.current.classList.add('g2-base-imagepro-mask-show')\n }\n }}\n >\n <img\n {...imgProps}\n style={{\n width: w,\n height: '100%',\n borderRadius: borderRadius,\n ...style,\n }}\n className=\"g2-base-imagepro\"\n draggable={false}\n alt={alt || 'image'}\n onLoad={() => setLoaded(true)}\n />\n {loaded && (\n <div className=\"g2-base-imagepro-mask\" ref={maskRef}>\n <span style={{ marginRight: 4 }}>\n {i18n.t('login.verifyCodeTip')}\n </span>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clip-path=\"url(#clip0_968_21911)\">\n <path\n d=\"M3.64204 2.95599C4.85175 1.90776 6.39937 1.33176 8.00004 1.33399C11.682 1.33399 14.6667 4.31866 14.6667 8.00066C14.6667 9.42466 14.22 10.7447 13.46 11.8273L11.3334 8.00066H13.3334C13.3335 6.95507 13.0262 5.93253 12.4498 5.06016C11.8734 4.1878 11.0533 3.5041 10.0915 3.09407C9.12966 2.68405 8.06852 2.56579 7.04001 2.754C6.01151 2.94221 5.06101 3.42859 4.30671 4.15266L3.64204 2.95599ZM12.358 13.0453C11.1483 14.0935 9.60072 14.6696 8.00004 14.6673C4.31804 14.6673 1.33337 11.6827 1.33337 8.00066C1.33337 6.57666 1.78004 5.25666 2.54004 4.17399L4.66671 8.00066H2.66671C2.66662 9.04624 2.97388 10.0688 3.55027 10.9412C4.12665 11.8135 4.94675 12.4972 5.90859 12.9072C6.87042 13.3173 7.93156 13.4355 8.96007 13.2473C9.98857 13.0591 10.9391 12.5727 11.6934 11.8487L12.358 13.0453Z\"\n fill=\"white\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_968_21911\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </div>\n )}\n {!loaded && (\n <GuardButton\n className=\"g2-base-imagepro-mask g2-base-imagepro-loading\"\n loading\n />\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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\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 useGuardView()\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<\n BackCustomProps & {\n children: any\n }\n> = (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 { useEffect } from 'react'\n\nimport {\n useGuardEvents,\n useGuardModule,\n useGuardMultipleInstance,\n} from '../../../_utils/context'\n\ninterface Options {\n changeTab?: React.Dispatch<any>\n currentTab?: string\n}\n\nexport function useGuardView(options: Options = {}) {\n const { currentTab, changeTab } = options\n\n const { changeModule, currentModule } = useGuardModule()\n\n const events = useGuardEvents()\n\n const { isMultipleAccount } = useGuardMultipleInstance()\n\n // 修改 View 的方式:changeModule、changeTab\n // 为避免 Guard 组件多次渲染及复杂的依赖创建及销毁判断\n // 直接将其挂载到 window 上最方便\n useEffect(() => {\n window.$$guard = Object.assign({}, window.$$guard, {\n viewContext: {\n ...window.$$guard?.viewContext,\n changeModule,\n changeTab,\n },\n })\n }, [changeModule, changeTab])\n\n useEffect(() => {\n let currentView: string = currentModule.moduleName\n\n if (currentTab) {\n currentView += `:${currentTab}`\n }\n\n window.$$guard = Object.assign({}, window.$$guard, {\n viewContext: {\n ...window.$$guard?.viewContext,\n currentModule: currentModule.moduleName,\n currentTab,\n currentView,\n },\n })\n\n if (events?.onAfterChangeModule && !isMultipleAccount && currentModule) {\n events.onAfterChangeModule({\n currentView,\n currentModule: currentModule.moduleName,\n currentTab: currentTab,\n data: currentModule.initData,\n })\n }\n }, [currentModule, currentTab, events, isMultipleAccount])\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 (_: any, value: any) => {\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 { useGuardPhoneRegex, 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 phoneRegex = useGuardPhoneRegex()\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 if (method === 'phone') {\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 : phoneRegex || VALIDATE_PATTERN.phone, //开启国际化短信,但不限制pattern eg:单手机号密码登录方式时🤢\n }\n }\n\n // 自定义字段\n return {\n field: t('common.account'),\n checkRepeatErrorMessage: t('common.checkCustomName'),\n checkExistErrorMessage: t('common.noFindUsername'),\n formatErrorMessage: t('common.customNameFormatError'),\n pattern: VALIDATE_PATTERN.username,\n }\n }, [\n isCheckPattern,\n method,\n publicConfig.internationalSmsConfig?.enabled,\n t,\n phoneRegex,\n ])\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\nexport const CustomNameFormItem: React.FC<\n ValidatorFormItemProps & { method: string }\n> = (props) => <ValidatorFormItem required {...props} />\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 CustomNameFormItem,\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' | string\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 CustomName: typeof CustomNameFormItem\n}\n\nconst CustomFormItem = FormItem as FormItemInterface\n\nCustomFormItem.Password = PasswordFormItem\nCustomFormItem.Email = EmailFormItem\nCustomFormItem.Phone = PhoneFormItem\nCustomFormItem.UserName = UserNameFormItem\nCustomFormItem.CustomName = CustomNameFormItem\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 userId,\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 userId\n ),\n ...(rules ?? []),\n ]}\n {...fromItemProos}\n />\n ) : (\n <Form.Item {...props} />\n )\n}\n","import { getGuardHttp } from '../_utils/guardHttp'\n\nexport 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 React from 'react'\nimport { IconFont } from '../IconFont'\nexport const InputPassword = (props: any) => {\n return (\n <Input.Password\n autoComplete=\"off\"\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 {\n getDefaultG2Config,\n IG2Config,\n IG2Events,\n IG2FCProps,\n Lang,\n} 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 i18n?: {\n errorMessage: Record<Lang, []>\n }\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 'phone-password' = 'phone',\n}\n","import React, { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Form, message } from 'antd'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport SubmitButton from '../../SubmitButton'\nimport CustomFormItem from '../../ValidatorRules'\nimport { IconFont } from '../../IconFont'\nimport { InputPassword } from '../../InputPassword'\nimport {\n useGuardInitData,\n useGuardIsAuthFlow,\n useGuardPublicConfig,\n} from '../../_utils/context'\nimport { authFlow, ChangePasswordBusinessAction } from '../businessRequest'\nimport { ApiCode } from '../../_utils/responseManagement/interface'\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, { ReactNode, 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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\n// 手动修改密码,并非「忘记密码」\n// 进入的场景是读取配置:1开了首次登录修改密码 || 2开了密码轮换\nexport const GuardChangePassword: React.FC<{\n title: string\n explain: string\n children: ReactNode\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 useGuardView()\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 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'] | string,\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 } else {\n const phoneToken = profile.phoneToken\n const emailToken = profile.emailToken\n\n delete profile.phoneToken\n delete profile.emailToken\n return post(`/api/v2/register-${fnName.split('-')[0]}`, {\n ...content,\n profile: {\n ...content.profile,\n ...profile,\n },\n postUserInfoPipeline: true,\n phoneToken,\n emailToken,\n })\n }\n}\n\nexport const registerSkipMethod = (\n fnName: RegisterCompleteInfoInitData['businessRequestName'] | string,\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 } else {\n return post(`/api/v2/register-${fnName.split('-')[0]}`, 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 {\n status: false,\n error: {\n message: JSON.stringify(error),\n code: 401,\n },\n }\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 codeFieldName?: string\n captchaCode?: string\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 codeFieldName,\n captchaCode,\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 (\n phone: string,\n countryCode?: string,\n captchaCode?: string\n ) => {\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 captchaCode,\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 code = form\n ? form?.getFieldValue(codeFieldName || 'captchaCode')\n : captchaCode\n\n const { status, error } = await sendPhone(\n phoneNumber,\n countryCode,\n code\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 { 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'\nimport { i18n } from '../_utils/locales'\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.errorMessage,\n i18n: rule.i18n,\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/**\n * @description 获取对应key的国际化value\n * @param record :example {key:\"\",i18n:{key:{zh_CN:{enabled:true,value:\"\"}}}\n * @param key\n */\nexport const getI18nValue = (record: any, key: string) => {\n const label = record?.[key]\n const i18nObj = record?.i18n?.[key] || {}\n const i18nLan = i18nObj?.[i18n.language]\n const i18nName = i18nLan?.enabled && i18nLan?.value\n return i18nName || label\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'\nimport { getI18nValue } from '../utils'\nimport classnames from 'classnames'\nconst MomentPicker: any = DatePicker\nexport interface CompleteInfoProps {\n metaData: CompleteInfoMetaData[]\n businessRequest: (data: CompleteInfoRequest) => Promise<void>\n extendsFieldsI18n?: any\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, extendsFieldsI18n } = 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: any) => {\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={classnames('authing-g2-select', 'authing-g2-input')}\n dropdownClassName=\"authing-g2-dropdown\"\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={classnames('authing-g2-select', 'authing-g2-input')}\n dropdownClassName=\"authing-g2-dropdown\"\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 <MomentPicker\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 <MomentPicker\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={classnames('authing-g2-select', 'authing-g2-input')}\n dropdownClassName=\"authing-g2-dropdown\"\n showSearch\n options={props.options}\n filterOption={filterOption}\n />\n ),\n dropdown: (props: any) => (\n <Select\n key={props.key}\n className={classnames('authing-g2-select', 'authing-g2-input')}\n dropdownClassName=\"authing-g2-dropdown\"\n showSearch\n options={props.options}\n filterOption={filterOption}\n />\n ),\n boolean: (props) => (\n <Select\n key={props.key}\n className={classnames('authing-g2-select', 'authing-g2-input')}\n dropdownClassName=\"authing-g2-dropdown\"\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 textarea: (props) => (\n <Input.TextArea\n key={props.key}\n // className=\"authing-g2-textarea\"\n className={classnames('authing-g2-textarea', 'authing-g2-input')}\n maxLength={200}\n rows={4}\n style={{\n marginBottom: 10,\n }}\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 />\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 = (extendsFieldsI18n || config.extendsFieldsI18n)?.[\n metaData.name\n ]\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, 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: 'any',\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:\n getI18nValue(rule, 'errorMessage') ||\n rule.errorMessage ||\n '请填写数字',\n })\n break\n case 'regExp':\n formRules.push({\n validateTrigger: 'onBlur',\n pattern: new RegExp((rule.content as any).replaceAll('/', '')),\n message: getI18nValue(rule, 'errorMessage') || 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) as any}\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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nenum DownloadType {\n IOS = 'ios',\n Android = 'Android',\n}\n\nexport const GuardDownloadATView: React.FC = () => {\n useGuardView()\n\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 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'\n\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nexport const GuardCompleteInfo: React.FC<{\n metaData: CompleteInfoMetaData[]\n skipComplateFileds: boolean\n businessRequest: (\n action: CompleteInfoAuthFlowAction,\n data?: CompleteInfoRequest\n ) => Promise<void>\n}> = ({ metaData, businessRequest, skipComplateFileds }) => {\n useGuardView()\n\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 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, message } from 'antd'\n// import { useGuardAuthClient } from '../../Guard/authClient'\nimport { fieldRequiredRule, validate } from '../../_utils'\nimport SubmitButton from '../../SubmitButton'\n\nimport { IconFont } from '../../IconFont'\n\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 './inputIdentify'\nimport { parsePhone, useMediaSize } from '../../_utils/hooks'\nimport { EmailScene } from '../../Type'\n\nimport { getGuardHttp } from '../../_utils/guardHttp'\n\n// import { useGuardEvents, 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 setControlShow: any\n setPolicyStrength: any\n setCustomPasswordStrength: any\n setPhoneOrEmailText: any\n // onSend: (type: 'email' | 'phone') => void\n // onSendError: (type: 'email' | 'phone', error: any) => void\n setResetToken: React.Dispatch<React.SetStateAction<string>>\n setUserId: React.Dispatch<React.SetStateAction<string>>\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 events = useGuardEvents()\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 // 校验手机号和验证码\n let identify = values.identify\n let code = values.code\n // let identify = form.getFieldsValue().identify\n // let code = form.getFieldsValue().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(\n '/api/v2/users/password/forget/check-code',\n {\n email: identify,\n code,\n // newPassword,\n }\n // config\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/forget/check-code', {\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 !== 200) {\n message.error(r?.message)\n return\n }\n const passwordStrength = r?.data.passwordStrength\n let customPasswordStrength = {}\n if (r?.data?.customPasswordStrength?.enabled) {\n customPasswordStrength = r?.data?.customPasswordStrength\n }\n // if (code === ApiCode.UNSAFE_PASSWORD_TIP) {\n // setPasswordErrorTextShow(true)\n // }\n // props.onSend(codeMethod)\n // props.onReset(r)\n if (code === 200) {\n props.setPhoneOrEmailText(identify)\n props.setPolicyStrength(passwordStrength)\n if (r?.data?.customPasswordStrength?.enabled) {\n props.setCustomPasswordStrength(customPasswordStrength)\n }\n props.setControlShow(false)\n props.setResetToken(r?.data?.resetPasswordToken)\n props.setUserId(r?.data?.userId)\n }\n })\n .catch((e) => {\n // submitButtonRef.current.onError()\n // props.onSendError(codeMethod, e)\n message.error(e.message)\n return\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('login.resetPassword.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('login.resetPassword.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 // .map((item, index) => (index === 0 ? `「${item}」` : item))\n\n <div className=\"authing-g2-login-phone-code\">\n <Form\n name=\"rePassword\"\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-sendCode\"\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 {/* // 这个密码记得加上 */}\n {/* {getPassWordUnsafeText()} */}\n <Form.Item className=\"authing-g2-sumbit-form submit-form\">\n <SubmitButton\n className=\"validater-account-btn\"\n text={t('login.resetPassword.nextStep')}\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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nexport interface ErrorProps {\n error?: Error\n}\n\nexport const GuardErrorView: React.FC<ErrorProps> = (propsInitData) => {\n const guardXInitData = useGuardInitData<ErrorInitData>()\n\n useGuardView()\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 useGuardPhoneRegex,\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 phoneRegex = useGuardPhoneRegex()\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: phoneRegex || VALIDATE_PATTERN.phone,\n }\n }, [currentMethod, phoneRegex, 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'\n\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 if (publicConfig?.internationalSmsConfig?.enabled) {\n return 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 .map((item, index) => (index === 0 ? `「${item}」` : item))\n .join(' / '),\n })\n } else {\n return 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 }\n }, [\n methods,\n t,\n verifyCodeMethodsText,\n publicConfig?.internationalSmsConfig?.enabled,\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 { Input } from 'antd'\nimport { PasswordProps } from 'antd/lib/input'\nimport React from 'react'\nimport { IconFont } from '../../IconFont'\nexport const InputPasswordForget = 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\n type=\"authing-authing-eye-fill\"\n style={{ color: '#4E5969' }}\n />\n ) : (\n <IconFont\n type=\"authing-authing-eye-off-fill\"\n style={{ color: '#A9AEB8' }}\n />\n )}\n </span>\n )}\n maxLength={35}\n />\n )\n})\n","import React, { useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Form, 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'\nimport { InputPasswordForget } from './InputPassword/index'\nimport { IconFont } from '../IconFont'\nimport SubmitButton from '../SubmitButton'\nimport { getGuardHttp } from '../_utils/guardHttp'\n// import axios, { Axios } from 'axios'\nimport {\n // getPasswordValidate,\n getPasswordValidateRules,\n PasswordStrength,\n} from '../_utils'\nimport { usePasswordErrorText } from '../_utils/useErrorText'\nimport { ApiCode } from '../_utils/responseManagement/interface'\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n// import './styles.less'\n// let passwordTimer: any = null\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 useGuardView()\n // @ts-ignore\n const logo = publicConfig?.resetPwdCustomLogo || config?.logo!\n const { changeModule } = useGuardModule()\n const [controlShow, setControlShow] = useState(true)\n const [policyStrength, setPolicyStrength] = useState(0)\n const [customPasswordStrength, setCustomPasswordStrength] = useState({})\n const [phoneOrEmailText, setPhoneOrEmailText] = useState('')\n const [userId, setUserId] = useState('')\n const {\n getPassWordUnsafeText,\n setPasswordErrorTextShow,\n } = usePasswordErrorText()\n // const initData = useGuardInitData<any>()\n // const { userId } = initData\n // 忘记密码的 token,在第二步重置密码时传给后端\n const [resetToken, setResetToken] = useState('')\n\n /**\n * 「返回」的回调函数,goBack 是 null 的时候就隐藏「第一步的返回按钮、最后提交成功后的返回和自动跳转」\n * goBack 不等于 null 时,如果传入就使用传入的,不然就默认跳转到 登录模块\n */\n const needBack = config?.goBack !== null\n const goBack = config?.goBack ?? (() => changeModule?.(GuardModuleType.LOGIN))\n\n let [form] = Form.useForm()\n const { post } = getGuardHttp()\n let submitBtnRef = useRef<any>(null)\n const onFinish = async () => {\n // 重置密码\n let data = form.getFieldsValue()\n const newPassword = await authClient.options?.encryptFunction?.(\n data.password,\n publicConfig.publicKey\n )\n const repeatPassword = await authClient.options?.encryptFunction?.(\n data.repeatPassword,\n publicConfig.publicKey\n )\n let res = post('/api/v2/users/password/password-reset', {\n newPassword,\n repeatPassword,\n // ...phoneOrEmail, // 不用传 phone 和 email 了\n resetPasswordToken: resetToken,\n })\n\n res\n .then((r: any) => {\n const { code } = r\n if (code === ApiCode.UNSAFE_PASSWORD_TIP) {\n setPasswordErrorTextShow(true)\n }\n if (code !== 200) {\n events?.onPwdResetError?.(r, authClient)\n message.error(r?.message)\n return\n }\n events?.onPwdReset?.(authClient)\n // 返回登录\n const initData = {\n title: t('common.resetSuccess'),\n message: t('common.resetSuccessMessage'),\n needBack,\n goBack,\n }\n changeModule?.(GuardModuleType.New_SUBMIT_SUCCESS, {\n ...initData,\n })\n // props.onSend(codeMethod)\n })\n .catch((e) => {\n submitBtnRef.current.onError()\n // props.onSendError(codeMethod, e)\n events?.onPwdResetError?.(e, authClient)\n message.error(e.message)\n return\n })\n }\n const rules = () => {\n let passwordStrength = [\n PasswordStrength.NoCheck,\n PasswordStrength.Low,\n PasswordStrength.Middle,\n PasswordStrength.High,\n PasswordStrength.AUTO,\n PasswordStrength.Custom,\n ]\n let rule = getPasswordValidateRules(\n passwordStrength[policyStrength],\n customPasswordStrength,\n 'onChange',\n t('login.resetPassword.pleaseInputPassword'),\n userId\n )\n return rule\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 controlShow ? (\n <div className=\"g2-view-container g2-forget-password g2-password-reset-pageWrap g2-password-reset-step1\">\n <div className=\"g2-view-header\">\n <ImagePro\n src={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\">\n {t('login.resetPassword.resetPasswordText1')}\n </div>\n </div>\n <div className=\"g2-view-tabs\">\n <ResetPassword\n // onReset={onReset}\n publicConfig={publicConfig}\n setControlShow={setControlShow}\n setPolicyStrength={setPolicyStrength}\n setCustomPasswordStrength={setCustomPasswordStrength}\n setPhoneOrEmailText={setPhoneOrEmailText}\n setResetToken={setResetToken}\n setUserId={setUserId}\n />\n </div>\n {needBack && (\n <div className=\"g2-tips-line\">\n <div className=\"link-like back-to-login\" onClick={goBack}>\n {t('login.resetPassword.back')}\n </div>\n </div>\n )}\n {/* <ChangeLanguage langRange={langRange} onLangChange={props.onLangChange} /> */}\n </div>\n ) : (\n <div className=\"g2-view-container g2-forget-password g2-password-reset-pageWrap g2-password-reset-step2\">\n <div className=\"g2-view-header\">\n <ImagePro\n src={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\">\n {t('login.resetPassword.resetPasswordText2', {\n account: phoneOrEmailText,\n })}\n </div>\n </div>\n <div className=\"g2-view-tabs\">\n <Form\n name=\"resetPassword\"\n form={form}\n onFinish={onFinish}\n onFinishFailed={() => {\n submitBtnRef?.current?.onError()\n }}\n autoComplete=\"off\"\n >\n <Form.Item\n className=\"authing-g2-input-form-password\"\n name=\"password\"\n rules={\n // {\n // required: true,\n // message: t('login.resetPassword.pleaseInputPassword'),\n // },\n rules()\n }\n >\n <InputPasswordForget\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.resetPassword.inputNewPwd')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95', marginBottom: 2 }}\n />\n }\n />\n </Form.Item>\n <Form.Item\n className=\"authing-g2-input-form-password-repeat\"\n name=\"repeatPassword\"\n validateFirst={true}\n rules={[\n {\n required: true,\n message: t('login.resetPassword.pleaseInputPassword'),\n },\n ({ getFieldValue }) => ({\n validator: (_, value) => {\n let password = getFieldValue('password')\n if (password === undefined && value === undefined) {\n return Promise.resolve()\n }\n if (password === value) {\n return Promise.resolve()\n } else {\n return Promise.reject(\n t('login.resetPassword.checkPasswordDiff')\n )\n }\n },\n }),\n ]}\n >\n <InputPasswordForget\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.resetPassword.confirmNewPwd')}\n prefix={\n <IconFont\n type=\"authing-a-lock-line1\"\n style={{ color: '#878A95', marginBottom: 2 }}\n />\n }\n // suffix={<div>111</div>}\n />\n </Form.Item>\n {getPassWordUnsafeText()}\n <Form.Item className=\"authing-g2-sumbit-form submit-form\">\n <SubmitButton\n className=\"reset-password-button\"\n text={t('login.resetPassword.reset')}\n ref={submitBtnRef}\n />\n </Form.Item>\n </Form>\n </div>\n <div className=\"g2-tips-line\">\n <div\n className=\"link-like back-to-login\"\n onClick={() => setControlShow(true)}\n >\n {t('login.resetPassword.back')}\n </div>\n </div>\n </div>\n )\n}\n","import { FormItemProps } from 'antd/lib/form'\nimport FormItem from 'antd/lib/form/FormItem'\nimport React, { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport CustomFormItem from '../../../ValidatorRules'\nimport { fieldRequiredRule } from '../../../_utils'\n\nexport interface FormItemAccountProps extends FormItemProps {\n validPasswordLoginMethods: string[]\n}\n\nexport const FormItemAccount: React.FC<FormItemAccountProps> = (props) => {\n const { validPasswordLoginMethods, ...formItemPtops } = props\n const { t } = useTranslation()\n\n const runderTemplate = useMemo(() => {\n if (validPasswordLoginMethods.length !== 1)\n return (\n <FormItem\n validateTrigger={['onBlur', 'onChange']}\n rules={fieldRequiredRule(t('common.account'))}\n {...formItemPtops}\n />\n )\n\n switch (validPasswordLoginMethods[0]) {\n case 'phone-password':\n return (\n <CustomFormItem.Phone {...formItemPtops} isCheckPattern={false} />\n )\n case 'email-password':\n return <CustomFormItem.Email {...formItemPtops} />\n }\n\n return <CustomFormItem.UserName {...formItemPtops} />\n }, [formItemPtops, validPasswordLoginMethods, t])\n\n return <>{runderTemplate}</>\n}\n","import Input, { InputProps } from 'antd/lib/input'\nimport React, { useMemo } from 'react'\nimport { InputNumber } from '../../../InputNumber'\n\nexport interface InputAccountProps extends InputProps {\n passwordLoginMethods: string[]\n placeholder: string\n}\n\nexport const InputAccount: React.FC<InputAccountProps> = (props) => {\n const { passwordLoginMethods: methods, placeholder, ...inputProps } = props\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 return <Input placeholder={placeholder} {...inputProps} />\n }, [inputProps, methods, placeholder])\n\n return <>{runderInput}</>\n}\n","import Input, { InputProps } from 'antd/lib/input'\nimport React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ImagePro2 } 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 <ImagePro2\n className=\"g2-captcha-code-image\"\n src={verifyCodeUrl}\n alt={t('login.captchaCode')}\n height=\"46px\"\n width=\"134px\" // 为了第一次加载图片,和后面刷新(或者显示时)宽度一致,免得宽度会变化,从100到134\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'\nimport { useAgreements } from '../../../Guard/core/hooks/useAgreements'\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 useAgreements({\n agreements,\n checkedAgreements: acceptList,\n checkAllAgreements() {\n const acceptList = agreements.map((agreement) => {\n return agreement.id\n })\n setAcceptList(acceptList)\n },\n unCheckAllAgreements() {\n setAcceptList([])\n },\n })\n\n /** 是否可以注册 */\n const isAccept = useMemo(() => {\n /** 所有必须勾选的都勾了就可以通过 */\n return agreements\n .filter((item) => item.required)\n .every((item) => acceptList.includes(item.id))\n }, [acceptList, agreements])\n\n useEffect(() => {\n onChange(isAccept)\n }, [isAccept, onChange])\n\n return (\n <div\n className={getClassnames([\n 'authing-agreements',\n showError && 'authing-agreements-error',\n ])}\n >\n {agreements.map((item) => {\n return (\n <div\n key={item.id}\n style={{ ...style }}\n className={getClassnames([\n 'authing-agreements-item',\n item.required &&\n !acceptList.includes(item.id) &&\n 'authing-agreements-item-invalid',\n ])}\n onClick={(e: any) => {\n e.persist()\n if (e.target.nodeName !== 'A') {\n toggleItemCheck(item.id)\n }\n }}\n >\n <Space align=\"start\" size={5}>\n <Checkbox\n className=\"authing-agreements-checkbox\"\n checked={acceptList.includes(item.id)}\n />\n <div\n className=\"authing-agreements-item-content\"\n dangerouslySetInnerHTML={{\n __html: item.title,\n }}\n ></div>\n </Space>\n </div>\n )\n })}\n </div>\n )\n}\n","import { useEffect } from 'react'\n\nimport { Agreement } from '../../../Type'\n\ninterface Options {\n agreements: Agreement[]\n checkedAgreements: (string | number)[]\n checkAllAgreements: () => void\n unCheckAllAgreements: () => void\n}\n\nexport function useAgreements(options: Options) {\n const {\n agreements,\n checkedAgreements,\n checkAllAgreements,\n unCheckAllAgreements,\n } = options\n\n const agreementsContext = {\n agreements,\n checkedAgreements,\n checkAllAgreements,\n unCheckAllAgreements,\n }\n\n useEffect(() => {\n window.$$guard = Object.assign({}, window.$$guard, {\n agreementsContext,\n })\n }, [agreements, checkedAgreements])\n\n return agreementsContext\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","export const getCaptchaUrl = (host: string) => {\n const url = new URL(host)\n url.pathname = '/api/v2/security/captcha'\n url.search = `?r=${+new Date()}`\n return url.href\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Form } from 'antd'\nimport { useTranslation } from 'react-i18next'\nimport { useGuardHttp } from '../../../_utils/guardHttp'\nimport { useGuardAuthClient } from '../../../Guard/authClient'\nimport {\n fieldRequiredRule,\n getSortLabels,\n getUserRegisterParams,\n} 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 useGuardDefaultLanguage,\n useGuardFinallyConfig,\n useGuardInitData,\n useGuardPublicConfig,\n useRobotVerify,\n} from '../../../_utils/context'\nimport { GuardLoginInitData } from '../../interface'\nimport {\n Agreement,\n LoginMethods,\n TabFieldsI18nItem,\n RegisterMethods,\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'\nimport { getCaptchaUrl } from '../../../_utils/getCaptchaUrl'\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: string[]\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 passwordLoginMethods,\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, i18n } = useTranslation()\n let { post } = useGuardHttp()\n let client = useGuardAuthClient()\n\n const publicConfig = useGuardPublicConfig()\n const config = useGuardFinallyConfig()\n const defaultLanguageConfig = useGuardDefaultLanguage()\n const robotVerify = useRobotVerify()\n\n let submitButtonRef = useRef<any>(null)\n\n const [showCaptcha, setShowCaptcha] = useState(\n robotVerify === 'always_enable'\n )\n const [verifyCodeUrl, setVerifyCodeUrl] = useState('')\n const [remainCount, setRemainCount] = useState(0)\n const [accountLock, setAccountLock] = useState(false)\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 // 图形验证码出现后,不管是「图形验证码」错了,还是「账号」「密码」错了,都要重新发验证码\n if (verifyCodeUrl) {\n setVerifyCodeUrl(getCaptchaUrl(props.host!))\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 // 需要「图形验证码」并且是第一次,就发一次,后面存在的时候会在点击登录,表单校验通过后,不论对错都要重新请求验证码\n if (apiCode === ErrorCode.INPUT_CAPTCHACODE && !verifyCodeUrl) {\n setVerifyCodeUrl(getCaptchaUrl(props.host!))\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 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 useEffect(() => {\n setShowCaptcha(robotVerify === 'always_enable')\n if (robotVerify === 'always_enable') {\n setVerifyCodeUrl(getCaptchaUrl(props.host!))\n }\n }, [robotVerify, props.host])\n\n const submitText = useMemo(() => {\n if (props.submitButText) return props.submitButText\n\n return props.autoRegister &&\n !publicConfig.registerDisabled &&\n config.registerMethods?.filter(\n (item) =>\n // @ts-ignore\n ![RegisterMethods.Phone, RegisterMethods.EmailCode].includes(item)\n )?.length\n ? `${t('common.login')} / ${t('common.register')}`\n : t('common.login')\n }, [props, t, publicConfig.registerDisabled, config.registerMethods])\n\n const formValuesChange = (changedValues: Record<string, any>) => {\n if (changedValues?.account && saveIdentify) {\n saveIdentify(LoginMethods.Password, changedValues?.account)\n }\n }\n\n const i18nFields = useMemo(() => {\n const i18nMap = new Map<string, TabFieldsI18nItem>()\n publicConfig.tabMethodsFields.forEach((item) => {\n i18nMap.set(item.key, item)\n })\n return i18nMap\n }, [publicConfig.tabMethodsFields])\n\n const placeholder = useMemo(() => {\n // 登录注册合并\n if (config?.autoRegister) {\n // 密码 placeholder\n const methods = [...passwordLoginMethods]\n return t('login.inputAccount', {\n text: getSortLabels(methods, i18nFields, defaultLanguageConfig),\n })\n }\n // 登录注册分页\n return t('login.inputAccount', {\n text: getSortLabels(\n [...passwordLoginMethods],\n i18nFields,\n defaultLanguageConfig\n ),\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n config?.autoRegister,\n i18n,\n i18nFields,\n defaultLanguageConfig,\n passwordLoginMethods,\n t,\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 validPasswordLoginMethods={\n publicConfig?.passwordTabConfig?.validLoginMethods || []\n }\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={passwordLoginMethods}\n placeholder={placeholder}\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(props.host!))}\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, message: tips } = 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 &&\n onLoginFailed(code, data, tips)\n }\n } catch (error: any) {\n submitButtonRef.current?.onSpin(false)\n if (error.code === 'ECONNABORTED') {\n message.error(t('common.timeoutLDAP'))\n onLoginFailed(2333, {}, JSON.stringify(error))\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, { useEffect, 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 useRobotVerify,\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'\nimport { ErrorCode } from '../../_utils/GuardErrorCode'\nimport { getCaptchaUrl } from '../../_utils/getCaptchaUrl'\nimport { GraphicVerifyCode } from './withPassword/GraphicVerifyCode'\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 robotVerify = useRobotVerify()\n\n const [showCaptcha, setShowCaptcha] = useState(\n robotVerify === 'always_enable'\n )\n const [verifyCodeUrl, setVerifyCodeUrl] = useState('')\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 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 let captchaCode = values.captchaCode\n\n const encrypt = client.options.encryptFunction\n\n const encryptPassword = await encrypt!(password, props.publicKey)\n\n // 图形验证码出现后,不管是「图形验证码」错了,还是「账号」「密码」错了,都要重新发验证码\n if (verifyCodeUrl) {\n setVerifyCodeUrl(getCaptchaUrl(host))\n }\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({\n username,\n password: encryptPassword,\n captchaCode,\n }),\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 {\n code,\n apiCode,\n data,\n onGuardHandling,\n message: tips,\n } = 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 // 需要「图形验证码」并且是第一次,就发一次,后面存在的时候会在点击登录,表单校验通过后,不论对错都要重新请求验证码\n if (apiCode === ErrorCode.INPUT_CAPTCHACODE && !verifyCodeUrl) {\n setVerifyCodeUrl(getCaptchaUrl(host))\n setShowCaptcha(true)\n }\n\n const handMode = onGuardHandling?.()\n // 向上层抛出错误\n handMode === CodeAction.RENDER_MESSAGE &&\n onLoginFailed(code, data, tips)\n }\n } catch (error: any) {\n submitButtonRef.current?.onSpin(false)\n if (error.code === 'ECONNABORTED') {\n message.error(t('common.timeoutAD'))\n onLoginFailed(2333, {}, JSON.stringify(error))\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 useEffect(() => {\n setShowCaptcha(robotVerify === 'always_enable')\n if (robotVerify === 'always_enable') {\n setVerifyCodeUrl(getCaptchaUrl(host))\n }\n }, [robotVerify, host])\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 {/* 图形验证码 */}\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(host))}\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(\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: string = '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 const classPrefix: any = `${prefix}-qrcode`\n const classes = className(classPrefix, 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: any = {\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 { getGuardHttp } from '../../_utils/guardHttp'\n\nexport const enum ResetAccountBusinessAction {\n ResetName = 'reset-username-before-auth',\n}\n\nexport const authFlow = async (\n action: ResetAccountBusinessAction,\n content: {\n username: string\n }\n) => {\n const { authFlow } = getGuardHttp()\n\n const res = await authFlow(action, { ...content })\n\n return res\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: any = {\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: any = {\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 1666: {\n action: 'changeModule',\n module: GuardModuleType.IDENTITY_BINDING_NO_ASK,\n },\n 1108: {\n action: 'changeModule',\n module: GuardModuleType.RESET_ACCOUNT_NAME,\n },\n 2930: {\n action: 'changeModule',\n module: GuardModuleType.SELECT_ACCOUNT_2_LOGIN,\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 &&\n onLoginFailed(code, data, evt?.data?.message)\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 way: string\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 getPhoneInLoginPageContext,\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 useIsForeignUserpool,\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, RegisterMethods } from '../../../Type/application'\nimport { useLoginMultipleBackFill } from '../../hooks/useLoginMultiple'\nimport { GraphicVerifyCode } from '../withPassword/GraphicVerifyCode'\nimport { getCaptchaUrl } from '../../../_utils/getCaptchaUrl'\n\nexport enum SpecifyCodeMethods {\n Phone = 'phone',\n Email = 'email',\n}\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 specifyCodeMethod,\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 = useRef(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 [isOnlyEmailCode, setIsOnlyEmailCode] = useState(false)\n // 区号 默认\n const [areaCode, setAreaCode] = useState(\n publicConfig?.internationalSmsConfig?.defaultISOType || 'CN'\n )\n\n const isForeignUserpool = useIsForeignUserpool()\n const [verifyCodeUrl, setVerifyCodeUrl] = useState('')\n\n let [form] = Form.useForm()\n\n const changeMethod = useCallback(\n (v: string) => {\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 [methods.length]\n )\n\n const changeCurrentMethod = useCallback(\n (v: string) => {\n setIdentify(v)\n changeMethod(v)\n },\n [changeMethod]\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 await form.validateFields(['captchaCode'])\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 codeFieldName={'captchaCode'}\n onSendCodeBefore={async () => {\n await form.validateFields(['identify'])\n await form.validateFields(['captchaCode'])\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?.internationalSmsConfig?.enabled) ||\n specifyCodeMethod === SpecifyCodeMethods.Phone\n ) {\n setInternationSms(true)\n setCurrentMethod(InputMethod.PhoneCode)\n }\n // 指定了只用邮箱验证码\n if (specifyCodeMethod === SpecifyCodeMethods.Email) {\n setIsOnlyEmailCode(true)\n setCurrentMethod(InputMethod.EmailCode)\n }\n }, [publicConfig, methods, specifyCodeMethod])\n\n useEffect(() => {\n /** 如果是国外用户池,那么有图形验证码,需要请求图片 */\n if (isForeignUserpool) {\n setVerifyCodeUrl(getCaptchaUrl(config.host!))\n }\n }, [isForeignUserpool, config?.host])\n\n useEffect(() => {\n // 方法发生变化时,图像验证码数据应该清空\n if (isForeignUserpool) {\n form?.setFieldsValue({ captchaCode: undefined })\n }\n }, [form, currentMethod, isForeignUserpool])\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, message: tips } = 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, tips)\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, message: tips } = 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, tips)\n }\n }\n\n const onFinish = async (values: any) => {\n setValidated(true)\n if (agreements?.length && !acceptedAgreements.current) {\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, message: tips } = 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, tips)\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 !publicConfig.registerDisabled &&\n config.registerMethods?.filter((item) =>\n // @ts-ignore\n [RegisterMethods.Phone, RegisterMethods.EmailCode].includes(item)\n )?.length\n ? `${t('common.login')} / ${t('common.register')}`\n : t('common.login')\n }, [\n autoRegister,\n submitButText,\n t,\n config.registerMethods,\n publicConfig.registerDisabled,\n ])\n // 为了 refresh input\n const AreaCodePhoneAccount = useCallback(\n (props: any) => {\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 const phone = getPhoneInLoginPageContext()\n\n console.log('currentMethod123: ', currentMethod, specifyCodeMethod)\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 : (specifyCodeMethod === 'phone' || !isInternationSms) && phone\n ? phone\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={isOnlyEmailCode ? ['email-code'] : methods}\n onChange={(e) => {\n let v = e.target.value\n changeMethod(v)\n }}\n onBlur={(e) => {\n let v = e.target.value\n changeMethod(v)\n }}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n )}\n </FormItemIdentify>\n\n {/* 图形验证码 国外用户池并且是手机号 */}\n {isForeignUserpool && currentMethod === InputMethod.PhoneCode && (\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(config.host!))}\n />\n </Form.Item>\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={(val) => {\n acceptedAgreements.current = val\n }}\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 { Form, Input, message } from 'antd'\nimport React, { FC, useCallback, useRef } from 'react'\nimport { useGuardAuthClient } from '../../Guard/authClient'\nimport { IconFont } from '../../IconFont'\nimport SubmitButton from '../../SubmitButton'\nimport CustomFormItem from '../../ValidatorRules'\nimport { useGuardEvents } from '../../_utils/context'\nimport { i18n } from '../../_utils/locales'\nimport { ApiCode } from '../../_utils/responseManagement/interface'\nimport { authFlow, ResetAccountBusinessAction } from './businessRequest'\nimport './style.less'\n\nexport const ResetAccountName: FC = () => {\n let submitButtonRef = useRef<any>(null)\n const [form] = Form.useForm()\n const events = useGuardEvents()\n const authClient = useGuardAuthClient()\n\n const onFinish = useCallback(\n async (values) => {\n try {\n const {\n apiCode,\n onGuardHandling,\n message: msg,\n isFlowEnd,\n data,\n } = await authFlow(ResetAccountBusinessAction.ResetName, values)\n\n submitButtonRef.current?.onSpin(false)\n\n if (isFlowEnd) {\n events?.onLogin?.(data, authClient)\n } else if (apiCode === ApiCode.RESET_ACCOUNT_NAME) {\n // 用户名重复\n message.error(msg)\n } else {\n submitButtonRef.current?.onError()\n onGuardHandling?.()\n }\n } catch (error) {}\n },\n [authClient, events]\n )\n\n return (\n <div className=\"g2-view-reset-username\">\n <div className=\"g2-view-reset-username__title\">\n {i18n.t('common.resetAccount.title')}\n </div>\n <Form\n name=\"passworLogin\"\n onFinish={onFinish}\n onFinishFailed={() => submitButtonRef.current?.onError()}\n autoComplete=\"off\"\n form={form}\n >\n <CustomFormItem.UserName>\n <Input\n className=\"authing-g2-input\"\n size=\"large\"\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n placeholder={i18n.t('login.inputUsername')}\n />\n </CustomFormItem.UserName>\n <Form.Item className=\"authing-g2-sumbit-form\">\n <SubmitButton\n text={i18n.t('common.sure')}\n className=\"password\"\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n )\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 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 { Select } from 'antd'\nimport React from 'react'\n\nimport { SelectorOptions, Selector } from './types'\n\ninterface PushLoginGuideSelectorProps {\n defaultValue: Selector\n onChange: (value: Selector) => void\n options: SelectorOptions\n}\n\nexport function PushLoginGuideSelector(props: PushLoginGuideSelectorProps) {\n const { defaultValue, onChange, options } = props\n\n return (\n <Select\n defaultValue={defaultValue}\n onChange={onChange}\n options={options}\n dropdownMatchSelectWidth={false}\n showArrow={true}\n />\n )\n}\n","import React, { CSSProperties, ReactNode, useEffect, useState } from 'react'\n\ninterface LazyloadImageProps {\n src: string\n placeholder: ReactNode\n className?: string\n style?: CSSProperties\n alt?: string\n width?: string\n height?: string\n}\n\nexport function LazyloadImage(props: LazyloadImageProps) {\n const { src, placeholder, className, style, alt, width, height } = props\n\n const [loadStatus, setLoadStatus] = useState<boolean>(false)\n\n const image = new Image(0, 0)\n\n image.src = src\n\n useEffect(() => {\n image.onload = () => {\n setLoadStatus(true)\n }\n })\n\n return (\n <>\n {(loadStatus && (\n <img\n src={src}\n width={width}\n height={height}\n className={className}\n style={style}\n alt={alt}\n />\n )) ||\n placeholder}\n </>\n )\n}\n","import React, { useMemo } from 'react'\n\nimport { Spin } from 'antd'\n\nimport { useTranslation } from 'react-i18next'\n\nimport { LazyloadImage } from '../../../LazyloadImage'\nimport {\n useGuardAppId,\n useGuardFinallyConfig,\n useGuardPublicConfig,\n} from '../../../_utils/context'\n\nimport { QRCodeSVG } from 'qrcode.react'\n\nexport function HowBindClient() {\n const { t } = useTranslation()\n\n const config = useGuardFinallyConfig()\n\n const publicConfig = useGuardPublicConfig()\n\n const appId = useGuardAppId()\n\n const qrcodeInfo = useMemo(() => {\n const data = {\n appId,\n appHost: config.host,\n scene: 'APP_OPTIONS',\n userPoolId: publicConfig.userPoolId,\n }\n return JSON.stringify(data)\n }, [config, appId])\n\n return (\n <>\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>1. {t('login.installAuthingToken')}</span>\n </div>\n <div className=\"desc\">{t('login.downloadAuthingToken')}</div>\n <div className=\"qrcode-container space-between\">\n <div className=\"qrcode-app grey-bg\">\n <LazyloadImage\n src=\"https://cdn.authing.co/authing-assets/qrcode-download-android.png\"\n placeholder={<Spin />}\n className=\"qrcode-verifier download-app\"\n alt={t('login.downloadAndroid')}\n ></LazyloadImage>\n <div className=\"qrcode-tips\">{t('login.downloadAndroid')}</div>\n </div>\n <div className=\"qrcode-app grey-bg\">\n <LazyloadImage\n src=\"https://cdn.authing.co/authing-assets/qrcode-download-ios.png\"\n placeholder={<Spin />}\n className=\"qrcode-verifier download-app\"\n alt={t('login.downloadIOS')}\n ></LazyloadImage>\n <div className=\"qrcode-tips\">{t('login.downloadIOS')}</div>\n </div>\n </div>\n </div>\n\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>2. {t('login.openAppList')}</span>\n </div>\n <div className=\"desc\">{t('login.addApp')}</div>\n <LazyloadImage\n src=\"https://files.authing.co/authing-guard/push-login-open-application-list.svg\"\n placeholder={<Spin />}\n className=\"qrcode-verifier\"\n alt={t('login.downloadIOS')}\n ></LazyloadImage>\n </div>\n\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>3. {t('login.openLoginPage')}</span>\n </div>\n <div className=\"desc\">{t('login.scanQrcode')}</div>\n <LazyloadImage\n src=\"https://files.authing.co/authing-guard/push-login-open-application.svg\"\n placeholder={<Spin />}\n className=\"qrcode-verifier\"\n alt={t('login.downloadIOS')}\n ></LazyloadImage>\n </div>\n\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>4. {t('login.scanFollowingQrcode')}</span>\n </div>\n <div\n className=\"qrcode-container center grey-bg\"\n style={{\n marginTop: '16px',\n padding: '25px 0',\n boxSizing: 'border-box',\n }}\n >\n <QRCodeSVG\n size={80}\n value={qrcodeInfo}\n style={{ padding: '5px', backgroundColor: '#fff' }}\n ></QRCodeSVG>\n </div>\n </div>\n\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>5. {t('login.relevanceApp')}</span>\n </div>\n <div className=\"desc\">{t('login.receiveMessageFromAuthingToken')}</div>\n <div className=\"qrcode-container center grey-bg\">\n <LazyloadImage\n src=\"https://files.authing.co/authing-guard/push-login-relevance-application.svg\"\n placeholder={<Spin />}\n className=\"qrcode-verifier\"\n alt={t('login.receiveMessageFromAuthingToken')}\n ></LazyloadImage>\n </div>\n </div>\n </>\n )\n}\n","import { Spin } from 'antd'\nimport React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { LazyloadImage } from '../../../LazyloadImage'\n\nexport function HowUsePushLogin() {\n const { t } = useTranslation()\n\n return (\n <>\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>1. {t('login.inputAccountInWeb')}</span>\n </div>\n <div className=\"desc\">{t('login.clickLoginButton')}</div>\n <div className=\"qrcode-container center grey\">\n <LazyloadImage\n src=\"https://files.authing.co/authing-guard/push-login-input-account.svg\"\n placeholder={<Spin />}\n className=\"qrcode-verifier\"\n alt={t('login.clickLoginButton')}\n ></LazyloadImage>\n </div>\n </div>\n\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>2. {t('login.receiveMessageInApp')}</span>\n </div>\n <div className=\"desc\">{t('login.confirmLoginInApp')}</div>\n <div className=\"qrcode-container center grey\">\n <LazyloadImage\n src=\"https://files.authing.co/authing-guard/push-login-receive-message-in-app.svg\"\n placeholder={<Spin />}\n className=\"qrcode-verifier\"\n alt={t('login.confirmLoginInApp')}\n ></LazyloadImage>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\n\nimport { Spin } from 'antd'\n\nimport { useTranslation } from 'react-i18next'\n\nimport { LazyloadImage } from '../../../LazyloadImage'\n\nexport function HowGetAppLoginUrl() {\n const { t } = useTranslation()\n\n return (\n <>\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>1. {t('login.getCodeFromAdmin')}</span>\n </div>\n <div className=\"desc\">{t('login.getCodeFromAdminTips')}</div>\n <div className=\"qrcode-container center grey\">\n <LazyloadImage\n src=\"https://files.authing.co/authing-guard/push-login-get-associated-qrcode-from-admin.svg\"\n placeholder={<Spin />}\n className=\"qrcode-verifier\"\n alt={t('login.getCodeFromAdmin')}\n ></LazyloadImage>\n </div>\n </div>\n\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>2. {t('login.getCodeFromPersonalCenter')}</span>\n </div>\n <div className=\"desc\">{t('login.getCodeFromPersonalCenterTips')}</div>\n <div className=\"qrcode-container center grey\">\n <LazyloadImage\n src=\"https://files.authing.co/authing-guard/push-login-get-code-from-personal.svg\"\n placeholder={<Spin />}\n className=\"qrcode-verifier\"\n alt={t('login.getCodeFromPersonalCenter')}\n ></LazyloadImage>\n </div>\n </div>\n\n <div className=\"guide-step\">\n <div className=\"title\">\n <span className=\"dot\"></span>\n <span>3. {t('login.getLoginUrlFromConsole')}</span>\n </div>\n <div className=\"desc\">{t('login.getLoginUrlFromConsoleTips')}</div>\n <div className=\"qrcode-container center grey\">\n <LazyloadImage\n src=\"https://files.authing.co/authing-guard/push-login-get-login-url-from-console.png\"\n placeholder={<Spin />}\n className=\"qrcode-verifier\"\n alt={t('login.getLoginUrlFromConsole')}\n ></LazyloadImage>\n </div>\n </div>\n </>\n )\n}\n","import React, { useMemo, useState } from 'react'\n\nimport { Drawer } from 'antd'\n\nimport { useTranslation } from 'react-i18next'\n\nimport { PushLoginGuideSelector } from './PushLoginGuideSelector'\n\nimport { HowBindClient } from './HowBindClient'\nimport { HowUsePushLogin } from './HowUsePushLogin'\nimport { HowGetAppLoginUrl } from './HowGetAppLoginUrl'\n\nimport {\n PushLoginGudeModalProps,\n Selector,\n SelectorOption,\n SelectorOptions,\n} from './types'\nimport { useMediaSize } from '../../../_utils/hooks'\nimport { IconFont } from '../../../IconFont'\n\nexport function PushLoginGudeModal(props: PushLoginGudeModalProps) {\n const { visible, onClose } = props\n\n const { t } = useTranslation()\n\n const howBindClient = t('login.howBindClient')\n const howGetAppLoginUrl = t('login.howGetAppLoginUrl')\n const howUsePushLogin = t('login.howUsePushLogin')\n\n const [selector, setSelector] = useState<Selector>('howUsePushLogin')\n\n const { isPhoneMedia } = useMediaSize()\n\n const selectorOptions = useMemo<SelectorOptions>(() => {\n return [\n {\n value: 'howUsePushLogin',\n label: howUsePushLogin,\n },\n {\n value: 'howBindClient',\n label: howBindClient,\n },\n {\n value: 'howGetAppLoginUrl',\n label: howGetAppLoginUrl,\n },\n ]\n }, [howUsePushLogin, howBindClient, howGetAppLoginUrl])\n\n const onSelectorChange = (value: Selector) => {\n const selector = selectorOptions.find(\n (option: SelectorOption) => option.value === value\n )\n if (selector) {\n setSelector(selector.value)\n }\n }\n\n const componentMap = {\n howBindClient: <HowBindClient />,\n howGetAppLoginUrl: <HowGetAppLoginUrl />,\n howUsePushLogin: <HowUsePushLogin />,\n }\n\n return (\n <Drawer\n title={\n <PushLoginGuideSelector\n defaultValue=\"howUsePushLogin\"\n onChange={onSelectorChange}\n options={selectorOptions}\n />\n }\n placement=\"right\"\n onClose={onClose}\n visible={visible}\n width={isPhoneMedia ? '375' : '640'}\n closeIcon={<IconFont type=\"authing-close-line\" />}\n >\n {componentMap[selector]}\n </Drawer>\n )\n}\n","import React, { useMemo, useRef, useState } from 'react'\n\nimport { Form, Input, message } from 'antd'\n\nimport { IconFont } from '../../../IconFont'\n\nimport { useMediaSize } from '../../../_utils/hooks'\n\nimport SubmitButton from '../../../SubmitButton'\n\nimport { OnPushSuccessProps, OnLoginProps } from './types'\n\nimport { AuthingGuardResponse } from '../../../_utils/http'\n\nimport { useTranslation } from 'react-i18next'\n\nimport {\n useGuardDefaultLanguage,\n useGuardFinallyConfig,\n useGuardPublicConfig,\n} from '../../../_utils/context'\n\nimport { getSortLabels } from '../../../_utils'\n\nimport { Agreement, TabFieldsI18nItem } from '../../../Type'\n\nimport { Agreements } from '../../../Register/components/Agreements'\n\nimport { PushLoginGudeModal } from './PushLoginGuideModal'\n\ninterface BeforeLoginProps {\n onPushSuccess: (props: OnPushSuccessProps) => void\n signinByPush: (\n props: OnLoginProps\n ) => Promise<\n AuthingGuardResponse<{\n pushCodeId: string\n }>\n >\n pushLoginStatus: boolean\n onchangePushLoginStatus: () => void\n defaultAccount: string\n setAccount: React.Dispatch<any>\n agreements: Agreement[]\n}\n\nexport function BeforeLogin(props: BeforeLoginProps) {\n const {\n onPushSuccess,\n signinByPush,\n pushLoginStatus,\n setAccount,\n agreements,\n } = props\n\n const { isPhoneMedia } = useMediaSize()\n\n const { t } = useTranslation()\n\n const config = useGuardFinallyConfig()\n\n const publicConfig = useGuardPublicConfig()\n\n const defaultLanguageConfig = useGuardDefaultLanguage()\n\n const [form] = Form.useForm()\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n\n const [validated, setValidated] = useState(false)\n\n let submitButtonRef = useRef<any>(null)\n\n const i18nFields = useMemo(() => {\n const i18nMap = new Map<string, TabFieldsI18nItem>()\n publicConfig.tabMethodsFields.forEach((item) => {\n i18nMap.set(item.key, item)\n })\n return i18nMap\n }, [publicConfig.tabMethodsFields])\n\n const onPushLogin = async (account: string) => {\n setValidated(true)\n\n if (agreements?.length && !acceptedAgreements) {\n submitButtonRef?.current.onError()\n return\n }\n\n if (!account) {\n return message.error(t('login.enterAccount'))\n }\n\n const { statusCode, message: _message, data } = await signinByPush({\n account,\n })\n\n if (statusCode === 200) {\n setAccount(account)\n onPushSuccess({\n pushCodeId: data?.pushCodeId || '',\n })\n } else {\n message.error(_message)\n }\n }\n\n const onFinish = async (values: any) => {\n const { account } = values\n\n onPushLogin(account)\n }\n\n const [visible, setVisible] = useState<boolean>(false)\n\n const onCloseModal = () => {\n setVisible(false)\n }\n\n const openModal = () => {\n setVisible(true)\n }\n\n const placeholder = useMemo(() => {\n const methods =\n publicConfig.authingOtpPushTabConfig?.validLoginMethods || []\n\n // 登录注册合并\n if (config?.autoRegister) {\n return t('login.inputAccount', {\n text: getSortLabels(methods, i18nFields, defaultLanguageConfig),\n })\n }\n\n // 登录注册分页\n return t('login.inputAccount', {\n text: getSortLabels([...methods], i18nFields, defaultLanguageConfig),\n })\n }, [\n config?.autoRegister,\n i18nFields,\n defaultLanguageConfig,\n publicConfig.authingOtpPushTabConfig?.validLoginMethods,\n t,\n ])\n\n return (\n <div>\n {!pushLoginStatus && (\n <div className=\"push-login-error-tips-container\">\n <div className=\"push-login-error-warning-box\">\n <IconFont\n type=\"authing-error-warning-fill1\"\n className=\"icon-push-login-error-warning\"\n />\n <div>{t('login.getOtpLoginRequestAgain')}</div>\n </div>\n <div onClick={props.onchangePushLoginStatus}>\n <IconFont type=\"authing-close-line\" className=\"close-line\" />\n </div>\n </div>\n )}\n <Form onFinish={onFinish} form={form}>\n <Form.Item name=\"account\">\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n autoFocus={!isPhoneMedia}\n placeholder={placeholder}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n />\n </Form.Item>\n {Boolean(agreements?.length) && (\n <Agreements\n agreements={agreements}\n showError={validated}\n onChange={setAcceptedAgreements}\n />\n )}\n <Form.Item className=\"authing-g2-sumbit-form\">\n <SubmitButton\n text={t('login.loginText')}\n htmlType=\"submit\"\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n <div className=\"how-use-push-login\" onClick={openModal}>\n {t('login.howUsePushLogin')}?\n </div>\n <PushLoginGudeModal visible={visible} onClose={onCloseModal} />\n </div>\n )\n}\n","import React from 'react'\n\nimport { Button, Form } from 'antd'\n\nimport './styles.less'\n\nimport { IconFont } from '../../../IconFont'\n\nimport { useTranslation } from 'react-i18next'\n\ninterface PendingLoginProps {\n onCancelLogin: () => void\n}\n\nexport function PendingLogin(props: PendingLoginProps) {\n const onCancelLogin = () => {\n props.onCancelLogin()\n }\n\n const { t } = useTranslation()\n\n return (\n <>\n <div className=\"pending-tips\">\n <div className=\"code-success\">\n <IconFont type=\"authing-checkbox-circle-fill\" />\n </div>\n <div>{t('login.otpLoginPendingText')}</div>\n </div>\n <Form>\n <Form.Item className=\"authing-g2-sumbit-form\">\n <Button\n block\n style={{\n width: '348px',\n height: '44px',\n background: '#F2F3F5',\n borderRadius: '4px',\n border: 'none',\n }}\n onClick={onCancelLogin}\n >\n {t('login.authingOtpPushCancelLogin')}\n </Button>\n </Form.Item>\n </Form>\n </>\n )\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { useGuardHttp } from '../../../_utils/guardHttp'\n\nimport { BeforeLogin } from './BeforeLogin'\n\nimport { PendingLogin } from './PendingLogin'\n\nimport {\n OnPushSuccessProps,\n CheckPushCodeStatusProps,\n OnLoginProps,\n LoginStatus,\n LoginWithAuthingOtpPushProps,\n} from './types'\n\nimport { message } from 'antd'\n\nimport { useGuardPublicConfig } from '../../../_utils/context'\n\nimport { LoginMethods } from '../../../Type/application'\n\nexport function LoginWithAuthingOtpPush(props: LoginWithAuthingOtpPushProps) {\n const { onLoginSuccess, multipleInstance, agreements } = props\n\n const [loginStatus, setLoginStatus] = useState<LoginStatus>('before')\n\n const [pushCodeId, setPushCodeId] = useState<string>('')\n\n const [pushLoginStatus, setPushLoginStatus] = useState<boolean>(true)\n\n const timer = useRef<NodeJS.Timeout | undefined>()\n\n const [account, setAccount] = useState<string>('')\n\n const clearTimer = () => {\n timer.current && clearInterval(timer.current)\n }\n\n const { post, get } = useGuardHttp()\n\n const publicConfig = useGuardPublicConfig()\n\n const onPushSuccess = (props: OnPushSuccessProps) => {\n setLoginStatus('pending')\n setPushCodeId(props.pushCodeId)\n }\n\n const onCancelLogin = useCallback(() => {\n clearTimer()\n setLoginStatus('before')\n }, [])\n\n const onchangePushLoginStatus = useCallback((status: boolean = true) => {\n setPushLoginStatus(status)\n }, [])\n\n const signinByPush = async (props: OnLoginProps) => {\n const { account } = props\n const url = '/api/v3/signin-by-push'\n const body = {\n account,\n }\n return await post(url, body)\n }\n\n const checkPushCodeStatus = useCallback(\n async (props: CheckPushCodeStatusProps) => {\n const { pushCodeId } = props\n const url = `/api/v3/check-pushcode-status?pushCodeId=${pushCodeId}`\n return await get(url)\n },\n [get]\n )\n\n const getUserInfo = useCallback(\n async (accessToken: string) => {\n const url = '/api/v2/users/me/info'\n const config = {\n headers: {\n 'x-authing-userpool-id': publicConfig.userPoolId,\n authorization: `Bearer ${accessToken}`,\n },\n }\n return await get(url, {}, config)\n },\n [get, publicConfig.userPoolId]\n )\n\n const onPushLogin = async () => {\n const { statusCode, data, message: _message } = await checkPushCodeStatus({\n pushCodeId,\n })\n\n if (statusCode !== 200) {\n message.error(_message)\n onCancelLogin()\n return\n }\n\n if (data.status === 'AUTHORIZED') {\n const { access_token } = data.tokenSet\n\n clearTimer()\n\n const { code, data: _userInfo, message } = await getUserInfo(access_token)\n\n if (code === 200) {\n multipleInstance?.setLoginWay('input', LoginMethods.AuthingOtpPush)\n onLoginSuccess(_userInfo, message)\n return\n }\n }\n\n if (data.status !== 'PUSHED') {\n setPushLoginStatus(false)\n onCancelLogin()\n }\n }\n\n useEffect(() => {\n if (!pushCodeId) {\n return\n }\n\n timer.current = setInterval(onPushLogin, 1000)\n\n return () => {\n clearTimer()\n }\n }, [\n pushCodeId,\n checkPushCodeStatus,\n getUserInfo,\n onLoginSuccess,\n onCancelLogin,\n ])\n\n const loginStatusMap = {\n before: (\n <BeforeLogin\n defaultAccount={account}\n setAccount={setAccount}\n onPushSuccess={onPushSuccess}\n signinByPush={signinByPush}\n pushLoginStatus={pushLoginStatus}\n onchangePushLoginStatus={onchangePushLoginStatus}\n agreements={agreements}\n />\n ),\n pending: <PendingLogin onCancelLogin={onCancelLogin} />,\n }\n\n return <div>{loginStatusMap[loginStatus]}</div>\n}\n","import { useGuardIsAuthFlow } from '../_utils/context'\nimport { getGuardHttp } from '../_utils/guardHttp'\nimport { AuthingGuardResponse } from '../_utils/http'\nimport {\n CredentialCreationOptionsJSON,\n CredentialRequestOptionsJSON,\n PublicKeyCredentialWithAssertionJSON,\n PublicKeyCredentialWithAttestationJSON,\n} from '@github/webauthn-json'\nexport enum MfaBusinessAction {\n VerifyEmail = 'verify-email',\n VerifySms = 'verify-sms',\n VerifyTotp = 'verify-totp',\n VerifyFace = 'verify-face',\n AssociateFace = 'associate-face',\n PasskeyBind = 'passkey-bind',\n PasskeyVerify = 'passkey-verify',\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\ntype BindPasskeyContent = PublicKeyCredentialWithAttestationJSON\n\ninterface VerifyPasskeyContent {\n credential: PublicKeyCredentialWithAssertionJSON\n ticket: string\n}\n\ninterface GetPasskeyBindChallengeParams {\n mfaToken: string\n}\n\ninterface GetPasskeyVerifyChallengeParams {\n mfaToken: string\n}\n\nexport const GetPasskeyBindChallenge = async (\n content: GetPasskeyBindChallengeParams\n): Promise<AuthingGuardResponse<CredentialCreationOptionsJSON>> => {\n const { mfaToken } = content\n const { post } = getGuardHttp()\n\n return await post(\n '/api/v3/webauthn/mfa-bind/initialize',\n {},\n {\n headers: {\n authorization: `Bearer ${mfaToken}`,\n },\n }\n )\n}\n\nexport const GetPasskeyVerifyChallenge = async (\n content: GetPasskeyVerifyChallengeParams\n): Promise<\n AuthingGuardResponse<\n CredentialRequestOptionsJSON & {\n ticket: string\n }\n >\n> => {\n const { mfaToken } = content\n const { post } = getGuardHttp()\n\n return await post(\n '/api/v3/webauthn/mfa-verify/initialize',\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 [MfaBusinessAction.PasskeyBind]: (content: BindPasskeyContent) => {\n if (isFlow) {\n return authFlow(MfaBusinessAction.PasskeyBind, content)\n }\n\n // return AssociateFace(content)\n return null\n },\n [MfaBusinessAction.PasskeyVerify]: (content: VerifyPasskeyContent) => {\n if (isFlow) {\n return authFlow(MfaBusinessAction.PasskeyVerify, content)\n }\n\n // return AssociateFace(content)\n return null\n },\n }\n\n return request\n}\n","import React from 'react'\nimport { useState } from 'react'\nimport { get as getWebauthnCredential } from '@github/webauthn-json'\nimport {\n useGuardAppId,\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardPublicConfig,\n} from '../../../_utils/context'\nimport { GuardButton } from '../../../GuardButton'\nimport { IconFont } from '../../../IconFont'\nimport { useTranslation } from 'react-i18next'\nimport { requestClient } from '../../../_utils/http'\nimport { i18n } from '../../../_utils/locales'\nimport version from '../../../version/version'\nimport { CodeAction } from '../../..'\n\ninterface LoginWithPasskeyProps {\n onLoginSuccess: any\n onLoginFailed: any\n}\n\nexport const PasskeyButton = (props: LoginWithPasskeyProps) => {\n const { onLoginFailed, onLoginSuccess } = props\n\n const publicConfig = useGuardPublicConfig()\n const [abortController, setAbortController] = useState<AbortController>()\n const [loading, setLoading] = useState<boolean>(false)\n const { host } = useGuardFinallyConfig()\n const appId = useGuardAppId()\n const { responseIntercept } = useGuardHttpClient()\n const { t } = useTranslation()\n\n const createAbortSignal = () => {\n if (abortController) {\n abortController.abort()\n }\n const controller = new AbortController()\n setAbortController(controller)\n return controller.signal\n }\n\n // const isShowPasskey = useCallback(() => {\n // if (!publicConfig.passkeyEnabled) {\n // return false\n // }\n\n // return supported()\n // }, [publicConfig])\n\n const handleLogin = async () => {\n setLoading(true)\n try {\n const initializeApi = `${host}/api/v3/webauthn/login/initialize`\n\n const initializeRes = await fetch(initializeApi, {\n method: 'POST',\n body: JSON.stringify({}),\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 const initializeJson = await initializeRes.json()\n const {\n statusCode,\n data: challenge,\n message: tips,\n onGuardHandling: onInitGuardHandling,\n } = responseIntercept(initializeJson)\n\n if (statusCode !== 200) {\n const handMode = onInitGuardHandling?.()\n handMode === CodeAction.RENDER_MESSAGE &&\n onLoginFailed(statusCode, undefined, tips)\n return\n }\n\n challenge.mediation = 'required' as CredentialMediationRequirement\n challenge.signal = createAbortSignal()\n const ticket = challenge.ticket\n const assertion = await getWebauthnCredential(challenge)\n\n const finalizeApi = `${host}/api/v3/webauthn/login/finalize`\n const finalizeRes = await fetch(finalizeApi, {\n method: 'POST',\n body: JSON.stringify({\n credential: assertion,\n ticket,\n }),\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 const finalizeJson = await finalizeRes.json()\n const {\n statusCode: code2,\n data: tokenSet,\n message: tips2,\n onGuardHandling: onFinishGuardHandling,\n } = responseIntercept(finalizeJson)\n if (code2 !== 200) {\n const handMode = onFinishGuardHandling?.()\n handMode === CodeAction.RENDER_MESSAGE &&\n onLoginFailed(code2, undefined, tips2)\n return\n }\n onLoginSuccess(tokenSet)\n } catch (error: any) {\n onLoginFailed(500, undefined, error.message)\n } finally {\n setLoading(false)\n }\n }\n\n return (\n <>\n <GuardButton\n className=\"g2-guard-third-login-btn\"\n block\n loading={loading}\n size=\"large\"\n onClick={handleLogin}\n icon={\n <IconFont\n type=\"authing-slideshow-3-line\"\n style={{ fontSize: 16, marginRight: 8, color: '#215AE5' }}\n />\n }\n >\n {t('login.loginWithPasskey')}\n </GuardButton>\n </>\n )\n}\n","import React, {\n useEffect,\n useLayoutEffect,\n useState,\n useRef,\n useMemo,\n useCallback,\n FC,\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'\nimport { ResetAccountName } from './resetAccountName'\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 useGuardTenantProvider,\n} from '../_utils/context'\nimport { getPasswordIdentify, getSortTabs } from '../_utils'\nimport { LoginWithVerifyCode, SpecifyCodeMethods } 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 {\n LoginMethods,\n QrCodeItem,\n VerifyLoginMethods,\n} from '../Type/application'\nimport { useLoginMultiple } from './hooks/useLoginMultiple'\n\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\nimport { LoginWithAuthingOtpPush } from './core/withAuthingOtpPush/index'\nimport { PasskeyButton } from './socialLogin/PasskeyButton'\nimport { supported } from '@github/webauthn-json'\n\nconst inputWays = [\n LoginMethods.Password,\n LoginMethods.PhoneCode,\n LoginMethods.AD,\n LoginMethods.LDAP,\n LoginMethods.AuthingOtpPush,\n LoginMethods.EmailCode,\n LoginMethods.Passkey,\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 ([LoginMethods.LDAP, LoginMethods.AuthingOtpPush].includes(loginWay)) {\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}\n\nconst computedTabName = (str: string) => {\n if (str.length > 20) {\n return `${str.substring(0, 20)}...`\n }\n return str\n}\n\nexport const GuardLoginView: FC<{ isResetPage?: boolean }> = ({\n isResetPage = false,\n}) => {\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 console.log('renderQrcodeWay: ', renderInputWay, renderQrcodeWay)\n\n const agreementEnabled = config?.agreementEnabled\n\n const { t } = useTranslation()\n\n const [loginWay, setLoginWay] = useState(\n specifyDefaultLoginMethod || defaultMethod\n )\n\n useEffect(() => {\n console.log(\n 'loginWay: ',\n loginWay,\n specifyDefaultLoginMethod,\n defaultMethod\n )\n }, [loginWay])\n\n useGuardView({\n currentTab: loginWay,\n changeTab: setLoginWay,\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 const tenantProvider = useGuardTenantProvider()\n\n /** 页面相关标签 */\n const tags = useMemo(() => {\n return ([\n tenantProvider?.isTenantConsole() && {\n name: i18n.t('login.tenant.consoleManage'),\n },\n tenantProvider?.isTenantSSOLaunchPad() && {\n name: t('login.tenant.ssoPad'),\n },\n ] as Array<{\n name: string\n color?: string\n backgroundColor?: string\n }>).filter(Boolean)\n }, [t, tenantProvider])\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 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 = useCallback(\n (data: any, message?: string) => {\n events?.onLogin?.(data, client)\n },\n [client, events]\n )\n\n // 保存用户输入的手机号、邮箱,在点击 问题反馈时带上\n const saveIdentify = useCallback((type: LoginMethods, identity: string) => {\n identifyRef.current = {\n ...identifyRef.current,\n [type]: getPasswordIdentify(identity),\n }\n }, [])\n\n // 重置用户名页面\n useEffect(() => {\n if (isResetPage) {\n message.info({\n content: i18n.t('common.resetAccount.message'),\n className: 'g2-view-message-info',\n })\n }\n }, [isResetPage])\n\n const onLoginFailed = useCallback(\n (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 [errorNumber, events]\n )\n\n const onBeforeLogin = useCallback(\n (loginInfo: any) => {\n if (events?.onBeforeLogin) {\n return events?.onBeforeLogin?.(loginInfo, client)\n }\n return () => console.log('Guard not onBeforeLogin hooks')\n },\n [client, events]\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 // 获取登录 tab 多语言\n const {\n password: passwordI18n,\n verifyCode: verifyCodeI18n,\n ad: adI18n,\n ldap: ldapI18n,\n } =\n publicConfig?.ssoPageComponentDisplay?.loginMethodsI18nDisplaySettings || {}\n\n const PasswordTab = useMemo(\n () =>\n ms?.includes(LoginMethods.Password) && (\n <Tabs.TabPane\n key={LoginMethods.Password}\n tab={computedTabName(\n passwordI18n?.tab?.i18n?.[i18n.language] ||\n passwordI18n?.tab?.default ||\n t('login.pwdLogin')\n )}\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={config?.passwordLoginMethods ?? []}\n agreements={agreements}\n multipleInstance={multipleInstance}\n />\n </Tabs.TabPane>\n ),\n [\n agreements,\n ms,\n multipleInstance,\n backfillData,\n config,\n publicKey,\n loginWay,\n onBeforeLogin,\n saveIdentify,\n onLoginFailed,\n onLoginSuccess,\n t,\n passwordI18n,\n ]\n )\n\n const CodeTab = useMemo(() => {\n if (!ms?.includes(LoginMethods.PhoneCode)) {\n return <></>\n }\n\n // 是否开启了国际化短信功能\n const isInternationSms =\n publicConfig?.internationalSmsConfig?.enabled || false\n\n const tabs = []\n\n // 开启国际化短信时要将短信和邮箱 tab 拆分,方便下拉选取手机区号\n if (isInternationSms) {\n if (\n publicConfig.verifyCodeTabConfig?.enabledLoginMethods?.includes(\n 'phone-code'\n )\n ) {\n tabs.push(\n <Tabs.TabPane\n key={LoginMethods.PhoneCode}\n // TODO 需要适配控制台的配置\n tab={computedTabName(t('common.phoneCodeTab'))}\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 specifyCodeMethod={SpecifyCodeMethods.Phone}\n />\n </Tabs.TabPane>\n )\n }\n\n if (\n publicConfig.verifyCodeTabConfig?.enabledLoginMethods?.includes(\n 'email-code'\n )\n ) {\n tabs.push(\n <Tabs.TabPane\n key={LoginMethods.EmailCode}\n // TODO 需要适配控制台的配置\n tab={computedTabName(t('common.emailCodeTab'))}\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 specifyCodeMethod={SpecifyCodeMethods.Email}\n />\n </Tabs.TabPane>\n )\n }\n\n return tabs\n } else {\n return (\n <Tabs.TabPane\n key={LoginMethods.PhoneCode}\n tab={computedTabName(\n verifyCodeI18n?.tab?.i18n?.[i18n.language] ||\n verifyCodeI18n?.tab?.default ||\n t('common.verifyCodeLogin')\n )}\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 }\n }, [\n ms,\n publicConfig?.internationalSmsConfig?.enabled,\n publicConfig.verifyCodeTabConfig?.enabledLoginMethods,\n publicConfig?.verifyCodeLength,\n t,\n config?.autoRegister,\n onBeforeLogin,\n onLoginSuccess,\n onLoginFailed,\n saveIdentify,\n agreements,\n verifyLoginMethods,\n backfillData,\n multipleInstance,\n verifyCodeI18n?.tab?.i18n,\n verifyCodeI18n?.tab?.default,\n ])\n\n const LdapTab = useMemo(\n () =>\n ms?.includes(LoginMethods.LDAP) && (\n <Tabs.TabPane\n key={LoginMethods.LDAP}\n tab={computedTabName(\n ldapI18n?.tab?.i18n?.[i18n.language] ||\n ldapI18n?.tab?.default ||\n t('login.ldapLogin')\n )}\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 [\n agreements,\n backfillData,\n config?.autoRegister,\n config?.host,\n multipleInstance,\n onBeforeLogin,\n onLoginFailed,\n onLoginSuccess,\n publicKey,\n ms,\n t,\n ldapI18n,\n ]\n )\n\n const ADTab = useMemo(\n () =>\n ms?.includes(LoginMethods.AD) && (\n <Tabs.TabPane\n key={LoginMethods.AD}\n tab={computedTabName(\n adI18n?.tab?.i18n?.[i18n.language] ||\n adI18n?.tab?.default ||\n t('login.adLogin')\n )}\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 [\n agreements,\n backfillData,\n config?.autoRegister,\n multipleInstance,\n onBeforeLogin,\n onLoginFailed,\n onLoginSuccess,\n publicKey,\n ms,\n t,\n adI18n,\n ]\n )\n\n const WxMiniQrTab = useCallback(\n (item: QrCodeItem) => {\n return (\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 [canLoop, multipleInstance, onLoginSuccess, t]\n )\n\n const AppQrTab = useCallback(() => {\n return (\n <Tabs.TabPane key={LoginMethods.AppQr} tab={t('login.appScanLogin')}>\n <LoginWithAppQrcode\n multipleInstance={multipleInstance}\n onLoginSuccess={onLoginSuccess}\n canLoop={canLoop}\n />\n </Tabs.TabPane>\n )\n }, [canLoop, multipleInstance, onLoginSuccess, t])\n\n const WechatMpQrTab = useCallback(\n (item: QrCodeItem) => {\n return (\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 [canLoop, multipleInstance, onLoginSuccess, t]\n )\n\n const AuthingOtpPushTab = useMemo(() => {\n return (\n ms?.includes(LoginMethods.AuthingOtpPush) && (\n <Tabs.TabPane\n key={LoginMethods.AuthingOtpPush}\n tab={t('login.authingOtpPushLogin')}\n >\n <LoginWithAuthingOtpPush\n onLoginSuccess={onLoginSuccess}\n multipleInstance={multipleInstance}\n initData={backfillData}\n agreements={agreements}\n ></LoginWithAuthingOtpPush>\n </Tabs.TabPane>\n )\n )\n }, [ms, onLoginSuccess, t, backfillData, multipleInstance, agreements])\n\n const PasskeyTab = useMemo(() => {\n return (\n <Tabs.TabPane key={'passkey'} tab={'Passkey'}>\n <PasskeyButton\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n />\n </Tabs.TabPane>\n )\n }, [onLoginSuccess, onLoginFailed])\n\n // 登录方式对应 tab Component\n const tabMap = useMemo(() => {\n return {\n [LoginMethods.Password]: PasswordTab,\n [LoginMethods.PhoneCode]: CodeTab,\n [LoginMethods.LDAP]: LdapTab,\n [LoginMethods.AD]: ADTab,\n [LoginMethods.AuthingOtpPush]: AuthingOtpPushTab,\n [LoginMethods.Passkey]: PasskeyTab,\n }\n }, [PasswordTab, CodeTab, LdapTab, ADTab, AuthingOtpPushTab, PasskeyTab])\n\n const GeneralLoginComponent = useMemo(() => {\n const total = ms?.filter((tabName) =>\n [\n LoginMethods.Password,\n LoginMethods.PhoneCode,\n LoginMethods.LDAP,\n LoginMethods.AD,\n LoginMethods.AuthingOtpPush,\n LoginMethods.Passkey,\n ].includes(tabName)\n )\n\n if (total) {\n const tabs = getSortTabs(total, config.defaultLoginMethod ?? '').map(\n (tabName) =>\n tabMap[\n tabName as\n | LoginMethods.Password\n | LoginMethods.PhoneCode\n | LoginMethods.LDAP\n | LoginMethods.AD\n | LoginMethods.AuthingOtpPush\n | LoginMethods.Passkey\n ]\n )\n // if (publicConfig.passkeyEnabled && supported()) {\n // tabs.push(PasskeyTab)\n // }\n return tabs\n }\n return null\n }, [config, ms, tabMap])\n\n const QrCodeTabMap = useMemo(() => {\n return {\n [LoginMethods.AppQr]: AppQrTab,\n [LoginMethods.WechatMpQrcode]: WechatMpQrTab,\n [LoginMethods.WxMinQr]: WxMiniQrTab,\n }\n }, [AppQrTab, WechatMpQrTab, WxMiniQrTab])\n\n const CodeLoginComponent = useMemo(() => {\n const qrCodeMap: {\n [name: string]: {\n type: LoginMethods.WechatMpQrcode | LoginMethods.WxMinQr\n title: string\n id: string\n }\n } = {}\n\n Object.keys(qrcodeTabsSettings).forEach((key) => {\n qrcodeTabsSettings[key as LoginMethods].forEach((item) => {\n qrCodeMap[item.id] = {\n type: key as LoginMethods.WechatMpQrcode | LoginMethods.WxMinQr,\n title: item.title,\n id: item.id,\n }\n })\n })\n\n const loginMethodsSort =\n publicConfig.qrCodeSortConfig?.loginMethodsSort || []\n\n const sortWithType = (loginMethodsSort || []).map((key) => {\n return {\n key,\n type: qrCodeMap[key]?.type || LoginMethods.AppQr,\n }\n })\n\n const position = sortWithType?.findIndex(\n (item) => item.type === defaultMethod\n )\n\n if (position > 0) {\n const item = loginMethodsSort.splice(position, 1)\n loginMethodsSort.unshift(item[0])\n }\n\n return (loginMethodsSort || []).map((key) => {\n return qrCodeMap[key]\n ? QrCodeTabMap[qrCodeMap[key].type]?.(qrCodeMap[key])\n : QrCodeTabMap[LoginMethods.AppQr]()\n })\n }, [\n QrCodeTabMap,\n qrcodeTabsSettings,\n publicConfig.qrCodeSortConfig?.loginMethodsSort,\n defaultMethod,\n ])\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 {!isResetPage ? (\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 {GeneralLoginComponent?.flat()}\n </Tabs>\n </div>\n ) : (\n <ResetAccountName />\n )}\n\n <div className={`g2-tips-line`}>\n {!disableResetPwd && !isResetPage && (\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 {isResetPage && (\n <GuardButton\n type=\"link\"\n onClick={() => {\n changeModule?.(GuardModuleType.LOGIN)\n }}\n >\n {t('common.backLoginPage')}\n </GuardButton>\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 {CodeLoginComponent}\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: any) => {\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: {\n mfaPhone: userPhone,\n mfaToken,\n mfaPhoneCountryCode: phoneCountryCode,\n },\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 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 const _FACE_SCORE = publicConfig?.mfa?.faceScore ?? FACE_SCORE\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, apiCode } = result\n\n if (isFlowEnd) {\n props.mfaLogin(200, data)\n } else {\n if (\n apiCode === 1700 ||\n apiCode === 1701 ||\n apiCode === 1702 ||\n apiCode === 502\n ) {\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\">\n {props.initData?.faceMfaEnabled\n ? t('common.faceCheck')\n : t('common.faceText2')}\n </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 [MFAType.PASSKEY]: {\n title: () => 'Passkey',\n icon: 'authing-slideshow-3-line',\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 {\n create as createWebauthnCredential,\n get as getWebauthnCredential,\n CredentialCreationOptionsJSON,\n CredentialRequestOptionsJSON,\n} from '@github/webauthn-json'\n\nexport const registerPasskey = async (\n challenge: CredentialCreationOptionsJSON\n) => {\n try {\n const attestation = await createWebauthnCredential(challenge)\n return attestation\n } catch (error) {\n console.warn('browser register passkey error: ', error)\n }\n}\n\nexport const verifyPasskey = async (\n challenge: CredentialRequestOptionsJSON\n) => {\n try {\n const attestation = await getWebauthnCredential({\n mediation: 'required',\n ...challenge,\n })\n return attestation\n } catch (error) {\n console.warn('browser verify passkey error: ', error)\n }\n}\n","import React from 'react'\n\nimport { message } from 'antd'\n\nimport { useTranslation } from 'react-i18next'\n\nimport { ImagePro } from '../../ImagePro'\n\nimport { IconFont } from '../../IconFont'\n\nimport {\n GetPasskeyBindChallenge,\n GetPasskeyVerifyChallenge,\n MfaBusinessAction,\n useMfaBusinessRequest,\n} from '../businessRequest'\n\nimport SubmitButton from '../../SubmitButton'\n\nimport { MFAType } from '../interface'\nimport { useGuardPublicConfig } from '../../_utils/context'\nimport { registerPasskey, verifyPasskey } from '../../_utils/passkey'\n\ninterface BindPasskeyProps {\n mfaToken: string\n mfaLogin: (code: any, data: any, message?: string) => void\n mfaConfigsMap: Map<MFAType, boolean>\n}\ninterface VerifyPasskeyProps {\n mfaToken: string\n mfaLogin: (code: any, data: any, message?: string) => void\n}\n\nexport type MFAPasskeyProps = BindPasskeyProps &\n VerifyPasskeyProps & {\n // 用户在当前应用下是否绑定了 passkey\n passkeyEnabled: boolean\n }\n\nconst BindPasskey: React.FC<BindPasskeyProps> = (props) => {\n const { mfaToken, mfaLogin, mfaConfigsMap } = props\n const submitButtonRef = React.useRef<any>(null)\n const businessRequest = useMfaBusinessRequest()[MfaBusinessAction.PasskeyBind]\n\n let { t } = useTranslation()\n\n const publicConfig = useGuardPublicConfig()\n\n const cdnBase = publicConfig?.cdnBase\n\n const bindPasskey = async () => {\n submitButtonRef.current?.onSpin(true)\n try {\n const challenge = await GetPasskeyBindChallenge({\n mfaToken,\n })\n\n if (challenge.statusCode !== 200) {\n message.error(challenge.message)\n return\n }\n\n const attestation = await registerPasskey(challenge.data!)\n const { isFlowEnd, data, onGuardHandling } =\n (await businessRequest(attestation!)) || {}\n\n if (isFlowEnd) {\n mfaLogin(200, data)\n } else {\n submitButtonRef.current?.onError()\n onGuardHandling?.()\n }\n } catch (e) {\n console.warn('register passkey flow error: ', e)\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n }\n\n return (\n <>\n <h3 className=\"authing-g2-mfa-title\">{t('common.cratePasskeyTitle')}</h3>\n\n {!mfaConfigsMap.get(MFAType.PASSKEY) ? (\n <>\n <p className=\"authing-g2-mfa-tips\">{t('common.cratePasskeyTips')}</p>\n <ImagePro\n // className=\"g2-mfa-passkey-empty-image\"\n width={215}\n height={145}\n src={`${cdnBase}/passkey/guard-bind-passkey-press.png`}\n alt=\"\"\n className=\"g2-mfa-register-passkey-image\"\n />\n\n <SubmitButton\n onClick={bindPasskey}\n text={t('common.createNow')!}\n className=\"bind-passkey-btn\"\n htmlType=\"button\"\n ref={submitButtonRef}\n />\n </>\n ) : (\n <>\n <p className=\"authing-g2-mfa-tips\">\n {t('common.onBindPasskeyTitle')}\n </p>\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <IconFont\n type=\"authing-bianzu\"\n style={{ width: 178, height: 120 }}\n />\n </div>\n </>\n )}\n </>\n )\n}\n\nconst VerifyPasskey: React.FC<VerifyPasskeyProps> = (props) => {\n const { mfaToken, mfaLogin } = props\n const submitButtonRef = React.useRef<any>(null)\n const businessRequest = useMfaBusinessRequest()[\n MfaBusinessAction.PasskeyVerify\n ]\n\n let { t } = useTranslation()\n\n const publicConfig = useGuardPublicConfig()\n const cdnBase = publicConfig?.cdnBase\n\n const handleVerifyPasskey = React.useCallback(async () => {\n submitButtonRef.current?.onSpin(true)\n try {\n const challenge = await GetPasskeyVerifyChallenge({\n mfaToken,\n })\n\n if (challenge.statusCode !== 200) {\n message.error(challenge.message)\n return\n }\n\n const attestation = await verifyPasskey(challenge.data!)\n const { isFlowEnd, data, onGuardHandling } =\n (await businessRequest({\n credential: attestation!,\n ticket: challenge.data?.ticket || '',\n })) || {}\n\n if (isFlowEnd) {\n mfaLogin(200, data)\n } else {\n submitButtonRef.current?.onError()\n onGuardHandling?.()\n }\n } catch (e) {\n console.warn('verify passkey flow error: ', e)\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n }, [businessRequest, mfaLogin, mfaToken])\n\n return (\n <>\n <h3 className=\"authing-g2-mfa-title\">{t('common.passkeyVerifyTitle')}</h3>\n <p className=\"authing-g2-mfa-tips\">{t('common.passkeyVerifyTips')}</p>\n <ImagePro\n // className=\"g2-mfa-passkey-empty-image\"\n width={215}\n height={145}\n src={`${cdnBase}/passkey/guard-bind-passkey-press.png`}\n alt=\"\"\n className=\"g2-mfa-verify-passkey-image\"\n />\n\n <SubmitButton\n onClick={handleVerifyPasskey}\n text={t('common.reVerify')!}\n className=\"bind-passkey-btn\"\n htmlType=\"button\"\n ref={submitButtonRef}\n />\n </>\n )\n}\n\nexport const MFAPasskey: React.FC<MFAPasskeyProps> = (props) => {\n const { passkeyEnabled, mfaLogin, mfaToken, mfaConfigsMap } = props\n return passkeyEnabled ? (\n <VerifyPasskey mfaLogin={mfaLogin} mfaToken={mfaToken} />\n ) : (\n <BindPasskey\n mfaLogin={mfaLogin}\n mfaToken={mfaToken}\n mfaConfigsMap={mfaConfigsMap}\n />\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 useGuardPublicConfig,\n} from '../_utils/context'\nimport { BackCustom, BackLogin } from '../Back'\nimport { ChangeLanguage } from '../ChangeLanguage'\n\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\nimport { MFAPasskey } from './core/passkey'\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.mfaEmail}\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 [MFAType.PASSKEY]: ({\n config,\n initData,\n mfaLogin,\n setShowMethods,\n mfaConfigsMap,\n }) => (\n <MFAPasskey\n mfaToken={initData.mfaToken}\n mfaLogin={mfaLogin}\n passkeyEnabled={initData.passkeyEnabled}\n mfaConfigsMap={mfaConfigsMap}\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 publicConfig = useGuardPublicConfig()\n\n useGuardView()\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 const mfaConfigsMap: Map<MFAType, boolean> = useMemo(() => {\n const map = new Map()\n publicConfig.mfaBindConfigs?.forEach((item) => {\n map.set(item.mfa, !item.changeable)\n })\n return map\n }, [publicConfig])\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 mfaConfigsMap: mfaConfigsMap,\n })}\n </div>\n {showMethods && (\n <MFAMethods\n method={currentMethod}\n onChangeMethod={(type) => {\n setCurrentMethod(type)\n }}\n />\n )}\n <ChangeLanguage\n langRange={config?.langRange}\n onLangChange={events?.onLangChange}\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 />\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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\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 useGuardView()\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 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 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 RegisterByPassword = 'register-bind-by-password',\n RegisterByPhoneCode = 'register-bind-by-phone-code',\n RegisterByEmailCode = 'register-bind-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 type: 'register' | 'bind' = 'bind'\n) => {\n const { authFlow } = useGuardHttp()\n\n const request = {\n [IdentityBindingBusinessAction.PhoneCode]: (params: PhoneCodeParams) => {\n return authFlow(\n type === 'bind'\n ? IdentityBindingAction.BindByPhoneCode\n : IdentityBindingAction.RegisterByPhoneCode,\n params\n )\n },\n [IdentityBindingBusinessAction.EmailCode]: (params: EmailCodeParams) => {\n return authFlow(\n type === 'bind'\n ? IdentityBindingAction.BindByEmailCode\n : IdentityBindingAction.RegisterByEmailCode,\n params\n )\n },\n [IdentityBindingBusinessAction.Password]: (params: PasswordParams) => {\n return authFlow(\n type === 'bind'\n ? IdentityBindingAction.BindByPassword\n : IdentityBindingAction.RegisterByPassword,\n params\n )\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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\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 useGuardView()\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 = (\n currentMode: 'phone' | 'email' | string\n) => {\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, useCallback, useMemo } 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 { InputNumber } from '../../InputNumber'\nimport { useIsChangeComplete } from '../utils'\nimport {\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardModule,\n} from '../../_utils/context'\nimport { GuardModuleType } from '../../Guard'\nimport { parsePhone, useMediaSize } from '../../_utils/hooks'\nimport { ApiCode } from '../../_utils/responseManagement/interface'\nimport { usePasswordErrorText } from '../../_utils/useErrorText'\nimport { Agreement, ApplicationConfig } from '../../Type/application'\nimport { InputInternationPhone } from '../../Login/core/withVerifyCode/InputInternationPhone'\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 label?: string\n method?: string\n}\n\nexport const RegisterWithEmail: React.FC<RegisterWithEmailProps> = ({\n label,\n method,\n onRegisterSuccess,\n onRegisterFailed,\n onBeforeRegister,\n agreements,\n registeContext,\n publicConfig,\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(\n (method || 'email').split('-')[0]\n )\n const { changeModule } = useGuardModule()\n const { post } = useGuardHttpClient()\n\n const [acceptedAgreements, setAcceptedAgreements] = useState(false)\n const [validated, setValidated] = useState(false)\n\n // 区号 默认\n const [areaCode, setAreaCode] = useState(\n publicConfig?.internationalSmsConfig?.defaultISOType || 'CN'\n )\n const isInternationSms =\n publicConfig?.internationalSmsConfig?.enabled || false\n\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 || values.account,\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 let { email, password, account } = values\n\n // 加密密码\n const encrypt = authClient.options.encryptFunction\n const encryptPassword = await encrypt!(password, config.publicKey!)\n\n const context = registeContext ?? {}\n\n let phoneCountryCode\n\n if (method === 'phone-password') {\n const { phoneNumber, countryCode } = parsePhone(\n isInternationSms,\n account,\n areaCode\n )\n account = phoneNumber\n phoneCountryCode = countryCode\n }\n\n // 注册使用的详情信息\n const registerContent = {\n account, // 自定义字段登录用户名\n email,\n password: encryptPassword,\n phoneCountryCode,\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 || account,\n })\n }\n if (isChangeComplete) {\n changeModule?.(GuardModuleType.REGISTER_COMPLETE_INFO, {\n businessRequestName: method || '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-${(method || 'email').split('-')[0]}`,\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 const PhoneAccount = useCallback(\n (props) => {\n if (publicConfig && publicConfig.internationalSmsConfig?.enabled) {\n return (\n <InputInternationPhone\n {...props}\n className=\"authing-g2-input\"\n size=\"large\"\n areaCode={areaCode}\n onAreaCodeChange={(value: string) => {\n setAreaCode(value)\n form.getFieldValue(['phone']) && form.validateFields(['phone'])\n }}\n maxLength={20}\n />\n )\n } else {\n return (\n <InputNumber\n {...props}\n className=\"authing-g2-input\"\n size=\"large\"\n placeholder={t('login.inputPhone')}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n maxLength={11}\n />\n )\n }\n },\n [areaCode, form, publicConfig, t]\n )\n\n const AccountForm = useMemo(() => {\n if (!method) return null\n\n if (method === 'phone-password') {\n return (\n <CustomFormItem.Phone\n key=\"account\"\n name=\"account\"\n className={\n publicConfig?.internationalSmsConfig?.enabled\n ? 'authing-g2-input-form remove-padding'\n : 'authing-g2-input-form'\n }\n validateFirst={true}\n form={form}\n checkRepeat={true}\n required={true}\n areaCode={areaCode}\n >\n <PhoneAccount autoFocus={!isPhoneMedia} />\n </CustomFormItem.Phone>\n )\n }\n return (\n <CustomFormItem.CustomName\n method={method?.split('-')[0]}\n key={method}\n name=\"account\"\n className=\"authing-g2-input-form\"\n validateFirst={true}\n form={form}\n checkRepeat={true}\n required={true}\n >\n <Input\n maxLength={50}\n autoFocus={!isPhoneMedia}\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n size=\"large\"\n placeholder={t('login.inputAccount', {\n text: label,\n })}\n prefix={\n <IconFont\n type=\"authing-a-user-line1\"\n style={{ color: '#878A95' }}\n />\n }\n ></Input>\n </CustomFormItem.CustomName>\n )\n }, [\n PhoneAccount,\n method,\n isPhoneMedia,\n areaCode,\n label,\n t,\n form,\n publicConfig?.internationalSmsConfig?.enabled,\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 form.validateFields(['new-password'])\n }\n }}\n >\n {/* 新建自定义注册 */}\n {method && label ? (\n AccountForm\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 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 )}\n\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 {\n useGuardFinallyConfig,\n useGuardModule,\n useIsForeignUserpool,\n} 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'\nimport { getCaptchaUrl } from '../../_utils/getCaptchaUrl'\nimport { GraphicVerifyCode } from '../../Login/core/withPassword/GraphicVerifyCode'\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 const [captchaCode, setCaptchaCode] = useState('')\n // 是否仅开启国际化短信\n const [isOnlyInternationSms, setInternationSms] = useState(false)\n // 是否开启了国际化短信功能\n const isInternationSms =\n publicConfig?.internationalSmsConfig?.enabled || false\n\n const isForeignUserpool = useIsForeignUserpool()\n const [verifyCodeUrl, setVerifyCodeUrl] = useState('')\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 useEffect(() => {\n /** 如果是国外用户池,那么有图形验证码,需要请求图片 */\n if (isForeignUserpool) {\n setVerifyCodeUrl(getCaptchaUrl(config.host!))\n }\n }, [isForeignUserpool, config?.host])\n\n useEffect(() => {\n // 方法发生变化时,图像验证码数据应该清空\n if (isForeignUserpool) {\n form?.setFieldsValue({ captchaCode: undefined })\n }\n }, [form, currentMethod, isForeignUserpool])\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: any) => {\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 await form.validateFields(['captchaCode'])\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 captchaCode={captchaCode}\n onSendCodeBefore={async () => {\n await form.validateFields(['identify'])\n await form.validateFields(['captchaCode'])\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 captchaCode,\n ]\n )\n\n // 为了 refresh input\n const AreaCodePhoneAccount = useCallback(\n (props: any) => {\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 {/* 图形验证码 国外用户池并且是手机号 */}\n {isForeignUserpool && currentMethod === InputMethod.PhoneCode && (\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(config.host!))}\n onChange={(e) => {\n setCaptchaCode(e.target.value)\n }}\n />\n </Form.Item>\n )}\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, { useEffect, useMemo, useState } 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 {\n getI18nLabel,\n getLoginTypePipe,\n getSortTabs,\n transformMethod,\n} from '../_utils'\nimport { fallbackLng, i18n } from '../_utils/locales'\nimport {\n useGuardDefaultLanguage,\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardModule,\n useGuardPublicConfig,\n} from '../_utils/context'\nimport { GuardLoginInitData } from '../Login/interface'\nimport {\n RegisterMethods,\n RegisterSortMethods,\n TabFieldsI18nItem,\n} from '../Type/application'\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\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 defaultLanguageConfig = useGuardDefaultLanguage()\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 [RegisterSortMethods.Email]: {\n component: <RegisterWithEmail {...registerContextProps} />,\n name: t('common.EmailRegister'),\n },\n [RegisterSortMethods.Phone]: {\n component: <RegisterWithCode {...registerContextProps} />,\n name: verifyCodeLogin,\n },\n }\n }, [registerContextProps, t, verifyRegisterMethods])\n\n // i18nFields 数据\n const i18nFields = useMemo(() => {\n const i18nMap = new Map<string, TabFieldsI18nItem>()\n publicConfig.tabMethodsFields.forEach((item) => {\n i18nMap.set(item.key, item)\n })\n return i18nMap\n }, [publicConfig.tabMethodsFields])\n\n const [activeKey, setActiveKey] = useState<string>('')\n\n const defaultMethod = useMemo(() => {\n return (\n config.defaultRegisterMethod &&\n transformMethod(config.defaultRegisterMethod)\n )\n }, [config.defaultRegisterMethod])\n\n useEffect(() => {\n if (defaultMethod) {\n setActiveKey(defaultMethod)\n }\n }, [defaultMethod])\n\n useGuardView({\n currentTab: activeKey,\n changeTab: setActiveKey,\n })\n\n const renderTab = useMemo(() => {\n const { registerMethods = [] } = config\n\n // registerMethods 处理,改版后支持自定义 method\n const filterRegisterMethods = [\n ...new Set(\n [...registerMethods]?.map((method) => {\n return transformMethod(method)\n })\n ),\n ]\n\n return getSortTabs(filterRegisterMethods, defaultMethod).map((method) => {\n const tab = tabMapping[method]\n const name = getI18nLabel(method, i18nFields, defaultLanguageConfig)\n return (\n <Tabs.TabPane\n tab={tab?.name || t('common.registerTab', { text: name })}\n key={method}\n >\n {tab?.component || (\n <RegisterWithEmail\n label={name}\n method={method}\n {...registerContextProps}\n />\n )}\n </Tabs.TabPane>\n )\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n config,\n tabMapping,\n publicConfig,\n defaultMethod,\n i18nFields,\n i18n.language,\n registerContextProps,\n defaultLanguageConfig,\n t,\n ])\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={defaultMethod}\n activeKey={activeKey}\n onChange={(activeKey) => {\n setActiveKey(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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\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 useGuardView()\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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nexport const GuardIdentityBindingView: React.FC<{\n skipAsk?: boolean // 是否跳过询问页面\n}> = ({ skipAsk = false }) => {\n const initData = useGuardInitData<GuardIdentityBindingInitData>()\n\n const config = useGuardFinallyConfig()\n\n const { backModule } = useGuardModule()\n\n useGuardView()\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 bindType = skipAsk ? 'register' : 'bind'\n const phoneCodeRequest = useIdentityBindingBusinessRequest(bindType)[\n IdentityBindingBusinessAction.PhoneCode\n ]\n const emailCodeRequest = useIdentityBindingBusinessRequest(bindType)[\n IdentityBindingBusinessAction.EmailCode\n ]\n const PasswordRequest = useIdentityBindingBusinessRequest(bindType)[\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 bindText = useMemo(() => {\n if (skipAsk) {\n return `${t('common.bind')} / ${t('common.register')}`\n }\n return t('common.bind')\n }, [skipAsk, t])\n\n const methods = [\n {\n key: 'code',\n title: t('common.verifyCodeLogin'),\n component: (\n <LoginWithVerifyCode\n verifyCodeLength={publicConfig?.verifyCodeLength}\n autoRegister={!!skipAsk}\n onLoginRequest={onBind}\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n agreements={agreements}\n methods={codeLoginMethods}\n submitButText={bindText}\n />\n ),\n },\n {\n key: 'password',\n title: t('login.bindPwdLogin'),\n component: (\n <LoginWithPassword\n publicKey={publicKey!}\n autoRegister={!!skipAsk}\n host={config.host}\n onLoginRequest={onBind}\n passwordLoginMethods={passwordLoginMethods}\n // onLogin={onLogin}\n onLoginSuccess={onLoginSuccess}\n onLoginFailed={onLoginFailed}\n agreements={agreements}\n submitButText={bindText}\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>\n {skipAsk\n ? t('common.identityBindingSkipAskTitle')\n : t('common.identityBindingTitle')}\n </span>\n </div>\n <div className=\"g2-view-identity-binding-content-desc\">\n <span>\n {skipAsk\n ? t('common.identityBindingSkipAskDesc')\n : t('common.identityBindingDesc')}\n </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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nexport const GuardIdentityBindingAskView: React.FC = () => {\n const initData = useGuardInitData<GuardIdentityBindingAskInitData>()\n\n const { changeModule } = useGuardModule()\n\n useGuardView()\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 { GuardSelectAccountView } from '../../SelectAccount'\nimport { GuardSelectAccount2LoginView } from '../../SelectAccount2Login'\nimport { GuardTenantPortalSelectView } from '../../TenantPortalSelect'\nimport { GuardNewSubmitSuccessView } from '../../NewSubmitSuccess'\nimport { GuardApplicationView } from '../../Invitation/Application'\nimport { GuardMessageView } from '../../Message'\nimport { GuardAuthenticationView } from '../../Invitation/AuthenticationBind'\nimport { GuardInviteCompleteView } from '../../Invitation/Complete'\nimport { GuardInviteExpireView } from '../../Invitation/Error'\nimport { GuardInviteSuccessView } from '../../Invitation/Success'\n\nconst PREFIX_CLS = 'authing-ant'\n\nmessage.config({\n prefixCls: `${PREFIX_CLS}-message`,\n})\n\nexport enum LangMAP {\n zhCn = 'zh-CN',\n enUs = 'en-US',\n 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 [GuardModuleType.RESET_ACCOUNT_NAME]: (key: string) => (\n <GuardLoginView key={key} isResetPage />\n ),\n // 身份源绑定\n [GuardModuleType.IDENTITY_BINDING]: (key: string) => (\n <GuardIdentityBindingView key={key} />\n ),\n // 身份源绑定 跳过询问页面\n [GuardModuleType.IDENTITY_BINDING_NO_ASK]: (key: string) => (\n <GuardIdentityBindingView key={key} skipAsk={true} />\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.FLOW_SELECT_ACCOUNT]: (key) => (\n <GuardSelectAccountView key={key} />\n ),\n // 切换登录身份\n [GuardModuleType.SELECT_ACCOUNT_2_LOGIN]: (key: string) => (\n <GuardSelectAccount2LoginView key={key} />\n ),\n [GuardModuleType.TENANT_PORTAL]: (key) => <GuardTenantPortalSelectView />,\n [GuardModuleType.New_SUBMIT_SUCCESS]: (key) => (\n <GuardNewSubmitSuccessView key={key} />\n ),\n [GuardModuleType.APPLY_INVITATION]: (key) => (\n <GuardApplicationView key={key} />\n ),\n [GuardModuleType.MESSAGE]: (key) => <GuardMessageView key={key} />,\n [GuardModuleType.INVITE_AUTH]: (key) => (\n <GuardAuthenticationView key={key} />\n ),\n [GuardModuleType.INVITE_COMPLETE]: (key) => (\n <GuardInviteCompleteView key={key} />\n ),\n [GuardModuleType.INVITE_EXPIRE]: (key) => (\n <GuardInviteExpireView key={key} />\n ),\n [GuardModuleType.INVITE_PAGE_EXPIRE]: (key) => (\n <GuardInviteExpireView key={key} />\n ),\n [GuardModuleType.INVITE_SUCCESS]: (key) => (\n <GuardInviteSuccessView key={key} />\n ),\n }\n\n // 初始化 请求拦截器 (Error Code)\n useEffect(() => {\n if (!httpClient || !changeModule) return\n\n // 错误码处理回调 切换 module 和 错误信息提示\n const errorCodeCb = (\n code: CodeAction,\n res: AuthingResponse\n ): AuthingGuardResponse => {\n // 判断有没有 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\n style={defaultMergedConfig.style}\n className={`authing-g2-render-module ${\n defaultMergedConfig.__internalRequest__\n ? ''\n : 'authing-g2-render-module-normal'\n }`}\n >\n {renderGuardContent}\n </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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\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 useGuardView()\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 { User } from 'authing-js-sdk'\nimport React, { useCallback, useMemo } from 'react'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { ImagePro } from '../ImagePro'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardInitData,\n} from '../_utils/context'\nimport './style.less'\n\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nexport const GuardSelectAccountView = () => {\n const config = useGuardFinallyConfig()\n const events = useGuardEvents()\n const authClient = useGuardAuthClient()\n const { post } = useGuardHttpClient()\n const loadingComponent = useMemo(() => {\n return config.loadingComponent\n }, [config.loadingComponent])\n const initData = useGuardInitData<{\n accounts: User[]\n i18n: string\n }>()\n\n useGuardView()\n\n const onClick = useCallback(\n async (user: User) => {\n const { isFlowEnd, data, onGuardHandling } = await post(\n '/interaction/federation/binding/select',\n {\n account: user.id,\n }\n )\n if (isFlowEnd) {\n events?.onLogin?.(data, authClient)\n } else {\n onGuardHandling?.()\n }\n },\n [authClient, post, events]\n )\n const renderList = useMemo(() => {\n if (!initData || !initData?.accounts) {\n return null\n }\n return initData?.accounts.map((user: any) => {\n const { id, photo, phone, email, username, nickname, name } = user\n const title = name || nickname || username || undefined\n const description = phone || email\n return (\n <li\n className=\"g2-select-account__li\"\n key={id}\n onClick={() => onClick(user)}\n >\n <img className=\"g2-select-account__avatar\" alt=\"\" src={photo || ''} />\n <div className=\"g2-select-account__body\">\n {title && <span className=\"g2-select-account__title\">{title}</span>}\n <span\n className={title ? 'g2-multiple__desc' : 'g2-multiple__title'}\n >\n {description}\n </span>\n </div>\n </li>\n )\n })\n }, [onClick, initData])\n const title = useMemo(() => {\n if (!initData) return ''\n return initData.i18n\n }, [initData])\n return (\n <>\n {!initData ? (\n loadingComponent\n ) : (\n <div className=\"g2-view-container\">\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\">{title}</div>\n </div>\n <div className=\"g2-view-tabs\">\n <ul className=\"g2-select-account_wrapper\">{renderList}</ul>\n </div>\n </div>\n )}\n </>\n )\n}\n","import { User } from 'authing-js-sdk'\nimport React, { useCallback } from 'react'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { Space } from 'antd'\nimport { useTranslation } from 'react-i18next'\nimport { ImagePro } from '../ImagePro'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardInitData,\n} from '../_utils/context'\nimport { getGuardHttp } from '../_utils/guardHttp'\nimport './style.less'\n\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nexport const GuardSelectAccount2LoginView = () => {\n const config = useGuardFinallyConfig()\n const events = useGuardEvents()\n const { t } = useTranslation()\n const authClient = useGuardAuthClient()\n const { post } = useGuardHttpClient()\n\n const initData = useGuardInitData<{\n accounts: any[]\n myself: any\n i18n: string\n }>()\n\n const accounts = initData?.accounts ?? []\n const myself = initData?.myself ?? {}\n const i18n = initData?.i18n\n const users = [myself, ...accounts]\n\n useGuardView()\n const { authFlow } = getGuardHttp()\n\n const onClick = useCallback(\n async (user: User & { userId: string }) => {\n const { isFlowEnd, data, onGuardHandling } = await authFlow(\n 'public-account-login-selection',\n {\n userId: user.userId,\n }\n )\n if (isFlowEnd) {\n events?.onLogin?.(data, authClient!) // 登录成功\n } else {\n onGuardHandling?.()\n }\n },\n [authClient, post, events]\n )\n\n return (\n <>\n {!initData ? (\n config.loadingComponent\n ) : (\n <div className=\"g2-view-container g2-view-container-2-login\">\n <div className=\"g2-view-header\">\n <ImagePro\n src={config?.logo!}\n size={42}\n borderRadius={4}\n alt=\"\"\n className=\"icon\"\n />\n <div className=\"title\">{i18n}</div>\n </div>\n <div className=\"g2-view-tabs\">\n <ul className=\"g2-select-account-2-login_wrapper\">\n {users.map((user: any, index: number) => {\n return (\n <li\n className=\"g2-select-account-2-login__li\"\n key={index}\n onClick={() => onClick(user)}\n >\n <img\n className=\"g2-select-account-2-login__avatar\"\n alt={user.userId}\n src={user.avatar || ''}\n />\n <div className=\"g2-select-account-2-login__body\">\n {user.displayName && (\n <Space className=\"g2-select-account-2-login__title\">\n {user.displayName}\n {+user.usertype === 2 && (\n <Space className=\"g2-select-account-2-login__des\">\n {t('common.publicAccount')}\n </Space>\n )}\n </Space>\n )}\n <Space className={'g2-multiple__tel'}>\n {user?.phone || '-'}\n </Space>\n </div>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n )}\n </>\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 { omit } from 'lodash'\nimport React, { useCallback, useMemo } from 'react'\n\nimport {\n useGuardCurrentModule,\n useGuardEvents,\n useGuardHttpClient,\n useGuardInitData,\n} from '../_utils/context'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { GuardFace } from '../GuardFace'\nimport { GuardSelect } from '../GuardSelect'\nimport { IconFont } from '../IconFont'\nimport {\n TenantPortalDataItem,\n TenantPortalDataType,\n TenantPortalSelectType,\n} from './interface'\n\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nexport const GuardTenantPortalSelectView = () => {\n const { moduleName } = useGuardCurrentModule()\n const {\n list,\n title,\n description,\n logo,\n } = useGuardInitData<TenantPortalDataType>()\n const events = useGuardEvents()\n const authClient = useGuardAuthClient()\n const http = useGuardHttpClient()\n\n useGuardView()\n\n const handleSelect = useCallback(\n async (item?: TenantPortalDataItem) => {\n const metaData = omit<TenantPortalDataItem>(item, [\n 'avatar',\n 'extra',\n 'userName',\n 'title',\n ]) as TenantPortalSelectType\n events?.onTenantSelect?.(metaData)\n if (item?.host) {\n http.setBaseUrl(item?.host)\n } else {\n http.setBaseUrl(window.location.origin)\n }\n if (!item?.isUserPool && item?.tenantId) {\n http.setTenantId(item?.tenantId)\n } else {\n http.setTenantId('') //使用前重置,防止其他环境设置污染,便于状态可控\n }\n\n const { isFlowEnd, onGuardHandling, data } = await http.authFlow(\n moduleName\n )\n if (isFlowEnd) {\n setTimeout(() => events?.onLogin?.(data, authClient)) // 让选择事件先行,登录成功宏任务异步,方便异步并发\n } else {\n onGuardHandling?.()\n }\n },\n [authClient, events, http, moduleName]\n )\n\n const dataSource = useMemo<TenantPortalDataItem[]>(\n () =>\n list?.map?.((it) => ({\n ...it,\n title: it.tenantName!,\n description: it.userName!,\n avatar: { size: 40, src: it.tenantLogo! },\n extra: (\n <IconFont\n type=\"authing-arrow-left-s-line\" // 没有右箭头,使用左箭头旋转\n className=\"authing-gaurd-select-extra-icon\"\n />\n ),\n })) as TenantPortalDataItem[],\n [list]\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 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\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nexport const GuardNewSubmitSuccessView: 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 useGuardView()\n\n const {\n title = t('login.resetPassword.successTip'),\n message = t('login.resetPassword.successTipMsg'),\n text = t('login.resetPassword.back'),\n countDesc = t('login.resetPassword.backLogin'),\n // changeModule = GuardModuleType.LOGIN,\n needBack = true,\n goBack = () => __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 needBack && goBack?.()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [countDown, needBack, goBack])\n\n return (\n <div className=\"g2-view-container g2-submit-success g2-view-container-submit-success\">\n <div className=\"g2-view-tabs g2-questions-send-success-pageWrap\">\n <ImagePro\n className=\"plate-submit-success\"\n src={`${cdnBase}/questions-send-ok.png`}\n alt=\"\"\n width={157}\n height={120}\n />\n <div className=\"success-page-title \">{title}</div>\n <div className=\"success-page-message\">{message}</div>\n {needBack && (\n <>\n <SubmitButton\n className=\"success-page-btn\"\n onClick={() => {\n goBack?.()\n }}\n text={text as string}\n />\n <div className=\"success-page-timer-tip\">\n {countDown} {countDesc}\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n","import React, { useRef, useState, useCallback, useEffect } from 'react'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardInitData,\n useGuardModule,\n useGuardPublicConfig,\n} from '../../_utils/context'\nimport { Form, Input, Select, DatePicker, message, notification } from 'antd'\n\nimport { ChangeLanguage } from '../../ChangeLanguage'\nimport SubmitButton from '../../SubmitButton'\nimport { useTranslation } from 'react-i18next'\nimport CustomFormItem from '../../ValidatorRules'\nimport { InputInternationPhone } from '../../Login/core/withVerifyCode/InputInternationPhone'\nimport { InputNumber } from '../../InputNumber'\nimport { IconFont } from '../../IconFont'\nimport { useMediaSize } from '../../_utils/hooks'\nimport './style.less'\nimport { i18n } from '../../_utils/locales'\nimport { fieldRequiredRule } from '../../_utils'\nimport { SendCodeByEmail } from '../../SendCode/SendCodeByEmail'\nimport { EmailScene } from '../../Type'\nimport { GuardModuleType } from '../../Guard'\nimport { useGuardHttp } from '../../_utils/guardHttp'\n\nexport const GuardApplicationView = () => {\n const { t } = useTranslation()\n\n const config = useGuardFinallyConfig()\n const events = useGuardEvents()\n const initData = useGuardInitData<{\n identifier: string\n inviter: any\n userPool: any\n }>()\n\n const { changeModule } = useGuardModule()\n\n const publicConfig = useGuardPublicConfig()\n\n const { get, post } = useGuardHttp()\n\n const [form] = Form.useForm()\n\n let submitButtonRef = useRef<any>(null)\n\n const verifyCodeLength = publicConfig?.verifyCodeLength\n\n // const [inviter, setInviter] = useState('')\n\n // const getConfig = useCallback(async () => {\n // const { data } = await get(\n // `/api/v3/get-universal-invitation-public-config?identifier=${initData?.identifier}`\n // )\n // setInviter(data.inviter.displayName)\n // }, [initData])\n\n // useEffect(() => {\n // getConfig()\n // }, [getConfig])\n\n const onFinishHandle = async () => {\n try {\n submitButtonRef.current?.onSpin(true)\n const { statusCode, message: msg, data } = await post(\n '/api/v3/signup-by-invitation',\n {\n ...form.getFieldsValue(),\n identifier: initData?.identifier,\n profile: {\n ...form.getFieldsValue(),\n },\n }\n )\n if (statusCode !== 200) {\n message.error(msg)\n } else {\n changeModule?.(GuardModuleType.MESSAGE, {\n message:\n data.status === 'PENDING'\n ? t('common.pendingMsg', [config.title])\n : t('common.doneMsg'),\n })\n }\n } catch (error) {\n } finally {\n submitButtonRef.current?.onSpin(false)\n }\n }\n\n return (\n <div className=\"g2-view-container g2-view-invitation-apply\">\n <div className=\"g2-view-container-inner\">\n <div className=\"g2-view-header\">\n <img src={initData?.userPool?.logo} alt=\"\" className=\"icon\" />\n <div className=\"g2-view-header-container\">\n <div className=\"invitation-welcome\">\n {initData?.inviter?.displayName} {t('common.welcomeJoin')}\n </div>\n <div className=\"title\">{initData?.userPool?.name}</div>\n </div>\n </div>\n\n <div className=\"g2-view-content\">\n <Form\n layout=\"vertical\"\n name=\"et-pre-check-email\"\n onFinish={onFinishHandle}\n onFinishFailed={() => submitButtonRef.current.onError()}\n autoComplete=\"off\"\n form={form}\n className=\"authing-g2-form-required-item-icon-after\"\n // onValuesChange={formValuesChange}\n >\n <Form.Item\n name=\"name\"\n label={t('common.name')}\n rules={[{ required: true }]}\n className=\"authing-g2-input-form\"\n >\n <Input\n type=\"text\"\n size=\"large\"\n className=\"authing-g2-input\"\n autoComplete=\"off\"\n />\n </Form.Item>\n <CustomFormItem.Email\n className=\"authing-g2-input-form\"\n name=\"email\"\n checkRepeat={true}\n label={i18n.t('common.email')}\n key=\"internal email:email13\"\n validateFirst={true}\n required\n >\n <Input\n className=\"authing-g2-input\"\n autoComplete=\"email\"\n size=\"large\"\n placeholder={t('login.inputEmail') as string}\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={fieldRequiredRule(t('common.captchaCode'))}\n >\n <SendCodeByEmail\n className=\"authing-g2-input g2-send-code-input\"\n autoComplete=\"one-time-code\"\n size=\"large\"\n placeholder={\n t('common.inputFourVerifyCode', {\n length: verifyCodeLength,\n }) as string\n }\n maxLength={verifyCodeLength}\n data={''}\n scene={EmailScene.VERIFY_CODE}\n fieldName=\"email\"\n form={form}\n onSendCodeBefore={async () => {\n // closeCheckSendUser 开启时,由 onFinish 统一校验\n if (!publicConfig?.closeCheckSendUser) {\n await form.validateFields(['email'])\n } else {\n Promise.resolve(true)\n }\n }}\n />\n </Form.Item>\n <Form.Item className=\"authing-g2-sumbit-form\">\n <SubmitButton\n text={t('common.applyJoin') as string}\n className=\"password\"\n ref={submitButtonRef}\n />\n </Form.Item>\n </Form>\n </div>\n <ChangeLanguage\n langRange={config?.langRange}\n onLangChange={events?.onLangChange}\n />\n </div>\n </div>\n )\n}\n","import React from 'react'\n\nimport { i18n } from '../_utils/locales'\n\nimport './styles.less'\n\nimport { useGuardInitData, useGuardPublicConfig } from '../_utils/context'\n\nimport { useGuardView } from '../Guard/core/hooks/useGuardView'\n\nconst { useMemo } = React\n\nexport interface MessageProps {\n message?: React.ReactNode\n}\n\nexport interface GuardMessageProps {\n initData?: MessageProps\n}\n\nexport const GuardMessageView: React.FC<MessageProps> = (propsInitData) => {\n const guardXInitData = useGuardInitData<MessageProps>()\n\n const publicConfig = useGuardPublicConfig()\n\n useGuardView()\n\n const messages = useMemo(() => {\n const message = propsInitData?.message || guardXInitData?.message\n\n return `${message}` || `${i18n.t('user.contactAdministrator')}`\n }, [guardXInitData?.message, propsInitData?.message])\n\n return (\n <div className=\"g2-view-container g2-view-message\">\n <div className=\"g2-message-content\">\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <div\n style={{\n width: 135,\n height: 103,\n backgroundImage: `url(${publicConfig.cdnBase}/authing_message.svg?v=1)`,\n backgroundSize: 'contain',\n }}\n />\n </div>\n <span\n className=\"g2-message-text\"\n dangerouslySetInnerHTML={{ __html: messages }}\n />\n </div>\n </div>\n )\n}\n","import { message as messageNote } from 'antd'\nimport React from 'react'\nimport { GuardModuleType } from '../Guard/module'\nimport { useGuardAuthClient } from '../Guard/authClient'\nimport { Lang } from '../Type'\nimport {\n useGuardEvents,\n useGuardHttpClient,\n useGuardModule,\n} from '../_utils/context'\nimport { getGuardHttp } from '../_utils/guardHttp'\n\nconst { useCallback } = React\nexport interface InviteContext {\n // autoLogin: boolean\n token: string\n email: string | null\n ticket: string\n enabledIdentifierCodeConfig: boolean\n enabledInfoFill: boolean\n // enabledExtIdpBind: boolean\n allowSkipBindExtIdp: boolean\n sendVerifyCodeMethod: 'prioritySMS' | 'priorityEmail'\n // receiverType: 'emailCode' | 'phoneCode'\n phoneCountryCode: string | null\n phone: string | null\n username: string | null\n name: string | null\n // verifyCodeMaxLength: number\n verifyCodeMaxErrCount: number\n extendsFieldsI18n?: {\n [key: string]: Record<Lang, { enabled: boolean; value: string }>\n }\n extendsFieldsOptions?: {\n key: string\n options: {\n value: string\n label: string\n }[]\n }[]\n extendsFields: any\n registerInfoFillMsg?: string\n}\n\nexport interface GuardInviteLoginInitData extends Partial<InviteContext> {\n canBack?: boolean\n verifyAccount: string\n context: any\n originModule: GuardModuleType\n originContext: any\n}\n\nexport interface GuardInviteCompleteInitData\n extends Partial<GuardInviteLoginInitData> {\n metaData: any\n}\nexport interface GuardInviteIdentityBindInitData\n extends Partial<GuardInviteLoginInitData> {\n weComConfig: {\n QRConfig: any\n id: string\n isDefault: boolean\n title: string\n }\n\n isNew: boolean // 是否是新版服务提供商\n\n socialConnections: any[]\n}\n\nexport interface EyGuardProtocolInitData {\n onAcceptHandle: () => void\n onRejectHandle: () => void\n mode: 'Guard' | 'Portal'\n}\n\nexport interface EyLoginProps {\n onBeforeLogin?: (loginInfo: any) => void\n onLoginSuccess?: (data: any, message?: string) => void\n onLoginFailed?: (code: number, data: any, message?: string) => void\n}\n\nexport const useRegisterHandleHook = (\n initData: any,\n submitButtonRef?: {\n current: { onSpin: (arg0: boolean) => void }\n }\n) => {\n const authClient = useGuardAuthClient()\n\n const events = useGuardEvents()\n\n const { post } = useGuardHttpClient()\n\n const { authFlow } = getGuardHttp()\n\n const { changeModule } = useGuardModule()\n\n // 核心注册接口\n const onRegisterHandle = useCallback(\n async (context) => {\n const onBeforeRegister = events?.onBeforeRegister\n if (onBeforeRegister) {\n try {\n const canRegister = await onBeforeRegister(\n {\n type: context.verifyType,\n data: context,\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 messageNote.error(e)\n } else {\n messageNote.error(e?.message)\n }\n submitButtonRef?.current?.onSpin(false)\n return\n }\n }\n\n const res = await post('/api/v3/join-by-invitation', context)\n const { statusCode, code, apiCode, data, onGuardHandling, message } = res\n if (statusCode === 200) {\n events?.onRegister?.(data, authClient)\n changeModule?.(GuardModuleType.INVITE_SUCCESS)\n } else {\n onGuardHandling?.()\n events?.onRegisterError?.({\n code,\n data,\n message,\n })\n }\n },\n [authClient, authFlow, changeModule, events, post, submitButtonRef]\n )\n return onRegisterHandle\n}\n","import { Form } from 'antd'\nimport React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { EmailScene } from '../../Type'\nimport { useGuardView } from '../../Guard/core/hooks/useGuardView'\nimport { SceneType } from 'authing-js-sdk'\nimport { ChangeLanguage } from '../../ChangeLanguage'\nimport { extendsFieldsToMetaData } from '../../CompleteInfo/utils'\nimport { GuardModuleType } from '../../Guard'\nimport { VerifyCodeInput } from '../../MFA/VerifyCodeInput'\nimport { VerifyCodeFormItem } from '../../MFA/VerifyCodeInput/VerifyCodeFormItem'\nimport { SendCodeBtn } from '../../SendCode/SendCodeBtn'\nimport SubmitButton from '../../SubmitButton'\nimport { mailDesensitization, phoneDesensitization } from '../../_utils'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardHttpClient,\n useGuardInitData,\n useGuardModule,\n useGuardPublicConfig,\n} from '../../_utils/context'\nimport { InviteContext, useRegisterHandleHook } from '../interface'\nimport './style.less'\n\nconst { useCallback, useEffect, useMemo, useRef, useState } = React\n\nexport const GuardAuthenticationView = () => {\n const initData = useGuardInitData<InviteContext>()\n\n const events = useGuardEvents()\n\n const config = useGuardFinallyConfig()\n\n const { t } = useTranslation()\n\n const verifyCodeRef = useRef<any>(null)\n\n useGuardView()\n\n const { changeModule } = useGuardModule()\n\n const { post } = useGuardHttpClient()\n\n const publicConfig = useGuardPublicConfig()\n\n const verifyCodeLength = publicConfig?.verifyCodeLength\n\n const [form] = Form.useForm()\n\n const submitButtonRef = useRef<any>(null)\n\n const [disabled, setDisabled] = useState<boolean>(true)\n\n const [verifyType, setVerifyType] = useState<'emailCode' | 'smsCode'>(\n initData.sendVerifyCodeMethod === 'prioritySMS' && initData.phone\n ? 'smsCode'\n : 'emailCode'\n )\n const btnRef = useRef(null)\n\n const verifyAccount = useMemo(() => {\n if (verifyType === 'emailCode') {\n return initData.email\n } else if (verifyType === 'smsCode') {\n return initData.phone\n }\n }, [initData.email, initData.phone, verifyType])\n\n const descConstants: any = useMemo(() => {\n const constants = {\n prioritySMS: {\n emailCode: {\n desc: t('common.sendSms'),\n show: initData.phone,\n receiverType: 'smsCode',\n },\n smsCode: {\n desc: t('common.sendEmail'),\n show: initData.email,\n receiverType: 'emailCode',\n },\n },\n priorityEmail: {\n emailCode: {\n desc: t('common.sendSms'),\n show: initData.phone,\n receiverType: 'smsCode',\n },\n smsCode: {\n desc: t('common.sendEmail'),\n show: initData.email,\n receiverType: 'emailCode',\n },\n },\n }\n const codeMethod = initData.sendVerifyCodeMethod\n if (['prioritySMS', 'priorityEmail'].some((type) => codeMethod === type)) {\n return {\n ...(constants[codeMethod] as any)[verifyType],\n }\n }\n return constants[codeMethod]\n }, [initData, t, verifyType])\n\n const reSendVerifyCode = useCallback(\n async (params) =>\n await post(\n params.receiverType === 'emailCode'\n ? '/api/v2/email/send'\n : '/api/v2/sms/send',\n {\n ...params,\n scene:\n params.receiverType === 'emailCode'\n ? EmailScene.REGISTER_VERIFY_CODE\n : SceneType.SCENE_TYPE_REGISTER,\n }\n ),\n [post]\n )\n\n const onRegisterHandle = useRegisterHandleHook(initData, submitButtonRef)\n\n const onFinishHandle = async (formValues: any) => {\n const captcha = formValues.code?.join('') || ''\n\n const res = await post('/api/v3/verify-invite-code', {\n code: captcha,\n receiverType: verifyType,\n token: initData.token,\n })\n\n const { statusCode, onGuardHandling } = res\n if (statusCode === 200) {\n const {\n extendsFields = [],\n extendsFieldsOptions = [],\n enabledInfoFill,\n } = initData\n\n const context = {\n code: captcha,\n token: initData.token,\n receiverType: verifyType,\n }\n\n // 开启补全\n const needCompleteData = extendsFields?.filter(\n (field: { name: string; type: string }) => {\n if (field.name === 'email' && field.type === 'internal') {\n return !initData.email\n }\n if (field.name === 'phone' && field.type === 'internal') {\n return !initData.phone\n }\n if (field.name === 'username' && field.type === 'internal') {\n return !initData.username\n }\n if (field.name === 'name' && field.type === 'internal') {\n return !initData.name\n }\n return true\n }\n )\n\n const metaData = extendsFieldsToMetaData(\n needCompleteData,\n extendsFieldsOptions\n )\n\n if (enabledInfoFill && metaData.length > 0) {\n changeModule?.(GuardModuleType.INVITE_COMPLETE, {\n ...initData,\n // ...data,\n verifyAccount,\n metaData: metaData,\n originModule: GuardModuleType.INVITE_AUTH,\n originContext: initData,\n context,\n })\n } else {\n await onRegisterHandle(context)\n }\n } else {\n onGuardHandling?.()\n }\n }\n\n useEffect(() => {\n verifyCodeRef.current && verifyCodeRef.current?.click()\n }, [])\n\n const onSend = async (type: 'default' | 'reSend') => {\n const receiverType =\n type === 'default' ? verifyType : descConstants.receiverType\n const res = await reSendVerifyCode({\n phone: initData.phone,\n phoneCountryCode: initData.phoneCountryCode,\n email: initData.email,\n receiverType,\n })\n if (res.code === 200) {\n setVerifyType(receiverType)\n return true\n } else {\n res.onGuardHandling?.()\n return false\n }\n }\n\n return (\n <div className=\"g2-view-container g2-view-invite\">\n <div className=\"g2-invite-content\">\n <div className=\"g2-view-invite-header\">\n <div className=\"title\">{t('common.inputCaptcha')}</div>\n <div className=\"tips\">\n {t('common.verifyAccount', [\n verifyAccount &&\n (verifyType === 'emailCode'\n ? mailDesensitization(verifyAccount)\n : phoneDesensitization(verifyAccount)),\n ])}\n </div>\n <div className=\"tips errorTips\">\n {t('common.captchaMaxErrorCount', [initData.verifyCodeMaxErrCount])}\n </div>\n </div>\n <Form\n form={form}\n onFinish={onFinishHandle}\n onFinishFailed={() => submitButtonRef.current?.onError()}\n // onValuesChange={v => {\n // const codes: string[] = v.code\n // if (\n // codes.filter(code => Boolean(code)).length >= verifyCodeLength\n // ) {\n // setDisabled(false)\n // } else {\n // setDisabled(true)\n // }\n // }}\n >\n <VerifyCodeFormItem codeLength={verifyCodeLength} name=\"code\">\n <VerifyCodeInput\n length={verifyCodeLength}\n showDivider={true}\n gutter={'10px'}\n onFinish={() => {\n setDisabled(false)\n }}\n />\n </VerifyCodeFormItem>\n <div className=\"resend_container\">\n <SendCodeBtn\n btnRef={verifyCodeRef}\n beforeSend={async () => await onSend('default')}\n type=\"link\"\n />\n </div>\n <SubmitButton\n text={t('login.nextStep') as string}\n ref={submitButtonRef}\n disabled={disabled}\n />\n </Form>\n {descConstants?.show && (\n <div className=\"resend_container\">\n <SendCodeBtn\n btnRef={btnRef}\n sendDesc={descConstants.desc}\n beforeSend={async () => await onSend('reSend')}\n type=\"link\"\n className=\"resend_code\"\n />\n </div>\n )}\n <ChangeLanguage\n langRange={config?.langRange}\n onLangChange={events?.onLangChange}\n />\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { ChangeLanguage } from '../../ChangeLanguage'\nimport { CompleteInfo } from '../../CompleteInfo/core/completeInfo'\nimport { CompleteInfoRequest } from '../../CompleteInfo/interface'\nimport { fieldValuesToRegisterProfile } from '../../CompleteInfo/utils'\nimport {\n useGuardEvents,\n useGuardFinallyConfig,\n useGuardInitData,\n useGuardModule,\n} from '../../_utils/context'\nimport { BackCustom } from '../../Back'\nimport {\n GuardInviteCompleteInitData,\n useRegisterHandleHook,\n} from '../interface'\nimport './style.less'\n\nexport const GuardInviteCompleteView = () => {\n const initData = useGuardInitData<GuardInviteCompleteInitData>()\n\n const config = useGuardFinallyConfig()\n\n const events = useGuardEvents()\n\n const { t } = useTranslation()\n const {\n metaData,\n extendsFieldsI18n,\n extendsFields,\n canBack = true,\n registerInfoFillMsg,\n } = initData\n\n const { changeModule } = useGuardModule()\n\n const onRegisterHandle = useRegisterHandleHook(initData)\n\n const nextStepHandle = async (data: CompleteInfoRequest) => {\n const { fieldValues } = data\n\n const { registerProfile, udf } = fieldValuesToRegisterProfile(\n extendsFields!,\n fieldValues\n )\n\n let phonePassCodeForInformationCompletion = null\n let emailPassCodeForInformationCompletion = null\n if (Reflect.has(registerProfile, 'phoneToken')) {\n phonePassCodeForInformationCompletion = registerProfile.phoneToken\n Reflect.deleteProperty(registerProfile, 'phoneToken')\n }\n if (Reflect.has(registerProfile, 'emailToken')) {\n emailPassCodeForInformationCompletion = registerProfile.emailToken\n Reflect.deleteProperty(registerProfile, 'emailToken')\n }\n\n const complete = {\n profile: {\n ...registerProfile,\n customData: udf,\n // 扩展字段\n },\n options: {\n phonePassCodeForInformationCompletion,\n emailPassCodeForInformationCompletion,\n },\n }\n const context = {\n ...initData.context,\n ...complete,\n }\n await onRegisterHandle?.(context)\n }\n\n return (\n <div className=\"g2-view-container g2-complete-info g2-invitation-complete\">\n <div className=\"g2-view-header\">\n {canBack && initData?.originModule && (\n <BackCustom\n onBack={() => {\n initData?.originModule &&\n changeModule?.(initData.originModule, initData.originContext)\n }}\n >\n {t('common.back')}\n </BackCustom>\n )}\n <div className=\"content\">\n <div className=\"title\">{t('common.invitation.completeInfo')}</div>\n <div className=\"title-explain\">\n {registerInfoFillMsg\n ? registerInfoFillMsg\n : t('common.invitation.completeInfoDesc')}\n </div>\n </div>\n </div>\n <div className=\"g2-view-tabs g2-completeInfo-content\">\n <CompleteInfo\n extendsFieldsI18n={extendsFieldsI18n}\n metaData={metaData}\n businessRequest={nextStepHandle}\n />\n </div>\n <ChangeLanguage\n langRange={config?.langRange}\n onLangChange={events?.onLangChange}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { GuardErrorView } from '../../Error'\nimport './style.less'\nimport { GuardModuleType } from '../../Guard'\nimport { useTranslation } from 'react-i18next'\n\nexport const GuardInviteExpireView = (props: any) => {\n const { t } = useTranslation()\n\n return (\n <GuardErrorView\n error={{\n name: 'invite_expire',\n message:\n props.key === GuardModuleType.INVITE_EXPIRE\n ? t('common.inviteExpired')\n : t('common.pageExpired'),\n }}\n />\n )\n}\n","import React from 'react'\nimport { GuardMessageView } from '../../Message'\nimport { useTranslation } from 'react-i18next'\n\nexport const GuardInviteSuccessView = () => {\n const { t } = useTranslation()\n\n return <GuardMessageView message={t('common.inviteSuccess')} />\n}\n","import { GuardModuleType } from '../../Guard'\n\nexport enum CodeAction {\n // 切换 Module\n CHANGE_MODULE = 'changeModule',\n // 渲染 错误信息\n RENDER_MESSAGE = 'renderMessage',\n // 流程 结束\n FLOW_END = 'flowEnd',\n}\n\nexport enum ApiCode {\n IDENTITY_BINDING_ASK = 1641,\n\n IDENTITY_BINDING = 1640,\n\n IDENTITY_BINDING_NO_ASK = 1666,\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 FLOW_SELECT_ACCOUNT = 2921,\n SELECT_ACCOUNT_2_LOGIN = 2930,\n\n TENANT_PORTAL = 1644,\n\n RESET_ACCOUNT_NAME = 1108, // 用户名重复\n INVITE_EXPIRE = 4032, // 链接过期\n INVITE_PAGE_EXPIRE = 4033,\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.IDENTITY_BINDING_NO_ASK]: GuardModuleType.IDENTITY_BINDING_NO_ASK,\n [ApiCode.RESET_ACCOUNT_NAME]: GuardModuleType.RESET_ACCOUNT_NAME,\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.FLOW_SELECT_ACCOUNT]: GuardModuleType.FLOW_SELECT_ACCOUNT,\n [ApiCode.SELECT_ACCOUNT_2_LOGIN]: GuardModuleType.SELECT_ACCOUNT_2_LOGIN,\n [ApiCode.TENANT_PORTAL]: GuardModuleType.TENANT_PORTAL,\n [ApiCode.INVITE_EXPIRE]: GuardModuleType.INVITE_EXPIRE,\n [ApiCode.INVITE_PAGE_EXPIRE]: GuardModuleType.INVITE_PAGE_EXPIRE,\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 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 setDeviceId(deviceId: string) {\n this.headers['x-authing-device-id'] = deviceId\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: AuthingGuardResponse\n ) => {\n if (this.responseInterceptorMap.size === 0) return res\n\n const interceptors = Array.from(this.responseInterceptorMap.values())\n\n return interceptors.reduce((acc, cur) => cur(acc), res)\n }\n}\n\nexport const initGuardHttp = (baseUrl: string) => {\n if (!httpClient) {\n const guardHttp = new GuardHttp(baseUrl)\n httpClient = guardHttp\n }\n\n return httpClient\n}\n\nexport const getGuardHttp = () => {\n if (!httpClient) {\n throw new Error('Please initialize Http Client')\n }\n\n return httpClient\n}\n\nexport const useGuardHttp = () => getGuardHttp()\n","import { 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 { 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 RegisterSortMethods,\n TabFieldsI18nItem,\n} from '../Type/application'\nimport { LngTextMapping } from '../ChangeLanguage'\nimport { Lang } from '../Type'\nimport { getGuardHttp } from './guardHttp'\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 object = 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('.')}${port && `:${port}`\n }`\n}\n\n// 拼接请求链接\nexport const assembledRequestHost = (\n requestHostname: string,\n configHost: string\n) => {\n const identifier = requestHostname.split('.')[0]\n\n const hostUrl = new URL(configHost)\n const splitHost = hostUrl.hostname.split('.')\n\n splitHost.shift()\n\n // 看看是否有端口号\n const port = hostUrl.port\n\n return `${hostUrl.protocol}//${identifier}.${splitHost.join('.')}${\n port && `:${port}`\n }`\n}\n\nexport enum PasswordStrength {\n NoCheck,\n Low,\n Middle,\n High,\n AUTO,\n Custom,\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 [PasswordStrength.Custom]: {\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 userId?: string\n): Rule[] => {\n const { post } = getGuardHttp()\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 [PasswordStrength.Custom]: [\n // ...required,\n {\n validateTrigger: 'onBlur',\n async validator(r, v) {\n if (!v || v?.length === 0) {\n return Promise.reject(i18n.t('login.inputPwd'))\n } else {\n const res = await post(`/api/v2/password/user-action/check`, {\n password: v,\n userId,\n })\n if (res?.code === 200) {\n if (res?.data?.valid) {\n return Promise.resolve(true)\n } else {\n return Promise.reject(res?.data?.message)\n }\n } else {\n return Promise.reject(res?.message)\n }\n }\n },\n },\n ],\n }\n\n return validateMap[strength]\n}\n\nexport const getPasswordValidateRules = (\n strength: PasswordStrength = PasswordStrength.NoCheck,\n customPasswordStrength: any = {},\n customValidateTrigger?: string,\n fieldRequiredRuleMessage?: string,\n userId?: string\n): Rule[] => {\n const { post } = getGuardHttp()\n const required = [\n ...fieldRequiredRule(i18n.t('common.password'), fieldRequiredRuleMessage),\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: customValidateTrigger,\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: customValidateTrigger,\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: customValidateTrigger,\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: customValidateTrigger,\n pattern: customPasswordStrength?.regex,\n message: getCustomPassword(),\n },\n ],\n [PasswordStrength.Custom]: [\n // ...required,\n {\n validateTrigger: customValidateTrigger,\n async validator(r, v) {\n if (!v || v?.length === 0) {\n return Promise.reject(i18n.t('login.inputPwd'))\n } else {\n const res = await post(`/api/v2/password/user-action/check`, {\n password: v,\n userId,\n })\n if (res?.code === 200) {\n if (res?.data?.valid) {\n return Promise.resolve(true)\n } else {\n return Promise.reject(res?.data?.message)\n }\n } else {\n return Promise.reject(res?.message)\n }\n }\n },\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 transformMethod = (method: RegisterMethods | string) => {\n switch (method) {\n case RegisterMethods.Phone:\n case RegisterMethods.EmailCode:\n case RegisterSortMethods.EmailCode:\n return RegisterSortMethods.Phone\n case RegisterMethods.Email:\n return RegisterSortMethods.Email\n default:\n return method\n }\n}\n\nexport const transformSortMethod = (method: RegisterSortMethods | string) => {\n switch (method) {\n case RegisterSortMethods.Email:\n return RegisterMethods.Email\n case RegisterSortMethods.EmailCode:\n return RegisterMethods.EmailCode\n case RegisterSortMethods.Phone:\n return RegisterMethods.Phone\n default:\n return method\n }\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\nexport const regexFromString = (string: string) => {\n var match = /^\\/(.*)\\/([a-z]*)$/.exec(string)\n if (match) {\n return new RegExp(match[1], match[2])\n }\n return null\n}\nexport const getI18nLabel = (\n method: string | RegisterSortMethods,\n i18nFields: Map<string, TabFieldsI18nItem>,\n defaultLanguageConfig: Lang\n) => {\n const lang = getCurrentLng()\n const key = method.split('-')[0]\n if (i18nFields.get(key)) {\n return (\n (i18nFields.get(key) as TabFieldsI18nItem)?.i18n?.[lang] ??\n (i18nFields.get(key) as TabFieldsI18nItem)?.i18n?.[\n defaultLanguageConfig\n ] ??\n (i18nFields.get(key) as TabFieldsI18nItem).label\n )\n }\n return ''\n}\n\nexport const getSortLabels = (\n methods: string[],\n i18nConfig: Map<string, TabFieldsI18nItem>,\n defaultLanguageConfig: Lang\n) => {\n let labels: string[] = []\n methods.forEach((v) => {\n const label = getI18nLabel(v, i18nConfig, defaultLanguageConfig)\n if (label) {\n labels.push(label)\n }\n })\n\n return labels.join(' / ')\n}\n\n// tab 排序\nexport const getSortTabs = (tabs: string[], tab?: string) => {\n const position = tabs.findIndex((item) => item === tab)\n\n if (position > 0) {\n const item = tabs.splice(position, 1)\n tabs.unshift(item[0])\n }\n\n return tabs\n}\n\nexport const getPhoneInLoginPageContext = () => {\n const search = qs.parse(window.location.search, {\n ignoreQueryPrefix: true,\n })\n\n try {\n if (search.login_page_context) {\n const customData = JSON.parse(search.login_page_context as string)\n return customData.phone || ''\n }\n } catch (e) {\n return ''\n }\n}\n","export 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","import {\n assembledRequestHost as utilAssembledRequestHost,\n getPhoneInLoginPageContext,\n transformSortMethod,\n} 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'\nimport { supported } from '@github/webauthn-json'\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 autoRegister =\n config.autoRegister ??\n publicConfig.ssoPageComponentDisplay.autoRegisterThenLoginHintInfo\n\n const registerMethods = publicConfig.passwordTabConfig.validRegisterMethods?.concat(\n publicConfig.verifyCodeTabConfig?.validRegisterMethods?.map((item) =>\n transformSortMethod(item)\n ) || []\n )\n\n const phone = getPhoneInLoginPageContext()\n const defaultLoginMethod = phone && LoginMethods.PhoneCode\n const hasPasskey = publicConfig.passkeyEnabled && supported()\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.validLoginMethods ??\n [],\n // 默认登录方式\n defaultLoginMethod:\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 registerMethods:\n config.registerMethods ??\n (autoRegister\n ? 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 if (hasPasskey) {\n mergedPublicConfig.loginMethods?.push(LoginMethods.Passkey)\n }\n return mergedPublicConfig\n}\n\n// host 拼接\n// const 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 const assembledRequestHost = (\n configHost: string,\n publicConfigHost: string\n ) => {\n const configUrl = new URL(configHost)\n\n if (configUrl.hostname === 'core.authing.cn') {\n return configUrl.protocol + '//' + publicConfigHost\n }\n\n return configHost\n }\n\n return useMemo(() => {\n if (publicConfig && config && pageConfig) {\n return {\n finallyConfig: {\n ...mergedPublicConfig(config, publicConfig),\n host: assembledRequestHost(config.host, publicConfig.requestHostname),\n },\n guardPageConfig: pageConfig,\n }\n } else {\n return {\n finallyConfig: undefined,\n guardPageConfig: undefined,\n }\n }\n }, [config, pageConfig, publicConfig])\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport reportWebVitals from './reportWebVitals'\nimport * as facePlugin from 'face-api.js'\nimport { Guard, GuardMode } from './components'\n// import { AuthenticationClient } from 'authing-js-sdk'\n\nconst App = () => {\n return (\n <div\n style={{\n display: 'flex',\n width: '100vw',\n justifyContent: 'center',\n alignItems: 'center',\n WebkitUserSelect: 'none',\n minHeight: '100vh',\n background: '#F5F7FA',\n }}\n >\n {/* https://login-ua.ey.com.cn/64d35e46593c027140aaaba9/invitation-register?app_id=64d35e46593c027140aaaba9&invited_user=6540d88acc5aa2278974af02 */}\n <Guard\n appId=\"6541e5daaf3dc81d89f69910\"\n config={{\n host: 'https://console.pre.authing.cn',\n // defaultScenes: 'ey_protocols',\n }}\n facePlugin={facePlugin}\n onBeforeLogin={(data) => {\n console.log('bbbb', data)\n return true\n }}\n onLoginError={(err) => {\n console.log('err: ', err)\n }}\n onLogin={(data) => {\n console.log('data: ', data)\n }}\n />\n {/* <button\n onClick={() => {\n authenticationClient.logout()\n }}\n >\n 退出登录\n </button> */}\n </div>\n )\n}\n\nReactDOM.render(<App />, document.getElementById('root'))\n\nreportWebVitals()\n"],"sourceRoot":""}