'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import cookies from 'js-cookie'; import { usePathname, useRouter } from 'next/navigation'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import * as z from 'zod'; import { Loader2 } from 'lucide-react'; import { Button } from '@/components/ui/Button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/Form'; import { Input } from '@/components/ui/Input'; const AuthFormSchema = z.object({ pseudo: z.string().min(3, 'Votre pseudo doit faire au moins 3 caractères.'), email: z.string().optional(), passwd: z.string().min(8, 'Votre mot de passe doit faire au moins 8 caractères.'), firstname: z.string().optional(), lastname: z.string().optional() }); export default function UserAuthForm() { const form = useForm>({ resolver: zodResolver(AuthFormSchema), defaultValues: { pseudo: '', email: '', passwd: '', firstname: '', lastname: '' } }); const [isLoading, setIsLoading] = useState(false); const router = useRouter(); const pathname = usePathname()!; const isSignIn = pathname.includes('sign-in'); async function onSubmit(data: z.infer) { setIsLoading(true); const res = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/${isSignIn ? 'login' : 'register'}`, { method: 'POST', body: JSON.stringify(data) } ); if (!res) { form.setError('passwd', { type: 'manual', message: "Une erreur s'est produite." }); setIsLoading(false); return; } if (!isSignIn) { if (res.status === 400) { const { username_valid, email_valid } = await res.json(); if (!username_valid) { form.setError('pseudo', { message: "Nom d'utilisateur indisponible" }); setIsLoading(false); return; } if (!email_valid) { form.setError('email', { message: 'Adresse e-mail indisponible' }); setIsLoading(false); return; } } } if (res.status === 200) { const token = res.headers.get('Authorization')?.split(' ')[1]; if (token) { cookies.set('token', token, { sameSite: 'strict', secure: process.env.NODE_ENV === 'production' }); router.refresh(); } } else { form.setError('passwd', { message: "Nom d'utilisateur ou mot de passe incorrect" }); setIsLoading(false); return; } } return (
{!isSignIn && ( <> ( Email )} /> ( Prénom )} /> ( Nom )} /> )} ( Nom d'utilisateur )} /> ( Mot de passe )} /> ); }