feat: implement auth redirects using beforeLoad route handlers

This commit is contained in:
2025-09-10 20:40:32 -03:00
parent f4e996d753
commit f6dd51c943
2 changed files with 30 additions and 14 deletions

View File

@@ -1,29 +1,28 @@
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute, redirect } from "@tanstack/react-router";
import { useEffect } from "react";
import { SpacesGrid } from "@/components/spaces-grid"; import { SpacesGrid } from "@/components/spaces-grid";
import { authClient } from "@/lib/auth-client"; import { authClient, account } from "@/lib/auth-client";
import { trpc } from "@/utils/trpc"; import { trpc } from "@/utils/trpc";
export const Route = createFileRoute("/dashboard")({ export const Route = createFileRoute("/dashboard")({
beforeLoad: async () => {
const me = await account.get();
if (!me) {
throw redirect({ to: "/" });
}
const isVerified = Boolean(me.emailVerification);
if (!isVerified) {
throw redirect({ to: "/verify-email" });
}
},
component: RouteComponent, component: RouteComponent,
}); });
function RouteComponent() { function RouteComponent() {
const { data: session, isPending } = authClient.useSession(); const { data: session, isPending } = authClient.useSession();
const navigate = Route.useNavigate();
const privateData = useQuery(trpc.privateData.queryOptions()); const privateData = useQuery(trpc.privateData.queryOptions());
useEffect(() => {
if (!(session || isPending)) {
navigate({
to: "/login",
});
}
}, [session, isPending, navigate]);
if (isPending) { if (isPending) {
return <div>Loading...</div>; return <div>Loading...</div>;
} }

View File

@@ -1,9 +1,26 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute, redirect } from "@tanstack/react-router";
import { useState } from "react"; import { useState } from "react";
import SignInForm from "@/components/sign-in-form"; import SignInForm from "@/components/sign-in-form";
import SignUpForm from "@/components/sign-up-form"; import SignUpForm from "@/components/sign-up-form";
import { account } from "@/lib/auth-client";
export const Route = createFileRoute("/login")({ export const Route = createFileRoute("/login")({
beforeLoad: async () => {
let me = null;
try {
me = await account.get();
} catch {
// ignore
}
console.log(me)
if (me) {
const isVerified = Boolean(me.emailVerification);
if (isVerified) {
throw redirect({ to: "/dashboard" });
}
throw redirect({ to: "/verify-email" });
}
},
component: RouteComponent, component: RouteComponent,
}); });