saas_app/src/packages/administrativo/components/TCensec/TCensecIndex.tsx

170 lines
4.6 KiB
TypeScript

'use client';
import { useCallback, useEffect, useState } from 'react';
import { Card, CardContent } from '@/components/ui/card';
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
import Loading from '@/shared/components/loading/loading';
import Header from '@/shared/components/structure/Header';
import { useTCensecDeleteHook } from '@/packages/administrativo/hooks/TCensec/useTCensecDeleteHook';
import { useTCensecReadHook } from '@/packages/administrativo/hooks/TCensec/useTCensecReadHook';
import { useTCensecSaveHook } from '@/packages/administrativo/hooks/TCensec/useTCensecSaveHook';
import TCensecInterface from '@/packages/administrativo/interfaces/TCensec/TCensecInterface';
import TCensecForm from './TCensecForm';
import TCensecTable from './TCensecTable';
export default function TCensecIndex() {
// Controle de estado do botão
const [buttonIsLoading, setButtonIsLoading] = useState(false);
// Hooks para leitura e salvamento
const { tCensec, fetchTCensec } = useTCensecReadHook();
const { saveTCensec } = useTCensecSaveHook();
const { deleteTCensec } = useTCensecDeleteHook();
// Estados
const [selectedAndamento, setSelectedAndamento] = useState<TCensecInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<TCensecInterface | 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: TCensecInterface | 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: TCensecInterface) => {
// Coloca o botão em estado de loading
setButtonIsLoading(true);
// Aguarda salvar o registro
await saveTCensec(formData);
// Remove o botão em estado de loading
setButtonIsLoading(false);
// Atualiza a lista de dados
fetchTCensec();
},
[saveTCensec, fetchTCensec, handleCloseForm],
);
/**
* Quando o usuário clica em "remover" na tabela
*/
const handleConfirmDelete = useCallback(
(item: TCensecInterface) => {
// 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 deleteTCensec(itemToDelete);
// Atualiza a lista
await fetchTCensec();
// Limpa o item selecionado
setItemToDelete(null);
// Fecha o modal
handleCancel();
}, [itemToDelete, fetchTCensec, handleCancel]);
/**
* Busca inicial dos dados
*/
useEffect(() => {
fetchTCensec();
}, []);
/**
* Tela de loading enquanto carrega os dados
*/
if (tCensec.length == 0) {
return <Loading type={2} />;
}
return (
<div>
{/* Cabeçalho */}
<Header
title={'CENSEC'}
description={'Gerenciamento de Centrais'}
buttonText={'Nova Central'}
buttonAction={() => {
handleOpenForm(null);
}}
/>
{/* Tabela de andamentos */}
<Card>
<CardContent>
<TCensecTable data={tCensec} onEdit={handleOpenForm} onDelete={handleConfirmDelete} />
</CardContent>
</Card>
{/* Modal de confirmação */}
<ConfirmDialog
isOpen={isConfirmOpen}
title="Confirmar exclusão"
description="Atenção"
message={`Deseja realmente excluir o andamento "${itemToDelete?.descricao}"?`}
confirmText="Sim, excluir"
cancelText="Cancelar"
onConfirm={handleDelete}
onCancel={handleCancel}
/>
{/* Formulário de criação/edição */}
<TCensecForm
isOpen={isFormOpen}
data={selectedAndamento}
onClose={handleCloseForm}
onSave={handleSave}
buttonIsLoading={buttonIsLoading}
/>
</div>
);
4;
}