@authing/react-ui-components 3.0.2-Beta.0 → 3.0.2-beta.10

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 (262) hide show
  1. package/lib/index.d.ts +466 -45
  2. package/lib/index.min.css +2 -2
  3. package/lib/index.min.js +1 -1
  4. package/package.json +26 -10
  5. package/.eslintignore +0 -6
  6. package/.eslintrc.js +0 -7
  7. package/.prettierrc +0 -5
  8. package/.vscode/settings.json +0 -31
  9. package/build/asset-manifest.json +0 -26
  10. package/build/favicon.ico +0 -0
  11. package/build/index.html +0 -1
  12. package/build/logo192.png +0 -0
  13. package/build/logo512.png +0 -0
  14. package/build/manifest.json +0 -25
  15. package/build/robots.txt +0 -3
  16. package/build/static/css/2.9512539b.chunk.css +0 -3
  17. package/build/static/css/2.9512539b.chunk.css.map +0 -1
  18. package/build/static/css/main.0ff9e24a.chunk.css +0 -2
  19. package/build/static/css/main.0ff9e24a.chunk.css.map +0 -1
  20. package/build/static/js/2.1105ecfb.chunk.js +0 -3
  21. package/build/static/js/2.1105ecfb.chunk.js.LICENSE.txt +0 -102
  22. package/build/static/js/2.1105ecfb.chunk.js.map +0 -1
  23. package/build/static/js/3.fd17f196.chunk.js +0 -2
  24. package/build/static/js/3.fd17f196.chunk.js.map +0 -1
  25. package/build/static/js/main.a47645ff.chunk.js +0 -2
  26. package/build/static/js/main.a47645ff.chunk.js.map +0 -1
  27. package/build/static/js/runtime-main.ef138021.js +0 -2
  28. package/build/static/js/runtime-main.ef138021.js.map +0 -1
  29. package/build/static/media/loading.4a67a5f3.svg +0 -29
  30. package/components/AuthingDropdown/index.tsx +0 -52
  31. package/components/AuthingDropdown/style.less +0 -43
  32. package/components/AuthingGuard/AppMFALayout/index.tsx +0 -74
  33. package/components/AuthingGuard/AppMFALayout/style.less +0 -12
  34. package/components/AuthingGuard/CompleteUserInfoLayout/index.tsx +0 -29
  35. package/components/AuthingGuard/CompleteUserInfoLayout/style.less +0 -8
  36. package/components/AuthingGuard/Forms/ADLoginForm/index.tsx +0 -117
  37. package/components/AuthingGuard/Forms/Agreements/index.tsx +0 -81
  38. package/components/AuthingGuard/Forms/Agreements/style.less +0 -44
  39. package/components/AuthingGuard/Forms/CompleteUserInfoForm/index.tsx +0 -139
  40. package/components/AuthingGuard/Forms/EmailMfaVerifyForm/CheckEmailForm.tsx +0 -84
  41. package/components/AuthingGuard/Forms/EmailMfaVerifyForm/VerifyCodeForm.tsx +0 -116
  42. package/components/AuthingGuard/Forms/EmailMfaVerifyForm/index.tsx +0 -40
  43. package/components/AuthingGuard/Forms/EmailMfaVerifyForm/style.less +0 -0
  44. package/components/AuthingGuard/Forms/EmailRegisterForm/index.tsx +0 -181
  45. package/components/AuthingGuard/Forms/EmailRegisterForm/style.less +0 -0
  46. package/components/AuthingGuard/Forms/LdapLoginForm/index.tsx +0 -166
  47. package/components/AuthingGuard/Forms/LdapLoginForm/style.less +0 -0
  48. package/components/AuthingGuard/Forms/LoginFormFooter/index.tsx +0 -76
  49. package/components/AuthingGuard/Forms/LoginFormFooter/style.less +0 -6
  50. package/components/AuthingGuard/Forms/MfaResetCodeForm/Step1.tsx +0 -86
  51. package/components/AuthingGuard/Forms/MfaResetCodeForm/Step2.tsx +0 -53
  52. package/components/AuthingGuard/Forms/MfaResetCodeForm/index.tsx +0 -65
  53. package/components/AuthingGuard/Forms/MfaResetCodeForm/style.less +0 -20
  54. package/components/AuthingGuard/Forms/MfaVerifyForm/index.tsx +0 -105
  55. package/components/AuthingGuard/Forms/MfaVerifyForm/style.less +0 -12
  56. package/components/AuthingGuard/Forms/PasswordLoginForm/index.tsx +0 -261
  57. package/components/AuthingGuard/Forms/PhoneCodeLoginForm/index.tsx +0 -133
  58. package/components/AuthingGuard/Forms/PhoneRegisterForm/index.tsx +0 -202
  59. package/components/AuthingGuard/Forms/QrCodeLoginForm/index.tsx +0 -59
  60. package/components/AuthingGuard/Forms/QrCodeLoginForm/style.less +0 -14
  61. package/components/AuthingGuard/Forms/RegisterFormFooter/index.tsx +0 -56
  62. package/components/AuthingGuard/Forms/RegisterFormFooter/style.less +0 -0
  63. package/components/AuthingGuard/Forms/ResetPwdForm/Footer.tsx +0 -21
  64. package/components/AuthingGuard/Forms/ResetPwdForm/Step1.tsx +0 -86
  65. package/components/AuthingGuard/Forms/ResetPwdForm/Step2.tsx +0 -127
  66. package/components/AuthingGuard/Forms/ResetPwdForm/Step3.tsx +0 -141
  67. package/components/AuthingGuard/Forms/ResetPwdForm/Step4.tsx +0 -51
  68. package/components/AuthingGuard/Forms/ResetPwdForm/index.tsx +0 -96
  69. package/components/AuthingGuard/Forms/ResetPwdForm/style.less +0 -3
  70. package/components/AuthingGuard/Forms/SendPhoneCode/SendCodeBtn.tsx +0 -88
  71. package/components/AuthingGuard/Forms/SendPhoneCode/index.tsx +0 -50
  72. package/components/AuthingGuard/Forms/SendPhoneCode/style.less +0 -26
  73. package/components/AuthingGuard/Forms/SmsMfaVerifyForm/CheckPhoneForm.tsx +0 -86
  74. package/components/AuthingGuard/Forms/SmsMfaVerifyForm/VerifyCodeForm.tsx +0 -113
  75. package/components/AuthingGuard/Forms/SmsMfaVerifyForm/index.tsx +0 -40
  76. package/components/AuthingGuard/Forms/SmsMfaVerifyForm/style.less +0 -3
  77. package/components/AuthingGuard/Forms/SocialAndIdpLogin/index.tsx +0 -325
  78. package/components/AuthingGuard/Forms/SocialAndIdpLogin/style.less +0 -75
  79. package/components/AuthingGuard/Forms/UploadImage/index.tsx +0 -70
  80. package/components/AuthingGuard/Forms/index.ts +0 -13
  81. package/components/AuthingGuard/GuardLayout/index.tsx +0 -474
  82. package/components/AuthingGuard/GuardLayout/style.less +0 -111
  83. package/components/AuthingGuard/Header/index.tsx +0 -25
  84. package/components/AuthingGuard/Header/style.less +0 -52
  85. package/components/AuthingGuard/IconFont/iconfont.js +0 -74
  86. package/components/AuthingGuard/IconFont/index.tsx +0 -19
  87. package/components/AuthingGuard/IconFont/style.less +0 -6
  88. package/components/AuthingGuard/IconFont/svg.js +0 -2
  89. package/components/AuthingGuard/LoginLayout/index.tsx +0 -161
  90. package/components/AuthingGuard/LoginLayout/style.less +0 -0
  91. package/components/AuthingGuard/MfaLayout/Steps.ts +0 -4
  92. package/components/AuthingGuard/MfaLayout/index.tsx +0 -49
  93. package/components/AuthingGuard/MfaLayout/style.less +0 -3
  94. package/components/AuthingGuard/RegisterLayout/index.tsx +0 -89
  95. package/components/AuthingGuard/RegisterLayout/style.less +0 -0
  96. package/components/AuthingGuard/ResetPwdLayout/index.tsx +0 -20
  97. package/components/AuthingGuard/ToggleLang/index.tsx +0 -51
  98. package/components/AuthingGuard/api/appConfig.ts +0 -146
  99. package/components/AuthingGuard/api/index.ts +0 -3
  100. package/components/AuthingGuard/api/sso.ts +0 -29
  101. package/components/AuthingGuard/api/userPoolConfig.ts +0 -111
  102. package/components/AuthingGuard/constants.ts +0 -107
  103. package/components/AuthingGuard/hooks/index.tsx +0 -70
  104. package/components/AuthingGuard/hooks/useScreenSize.tsx +0 -68
  105. package/components/AuthingGuard/index.tsx +0 -126
  106. package/components/AuthingGuard/style.less +0 -103
  107. package/components/AuthingGuard/types/Forms.ts +0 -94
  108. package/components/AuthingGuard/types/GuardConfig.ts +0 -420
  109. package/components/AuthingGuard/types/GuardState.ts +0 -7
  110. package/components/AuthingGuard/types/Locales.ts +0 -12
  111. package/components/AuthingGuard/types/index.ts +0 -4
  112. package/components/AuthingTabs/index.tsx +0 -98
  113. package/components/AuthingTabs/style.less +0 -135
  114. package/components/BindTotp/core/bindSuccess.tsx +0 -73
  115. package/components/BindTotp/core/securityCode.tsx +0 -108
  116. package/components/BindTotp/index.tsx +0 -134
  117. package/components/BindTotp/interface.ts +0 -30
  118. package/components/BindTotp/styles.less +0 -57
  119. package/components/ChangeLanguage/index.tsx +0 -35
  120. package/components/ChangePassword/core/firstLoginReset.tsx +0 -104
  121. package/components/ChangePassword/core/rotateReset.tsx +0 -114
  122. package/components/ChangePassword/index.tsx +0 -59
  123. package/components/CompleteInfo/core/completeInfo.tsx +0 -155
  124. package/components/CompleteInfo/index.tsx +0 -45
  125. package/components/CompleteInfo/interface.ts +0 -40
  126. package/components/CompleteInfo/styles.less +0 -7
  127. package/components/CopyAbleText/index.tsx +0 -54
  128. package/components/CopyAbleText/style.less +0 -13
  129. package/components/DownloadAuthenticator/index.tsx +0 -97
  130. package/components/DownloadAuthenticator/interface.ts +0 -22
  131. package/components/DownloadAuthenticator/styles.less +0 -52
  132. package/components/Error/index.tsx +0 -21
  133. package/components/Error/interface.ts +0 -9
  134. package/components/Error/styles.less +0 -12
  135. package/components/ForgetPassword/core/resetPassword.tsx +0 -162
  136. package/components/ForgetPassword/index.tsx +0 -78
  137. package/components/ForgetPassword/interface.ts +0 -32
  138. package/components/Guard/Guard.tsx +0 -255
  139. package/components/Guard/authClient.ts +0 -46
  140. package/components/Guard/config.ts +0 -19
  141. package/components/Guard/event.ts +0 -52
  142. package/components/Guard/index.tsx +0 -4
  143. package/components/Guard/module.ts +0 -20
  144. package/components/Guard/stateMachine.ts +0 -133
  145. package/components/Guard/styles.less +0 -461
  146. package/components/IconFont/iconfont.js +0 -74
  147. package/components/IconFont/index.tsx +0 -16
  148. package/components/IconFont/style.less +0 -6
  149. package/components/IconFont/svg.js +0 -2
  150. package/components/ImagePro/index.tsx +0 -53
  151. package/components/ImagePro/styles.less +0 -40
  152. package/components/InputNumber/index.tsx +0 -33
  153. package/components/Login/codemap.ts +0 -47
  154. package/components/Login/core/withAD.tsx +0 -9
  155. package/components/Login/core/withAppQrcode.tsx +0 -49
  156. package/components/Login/core/withLDAP.tsx +0 -146
  157. package/components/Login/core/withPassword/FormItemAccount.tsx +0 -42
  158. package/components/Login/core/withPassword/GraphicVerifyCode.tsx +0 -31
  159. package/components/Login/core/withPassword/InputAccount.tsx +0 -64
  160. package/components/Login/core/withPassword/index.tsx +0 -173
  161. package/components/Login/core/withPhonecode.tsx +0 -122
  162. package/components/Login/core/withWechatMiniQrcode.tsx +0 -60
  163. package/components/Login/core/withWechatmpQrcode.tsx +0 -53
  164. package/components/Login/index.tsx +0 -373
  165. package/components/Login/props.ts +0 -74
  166. package/components/Login/socialLogin/index.tsx +0 -407
  167. package/components/Login/socialLogin/style.less +0 -69
  168. package/components/Login/styles.less +0 -53
  169. package/components/MFA/VerifyCodeInput/VerifyCodeFormItem.tsx +0 -41
  170. package/components/MFA/VerifyCodeInput/index.tsx +0 -145
  171. package/components/MFA/VerifyCodeInput/style.less +0 -35
  172. package/components/MFA/codemap.ts +0 -24
  173. package/components/MFA/core/email.tsx +0 -203
  174. package/components/MFA/core/face.tsx +0 -297
  175. package/components/MFA/core/face_deps.tsx +0 -37
  176. package/components/MFA/core/sms.tsx +0 -204
  177. package/components/MFA/core/totp.tsx +0 -122
  178. package/components/MFA/index.tsx +0 -143
  179. package/components/MFA/mfaMethods/index.tsx +0 -88
  180. package/components/MFA/mfaMethods/style.less +0 -39
  181. package/components/MFA/props.ts +0 -51
  182. package/components/MFA/styles.less +0 -100
  183. package/components/NeedHelpView/core/describeQuestions.tsx +0 -245
  184. package/components/NeedHelpView/index.tsx +0 -47
  185. package/components/RecoveryCode/core/useCode.tsx +0 -71
  186. package/components/RecoveryCode/index.tsx +0 -27
  187. package/components/RecoveryCode/interface.ts +0 -31
  188. package/components/RecoveryCode/style.less +0 -13
  189. package/components/Register/codemap.ts +0 -12
  190. package/components/Register/components/Agreements/index.tsx +0 -81
  191. package/components/Register/components/Agreements/style.less +0 -44
  192. package/components/Register/core/WithEmail.tsx +0 -239
  193. package/components/Register/core/WithPhone.tsx +0 -184
  194. package/components/Register/index.tsx +0 -138
  195. package/components/Register/props.ts +0 -50
  196. package/components/SendCode/SendCodeBtn.tsx +0 -96
  197. package/components/SendCode/index.tsx +0 -94
  198. package/components/SendCode/style.less +0 -31
  199. package/components/ShieldSpin/index.tsx +0 -27
  200. package/components/ShieldSpin/loading.svg +0 -29
  201. package/components/SubmitButton/index.tsx +0 -50
  202. package/components/SubmitSuccess/index.tsx +0 -66
  203. package/components/SubmitSuccess/interface.ts +0 -17
  204. package/components/Type/index.ts +0 -52
  205. package/components/ValidatorRules/EmailFormItem.tsx +0 -95
  206. package/components/ValidatorRules/PhoneFormItem.tsx +0 -100
  207. package/components/ValidatorRules/index.ts +0 -14
  208. package/components/VerifyCodeInput/index.tsx +0 -76
  209. package/components/VerifyCodeInput/style.less +0 -24
  210. package/components/_utils/GuardErrorCode.ts +0 -9
  211. package/components/_utils/clipboard.ts +0 -27
  212. package/components/_utils/config.ts +0 -118
  213. package/components/_utils/guradHttp.ts +0 -97
  214. package/components/_utils/hooks/index.ts +0 -64
  215. package/components/_utils/http.ts +0 -85
  216. package/components/_utils/index.ts +0 -322
  217. package/components/_utils/locales/en/common.json +0 -227
  218. package/components/_utils/locales/en/index.ts +0 -6
  219. package/components/_utils/locales/en/login.json +0 -96
  220. package/components/_utils/locales/en/map.json +0 -4
  221. package/components/_utils/locales/en/user.json +0 -82
  222. package/components/_utils/locales/index.ts +0 -45
  223. package/components/_utils/locales/zh/common.json +0 -227
  224. package/components/_utils/locales/zh/index.ts +0 -6
  225. package/components/_utils/locales/zh/login.json +0 -96
  226. package/components/_utils/locales/zh/map.json +0 -4
  227. package/components/_utils/locales/zh/user.json +0 -82
  228. package/components/_utils/popupCenter.ts +0 -48
  229. package/components/assets/images/error.png +0 -0
  230. package/components/context/base.tsx +0 -28
  231. package/components/context/global/context.tsx +0 -39
  232. package/components/context/global/reducer.tsx +0 -56
  233. package/components/context/module/context.tsx +0 -23
  234. package/components/index.ts +0 -12
  235. package/config/antdReplacer.js +0 -51
  236. package/config/env.js +0 -104
  237. package/config/getHttpsConfig.js +0 -66
  238. package/config/jest/cssTransform.js +0 -14
  239. package/config/jest/fileTransform.js +0 -40
  240. package/config/modules.js +0 -134
  241. package/config/paths.js +0 -71
  242. package/config/pnpTs.js +0 -35
  243. package/config/webpack.config.js +0 -835
  244. package/config/webpackDevServer.config.js +0 -130
  245. package/examples.tsx +0 -82
  246. package/index.js +0 -1
  247. package/logo.svg +0 -7
  248. package/public/favicon.ico +0 -0
  249. package/public/index.html +0 -43
  250. package/public/logo192.png +0 -0
  251. package/public/logo512.png +0 -0
  252. package/public/manifest.json +0 -25
  253. package/public/robots.txt +0 -3
  254. package/react-app-env.d.ts +0 -71
  255. package/reportWebVitals.ts +0 -15
  256. package/scripts/build.js +0 -208
  257. package/scripts/lib.js +0 -200
  258. package/scripts/publish.js +0 -57
  259. package/scripts/start.js +0 -162
  260. package/scripts/test.js +0 -49
  261. package/setupTests.ts +0 -5
  262. package/tsconfig.json +0 -30
@@ -1,35 +0,0 @@
1
- .authing-g2-code-input-item {
2
- text-align: center;
3
- width: 40px;
4
- min-width: 40px;
5
- min-height: 40px;
6
- height: 40px;
7
- line-height: 40px;
8
- background-color: #f5f6f7;
9
- border: unset;
10
- border-radius: 4px;
11
-
12
- &:not(:first-child) {
13
- margin-left: 18px;
14
- }
15
- input {
16
- text-align: center;
17
- }
18
- }
19
- .authing-g2-code-input-divider {
20
- width: 14px;
21
- min-width: 14px;
22
- max-width: 14px;
23
- margin-left: 18px;
24
- }
25
- .authing-g2-code-input {
26
- display: flex;
27
- align-items: center;
28
- }
29
-
30
- .authing-ant-form-item-has-error {
31
- .authing-g2-code-input-item {
32
- background-color: #f5f6f7;
33
- border: 1px solid #ff4d4f;
34
- }
35
- }
@@ -1,24 +0,0 @@
1
- import { GuardModuleAction, GuardModuleType } from '../Guard/module'
2
-
3
- export const codeMap: Record<number, GuardModuleAction> = {
4
- // 待添加
5
- 2021: {
6
- action: 'changeModule',
7
- module: GuardModuleType.LOGIN,
8
- },
9
- 1700: {
10
- action: 'insideFix',
11
- message: 'verification failed, let components inside fix is fine.',
12
- },
13
- 1701: {
14
- action: 'insideFix',
15
- message: 'verification failed, let components inside fix is fine.',
16
- },
17
- 1702: {
18
- action: 'insideFix',
19
- message: 'verification failed, let components inside fix is fine.',
20
- },
21
- 500: {
22
- action: 'message',
23
- },
24
- }
@@ -1,203 +0,0 @@
1
- import { UserOutlined } from '@ant-design/icons'
2
- import { Input, message, message as Message } from 'antd'
3
- import { Form } from 'antd'
4
- import { EmailScene, User } from 'authing-js-sdk'
5
- import React, { useRef, useState } from 'react'
6
- import { useTranslation } from 'react-i18next'
7
- import { VerifyCodeInput } from '../VerifyCodeInput'
8
- import { useAuthClient } from '../../Guard/authClient'
9
- import { SendCodeBtn } from '../../SendCode/SendCodeBtn'
10
- import SubmitButton from '../../SubmitButton'
11
- import { EmailFormItem, ICheckProps } from '../../ValidatorRules'
12
- import { MFAConfig } from '../props'
13
- import { VerifyCodeFormItem } from '../VerifyCodeInput/VerifyCodeFormItem'
14
-
15
- interface BindMFAEmailProps {
16
- mfaToken: string
17
- onBind: (email: string) => void
18
- config: any
19
- }
20
- export const BindMFAEmail: React.FC<BindMFAEmailProps> = ({
21
- mfaToken,
22
- onBind,
23
- config,
24
- }) => {
25
- const submitButtonRef = useRef<any>(null)
26
- const { t } = useTranslation()
27
- const [form] = Form.useForm()
28
- const ref = useRef<ICheckProps>(null)
29
-
30
- const onFinish = async ({ email }: any) => {
31
- submitButtonRef.current?.onSpin(true)
32
- await form.validateFields()
33
- try {
34
- onBind(email)
35
- } catch (e: any) {
36
- const error = JSON.parse(e?.message)
37
- submitButtonRef.current.onError()
38
- Message.error(error.message)
39
- } finally {
40
- submitButtonRef.current?.onSpin(false)
41
- }
42
- }
43
- return (
44
- <>
45
- <p className="authing-g2-mfa-title">{t('common.bindEmail')}</p>
46
- <p className="authing-g2-mfa-tips">{t('common.bindEmailDoc')}</p>
47
- <Form
48
- form={form}
49
- onFinish={onFinish}
50
- onFinishFailed={() => submitButtonRef.current.onError()}
51
- onValuesChange={() => {
52
- ref.current?.check()
53
- }}
54
- >
55
- <EmailFormItem
56
- className="authing-g2-input-form"
57
- name="email"
58
- userPoolId={config.__publicConfig__.userPoolId}
59
- form={form}
60
- ref={ref}
61
- checkRepeat={true}
62
- >
63
- <Input
64
- className="authing-g2-input"
65
- autoComplete="email"
66
- size="large"
67
- placeholder={t('login.inputEmail')}
68
- prefix={<UserOutlined style={{ color: '#878A95' }} />}
69
- />
70
- </EmailFormItem>
71
-
72
- <SubmitButton text={t('common.sure')} ref={submitButtonRef} />
73
- </Form>
74
- </>
75
- )
76
- }
77
-
78
- interface VerifyMFAEmailProps {
79
- email: string
80
- mfaToken: string
81
- onVerify: (code: number, data: any) => void
82
- sendCodeRef: React.RefObject<HTMLButtonElement>
83
- codeLength: number
84
- }
85
-
86
- export const VerifyMFAEmail: React.FC<VerifyMFAEmailProps> = ({
87
- email,
88
- mfaToken,
89
- onVerify,
90
- sendCodeRef,
91
- codeLength,
92
- }) => {
93
- const authClient = useAuthClient()
94
- const submitButtonRef = useRef<any>(null)
95
- const { t } = useTranslation()
96
- const [form] = Form.useForm()
97
- const [sent, setSent] = useState(false)
98
-
99
- const sendVerifyCode = async () => {
100
- try {
101
- await authClient.sendEmail(email!, EmailScene.MfaVerify)
102
- setSent(true)
103
- return true
104
- } catch (e) {
105
- const errorMessage = JSON.parse(e.message)
106
- message.error(errorMessage.message)
107
- return false
108
- }
109
- }
110
-
111
- const onFinish = async (values: any) => {
112
- submitButtonRef.current?.onSpin(true)
113
- const mfaCode = form.getFieldValue('mfaCode')
114
-
115
- try {
116
- const user: User = await authClient.mfa.verifyAppEmailMfa({
117
- mfaToken,
118
- email: email!,
119
- code: mfaCode.join(''),
120
- })
121
-
122
- onVerify(200, user)
123
- } catch (e: any) {
124
- const error = JSON.parse(e?.message)
125
- onVerify(error.code as number, error)
126
- } finally {
127
- submitButtonRef.current?.onSpin(false)
128
- }
129
- }
130
-
131
- return (
132
- <>
133
- <p className="authing-g2-mfa-title">{t('login.inputEmailCode')}</p>
134
- <p className="authing-g2-mfa-tips">
135
- {sent
136
- ? `${t('login.verifyCodeSended')} ${email}`
137
- : t('login.clickSent')}
138
- </p>
139
- <Form
140
- form={form}
141
- onFinish={onFinish}
142
- onFinishFailed={() => submitButtonRef.current?.onError()}
143
- >
144
- <VerifyCodeFormItem
145
- codeLength={codeLength}
146
- ruleKeyword={t('common.captchaCode')}
147
- >
148
- <VerifyCodeInput length={codeLength} />
149
- </VerifyCodeFormItem>
150
-
151
- <SendCodeBtn
152
- btnRef={sendCodeRef}
153
- beforeSend={() => sendVerifyCode()}
154
- type="link"
155
- />
156
-
157
- <SubmitButton
158
- text={t('common.sure')}
159
- ref={submitButtonRef}
160
- className="g2-mfa-submit-button"
161
- />
162
- </Form>
163
- </>
164
- )
165
- }
166
-
167
- export const MFAEmail: React.FC<{
168
- mfaToken: string
169
- email?: string
170
- mfaLogin: any
171
- config: MFAConfig
172
- }> = ({ email: userEmail, mfaToken, mfaLogin, config }) => {
173
- const [email, setEmail] = useState(userEmail)
174
- const sendCodeRef = useRef<HTMLButtonElement>(null)
175
-
176
- const codeLength = config.__publicConfig__?.verifyCodeLength
177
-
178
- return (
179
- <>
180
- {email ? (
181
- <VerifyMFAEmail
182
- mfaToken={mfaToken}
183
- email={email}
184
- onVerify={(code, data) => {
185
- mfaLogin(code, data)
186
- }}
187
- sendCodeRef={sendCodeRef}
188
- codeLength={codeLength ?? 4}
189
- />
190
- ) : (
191
- <BindMFAEmail
192
- config={config}
193
- mfaToken={mfaToken}
194
- onBind={(email: string) => {
195
- console.log('email', email)
196
- setEmail(email)
197
- sendCodeRef.current?.click()
198
- }}
199
- />
200
- )}
201
- </>
202
- )
203
- }
@@ -1,297 +0,0 @@
1
- import React, { useCallback, useEffect, useRef, useState } from 'react'
2
- import { useTranslation } from 'react-i18next'
3
- import { detectSingleFace } from 'face-api.js'
4
- import { useGuardHttp } from '../../_utils/guradHttp'
5
- import {
6
- FACE_SCORE,
7
- devicesConstraints,
8
- dataURItoBlob,
9
- getCurrentFaceDetectionNet,
10
- getFaceDetectorOptions,
11
- isFaceDetectionModelLoaded,
12
- } from './face_deps'
13
- import { ImagePro } from '../../ImagePro'
14
- import SubmitButton from '../../SubmitButton'
15
-
16
- const useDashoffset = (percent: number) => {
17
- // 接受 0 - 1,返回 0-700 之间的偏移量
18
- let offset = percent * 7
19
-
20
- // 在识别成功的时候,返回绿色
21
- let dashStyle = {}
22
- return { offset, dashStyle }
23
- }
24
-
25
- export const MFAFace = (props: any) => {
26
- let { postForm, post } = useGuardHttp()
27
- let { t } = useTranslation()
28
- const [faceState, setFaceState] = useState('ready') // ready, identifying, retry
29
- const [percent, setPercent] = useState(0) // 识别进度(相似性)
30
-
31
- const videoRef = useRef<HTMLVideoElement>(null)
32
- const canvasRef = useRef<HTMLCanvasElement>(null)
33
- const interval = useRef<NodeJS.Timeout | undefined>()
34
- const p1 = useRef<string>() // p1 key
35
- const p2 = useRef<string>() // p2 key
36
- const cooldown = useRef<number>(6) // p2 cooldown, * 500ms
37
- const cdnBase = props.config.__publicConfig__.cdnBase
38
-
39
- let { offset, dashStyle } = useDashoffset(percent)
40
-
41
- // 预加载数据
42
- useEffect(() => {
43
- // 载入 cdn
44
- let cdnContext = getCurrentFaceDetectionNet().loadFromUri(
45
- `${cdnBase}/face-api/v1/tiny_face_detector_model-weights_manifest.json`
46
- )
47
- cdnContext.then((result) => {
48
- // setLoading(false)
49
- })
50
-
51
- if (faceState !== 'identifying') {
52
- return // 不存在 video dom,不要去尝试了
53
- }
54
- let devicesContext = navigator.mediaDevices.getUserMedia(devicesConstraints)
55
- devicesContext
56
- .then((stream) => {
57
- videoRef.current!.srcObject = stream
58
- })
59
- .catch((e) => {
60
- // 没有设备,或没有授权
61
- console.error(e)
62
- // setVideoType(VideoAction.ERROR)
63
- // setProgressStatus('exception')
64
- // setPercent(100)
65
- // setVideoError(e.message)
66
- })
67
-
68
- return () => {
69
- interval.current && clearInterval(interval.current)
70
- }
71
- }, [faceState, interval, props.config, cdnBase])
72
-
73
- // 监听 faceState
74
- useEffect(() => {
75
- if (faceState === 'identifying' || faceState === 'retry') {
76
- props.setShowMethods(false)
77
- } else {
78
- props.setShowMethods(true)
79
- }
80
- // eslint-disable-next-line react-hooks/exhaustive-deps
81
- }, [faceState])
82
-
83
- // 上传文件
84
- const uploadImage = async (blob: Blob) => {
85
- const formData = new FormData()
86
- formData.append('folder', 'photos')
87
- formData.append('file', blob, 'personal.jpeg')
88
-
89
- let url = '/api/v2/upload?folder=photos&private=true'
90
- let result = await postForm<any>(url, formData)
91
- let key = result.data?.key
92
- return key
93
- }
94
-
95
- // get base 64
96
- const getBase64 = (videoDom: any) => {
97
- const canvas = canvasRef.current!
98
- const ctx = canvas!.getContext('2d')!
99
- ctx.clearRect(0, 0, canvas.width, canvas.height)
100
- ctx.drawImage(videoDom, 0, 0, canvas.width, canvas.height)
101
- const base64Data = canvas.toDataURL('image/jpeg', 1.0)
102
- return base64Data
103
- }
104
-
105
- const faceLogin = (result: any) => {
106
- let { code, data, message } = result
107
-
108
- if (code === 1700 || code === 1701 || code === 1702) {
109
- p1.current = undefined
110
- p2.current = undefined
111
- interval.current = undefined
112
- cooldown.current = 6
113
- setFaceState('retry')
114
- }
115
- props.mfaLogin(code, data, message)
116
- }
117
-
118
- const faceBind = () => {
119
- let url = '/api/v2/mfa/face/associate'
120
- let data = {
121
- photoA: p1.current,
122
- photoB: p2.current,
123
- }
124
- let mfaToken = props.initData.mfaToken
125
- let config = {
126
- headers: {
127
- authorization: mfaToken,
128
- },
129
- }
130
- post(url, data, config).then((result) => {
131
- faceLogin(result)
132
- })
133
- }
134
-
135
- const faceCheck = () => {
136
- let url = '/api/v2/mfa/face/verify'
137
- let data = {
138
- photo: p1.current,
139
- }
140
- let mfaToken = props.initData.mfaToken
141
- let config = {
142
- headers: {
143
- authorization: mfaToken,
144
- },
145
- }
146
- post(url, data, config).then((result) => {
147
- // 如果是 1702,那么久绑定一个
148
- faceLogin(result)
149
- })
150
- }
151
-
152
- // bind 的情况
153
- const goToBindScene = (key: string) => {
154
- if (!p1.current) {
155
- p1.current = key
156
- } else {
157
- if (cooldown.current > 0) {
158
- cooldown.current -= 1
159
- }
160
- if (cooldown.current <= 0) {
161
- p2.current = key
162
- // 彻底上传完了,应该走验证了
163
- interval.current && clearInterval(interval.current)
164
- faceBind()
165
- }
166
- }
167
- }
168
-
169
- // goToCheck 的情况
170
- const goToCheckScene = (key: string) => {
171
- p1.current = key
172
- interval.current && clearInterval(interval.current)
173
- faceCheck()
174
- }
175
-
176
- // 识别成功,自动前进到下一个步骤
177
- const quitIdentifying = (blob: Blob) => {
178
- setPercent(100)
179
- uploadImage(blob).then((key) => {
180
- if (props.initData?.faceMfaEnabled === true) {
181
- goToCheckScene(key)
182
- } else {
183
- goToBindScene(key)
184
- }
185
- })
186
- }
187
-
188
- const autoShoot = useCallback(async () => {
189
- if (!interval.current) {
190
- interval.current = setInterval(() => autoShoot(), 500)
191
- }
192
- const videoDom = videoRef.current!
193
- if (videoDom.paused || videoDom.ended || !isFaceDetectionModelLoaded()) {
194
- return
195
- }
196
- const options = getFaceDetectorOptions()
197
- const result = await detectSingleFace(videoDom, options)
198
-
199
- if (result) {
200
- if (result.score > FACE_SCORE) {
201
- const base64Data = getBase64(videoDom)
202
- const blob = dataURItoBlob(base64Data)
203
- quitIdentifying(blob) // 识别成功,退出识别
204
- } else {
205
- // 识别失败,但是有结果,设置相似性
206
- setPercent(() => {
207
- return (result.score / FACE_SCORE) * 100
208
- })
209
- // console.log('识别失败,但是有结果,设置相似性', percent)
210
- }
211
- } else {
212
- setPercent(10)
213
- }
214
- // eslint-disable-next-line react-hooks/exhaustive-deps
215
- }, [])
216
-
217
- return (
218
- <div>
219
- <h3 className="authing-g2-mfa-title">{t('common.faceText1')}</h3>
220
- <p className="authing-g2-mfa-tips">{t('common.faceText2')}</p>
221
- {faceState === 'ready' && (
222
- <>
223
- <ImagePro
224
- className="g2-mfa-face-image"
225
- width={247}
226
- height={131}
227
- src={`${cdnBase}/face.png`}
228
- alt=""
229
- />
230
-
231
- <SubmitButton
232
- onClick={() => {
233
- setFaceState('identifying')
234
- autoShoot()
235
- }}
236
- text={t('common.faceText3')}
237
- className="mfa-face"
238
- />
239
- </>
240
- )}
241
- <div
242
- className="g2-mfa-face-identifying"
243
- style={{
244
- display: faceState !== 'ready' ? 'flex' : 'none',
245
- }}
246
- >
247
- <video
248
- className="video-round"
249
- ref={videoRef}
250
- // onLoadedMetadata={() => onIdentify()}
251
- id="inputVideo"
252
- autoPlay
253
- muted
254
- playsInline
255
- />
256
- <div
257
- className="video-round mesh"
258
- style={{
259
- display: faceState === 'retry' ? 'flex' : 'none',
260
- }}
261
- onClick={() => {
262
- setFaceState('identifying')
263
- setPercent(0)
264
- autoShoot()
265
- }}
266
- >
267
- {t('common.faceText4')}
268
- </div>
269
-
270
- <div className="video-round ring">
271
- <svg width={240} height={240} fill="none">
272
- <circle
273
- className="svg-circle-running"
274
- style={dashStyle}
275
- strokeDasharray={700} // 根据周长做 0-700 之间的数值表示准确率
276
- strokeDashoffset={700 - offset} // 处理这个 offset, 0-700之间的数
277
- cx={120}
278
- cy={120}
279
- r={110}
280
- />
281
- </svg>
282
- </div>
283
- </div>
284
-
285
- <canvas
286
- style={{
287
- width: 210,
288
- height: 210,
289
- opacity: 0,
290
- position: 'absolute',
291
- display: 'none',
292
- }}
293
- ref={canvasRef}
294
- />
295
- </div>
296
- )
297
- }
@@ -1,37 +0,0 @@
1
- import { nets, TinyFaceDetectorOptions } from 'face-api.js'
2
-
3
- let inputSize = 512
4
- let scoreThreshold = 0.5
5
-
6
- export const devicesConstraints = {
7
- video: {
8
- width: 210,
9
- height: 210,
10
- },
11
- }
12
- export const FACE_SCORE = 0.65
13
-
14
- export function getFaceDetectorOptions() {
15
- return new TinyFaceDetectorOptions({ inputSize, scoreThreshold })
16
- }
17
-
18
- export function getCurrentFaceDetectionNet() {
19
- return nets.tinyFaceDetector
20
- }
21
-
22
- export function isFaceDetectionModelLoaded() {
23
- return !!getCurrentFaceDetectionNet().params
24
- }
25
-
26
- export function dataURItoBlob(base64Data: any) {
27
- var byteString
28
- if (base64Data.split(',')[0].indexOf('base64') >= 0)
29
- byteString = atob(base64Data.split(',')[1])
30
- else byteString = unescape(base64Data.split(',')[1])
31
- var mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0]
32
- var ia = new Uint8Array(byteString.length)
33
- for (var i = 0; i < byteString.length; i++) {
34
- ia[i] = byteString.charCodeAt(i)
35
- }
36
- return new Blob([ia], { type: mimeString })
37
- }