From 3cf20cfb38dcdae9ae17aa137c63e19eaf13a6b3 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 7 May 2024 22:33:36 +0100 Subject: [PATCH] feat: google oauth --- bun.lockb | Bin 351190 -> 351589 bytes package.json | 1 + src/components/AuthForm.tsx | 100 ++++++++++++++++++++++++++++++ src/components/LoadingSpinner.tsx | 26 ++++++++ src/components/auth.tsx | 61 ------------------ src/pages/api/auth/confirm.ts | 38 +++++++----- src/pages/signup/index.tsx | 5 ++ src/pages/verify/index.tsx | 5 -- src/server/api/routers/auth.ts | 20 +++++- src/views/auth/login/index.tsx | 57 +++++++++++++---- src/views/auth/signup/index.tsx | 51 +++++++++++++++ src/views/auth/verify/index.tsx | 12 ---- 12 files changed, 269 insertions(+), 107 deletions(-) create mode 100644 src/components/AuthForm.tsx create mode 100644 src/components/LoadingSpinner.tsx delete mode 100644 src/components/auth.tsx create mode 100644 src/pages/signup/index.tsx delete mode 100644 src/pages/verify/index.tsx create mode 100644 src/views/auth/signup/index.tsx delete mode 100644 src/views/auth/verify/index.tsx diff --git a/bun.lockb b/bun.lockb index 0eb9a9119df8bd8a6870d8368f846cd5fce5845d..d647668a328f49b1663672dfc99e3da4c16f409b 100755 GIT binary patch delta 70626 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 G@Ba_KV5yD( delta 70977 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 ivq^+!yH;YT>UG%mU2D06e%qNZ void; +} + +const EmailSchema = z.object({ email: z.string().email() }); + +export function Auth({ setIsMagicLinkSent }: AuthProps) { + const { + register, + handleSubmit, + watch, + formState: { errors }, + } = useForm({ + resolver: zodResolver(EmailSchema), // Apply the zodResolver + }); + + const email = watch("email"); + + const loginWithEmail = api.auth.loginWithEmail.useMutation({ + onSuccess: () => { + setIsMagicLinkSent(true, email); + }, + }); + + const loginWithOAuth = api.auth.loginWithOAuth.useMutation({ + onSuccess: (data) => { + if (data?.url) window.open(data.url); + }, + }); + + const onSubmit = (values: FormValues) => { + try { + loginWithEmail.mutate({ + email: values.email, + }); + } catch (error) { + console.error(error); + } + }; + + return ( +
+
+ +
+
+
+ + {!loginWithEmail.error && !loginWithOAuth.error && errors.email && ( +

+ Please enter a valid email address +

+ )} + {loginWithEmail.error ?? loginWithOAuth.error ? ( +

+ Something went wrong, please try again later or contact customer + support. +

+ ) : null} + +
+ +
+ +
+ ); +} diff --git a/src/components/LoadingSpinner.tsx b/src/components/LoadingSpinner.tsx new file mode 100644 index 00000000..4ad32246 --- /dev/null +++ b/src/components/LoadingSpinner.tsx @@ -0,0 +1,26 @@ +const LoadingSpinner = () => { + return ( + + + + + ); +}; + +export default LoadingSpinner; diff --git a/src/components/auth.tsx b/src/components/auth.tsx deleted file mode 100644 index bd065c1b..00000000 --- a/src/components/auth.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Formik, Form, Field } from "formik"; -import { api } from "~/utils/api"; -import { useRouter } from "next/navigation"; - -interface FormValues { - email: string; -} - -export function Login() { - const router = useRouter(); - - const login = api.auth.login.useMutation({ - onSuccess: () => { - router.push("/verify"); - }, - }); - - return ( - { - login.mutate({ - email: values.email, - }); - }} - > -
-
- -
- -
-
- -
- -
-
-
- ); -} diff --git a/src/pages/api/auth/confirm.ts b/src/pages/api/auth/confirm.ts index c913d1e8..fa24d231 100644 --- a/src/pages/api/auth/confirm.ts +++ b/src/pages/api/auth/confirm.ts @@ -19,35 +19,43 @@ export default async function handler( const queryParams = req.query; const token_hash = stringOrFirstString(queryParams.token_hash); const type = stringOrFirstString(queryParams.type); + const code = stringOrFirstString(queryParams.code); let next = "/error"; - if (token_hash && type) { + let authRes; + + if ((token_hash && type) ?? code) { const db = createNextClient(req, res); - const { error, data } = await db.auth.verifyOtp({ - type: type as EmailOtpType, - token_hash, - }); - console.log({ error }); + if (token_hash && type) { + authRes = await db.auth.verifyOtp({ + type: type as EmailOtpType, + token_hash, + }); + } - if (data.user?.id) { - const user = await db + if (code) { + authRes = await db.auth.exchangeCodeForSession(code); + } + + const user = authRes?.data.user; + + if (user?.id) { + const existingUser = await db .from("user") .select() - .eq("id", data.user.id) + .eq("id", user.id) .limit(1) .maybeSingle(); - if (!user.data) { - await db - .from("user") - .insert({ id: data.user.id, email: data.user.email ?? "" }); + if (!existingUser.data) { + await db.from("user").insert({ id: user.id, email: user.email ?? "" }); } } - if (error) { - console.error(error); + if (authRes?.error) { + console.error(authRes.error); } else { next = stringOrFirstString(queryParams.next) ?? "/"; } diff --git a/src/pages/signup/index.tsx b/src/pages/signup/index.tsx new file mode 100644 index 00000000..152a9774 --- /dev/null +++ b/src/pages/signup/index.tsx @@ -0,0 +1,5 @@ +import SignupView from "~/views/auth/signup"; + +export default function SignupPage() { + return ; +} diff --git a/src/pages/verify/index.tsx b/src/pages/verify/index.tsx deleted file mode 100644 index 6cfa6c29..00000000 --- a/src/pages/verify/index.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import VerifyView from "~/views/auth/verify"; - -export default function VerifyPage() { - return ; -} diff --git a/src/server/api/routers/auth.ts b/src/server/api/routers/auth.ts index 0e540a0a..7aaad0d3 100644 --- a/src/server/api/routers/auth.ts +++ b/src/server/api/routers/auth.ts @@ -21,7 +21,7 @@ export const authRouter = createTRPCRouter({ return data; }), - login: publicProcedure + loginWithEmail: publicProcedure .input(z.object({ email: z.string() })) .mutation(async ({ ctx, input }) => { const { data } = await ctx.db.auth.signInWithOtp({ @@ -31,6 +31,24 @@ export const authRouter = createTRPCRouter({ }, }); + return data; + }), + loginWithOAuth: publicProcedure + .input(z.object({ provider: z.string() })) + .mutation(async ({ ctx, input }) => { + if (input.provider !== "google") return null; + + const { data } = await ctx.db.auth.signInWithOAuth({ + provider: "google", + options: { + queryParams: { + access_type: "offline", + prompt: "consent", + }, + redirectTo: `${env.WEBSITE_URL}/api/auth/confirm`, + }, + }); + return data; }), }); diff --git a/src/views/auth/login/index.tsx b/src/views/auth/login/index.tsx index d1226beb..a4335399 100644 --- a/src/views/auth/login/index.tsx +++ b/src/views/auth/login/index.tsx @@ -1,20 +1,51 @@ -import { Login } from "~/components/auth"; +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import { Auth } from "~/components/AuthForm"; +import { api } from "~/utils/api"; export default function LoginPage() { + const router = useRouter(); + const [isMagicLinkSent, setIsMagicLinkSent] = useState(false); + const [magicLinkRecipient, setMagicLinkRecipient] = useState(""); + + const handleMagicLinkSent = (value: boolean, recipient: string) => { + setIsMagicLinkSent(value); + setMagicLinkRecipient(recipient); + }; + + const authCookieExists = document.cookie + .split("; ") + .some((cookie) => cookie.includes("auth-token")); + + if (authCookieExists) { + const { error } = api.auth.getUser.useQuery(); + + if (!error) router.push("/boards"); + } + return ( -
-

- kan.bn -

-

Get started

-
-
- -
+
+
+

+ kan.bn +

+

+ {isMagicLinkSent ? "Check your inbox" : "Welcome back"} +

+ {isMagicLinkSent ? ( +
+

+ {`Click on the link we've sent to ${magicLinkRecipient} to sign in.`} +

+
+ ) : ( +
+
+ +
+
+ )}
-

- {"Already have an account?"} -

); } diff --git a/src/views/auth/signup/index.tsx b/src/views/auth/signup/index.tsx new file mode 100644 index 00000000..5ad80de0 --- /dev/null +++ b/src/views/auth/signup/index.tsx @@ -0,0 +1,51 @@ +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import { Auth } from "~/components/AuthForm"; +import { api } from "~/utils/api"; + +export default function SignupPage() { + const router = useRouter(); + const [isMagicLinkSent, setIsMagicLinkSent] = useState(false); + const [magicLinkRecipient, setMagicLinkRecipient] = useState(""); + + const handleMagicLinkSent = (value: boolean, recipient: string) => { + setIsMagicLinkSent(value); + setMagicLinkRecipient(recipient); + }; + + const authCookieExists = document.cookie + .split("; ") + .some((cookie) => cookie.includes("auth-token")); + + if (authCookieExists) { + const { error } = api.auth.getUser.useQuery(); + + if (!error) router.push("/boards"); + } + + return ( +
+
+

+ kan.bn +

+

+ {isMagicLinkSent ? "Check your inbox" : "Get started"} +

+ {isMagicLinkSent ? ( +
+

+ {`Click on the link we've sent to ${magicLinkRecipient} to sign in.`} +

+
+ ) : ( +
+
+ +
+
+ )} +
+
+ ); +} diff --git a/src/views/auth/verify/index.tsx b/src/views/auth/verify/index.tsx deleted file mode 100644 index 33e9a9c2..00000000 --- a/src/views/auth/verify/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -export default function VerifyPage() { - return ( -
-

Check your inbox

-
-

- {`Click on the link we've sent to you@example.com to sign in.`} -

-
-
- ); -}