60 lines
1.3 KiB
TypeScript
60 lines
1.3 KiB
TypeScript
import { useMutation } from "@tanstack/react-query"
|
|
import { useNavigate } from "@tanstack/react-router"
|
|
import { toast } from "sonner"
|
|
import type z from "zod"
|
|
import { loginUser } from "@/lib/db/user"
|
|
import { loginFormSchema } from "@/lib/validation/user"
|
|
import { useValidation } from "../useValidation"
|
|
|
|
type TLoginForm = z.infer<typeof loginFormSchema>
|
|
|
|
export const useLogin = () => {
|
|
const navigate = useNavigate()
|
|
const { errors, validate } = useValidation({
|
|
defaultSchema: loginFormSchema
|
|
})
|
|
const loginMutation = useMutation({
|
|
mutationKey: ["login"],
|
|
mutationFn: async (data: TLoginForm) => {
|
|
const response = await loginUser({
|
|
data
|
|
})
|
|
|
|
if (response.error) {
|
|
throw new Error(response.message)
|
|
}
|
|
},
|
|
onMutate: () => {
|
|
toast.loading("Logging in...", { id: "login" })
|
|
},
|
|
onSuccess: () => {
|
|
toast.success("Login successful! Redirecting to posts..", { id: "login" })
|
|
navigate({
|
|
to: "/post"
|
|
})
|
|
},
|
|
onError: (error) => {
|
|
toast.error(error.message, { id: "login" })
|
|
}
|
|
})
|
|
|
|
const validateLogin = (formData: TLoginForm) => {
|
|
const isValid = validate({
|
|
formData
|
|
})
|
|
|
|
if (!isValid) {
|
|
toast.error("Error en el formulario.")
|
|
return false
|
|
}
|
|
|
|
loginMutation.mutate(formData)
|
|
}
|
|
|
|
return {
|
|
login: validateLogin,
|
|
isPending: loginMutation.isPending,
|
|
errors: errors
|
|
}
|
|
}
|