170 lines
4.6 KiB
TypeScript
170 lines
4.6 KiB
TypeScript
'use client';
|
|
|
|
import { useEffect, useState, useCallback } from 'react';
|
|
|
|
import Loading from '@/shared/components/loading/loading';
|
|
|
|
import { useTImovelIndexHook } from '@/packages/administrativo/hooks/TImovel/useTImovelIndexHook';
|
|
import { useTImovelSaveHook } from '@/packages/administrativo/hooks/TImovel/useTImovelSaveHook';
|
|
import { useTImovelDeleteHook } from '@/packages/administrativo/hooks/TImovel/useTImovelDeleteHook';
|
|
|
|
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
|
|
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
|
|
|
|
import TImovelInterface from '@/packages/administrativo/interfaces/TImovel/TImovelInterface';
|
|
import Header from '@/shared/components/structure/Header';
|
|
import { TImovelIndexInterface } from '../../interfaces/TImovel/TImovelIndexInterface';
|
|
import TImovelTable from './TImovelTable';
|
|
import TImovelForm from './TImovelForm';
|
|
|
|
export default function TImovelIndex({ pageTitle, pageDescription, tipoClasse }: TImovelIndexInterface) {
|
|
|
|
// Controle de estado do botão
|
|
const [buttonIsLoading, setButtonIsLoading] = useState(false);
|
|
|
|
// Hooks para leitura e salvamento
|
|
const { tImovel, indexTImovel } = useTImovelIndexHook();
|
|
const { saveTImovel } = useTImovelSaveHook();
|
|
const { deleteTImovel } = useTImovelDeleteHook();
|
|
|
|
// Estados
|
|
const [selectedAndamento, setSelectedAndamento] = useState<TImovelInterface | null>(null);
|
|
const [isFormOpen, setIsFormOpen] = useState(false);
|
|
|
|
// Estado para saber qual item será deletado
|
|
const [itemToDelete, setItemToDelete] = useState<TImovelInterface | 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: TImovelInterface | 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: TImovelInterface) => {
|
|
// Coloca o botão em estado de loading
|
|
setButtonIsLoading(true);
|
|
|
|
// Aguarda salvar o registro
|
|
await saveTImovel(formData);
|
|
|
|
// Remove o botão em estado de loading
|
|
setButtonIsLoading(false);
|
|
|
|
// Atualiza a lista de dados
|
|
indexTImovel();
|
|
},
|
|
[saveTImovel, indexTImovel, handleCloseForm],
|
|
);
|
|
|
|
/**
|
|
* Quando o usuário clica em "remover" na tabela
|
|
*/
|
|
const handleConfirmDelete = useCallback(
|
|
(item: TImovelInterface) => {
|
|
// 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 deleteTImovel(itemToDelete);
|
|
|
|
// Atualiza a lista
|
|
await indexTImovel();
|
|
|
|
// Limpa o item selecionado
|
|
setItemToDelete(null);
|
|
|
|
// Fecha o modal
|
|
handleCancel();
|
|
}, [itemToDelete, indexTImovel, handleCancel]);
|
|
|
|
/**
|
|
* Busca inicial dos dados
|
|
*/
|
|
useEffect(() => {
|
|
indexTImovel();
|
|
}, []);
|
|
|
|
/**
|
|
* Tela de loading enquanto carrega os dados
|
|
*/
|
|
if (tImovel?.length == 0) {
|
|
return <Loading type={2} />;
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
{/* Cabeçalho */}
|
|
<Header
|
|
title={pageTitle}
|
|
description={pageDescription}
|
|
buttonText={'Novo imóvel'}
|
|
buttonAction={() => {
|
|
handleOpenForm(null);
|
|
}}
|
|
/>
|
|
{/* Tabela de andamentos */}
|
|
<TImovelTable
|
|
data={tImovel}
|
|
onEdit={handleOpenForm}
|
|
onDelete={handleConfirmDelete}
|
|
/>
|
|
{/* Modal de confirmação */}
|
|
<ConfirmDialog
|
|
isOpen={isConfirmOpen}
|
|
title="Confirmar exclusão"
|
|
description="Atenção"
|
|
message={`Deseja realmente excluir o imóvel "${itemToDelete?.cidade}"?`}
|
|
confirmText="Sim, excluir"
|
|
cancelText="Cancelar"
|
|
onConfirm={handleDelete}
|
|
onCancel={handleCancel}
|
|
/>
|
|
{/* Formulário de criação/edição */}
|
|
<TImovelForm
|
|
isOpen={isFormOpen}
|
|
data={selectedAndamento}
|
|
onClose={handleCloseForm}
|
|
onSave={handleSave}
|
|
buttonIsLoading={buttonIsLoading}
|
|
tipoClasse={tipoClasse}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|