saas_app/src/packages/administrativo/components/GEmolumentoItem/GEmolumentoItemIndex.tsx

176 lines
5.4 KiB
TypeScript

'use client';
import { useCallback, useEffect, useState } from 'react';
import { useGEmolumentoItemDeleteHook } from '@/packages/administrativo/hooks/GEmolumentoItem/useGEmolumentoItemDeleteHook';
import { useGEmolumentoItemIndexHook } from '@/packages/administrativo/hooks/GEmolumentoItem/useGEmolumentoItemIndexHook';
import { useGEmolumentoItemSaveHook } from '@/packages/administrativo/hooks/GEmolumentoItem/useGEmolumentoItemSaveHook';
import GEmolumentoItemIndexInterface from '@/packages/administrativo/interfaces/GEmolumentoItem/GEmolumentoItemIndexInterface';
import GEmolumentoItemInterface from '@/packages/administrativo/interfaces/GEmolumentoItem/GEmolumentoItemInterface';
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 GEmolumentoItemForm from './GEmolumentoItemForm';
import GEmolumentoItemTable from './GEmolumentoItemTable';
export default function GEmolumentoItemIndex({
emolumento_id,
emolumento_periodo_id,
}: GEmolumentoItemIndexInterface) {
const gEmolumentoItemParams = {
emolumento_id: emolumento_id,
emolumento_periodo_id: emolumento_periodo_id,
};
// Controle de estado do botão
const [buttonIsLoading, setButtonIsLoading] = useState(false);
// Hooks para leitura e salvamento
const { gEmolumentoItem, indexGEmolumentoItem } = useGEmolumentoItemIndexHook();
const { saveGEmolumentoItem } = useGEmolumentoItemSaveHook();
const { deleteGEmolumentoItem } = useGEmolumentoItemDeleteHook();
// Estados
const [selectedData, setSelectedData] = useState<GEmolumentoItemInterface | null>(null);
const [isFormOpen, setIsFormOpen] = useState(false);
// Estado para saber qual item será deletado
const [itemToDelete, setItemToDelete] = useState<GEmolumentoItemInterface | null>(null);
/**
* Hook do modal de confirmação
*/
const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, handleCancel } = useConfirmDialog();
/**
* Abre o formulário no modo de edição ou criação
*/
const handleOpenForm = useCallback((data: GEmolumentoItemInterface | null) => {
// Se não houver dados (criação), cria um objeto inicial com imovel_id
const initialData: GEmolumentoItemInterface =
data ?? ({ emolumento_id, emolumento_periodo_id } as GEmolumentoItemInterface);
setSelectedData(initialData);
setIsFormOpen(true);
}, []);
/**
* Fecha o formulário e limpa o andamento selecionado
*/
const handleCloseForm = useCallback(() => {
setSelectedData(null);
setIsFormOpen(false);
}, []);
/**
* Salva os dados do formulário
*/
const handleSave = useCallback(
async (formData: GEmolumentoItemInterface) => {
// Coloca o botão em estado de loading
setButtonIsLoading(true);
// Aguarda salvar o registro
await saveGEmolumentoItem(formData);
// Remove o botão em estado de loading
setButtonIsLoading(false);
// Atualiza a lista de dados
indexGEmolumentoItem(gEmolumentoItemParams);
},
[saveGEmolumentoItem, indexGEmolumentoItem, handleCloseForm],
);
/**
* Quando o usuário clica em "remover" na tabela
*/
const handleConfirmDelete = useCallback(
(item: GEmolumentoItemInterface) => {
// 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 deleteGEmolumentoItem(itemToDelete);
// Atualiza a lista
await indexGEmolumentoItem(gEmolumentoItemParams);
// Limpa o item selecionado
setItemToDelete(null);
// Fecha o modal
handleCancel();
}, [itemToDelete, indexGEmolumentoItem, handleCancel]);
/**
* Busca inicial dos dados
*/
useEffect(() => {
indexGEmolumentoItem(gEmolumentoItemParams);
}, []);
/**
* Tela de loading enquanto carrega os dados
*/
if (gEmolumentoItem?.length == 0) {
return <Loading type={2} />;
}
return (
<div>
{/* Cabeçalho */}
<Header
title="Itens de Emolumentos"
description="Itens de Emolumentos"
buttonText="Novo Item"
buttonAction={() => handleOpenForm(null)}
/>
{/* Tabela */}
<GEmolumentoItemTable
data={gEmolumentoItem}
onEdit={handleOpenForm}
onDelete={handleConfirmDelete}
/>
{/* Modal de confirmação */}
{isConfirmOpen && (
<ConfirmDialog
isOpen={isConfirmOpen}
title="Confirmar exclusão"
description="Atenção"
message={`Deseja realmente excluir o valor "${itemToDelete?.valor_emolumento}"?`}
confirmText="Sim, excluir"
cancelText="Cancelar"
onConfirm={handleDelete}
onCancel={handleCancel}
/>
)}
{/* Formulário */}
{isFormOpen && (
<GEmolumentoItemForm
isOpen={isFormOpen}
data={selectedData}
onClose={handleCloseForm}
onSave={handleSave}
buttonIsLoading={buttonIsLoading}
/>
)}
</div>
);
}