monitoring-app/src/packages/administrativo/hooks/User/useUserFormLoginHook.ts

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 };
}