Login.tsx
import { login } from '#/api/mutations/auth'
import { AuthContext } from '#/context/AuthProvider'
import { getError, hasError } from '#/utils/errors'
import { Button } from '#components/catalyst/button'
import { ErrorMessage, Field, Label } from '#components/catalyst/fieldset'
import { Input } from '#components/catalyst/input'
import { ApiError } from '#types/error'
import { AuthContextType, LoginPayload, User } from '#types/user'
import { useForm } from '@tanstack/react-form'
import { useMutation } from '@tanstack/react-query'
import { createFileRoute, redirect, useNavigate } from '@tanstack/react-router'
import { enqueueSnackbar } from 'notistack'
import { useContext } from 'react'
export const Route = createFileRoute('/login')({
beforeLoad: ({ context }) => {
if (context.user) {
throw redirect({
to: '/dashboard',
})
}
},
component: () => <Login />,
})
const Login = () => {
const { updateUser } = useContext(AuthContext) as AuthContextType
const navigate = useNavigate({ from: '/login' })
const { mutate, isPending, error } = useMutation<
User,
ApiError[],
LoginPayload
>({
mutationFn: (payload: LoginPayload) => {
return login(payload)
},
onSuccess: (data) => {
updateUser(data)
enqueueSnackbar('Vous êtes connecté', { variant: 'success' })
},
onSettled: async () => {
await navigate({ to: '/dashboard' })
},
})
const form = useForm({
defaultValues: {
email: '',
password: '',
},
onSubmit: async ({ value }) => {
mutate(value)
},
})
return (
)
}