@springmicro/auth 0.3.0 → 0.3.5
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.
- package/.eslintrc.cjs +0 -0
- package/README.md +60 -60
- package/dist/{Index-c419311f-DolmVisI.js → Index-64ac63ff-mcEPPGzJ.js} +101 -102
- package/dist/{Index-652aeb8c-Cr1mbyJJ.js → Index-6c094240-D4xpr8fA.js} +70 -71
- package/dist/{Web3Auth-C5tucK1E.js → Web3Auth-DB9s-qbl.js} +12454 -12511
- package/dist/alphawallet-B7eovdf-.js +0 -0
- package/dist/apexwallet-ysP20G9D.js +0 -0
- package/dist/atoken-BBnNTzcz.js +0 -0
- package/dist/bifrostwallet-CNNBO92h.js +0 -0
- package/dist/binance-DvPgAzCw.js +0 -0
- package/dist/bitget-DZOUrwgy.js +0 -0
- package/dist/bitpie-C_uxmEzw.js +0 -0
- package/dist/bitski-DpzkHNkv.js +0 -0
- package/dist/blockwallet-BL69cqkA.js +0 -0
- package/dist/brave-DnRzMQYW.js +0 -0
- package/dist/ccip-c78d2f16-DLcRlwod.js +0 -0
- package/dist/coin98wallet-CkFdOvXt.js +0 -0
- package/dist/coinbase-CaGNx5if.js +0 -0
- package/dist/core-9rK8tWud.js +0 -0
- package/dist/defiwallet-0AsgJBSy.js +0 -0
- package/dist/detected-CX_JZaUk.js +0 -0
- package/dist/echooo-CmaetT_Z.js +0 -0
- package/dist/enkrypt-BibtwvK7.js +0 -0
- package/dist/exodus-BxzkDWWP.js +0 -0
- package/dist/fordefi-CvKyVwhI.js +0 -0
- package/dist/foxwallet-D7c_LDTf.js +0 -0
- package/dist/frame-CDfNmjUy.js +0 -0
- package/dist/frontier-DqKNSj2z.js +0 -0
- package/dist/hashMessage-Dw0KdqMZ.js +2101 -0
- package/dist/huobiwallet-CxSwqa5L.js +0 -0
- package/dist/hyperpay-nmHE3WqM.js +0 -0
- package/dist/icon-2Zqy7pqQ.js +0 -0
- package/dist/icon-CGWI1Ies.js +0 -0
- package/dist/icon-C_O4nprO.js +0 -0
- package/dist/icon-DbgmZCnU.js +0 -0
- package/dist/icon-Dbjb6jc5.js +20 -0
- package/dist/icon-cAd7RhSC.js +0 -0
- package/dist/imtoken-yENtOTS3.js +0 -0
- package/dist/index-021f6a62-Zz543EDB.js +0 -0
- package/dist/index-40a497ea-Bn2mC0r7.js +0 -0
- package/dist/{index-YKlm7xSx.js → index-C0yeApwY.js} +750 -751
- package/dist/{index-C4uVsW-I.js → index-CDaoza_m.js} +2 -2
- package/dist/index-CiwBcaZ0.js +384 -0
- package/dist/{index-DOUI-2vv.js → index-CroNOC7e.js} +27 -29
- package/dist/{index-Boi-WcMK.js → index-Df5ie3cE.js} +2 -2
- package/dist/{index-DzOmdGpF.js → index-F-gl3DJX.js} +8 -10
- package/dist/index-wNV8PBAh.js +11412 -0
- package/dist/index.d.ts +0 -0
- package/dist/index.js +1 -1
- package/dist/index.umd.cjs +327 -291
- package/dist/infinitywallet-C8J4FUYw.js +0 -0
- package/dist/kayros-AIrUK1za.js +0 -0
- package/dist/keplr-CyLTca9B.js +36 -0
- package/dist/lif3wallet-C5D6r8pg.js +0 -0
- package/dist/liquality-nbCtErVq.js +0 -0
- package/dist/mathwallet-CWkivCXo.js +0 -0
- package/dist/meetone-kKmvI8md.js +0 -0
- package/dist/metamask-BN7yiDV1.js +0 -0
- package/dist/mykey-CQZ6UcLH.js +0 -0
- package/dist/native-FDN9oNjc.js +15 -0
- package/dist/{number-UhidYs-H.js → number-ByqdQYDu.js} +1 -1
- package/dist/okxwallet-CJLVogh2.js +0 -0
- package/dist/oneInch-CciyZ4Pz.js +0 -0
- package/dist/onekey-Dal8kYjU.js +0 -0
- package/dist/opera-DnKg-TJU.js +0 -0
- package/dist/ownbit-BshJUVuW.js +0 -0
- package/dist/phantom-CJ8dIcov.js +0 -0
- package/dist/rabby-D4thTcd6.js +0 -0
- package/dist/rainbow-mXld6yWV.js +0 -0
- package/dist/roninwallet-ZyYrd-D1.js +0 -0
- package/dist/safeheron-Eg1Jb29V.js +0 -0
- package/dist/safepal-DVIKy94N.js +0 -0
- package/dist/sequence-BS2IbtDg.js +0 -0
- package/dist/stablewallet-jyB079Wb.js +0 -0
- package/dist/status-FrAvQjfn.js +0 -0
- package/dist/subwallet-DMvFqKyY.js +0 -0
- package/dist/talisman-Bp8zUXqB.js +0 -0
- package/dist/tallywallet-B4OS9nIr.js +0 -0
- package/dist/tokenary-C7jjcbQa.js +0 -0
- package/dist/tokenpocket-9ZRPmAFA.js +0 -0
- package/dist/tp-V2em5bdl.js +0 -0
- package/dist/transactionRequest-be6a8ea9-CUKWo5mx.js +0 -0
- package/dist/trust-SgHubMq7.js +20 -0
- package/dist/xdefi-COVIyGz4.js +0 -0
- package/dist/zeal-DxHbDqm0.js +0 -0
- package/dist/zerion-BfW0UElc.js +0 -0
- package/dist/zodiacpilot-CrId6F4w.js +0 -0
- package/index.html +0 -0
- package/package.json +2 -2
- package/src/auth/config.ts +91 -91
- package/src/components/SignUp.tsx +442 -442
- package/src/components/forms/AgreementModal.tsx +88 -88
- package/src/components/forms/CaptchaController.tsx +94 -94
- package/src/components/forms/CaptchaModal.jsx +171 -171
- package/src/components/forms/CaptchaWidget.jsx +146 -146
- package/src/components/forms/PasswordChecker.ts +88 -88
- package/src/components/forms/SendCodeInput.tsx +149 -149
- package/src/components/forms/SignUpFormItem.tsx +704 -704
- package/src/components/forms/util/application-api.ts +155 -155
- package/src/components/forms/util/auth-api.ts +198 -198
- package/src/components/forms/util/auth-util.tsx +346 -346
- package/src/components/forms/util/core.ts +493 -493
- package/src/components/forms/util/invitation-api.ts +132 -132
- package/src/components/forms/util/provider.tsx +603 -603
- package/src/components/forms/util/user-api.ts +303 -303
- package/src/components/provider/AdfsLoginButton.jsx +38 -38
- package/src/components/provider/AlipayLoginButton.jsx +38 -38
- package/src/components/provider/AppleLoginButton.jsx +38 -38
- package/src/components/provider/AzureADB2CLoginButton.jsx +38 -38
- package/src/components/provider/AzureADLoginButton.jsx +38 -38
- package/src/components/provider/BaiduLoginButton.jsx +38 -38
- package/src/components/provider/BilibiliLoginButton.jsx +37 -37
- package/src/components/provider/CasdoorLoginButton.jsx +38 -38
- package/src/components/provider/DingTalkLoginButton.jsx +37 -37
- package/src/components/provider/DouyinLoginButton.jsx +38 -38
- package/src/components/provider/FacebookLoginButton.jsx +37 -37
- package/src/components/provider/GitHubLoginButton.jsx +37 -37
- package/src/components/provider/GitLabLoginButton.jsx +38 -38
- package/src/components/provider/GiteeLoginButton.jsx +34 -34
- package/src/components/provider/GoogleLoginButton.jsx +68 -68
- package/src/components/provider/InfoflowLoginButton.jsx +38 -38
- package/src/components/provider/LarkLoginButton.jsx +38 -38
- package/src/components/provider/LinkedInLoginButton.jsx +37 -37
- package/src/components/provider/LoginButton.jsx +33 -33
- package/src/components/provider/OktaLoginButton.jsx +38 -38
- package/src/components/provider/Provider.jsx +3 -3
- package/src/components/provider/ProviderButton.jsx +327 -327
- package/src/components/provider/QqLoginButton.jsx +31 -31
- package/src/components/provider/SelfLoginButton.jsx +47 -47
- package/src/components/provider/SlackLoginButton.jsx +38 -38
- package/src/components/provider/SteamLoginButton.jsx +38 -38
- package/src/components/provider/WeComLoginButton.jsx +34 -34
- package/src/components/provider/Web3Auth.jsx +365 -365
- package/src/components/provider/WechatLoginButton.jsx +37 -37
- package/src/components/provider/WeiboLoginButton.jsx +34 -34
- package/src/components/util.tsx +173 -173
- package/src/i18n/en/signup.json +48 -48
- package/src/i18n/index.ts +17 -17
- package/src/index.tsx +8 -8
- package/src/vite-env.d.ts +0 -0
- package/tsconfig.json +0 -0
- package/tsconfig.node.json +0 -0
- package/vite.config.ts +33 -33
- package/dist/icon-duCa3gfT.js +0 -11
- package/dist/index-BtLU53lm.js +0 -6023
- package/dist/index-CLfsMiG4.js +0 -2021
- package/dist/index-DPq81SIn.js +0 -161
- package/dist/trust-gPypS1O7.js +0 -11
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
import { createButton } from "react-social-login-buttons";
|
|
16
|
-
import { StaticBaseUrl } from "../forms/util/core";
|
|
17
|
-
|
|
18
|
-
function Icon({ width = 24, height = 24, color }) {
|
|
19
|
-
return (
|
|
20
|
-
<img
|
|
21
|
-
src={`${StaticBaseUrl}/buttons/wechat.svg`}
|
|
22
|
-
alt="Sign in with Wechat"
|
|
23
|
-
/>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const config = {
|
|
28
|
-
text: "Sign in with Wechat",
|
|
29
|
-
icon: Icon,
|
|
30
|
-
iconFormat: (name) => `fa fa-${name}`,
|
|
31
|
-
style: { background: "rgb(0,194,80)" },
|
|
32
|
-
activeStyle: { background: "rgb(0,158,64)" },
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const WechatLoginButton = createButton(config);
|
|
36
|
-
|
|
37
|
-
export default WechatLoginButton;
|
|
1
|
+
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
import { createButton } from "react-social-login-buttons";
|
|
16
|
+
import { StaticBaseUrl } from "../forms/util/core";
|
|
17
|
+
|
|
18
|
+
function Icon({ width = 24, height = 24, color }) {
|
|
19
|
+
return (
|
|
20
|
+
<img
|
|
21
|
+
src={`${StaticBaseUrl}/buttons/wechat.svg`}
|
|
22
|
+
alt="Sign in with Wechat"
|
|
23
|
+
/>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const config = {
|
|
28
|
+
text: "Sign in with Wechat",
|
|
29
|
+
icon: Icon,
|
|
30
|
+
iconFormat: (name) => `fa fa-${name}`,
|
|
31
|
+
style: { background: "rgb(0,194,80)" },
|
|
32
|
+
activeStyle: { background: "rgb(0,158,64)" },
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const WechatLoginButton = createButton(config);
|
|
36
|
+
|
|
37
|
+
export default WechatLoginButton;
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
import { createButton } from "react-social-login-buttons";
|
|
16
|
-
import { StaticBaseUrl } from "../forms/util/core";
|
|
17
|
-
|
|
18
|
-
function Icon({ width = 24, height = 24, color }) {
|
|
19
|
-
return (
|
|
20
|
-
<img src={`${StaticBaseUrl}/buttons/weibo.svg`} alt="Sign in with Weibo" />
|
|
21
|
-
);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const config = {
|
|
25
|
-
text: "Sign in with Weibo",
|
|
26
|
-
icon: Icon,
|
|
27
|
-
iconFormat: (name) => `fa fa-${name}`,
|
|
28
|
-
style: { background: "#e62329" },
|
|
29
|
-
activeStyle: { background: "#e54329" },
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
const WeiboLoginButton = createButton(config);
|
|
33
|
-
|
|
34
|
-
export default WeiboLoginButton;
|
|
1
|
+
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
import { createButton } from "react-social-login-buttons";
|
|
16
|
+
import { StaticBaseUrl } from "../forms/util/core";
|
|
17
|
+
|
|
18
|
+
function Icon({ width = 24, height = 24, color }) {
|
|
19
|
+
return (
|
|
20
|
+
<img src={`${StaticBaseUrl}/buttons/weibo.svg`} alt="Sign in with Weibo" />
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const config = {
|
|
25
|
+
text: "Sign in with Weibo",
|
|
26
|
+
icon: Icon,
|
|
27
|
+
iconFormat: (name) => `fa fa-${name}`,
|
|
28
|
+
style: { background: "#e62329" },
|
|
29
|
+
activeStyle: { background: "#e54329" },
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const WeiboLoginButton = createButton(config);
|
|
33
|
+
|
|
34
|
+
export default WeiboLoginButton;
|
package/src/components/util.tsx
CHANGED
|
@@ -1,173 +1,173 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
export type SignupItem = {
|
|
4
|
-
name: string;
|
|
5
|
-
label: string;
|
|
6
|
-
placeholder: string;
|
|
7
|
-
prompted: boolean;
|
|
8
|
-
required: boolean;
|
|
9
|
-
rule: string;
|
|
10
|
-
visible: boolean;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export function getIcon(
|
|
14
|
-
signupItem: SignupItem,
|
|
15
|
-
options: {
|
|
16
|
-
password: {
|
|
17
|
-
state: Record<string, boolean>;
|
|
18
|
-
setState: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;
|
|
19
|
-
};
|
|
20
|
-
},
|
|
21
|
-
Button: React.JSX.ElementType
|
|
22
|
-
) {
|
|
23
|
-
const eye = (
|
|
24
|
-
<svg
|
|
25
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
26
|
-
width="24"
|
|
27
|
-
height="24"
|
|
28
|
-
viewBox="0 0 24 24"
|
|
29
|
-
fill="none"
|
|
30
|
-
stroke="currentColor"
|
|
31
|
-
stroke-width="2"
|
|
32
|
-
stroke-linecap="round"
|
|
33
|
-
stroke-linejoin="round"
|
|
34
|
-
className="lucide lucide-eye"
|
|
35
|
-
>
|
|
36
|
-
<path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z" />
|
|
37
|
-
<circle cx="12" cy="12" r="3" />
|
|
38
|
-
</svg>
|
|
39
|
-
);
|
|
40
|
-
const eyeOff = (
|
|
41
|
-
<svg
|
|
42
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
43
|
-
width="24"
|
|
44
|
-
height="24"
|
|
45
|
-
viewBox="0 0 24 24"
|
|
46
|
-
fill="none"
|
|
47
|
-
stroke="currentColor"
|
|
48
|
-
stroke-width="2"
|
|
49
|
-
stroke-linecap="round"
|
|
50
|
-
stroke-linejoin="round"
|
|
51
|
-
className="lucide lucide-eye-off"
|
|
52
|
-
>
|
|
53
|
-
<path d="M9.88 9.88a3 3 0 1 0 4.24 4.24" />
|
|
54
|
-
<path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" />
|
|
55
|
-
<path d="M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" />
|
|
56
|
-
<line x1="2" x2="22" y1="2" y2="22" />
|
|
57
|
-
</svg>
|
|
58
|
-
);
|
|
59
|
-
const type = getType(signupItem);
|
|
60
|
-
const key = getKey(signupItem);
|
|
61
|
-
if (type === "password") {
|
|
62
|
-
const showPassword = options.password.state[key];
|
|
63
|
-
return (
|
|
64
|
-
<Button
|
|
65
|
-
variant="ghost"
|
|
66
|
-
size="icon"
|
|
67
|
-
className="absolute top-1/2 right-2 -translate-y-1/2"
|
|
68
|
-
onClick={(e) => {
|
|
69
|
-
e.preventDefault();
|
|
70
|
-
e.stopPropagation();
|
|
71
|
-
options.password.setState({
|
|
72
|
-
...options.password.state,
|
|
73
|
-
[key]: !showPassword,
|
|
74
|
-
});
|
|
75
|
-
}}
|
|
76
|
-
>
|
|
77
|
-
{showPassword ? eyeOff : eye}
|
|
78
|
-
<span className="sr-only">Toggle password visibility</span>
|
|
79
|
-
</Button>
|
|
80
|
-
);
|
|
81
|
-
} else {
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export function getKey(signupItem: SignupItem) {
|
|
87
|
-
const nameMap = {
|
|
88
|
-
ID: "id",
|
|
89
|
-
Username: "username",
|
|
90
|
-
// also firstName, lastName
|
|
91
|
-
"Display name": "name",
|
|
92
|
-
Affiliation: "affiliation",
|
|
93
|
-
"ID card": "idCard",
|
|
94
|
-
Email: "email",
|
|
95
|
-
Phone: "phone",
|
|
96
|
-
Password: "password",
|
|
97
|
-
"Confirm password": "confirm",
|
|
98
|
-
"Invitation code": "invitationCode",
|
|
99
|
-
"Country/Region": "country_region",
|
|
100
|
-
Agreement: "agreement",
|
|
101
|
-
};
|
|
102
|
-
if (Object.keys(nameMap).includes(signupItem.name)) {
|
|
103
|
-
return nameMap[signupItem.name];
|
|
104
|
-
} else {
|
|
105
|
-
return signupItem.name;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export function getType(
|
|
110
|
-
signupItem: SignupItem,
|
|
111
|
-
options?: { hidePassword: Record<string, boolean> }
|
|
112
|
-
) {
|
|
113
|
-
const password = ["password", "confirm"];
|
|
114
|
-
const key = getKey(signupItem);
|
|
115
|
-
if (password.includes(key) && !options?.hidePassword[key]) {
|
|
116
|
-
return "password";
|
|
117
|
-
} else {
|
|
118
|
-
return "text";
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export function getPasswordVisibilityRecord(
|
|
123
|
-
signupItems: SignupItem[]
|
|
124
|
-
): Record<string, boolean> {
|
|
125
|
-
return Object.fromEntries(
|
|
126
|
-
signupItems
|
|
127
|
-
.filter((item) => getType(item) === "password")
|
|
128
|
-
.map((item) => [getKey(item), false])
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export function getFormProps(signupItem: SignupItem) {
|
|
133
|
-
return {
|
|
134
|
-
name: getKey(signupItem),
|
|
135
|
-
label: signupItem.label || signupItem.name,
|
|
136
|
-
placeholder: signupItem.placeholder,
|
|
137
|
-
required: signupItem.required,
|
|
138
|
-
type: getType(signupItem),
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export function getZod(z: any, signupItem: SignupItem) {
|
|
143
|
-
const key = getKey(signupItem);
|
|
144
|
-
let validator: any = z.string();
|
|
145
|
-
if (key === "email") {
|
|
146
|
-
validator = validator.email();
|
|
147
|
-
}
|
|
148
|
-
if (!signupItem.required) {
|
|
149
|
-
validator = validator.optional();
|
|
150
|
-
}
|
|
151
|
-
return validator;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export function getDefaultValues(signupItems: SignupItem[]) {
|
|
155
|
-
const entries = signupItems.map((item) => {
|
|
156
|
-
return [getKey(item), ""];
|
|
157
|
-
});
|
|
158
|
-
// add codes
|
|
159
|
-
const codes = signupItems
|
|
160
|
-
.filter((item) => requiresCode(item))
|
|
161
|
-
.map((item) => {
|
|
162
|
-
return [getKey(item) + "Code", ""];
|
|
163
|
-
});
|
|
164
|
-
return Object.fromEntries([...entries, ...codes]);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export function requiresCode(signupItem: SignupItem) {
|
|
168
|
-
const key = getKey(signupItem);
|
|
169
|
-
return (
|
|
170
|
-
(key === "email" || key === "phone") &&
|
|
171
|
-
signupItem.rule !== "No verification"
|
|
172
|
-
);
|
|
173
|
-
}
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
export type SignupItem = {
|
|
4
|
+
name: string;
|
|
5
|
+
label: string;
|
|
6
|
+
placeholder: string;
|
|
7
|
+
prompted: boolean;
|
|
8
|
+
required: boolean;
|
|
9
|
+
rule: string;
|
|
10
|
+
visible: boolean;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export function getIcon(
|
|
14
|
+
signupItem: SignupItem,
|
|
15
|
+
options: {
|
|
16
|
+
password: {
|
|
17
|
+
state: Record<string, boolean>;
|
|
18
|
+
setState: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
Button: React.JSX.ElementType
|
|
22
|
+
) {
|
|
23
|
+
const eye = (
|
|
24
|
+
<svg
|
|
25
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
26
|
+
width="24"
|
|
27
|
+
height="24"
|
|
28
|
+
viewBox="0 0 24 24"
|
|
29
|
+
fill="none"
|
|
30
|
+
stroke="currentColor"
|
|
31
|
+
stroke-width="2"
|
|
32
|
+
stroke-linecap="round"
|
|
33
|
+
stroke-linejoin="round"
|
|
34
|
+
className="lucide lucide-eye"
|
|
35
|
+
>
|
|
36
|
+
<path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z" />
|
|
37
|
+
<circle cx="12" cy="12" r="3" />
|
|
38
|
+
</svg>
|
|
39
|
+
);
|
|
40
|
+
const eyeOff = (
|
|
41
|
+
<svg
|
|
42
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
43
|
+
width="24"
|
|
44
|
+
height="24"
|
|
45
|
+
viewBox="0 0 24 24"
|
|
46
|
+
fill="none"
|
|
47
|
+
stroke="currentColor"
|
|
48
|
+
stroke-width="2"
|
|
49
|
+
stroke-linecap="round"
|
|
50
|
+
stroke-linejoin="round"
|
|
51
|
+
className="lucide lucide-eye-off"
|
|
52
|
+
>
|
|
53
|
+
<path d="M9.88 9.88a3 3 0 1 0 4.24 4.24" />
|
|
54
|
+
<path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68" />
|
|
55
|
+
<path d="M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61" />
|
|
56
|
+
<line x1="2" x2="22" y1="2" y2="22" />
|
|
57
|
+
</svg>
|
|
58
|
+
);
|
|
59
|
+
const type = getType(signupItem);
|
|
60
|
+
const key = getKey(signupItem);
|
|
61
|
+
if (type === "password") {
|
|
62
|
+
const showPassword = options.password.state[key];
|
|
63
|
+
return (
|
|
64
|
+
<Button
|
|
65
|
+
variant="ghost"
|
|
66
|
+
size="icon"
|
|
67
|
+
className="absolute top-1/2 right-2 -translate-y-1/2"
|
|
68
|
+
onClick={(e) => {
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
e.stopPropagation();
|
|
71
|
+
options.password.setState({
|
|
72
|
+
...options.password.state,
|
|
73
|
+
[key]: !showPassword,
|
|
74
|
+
});
|
|
75
|
+
}}
|
|
76
|
+
>
|
|
77
|
+
{showPassword ? eyeOff : eye}
|
|
78
|
+
<span className="sr-only">Toggle password visibility</span>
|
|
79
|
+
</Button>
|
|
80
|
+
);
|
|
81
|
+
} else {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function getKey(signupItem: SignupItem) {
|
|
87
|
+
const nameMap = {
|
|
88
|
+
ID: "id",
|
|
89
|
+
Username: "username",
|
|
90
|
+
// also firstName, lastName
|
|
91
|
+
"Display name": "name",
|
|
92
|
+
Affiliation: "affiliation",
|
|
93
|
+
"ID card": "idCard",
|
|
94
|
+
Email: "email",
|
|
95
|
+
Phone: "phone",
|
|
96
|
+
Password: "password",
|
|
97
|
+
"Confirm password": "confirm",
|
|
98
|
+
"Invitation code": "invitationCode",
|
|
99
|
+
"Country/Region": "country_region",
|
|
100
|
+
Agreement: "agreement",
|
|
101
|
+
};
|
|
102
|
+
if (Object.keys(nameMap).includes(signupItem.name)) {
|
|
103
|
+
return nameMap[signupItem.name];
|
|
104
|
+
} else {
|
|
105
|
+
return signupItem.name;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function getType(
|
|
110
|
+
signupItem: SignupItem,
|
|
111
|
+
options?: { hidePassword: Record<string, boolean> }
|
|
112
|
+
) {
|
|
113
|
+
const password = ["password", "confirm"];
|
|
114
|
+
const key = getKey(signupItem);
|
|
115
|
+
if (password.includes(key) && !options?.hidePassword[key]) {
|
|
116
|
+
return "password";
|
|
117
|
+
} else {
|
|
118
|
+
return "text";
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function getPasswordVisibilityRecord(
|
|
123
|
+
signupItems: SignupItem[]
|
|
124
|
+
): Record<string, boolean> {
|
|
125
|
+
return Object.fromEntries(
|
|
126
|
+
signupItems
|
|
127
|
+
.filter((item) => getType(item) === "password")
|
|
128
|
+
.map((item) => [getKey(item), false])
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function getFormProps(signupItem: SignupItem) {
|
|
133
|
+
return {
|
|
134
|
+
name: getKey(signupItem),
|
|
135
|
+
label: signupItem.label || signupItem.name,
|
|
136
|
+
placeholder: signupItem.placeholder,
|
|
137
|
+
required: signupItem.required,
|
|
138
|
+
type: getType(signupItem),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function getZod(z: any, signupItem: SignupItem) {
|
|
143
|
+
const key = getKey(signupItem);
|
|
144
|
+
let validator: any = z.string();
|
|
145
|
+
if (key === "email") {
|
|
146
|
+
validator = validator.email();
|
|
147
|
+
}
|
|
148
|
+
if (!signupItem.required) {
|
|
149
|
+
validator = validator.optional();
|
|
150
|
+
}
|
|
151
|
+
return validator;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function getDefaultValues(signupItems: SignupItem[]) {
|
|
155
|
+
const entries = signupItems.map((item) => {
|
|
156
|
+
return [getKey(item), ""];
|
|
157
|
+
});
|
|
158
|
+
// add codes
|
|
159
|
+
const codes = signupItems
|
|
160
|
+
.filter((item) => requiresCode(item))
|
|
161
|
+
.map((item) => {
|
|
162
|
+
return [getKey(item) + "Code", ""];
|
|
163
|
+
});
|
|
164
|
+
return Object.fromEntries([...entries, ...codes]);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function requiresCode(signupItem: SignupItem) {
|
|
168
|
+
const key = getKey(signupItem);
|
|
169
|
+
return (
|
|
170
|
+
(key === "email" || key === "phone") &&
|
|
171
|
+
signupItem.rule !== "No verification"
|
|
172
|
+
);
|
|
173
|
+
}
|
package/src/i18n/en/signup.json
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"translation": {
|
|
3
|
-
"signup": {
|
|
4
|
-
"username": "Username",
|
|
5
|
-
"confirm": "Confirm password",
|
|
6
|
-
"signInNow": "Sign In Now",
|
|
7
|
-
"signUp": "Sign Up",
|
|
8
|
-
"haveAccount": "Have account?"
|
|
9
|
-
},
|
|
10
|
-
"forget": {
|
|
11
|
-
"username": "Please input your username.",
|
|
12
|
-
"firstName": "Please input your first name.",
|
|
13
|
-
"lastName": "Please input your last name.",
|
|
14
|
-
"realName": "Please input your real name.",
|
|
15
|
-
"displayName": "Please input your display name.",
|
|
16
|
-
"affliation": "Please input your affliation.",
|
|
17
|
-
"idCard": "Please input your ID card number.",
|
|
18
|
-
"code": "Please input your verification code.",
|
|
19
|
-
"email": "Please input your email.",
|
|
20
|
-
"confirm": "Please confirm your password and ensure it matches.",
|
|
21
|
-
"invitationCode": "Please input your invitation code."
|
|
22
|
-
},
|
|
23
|
-
"format": {
|
|
24
|
-
"idCard": "The ID card number format is incorrect."
|
|
25
|
-
},
|
|
26
|
-
"general": {
|
|
27
|
-
"firstName": "First name",
|
|
28
|
-
"lastName": "Last name",
|
|
29
|
-
"displayName": "Display name",
|
|
30
|
-
"realName": "Real name",
|
|
31
|
-
"email": "Email",
|
|
32
|
-
"password": "Password",
|
|
33
|
-
"captcha": "Captcha"
|
|
34
|
-
},
|
|
35
|
-
"user": {
|
|
36
|
-
"affliation": "Affliation",
|
|
37
|
-
"idCard": "ID card"
|
|
38
|
-
},
|
|
39
|
-
"code": {
|
|
40
|
-
"email": "Email code",
|
|
41
|
-
"sending": "Sending",
|
|
42
|
-
"sendCode": "Send code"
|
|
43
|
-
},
|
|
44
|
-
"application": {
|
|
45
|
-
"invitationCode": "Invitation code"
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"translation": {
|
|
3
|
+
"signup": {
|
|
4
|
+
"username": "Username",
|
|
5
|
+
"confirm": "Confirm password",
|
|
6
|
+
"signInNow": "Sign In Now",
|
|
7
|
+
"signUp": "Sign Up",
|
|
8
|
+
"haveAccount": "Have account?"
|
|
9
|
+
},
|
|
10
|
+
"forget": {
|
|
11
|
+
"username": "Please input your username.",
|
|
12
|
+
"firstName": "Please input your first name.",
|
|
13
|
+
"lastName": "Please input your last name.",
|
|
14
|
+
"realName": "Please input your real name.",
|
|
15
|
+
"displayName": "Please input your display name.",
|
|
16
|
+
"affliation": "Please input your affliation.",
|
|
17
|
+
"idCard": "Please input your ID card number.",
|
|
18
|
+
"code": "Please input your verification code.",
|
|
19
|
+
"email": "Please input your email.",
|
|
20
|
+
"confirm": "Please confirm your password and ensure it matches.",
|
|
21
|
+
"invitationCode": "Please input your invitation code."
|
|
22
|
+
},
|
|
23
|
+
"format": {
|
|
24
|
+
"idCard": "The ID card number format is incorrect."
|
|
25
|
+
},
|
|
26
|
+
"general": {
|
|
27
|
+
"firstName": "First name",
|
|
28
|
+
"lastName": "Last name",
|
|
29
|
+
"displayName": "Display name",
|
|
30
|
+
"realName": "Real name",
|
|
31
|
+
"email": "Email",
|
|
32
|
+
"password": "Password",
|
|
33
|
+
"captcha": "Captcha"
|
|
34
|
+
},
|
|
35
|
+
"user": {
|
|
36
|
+
"affliation": "Affliation",
|
|
37
|
+
"idCard": "ID card"
|
|
38
|
+
},
|
|
39
|
+
"code": {
|
|
40
|
+
"email": "Email code",
|
|
41
|
+
"sending": "Sending",
|
|
42
|
+
"sendCode": "Send code"
|
|
43
|
+
},
|
|
44
|
+
"application": {
|
|
45
|
+
"invitationCode": "Invitation code"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
package/src/i18n/index.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import i18n from "i18next";
|
|
2
|
-
// import detector from "i18next-browser-languagedetector";
|
|
3
|
-
import { initReactI18next } from "react-i18next";
|
|
4
|
-
import en from "./en/signup.json";
|
|
5
|
-
|
|
6
|
-
i18n
|
|
7
|
-
// .use(detector)
|
|
8
|
-
.use(initReactI18next) // passes i18n down to react-i18next
|
|
9
|
-
.init({
|
|
10
|
-
lng: "en",
|
|
11
|
-
fallbackLng: "en", // use en if detected lng is not available
|
|
12
|
-
resources: {
|
|
13
|
-
en,
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
export default i18n;
|
|
1
|
+
import i18n from "i18next";
|
|
2
|
+
// import detector from "i18next-browser-languagedetector";
|
|
3
|
+
import { initReactI18next } from "react-i18next";
|
|
4
|
+
import en from "./en/signup.json";
|
|
5
|
+
|
|
6
|
+
i18n
|
|
7
|
+
// .use(detector)
|
|
8
|
+
.use(initReactI18next) // passes i18n down to react-i18next
|
|
9
|
+
.init({
|
|
10
|
+
lng: "en",
|
|
11
|
+
fallbackLng: "en", // use en if detected lng is not available
|
|
12
|
+
resources: {
|
|
13
|
+
en,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export default i18n;
|
package/src/index.tsx
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import getAuthConfig from "./auth/config";
|
|
2
|
-
import { SignUp, useSignUp, SignUpProvider } from "./components/SignUp";
|
|
3
|
-
|
|
4
|
-
// function SignUp() {
|
|
5
|
-
// return <>Sign up</>;
|
|
6
|
-
// }
|
|
7
|
-
|
|
8
|
-
export { getAuthConfig, SignUp, useSignUp, SignUpProvider };
|
|
1
|
+
import getAuthConfig from "./auth/config";
|
|
2
|
+
import { SignUp, useSignUp, SignUpProvider } from "./components/SignUp";
|
|
3
|
+
|
|
4
|
+
// function SignUp() {
|
|
5
|
+
// return <>Sign up</>;
|
|
6
|
+
// }
|
|
7
|
+
|
|
8
|
+
export { getAuthConfig, SignUp, useSignUp, SignUpProvider };
|
package/src/vite-env.d.ts
CHANGED
|
File without changes
|
package/tsconfig.json
CHANGED
|
File without changes
|
package/tsconfig.node.json
CHANGED
|
File without changes
|