diff --git a/apps/web/src/routes/auth.tsx b/apps/web/src/routes/auth.tsx index 904b4ede39..d12be87299 100644 --- a/apps/web/src/routes/auth.tsx +++ b/apps/web/src/routes/auth.tsx @@ -1,6 +1,6 @@ import { Icon } from "@iconify-icon/react"; import { useMutation } from "@tanstack/react-query"; -import { createFileRoute } from "@tanstack/react-router"; +import { createFileRoute, redirect } from "@tanstack/react-router"; import { useState } from "react"; import { z } from "zod"; @@ -8,6 +8,7 @@ import { cn } from "@hypr/utils"; import { Image } from "@/components/image"; import { doAuth, doMagicLinkAuth } from "@/functions/auth"; +import { getSupabaseServerClient } from "@/functions/supabase"; const validateSearch = z.object({ flow: z.enum(["desktop", "web"]).default("web"), @@ -18,6 +19,28 @@ const validateSearch = z.object({ export const Route = createFileRoute("/auth")({ validateSearch, component: Component, + beforeLoad: async ({ search }) => { + const supabase = getSupabaseServerClient(); + const { data: sessionData } = await supabase.auth.getSession(); + + if (sessionData.session) { + if (search.flow === "desktop") { + throw redirect({ + to: "/callback/auth", + search: { + flow: "desktop", + scheme: search.scheme || "hyprnote", + access_token: sessionData.session.access_token, + refresh_token: sessionData.session.refresh_token, + }, + }); + } + + if (search.flow === "web") { + throw redirect({ href: search.redirect || "/app/account" }); + } + } + }, }); function Component() {