Skip to content

Commit 42727c2

Browse files
authored
Merge pull request #184 from DistributedCollective/develop
Develop
2 parents 4e56560 + 3fcbb16 commit 42727c2

File tree

5 files changed

+69
-16
lines changed

5 files changed

+69
-16
lines changed

packages/dev-frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"@fortawesome/free-regular-svg-icons": "5.15.2",
1010
"@fortawesome/free-solid-svg-icons": "5.15.2",
1111
"@fortawesome/react-fontawesome": "0.1.14",
12+
"@hcaptcha/react-hcaptcha": "1.4.4",
1213
"@ledgerhq/devices": "^7.0.0",
1314
"@popperjs/core": "2.9.1",
1415
"@testing-library/dom": "7.30.0",

packages/dev-frontend/src/pages/WaitListSignup.tsx

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useMemo } from "react";
1+
import { useMemo, useRef } from "react";
22
import { useCallback } from "react";
33
import { useState } from "react";
44
import {
@@ -19,23 +19,27 @@ import { validateEmail } from "../utils/helpers";
1919
import { registerEmail } from "../utils/whitelist";
2020
import { useLocation } from "react-router-dom";
2121
import { sovrynLink } from "src/contracts/config";
22+
import HCaptcha from "@hcaptcha/react-hcaptcha";
23+
import { captchaSiteKey } from "src/utils";
2224

2325
export const WaitListSignup: React.FC = ({ children }) => {
2426
const [isLoading, setIsLoading] = useState(false);
27+
const [token, setToken] = useState("");
2528
const [success, setSuccess] = useState(false);
2629
const [sovrynMail, setSovrylMail] = useState(false);
27-
const [errorMessage, setErrorMessage] = useState("");
30+
const [error, setError] = useState("");
2831
const [email, setEmail] = useState("");
32+
const captchaRef = useRef<HCaptcha>(null);
2933

3034
const location = useLocation();
3135

3236
const isValidEmail = useMemo(() => validateEmail(email), [email]);
3337

3438
const resetStatus = useCallback(() => {
35-
if (!errorMessage && !success) return;
36-
setErrorMessage("");
39+
if (!error && !success) return;
40+
setError("");
3741
setSuccess(false);
38-
}, [errorMessage, success]);
42+
}, [error, success]);
3943

4044
const handleEmailChange = useCallback(
4145
(e: React.ChangeEvent<HTMLInputElement>) => {
@@ -52,29 +56,44 @@ export const WaitListSignup: React.FC = ({ children }) => {
5256

5357
const ref = params.get("r") || "";
5458
resetStatus();
55-
if (!isValidEmail) {
59+
if (!isValidEmail || !token) {
5660
return;
5761
}
5862
try {
5963
setIsLoading(true);
60-
await registerEmail(email, ref, sovrynMail);
64+
await registerEmail(email, ref, sovrynMail, token);
6165

6266
setEmail("");
63-
setErrorMessage("");
67+
setError("");
6468
setSuccess(true);
6569
setIsLoading(false);
6670
} catch (error: any) {
6771
if (error?.response?.data?.message) {
68-
setErrorMessage(error?.response?.data?.message);
72+
setError(error?.response?.data?.message);
6973
} else {
70-
setErrorMessage("An error has occurred");
74+
setError("An error has occurred");
7175
}
7276
setIsLoading(false);
7377
}
78+
setToken("");
79+
captchaRef.current?.resetCaptcha();
7480
},
75-
[email, isValidEmail, location.search, resetStatus, sovrynMail]
81+
[email, isValidEmail, location.search, resetStatus, sovrynMail, token]
7682
);
7783

84+
const errorMessage = useMemo(() => {
85+
if (error) {
86+
return error;
87+
}
88+
if (email && !isValidEmail) {
89+
return "Please enter a valid email address.";
90+
}
91+
if (email && !token) {
92+
return "Please compelete recaptcha";
93+
}
94+
return null;
95+
}, [email, error, isValidEmail, token]);
96+
7897
return (
7998
<Box
8099
sx={{
@@ -169,6 +188,16 @@ export const WaitListSignup: React.FC = ({ children }) => {
169188
/>
170189
Add me to the general Sovryn mailing list
171190
</Label>
191+
192+
<Box sx={{ my: 1 }}>
193+
<HCaptcha
194+
theme="dark"
195+
sitekey={captchaSiteKey || ""}
196+
onVerify={setToken}
197+
ref={captchaRef}
198+
/>
199+
</Box>
200+
172201
<Button
173202
sx={{
174203
width: 285,
@@ -177,13 +206,13 @@ export const WaitListSignup: React.FC = ({ children }) => {
177206
alignItems: "center"
178207
}}
179208
variant="secondary"
180-
disabled={!isValidEmail || isLoading}
209+
disabled={!isValidEmail || isLoading || !token}
181210
data-action-id="zero-landing-signUp"
182211
>
183212
Sign Up
184213
{isLoading && <Spinner sx={{ ml: 1 }} color={"cardBackground"} size={24} />}
185214
</Button>
186-
{((email && !isValidEmail) || errorMessage) && (
215+
{errorMessage && (
187216
<Paragraph
188217
sx={{
189218
fontSize: 1,
@@ -198,7 +227,7 @@ export const WaitListSignup: React.FC = ({ children }) => {
198227
textAlign: "center"
199228
}}
200229
>
201-
{errorMessage ? errorMessage : "Please enter a valid email address."}
230+
{errorMessage}
202231
</Paragraph>
203232
)}
204233
</form>

packages/dev-frontend/src/utils/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,5 @@ export const parseBalance = (
2222
decimals = 18,
2323
decimalsToDisplay = 2
2424
) => new BigNumber(formatUnits(value || 0, decimals)).toFixed(decimalsToDisplay);
25+
26+
export const captchaSiteKey = process.env.REACT_APP_HCAPTCHA;

packages/dev-frontend/src/utils/whitelist.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ const whitelistClient = axios.create({
1212
export const registerEmail = (
1313
email: string,
1414
ref: string,
15-
sovrynMail: boolean
15+
sovrynMail: boolean,
16+
token: string
1617
): Promise<AxiosResponse<any>> =>
1718
whitelistClient.post("register/" + WhitelistType.ZERO, {
1819
email,
1920
ref,
20-
sovrynMail: !!sovrynMail
21+
sovrynMail: !!sovrynMail,
22+
token
2123
});
2224

2325
export const checkAccountAccess = (account: string): Promise<AxiosResponse<any>> =>

yarn.lock

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,6 +1198,13 @@
11981198
dependencies:
11991199
regenerator-runtime "^0.13.4"
12001200

1201+
"@babel/runtime@^7.17.9":
1202+
version "7.20.6"
1203+
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3"
1204+
integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==
1205+
dependencies:
1206+
regenerator-runtime "^0.13.11"
1207+
12011208
"@babel/runtime@^7.8.7":
12021209
version "7.17.2"
12031210
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941"
@@ -3408,6 +3415,13 @@
34083415
dependencies:
34093416
"@hapi/hoek" "^9.0.0"
34103417

3418+
"@hcaptcha/react-hcaptcha@^1.4.4":
3419+
version "1.4.4"
3420+
resolved "https://registry.yarnpkg.com/@hcaptcha/react-hcaptcha/-/react-hcaptcha-1.4.4.tgz#529c55369160995115735b5fe5453daef4670f04"
3421+
integrity sha512-Aen217LDnf5ywbPSwBG5CsoqBLIHIAS9lhj3zQjXJuO13doQ6/ubkCWNuY8jmwYLefoFt3V3MrZmCdKDaFoTuQ==
3422+
dependencies:
3423+
"@babel/runtime" "^7.17.9"
3424+
34113425
"@humanwhocodes/config-array@^0.5.0":
34123426
version "0.5.0"
34133427
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
@@ -20621,6 +20635,11 @@ regenerator-runtime@^0.11.0:
2062120635
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
2062220636
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
2062320637

20638+
regenerator-runtime@^0.13.11:
20639+
version "0.13.11"
20640+
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
20641+
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
20642+
2062420643
regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7:
2062520644
version "0.13.7"
2062620645
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"

0 commit comments

Comments
 (0)