From c61e5550b81f982ea8576f025b33e054b3fa5db3 Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Tue, 26 Mar 2024 16:41:57 -0400 Subject: [PATCH] refactor: wire up verify email, change route, and make it authenticated --- app/routes/account_.verify.tsx | 102 +++++++++++++++++++++++++++++++++ app/routes/verify.tsx | 97 ------------------------------- 2 files changed, 102 insertions(+), 97 deletions(-) create mode 100644 app/routes/account_.verify.tsx delete mode 100644 app/routes/verify.tsx diff --git a/app/routes/account_.verify.tsx b/app/routes/account_.verify.tsx new file mode 100644 index 0000000..693ccda --- /dev/null +++ b/app/routes/account_.verify.tsx @@ -0,0 +1,102 @@ +import type {MetaFunction} from "@remix-run/node"; +import {useSearchParams} from "@remix-run/react"; +import {Button} from "~/components/ui/button.js"; +import logoPng from "~/images/lume-logo.png?url"; +import lumeBgPng from "~/images/lume-bg-image.png?url"; +import {Authenticated, HttpError, useGetIdentity, useGo, useNotification} from "@refinedev/core"; +import {useEffect} from "react"; +import {useMutation, useQuery} from "@tanstack/react-query"; +import {useSdk} from "~/components/lib/sdk-context.js"; +import {Identity} from "~/data/auth-provider.js"; + +export const meta: MetaFunction = () => { + return [{ title: "Verify Email" }]; +}; + +export default function Verify() { + return ( + + + + ); +} + +function VerifyAuthenticated() { + const go = useGo(); + const {open} = useNotification(); + const [searchParams] = useSearchParams(); + const token = searchParams.get("token"); + const sdk = useSdk(); + const user = useGetIdentity(); + + const exchangeToken = useQuery({ + queryKey: ["exchange-token", token], + retry: false, + queryFn: async () => { + const ret= await sdk.account!().verifyEmail({ + email: user.data?.email as string, + token: token!, + }) + + if (ret instanceof Error) { + return Promise.reject(ret) + } + + return ret + }, + }); + + const verifyAgain = useMutation({ + mutationFn: () => { + return sdk.account!().requestEmailVerification() + }, + onMutate() { + open?.({ + type: "success", + message: "Email sent", + description: "Please check your email inbox and click the link", + }) + } + }); + + useEffect(() => { + if (exchangeToken.isSuccess) { + go({ to: "/dashboard" }); + } + }, [go, exchangeToken.isSuccess]); + + return ( +
+
+ Lume logo +
+
+

+ {exchangeToken.isLoading + ? "Verifying your email." : null} + + {exchangeToken.isSuccess && !exchangeToken.isLoading ? "Your email has been verified" : null} + {exchangeToken.isError && !exchangeToken.isLoading ? "Something went wrong, please try again" : null} +

+ {exchangeToken.isError ? ( +
+

{exchangeToken.error.message}

+ +
+ ) : null} + {exchangeToken.isSuccess ?

Redirecting to your dashboard

: null} +
+
+ Lume background +
+
+ ) +} diff --git a/app/routes/verify.tsx b/app/routes/verify.tsx deleted file mode 100644 index 0571b24..0000000 --- a/app/routes/verify.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import type { MetaFunction } from "@remix-run/node"; -import { Link, useSearchParams } from "@remix-run/react"; -import { Button } from "~/components/ui/button"; -import logoPng from "~/images/lume-logo.png?url"; -import lumeColorLogoPng from "~/images/lume-color-logo.png?url"; -import discordLogoPng from "~/images/discord-logo.png?url"; -import lumeBgPng from "~/images/lume-bg-image.png?url"; -import { Field } from "~/components/forms"; -import { getFormProps, useForm } from "@conform-to/react"; -import { z } from "zod"; -import { getZodConstraint, parseWithZod } from "@conform-to/zod"; -import { ToastAction } from "~/components/ui/toast"; -import { useGo, useNotification } from "@refinedev/core"; -import { useEffect } from "react"; -import { useMutation, useQuery } from "@tanstack/react-query"; - -export const meta: MetaFunction = () => { - return [{ title: "Verify Email" }]; -}; - -export default function Verify() { - const go = useGo(); - const {open} = useNotification(); - const [searchParams] = useSearchParams(); - const token = searchParams.get("token"); - - const exchangeToken = useQuery({ - queryKey: ["exchange-token", token], - queryFn: () => { - // TODO: api call to exchange token goes here - return new Promise((resolve) => { - setTimeout(() => { - resolve(true); - }, 5000); - }); - }, - }); - - const verifyAgain = useMutation({ - mutationFn: () => { - // TODO: api call to verify again goes here - return new Promise((resolve) => { - setTimeout(() => { - resolve(true); - }, 5000); - }); - }, - onMutate() { - open?.({ - type: "success", - message: "Email sent", - description: "Please check your email inbox and click the link", - }) - } - }); - - useEffect(() => { - if (exchangeToken.isSuccess) { - go({ to: "/dashboard" }); - } - }, [go, exchangeToken.isSuccess]); - - return ( -
-
- Lume logo -
-
-

- {exchangeToken.isLoading - ? "Verifying your email." : null} - - {exchangeToken.isSuccess && !exchangeToken.isLoading ? "Your email has been verified" : null} - {exchangeToken.isError && !exchangeToken.isLoading ? "Something went wrong, please try again" : null} -

- {exchangeToken.isError ? ( -
-

{exchangeToken.error.message}

- -
- ) : null} - {exchangeToken.isSuccess ?

Redirecting to your dashboard

: null} -
-
- Lume background -
-
- ); -}