feat: implement auth states

This commit is contained in:
2025-07-19 16:20:08 +07:00
parent 4f4c687ab7
commit da7c3b2603
10 changed files with 136 additions and 65 deletions
-1
View File
@@ -1 +0,0 @@
export const AUTH_COOKIE = 'payload-token';
+9 -19
View File
@@ -1,21 +1,17 @@
import { headers as getHeaders, cookies as getCookies } from "next/headers";
import { headers as getHeaders } from "next/headers";
import { TRPCError } from "@trpc/server";
import { AUTH_COOKIE } from "@/modules/auth/constants";
import { loginSchema, registerSchema } from "@/modules/auth/schemas";
import { baseProcedure, createTRPCRouter } from "@/trpc/init";
import { generateAuthCookie } from "../utils";
export const authRouter = createTRPCRouter({
session: baseProcedure.query(async ({ ctx }) => {
const headers = await getHeaders();
return await ctx.db.auth({ headers });
}),
logout: baseProcedure.mutation((async () => {
const cookies = await getCookies();
cookies.delete(AUTH_COOKIE);
})),
register: baseProcedure
.input(
registerSchema
@@ -62,13 +58,10 @@ export const authRouter = createTRPCRouter({
})
}
const cookies = await getCookies();
cookies.set({
name: AUTH_COOKIE,
await generateAuthCookie({
prefix: ctx.db.config.cookiePrefix,
value: data.token,
httpOnly: true,
path: '/',
});
})
}),
login: baseProcedure
.input(loginSchema)
@@ -88,13 +81,10 @@ export const authRouter = createTRPCRouter({
})
}
const cookies = await getCookies();
cookies.set({
name: AUTH_COOKIE,
await generateAuthCookie({
prefix: ctx.db.config.cookiePrefix,
value: data.token,
httpOnly: true,
path: '/',
});
})
return data;
})
+12 -9
View File
@@ -1,18 +1,19 @@
'use client';
import { toast } from "sonner";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useForm } from "react-hook-form";
import { Poppins } from "next/font/google";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { zodResolver } from "@hookform/resolvers/zod";
import { useTRPC } from "@/trpc/client";
import { Button } from "@/components/ui/button";
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form";
import { Input } from "@/components/ui/input";
import { cn } from "@/lib/utils";
import { LoginSchema, loginSchema } from "@/modules/auth/schemas";
import { useTRPC } from "@/trpc/client";
import { zodResolver } from "@hookform/resolvers/zod";
import { useMutation } from "@tanstack/react-query";
import { Poppins } from "next/font/google";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
const poppins = Poppins({
subsets: ['latin'],
@@ -22,11 +23,13 @@ const poppins = Poppins({
export const SignInView = () => {
const router = useRouter();
const trpc = useTRPC();
const queryClient = useQueryClient();
const login = useMutation(trpc.auth.login.mutationOptions({
onError: (error) => {
toast.error(error.message)
},
onSuccess: () => {
onSuccess: async () => {
await queryClient.invalidateQueries(trpc.auth.session.queryFilter())
router.push('/');
}
}));
+17
View File
@@ -0,0 +1,17 @@
import { cookies as getCookies } from "next/headers";
interface Props {
prefix: string;
value: string;
}
export const generateAuthCookie = async ({prefix, value}: Props) => {
const cookies = await getCookies();
cookies.set({
name: `${prefix}-token`,
value,
httpOnly: true,
path: '/',
})
}