65 lines
1.8 KiB
TypeScript
65 lines
1.8 KiB
TypeScript
'use client';
|
|
|
|
import { useEffect, useState } from 'react';
|
|
import { useForm } from 'react-hook-form';
|
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
import { UserLoginSchema } from '../../schemas/User/UserLoginSchema';
|
|
import UserLoginService from '../../services/User/UserLoginService';
|
|
import z from 'zod';
|
|
|
|
/**
|
|
* Tipagem dos valores do formulário.
|
|
* Inclui o campo "rememberMe" que não está no schema Zod original.
|
|
*/
|
|
export type LoginFormValues = z.infer<typeof UserLoginSchema> & {
|
|
rememberMe: boolean;
|
|
};
|
|
|
|
/**
|
|
* Hook responsável por gerenciar o formulário de login e o comportamento
|
|
* de lembrar acesso (localStorage + API).
|
|
*/
|
|
export function useUserFormLoginHook() {
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
// Inicializa o formulário com validação Zod
|
|
const form = useForm<LoginFormValues>({
|
|
resolver: zodResolver(UserLoginSchema),
|
|
defaultValues: {
|
|
email: '',
|
|
password: '',
|
|
rememberMe: false,
|
|
},
|
|
});
|
|
|
|
// Carrega o e-mail salvo no localStorage, se existir
|
|
useEffect(() => {
|
|
const savedEmail = localStorage.getItem('remembered_email');
|
|
if (savedEmail) {
|
|
form.setValue('email', savedEmail);
|
|
form.setValue('rememberMe', true);
|
|
}
|
|
}, [form]);
|
|
|
|
/**
|
|
* Função de envio do formulário — autentica o usuário e
|
|
* salva o e-mail no localStorage se o "Lembrar acesso" estiver marcado.
|
|
*/
|
|
const onSubmit = async (values: LoginFormValues) => {
|
|
try {
|
|
setLoading(true);
|
|
await UserLoginService(values);
|
|
|
|
if (values.rememberMe) {
|
|
localStorage.setItem('remembered_email', values.email);
|
|
} else {
|
|
localStorage.removeItem('remembered_email');
|
|
}
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
// Retorna o formulário e os estados necessários para o componente
|
|
return { form, onSubmit, loading };
|
|
}
|