saas_app/src/packages/administrativo/components/t_imovel_unidade/TImovelUnidadePage.tsx

166 lines
4.6 KiB
TypeScript

'use client';
import { useEffect, useState, useCallback } from 'react';
import Loading from '@/app/_components/loading/loading';
import TImovelUnidadeTable from './TImovelUnidadeTable';
import TImovelUnidadeForm from './TImovelUnidadeForm';
import { useTImovelUnidadeIndexHook } from '../../hooks/t_imovel_unidade/useTImovelUnidadeIndexHook';
import { useTImovelUnidadeSaveHook } from '../../hooks/t_imovel_unidade/useTImovelUnidadeSaveHook';
import { useTImovelUnidadeDeleteHook } from '../../hooks/t_imovel_unidade/useTImovelUnidadeDeleteHook';
import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog';
import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog';
import TImovelUnidadeInterface from '../../interfaces/TImovelUnidadeInterface';
import Header from '@/app/_components/structure/Header';
export default function TImovelUnidadePage() {
// Controle de estado do botão
const [buttonIsLoading, setButtonIsLoading] = useState(false);
// Hooks para leitura e salvamento
const { tImovelUnidade, indexTImovelUnidade } = useTImovelUnidadeIndexHook();
const { saveTImovelUnidade } = useTImovelUnidadeSaveHook();
const { deleteTImovelUnidade } = useTImovelUnidadeDeleteHook();
// Estados
const [selectedAndamento, setSelectedAndamento] = useState<TImovelUnidadeInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<TImovelUnidadeInterface | null>(null);
/**
* Hook do modal de confirmação
*/
const {
isOpen: isConfirmOpen,
openDialog: openConfirmDialog,
handleConfirm,
handleCancel,
} = useConfirmDialog();
/**
* Abre o formulário no modo de edição ou criação
*/
const handleOpenForm = useCallback((data: TImovelUnidadeInterface | null) => {
setSelectedAndamento(data);
setIsFormOpen(true);
}, []);
/**
* Fecha o formulário e limpa o andamento selecionado
*/
const handleCloseForm = useCallback(() => {
setSelectedAndamento(null);
setIsFormOpen(false);
}, []);
/**
* Salva os dados do formulário
*/
const handleSave = useCallback(
async (formData: TImovelUnidadeInterface) => {
// Coloca o botão em estado de loading
setButtonIsLoading(true);
// Aguarda salvar o registro
await saveTImovelUnidade(formData);
// Remove o botão em estado de loading
setButtonIsLoading(false);
// Atualiza a lista de dados
indexTImovelUnidade();
},
[saveTImovelUnidade, indexTImovelUnidade, handleCloseForm],
);
/**
* Quando o usuário clica em "remover" na tabela
*/
const handleConfirmDelete = useCallback(
(item: TImovelUnidadeInterface) => {
// Define o item atual para remoção
setItemToDelete(item);
// Abre o modal de confirmação
openConfirmDialog();
},
[openConfirmDialog],
);
/**
* Executa a exclusão de fato quando o usuário confirma
*/
const handleDelete = useCallback(async () => {
// Protege contra null
if (!itemToDelete) return;
// Executa o Hook de remoção
await deleteTImovelUnidade(itemToDelete);
// Atualiza a lista
await indexTImovelUnidade();
// Limpa o item selecionado
setItemToDelete(null);
// Fecha o modal
handleCancel();
}, [itemToDelete, indexTImovelUnidade, handleCancel]);
/**
* Busca inicial dos dados
*/
useEffect(() => {
indexTImovelUnidade();
}, []);
/**
* Tela de loading enquanto carrega os dados
*/
if (tImovelUnidade?.length == 0) {
return <Loading type={2} />;
}
return (
<div>
{/* Cabeçalho */}
<Header
title={'Unidades'}
description={'Gerenciamento de unidades'}
buttonText={'Nova unidade'}
buttonAction={() => {
handleOpenForm(null);
}}
/>
{/* Tabela de andamentos */}
<TImovelUnidadeTable
data={tImovelUnidade}
onEdit={handleOpenForm}
onDelete={handleConfirmDelete} />
{/* Modal de confirmação */}
<ConfirmDialog
isOpen={isConfirmOpen}
title="Confirmar exclusão"
description="Atenção"
message={`Deseja realmente excluir a unidade "${itemToDelete?.cidade}"?`}
confirmText="Sim, excluir"
cancelText="Cancelar"
onConfirm={handleDelete}
onCancel={handleCancel}
/>
{/* Formulário de criação/edição */}
<TImovelUnidadeForm
isOpen={isFormOpen}
data={selectedAndamento}
onClose={handleCloseForm}
onSave={handleSave}
buttonIsLoading={buttonIsLoading}
/>
</div>
);
}