Skip to content

Commit 143d33f

Browse files
committed
chore(web): update-confirm-email-mutation
1 parent 4375993 commit 143d33f

File tree

4 files changed

+30
-17
lines changed

4 files changed

+30
-17
lines changed

web/src/context/AtlasProvider.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
type AddUserData,
1919
type UpdateEmailData,
2020
type ConfirmEmailData,
21+
type ConfirmEmailResponse,
2122
} from "utils/atlas";
2223

2324
import { isUndefined } from "src/utils";
@@ -33,10 +34,11 @@ interface IAtlasProvider {
3334
authoriseUser: () => void;
3435
addUser: (userSettings: AddUserData) => Promise<boolean>;
3536
updateEmail: (userSettings: UpdateEmailData) => Promise<boolean>;
36-
confirmEmail: (userSettings: ConfirmEmailData) => Promise<{
37-
confirmed: boolean;
38-
isError: boolean;
39-
}>;
37+
confirmEmail: (userSettings: ConfirmEmailData) => Promise<
38+
ConfirmEmailResponse & {
39+
isError: boolean;
40+
}
41+
>;
4042
}
4143

4244
const Context = createContext<IAtlasProvider | undefined>(undefined);
@@ -212,17 +214,17 @@ const AtlasProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) =
212214
* @returns {Promise<boolean>} A promise that resolves to true if email was confirmed successfully
213215
*/
214216
const confirmEmail = useCallback(
215-
async (userSettings: ConfirmEmailData) => {
217+
async (userSettings: ConfirmEmailData): Promise<ConfirmEmailResponse & { isError: boolean }> => {
216218
try {
217219
setIsUpdatingUser(true);
218220

219221
const emailConfirmed = await confirmEmailInAtlas(atlasGqlClient, userSettings);
220222

221-
return { confirmed: emailConfirmed, isError: false };
223+
return { ...emailConfirmed, isError: false };
222224
} catch (err: any) {
223225
// eslint-disable-next-line
224226
console.log("Confirm Email Error : ", err?.message);
225-
return { confirmed: false, isError: true };
227+
return { isConfirmed: false, isTokenExpired: false, isTokenInvalid: false, isError: true };
226228
}
227229
},
228230
[atlasGqlClient]

web/src/pages/Settings/EmailConfirmation/index.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ const EmailConfirmation: React.FC = () => {
5353

5454
const [isConfirming, setIsConfirming] = useState(false);
5555
const [isConfirmed, setIsConfirmed] = useState(false);
56+
const [isTokenExpired, setIsTokenExpired] = useState(false);
57+
const [isTokenInvalid, setIsTokenInvalid] = useState(false);
5658
const [isError, setIsError] = useState(false);
5759
const [searchParams, _] = useSearchParams();
5860
const address = searchParams.get("address");
@@ -66,26 +68,29 @@ const EmailConfirmation: React.FC = () => {
6668

6769
confirmEmail({ address, token })
6870
.then((res) => {
69-
setIsConfirmed(res.confirmed);
71+
setIsConfirmed(res.isConfirmed);
72+
setIsTokenExpired(res.isTokenExpired);
73+
setIsTokenInvalid(res.isTokenInvalid);
7074
setIsError(res.isError);
7175
})
7276
.finally(() => setIsConfirming(false));
7377
}
7478
}, [address, token, confirmEmail]);
7579

7680
const [headerMsg, subtitleMsg, buttonMsg] = useMemo(() => {
77-
if (!address || !isAddress(address) || !token)
81+
if (!address || !isAddress(address) || !token || isTokenInvalid)
7882
return ["Invalid Link!", "Oops, seems like you followed an invalid link.", "Contact Support"];
7983
else if (isError) return ["Verification Failed", "Oops, could not verify your email.", "Contact Support"];
8084
else if (isConfirmed)
8185
return ["Verification Successful 🎉", "Hooray! , your email has been verified.", "Go to dashboard"];
82-
else
86+
else if (isTokenExpired)
8387
return [
8488
"Link Expired",
8589
"Oops, seems like this email verification link has expired. \n No worries we can send the link again.",
8690
"Generate new link",
8791
];
88-
}, [address, token, isError, isConfirmed]);
92+
else return ["Something went wrong", "Oops, seems like something went wrong in our systems", "Contact Support"];
93+
}, [address, token, isError, isConfirmed, isTokenExpired, isTokenInvalid]);
8994

9095
const handleButtonClick = useCallback(() => {
9196
// TODO: send to support?

web/src/utils/atlas/confirmEmail.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import { gql, type GraphQLClient } from "graphql-request";
22

33
const query = gql`
4-
mutation ConfirmEmail($address: String!, $token: String!) {
5-
confirmEmail(address: $address, token: $token)
4+
mutation ConfirmEmail($address: Address!, $token: String!) {
5+
confirmEmail(confirmEmailInput: { address: $address, token: $token }) {
6+
isConfirmed
7+
isTokenExpired
8+
isTokenInvalid
9+
}
610
}
711
`;
812

@@ -11,15 +15,17 @@ export type ConfirmEmailData = {
1115
token: string;
1216
};
1317

14-
type ConfirmEmailResponse = {
15-
confirmEmail: boolean;
18+
export type ConfirmEmailResponse = {
19+
isConfirmed: boolean;
20+
isTokenExpired: boolean;
21+
isTokenInvalid: boolean;
1622
};
1723

1824
export async function confirmEmail(client: GraphQLClient, userData: ConfirmEmailData) {
1925
const variables = userData;
2026

2127
return client
22-
.request<ConfirmEmailResponse>(query, variables)
28+
.request<{ confirmEmail: ConfirmEmailResponse }>(query, variables)
2329
.then(async (response) => response.confirmEmail)
2430
.catch((errors) => {
2531
// eslint-disable-next-line no-console

web/src/utils/atlas/fetchUser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function fetchUser(client: GraphQLClient): Promise<User> {
3434
console.log("Error fetching user :", { errors });
3535
const errorMessage = Array.isArray(errors?.response?.errors)
3636
? errors.response.errors[0]?.message
37-
: "Error user nonce";
37+
: "Error fetching user";
3838
throw Error(errorMessage);
3939
}),
4040
{

0 commit comments

Comments
 (0)