saveinmed/frontend/src/app/faturas/page.tsx

205 lines
6 KiB
TypeScript

'use client';
import { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation';
import { account } from '@/lib/appwrite';
import { Models } from '@/lib/appwrite';
import Header from '@/components/Header';
import { FileSpreadsheet, Plus } from 'lucide-react';
import FaturaForm from '@/components/FaturaForm';
import FaturaList from '@/components/FaturaList';
import { useFaturas, FaturaFormData } from '@/hooks/useFaturas';
import { RoleGuard } from '@/components/auth/RoleGuard';
import { UserRole } from '@/types/auth';
import { FaturaDocument } from '@/types/legacyEntities';
const GestaoFaturas = () => {
const router = useRouter();
const [user, setUser] = useState<Models.User<Models.Preferences> | null>(null);
const [editing, setEditing] = useState<FaturaDocument | null>(null);
const [activeTab, setActiveTab] = useState<'lista' | 'cadastro'>('lista');
const [searchTerm, setSearchTerm] = useState('');
const {
faturas,
loading,
error,
totalFaturas,
currentPage,
listarFaturas,
buscarFaturas,
cadastrarFatura,
atualizarFatura,
deletarFatura,
} = useFaturas();
useEffect(() => {
const initializeUser = async () => {
try {
const currentUser = await account.get();
setUser(currentUser);
if (activeTab === 'lista') {
await listarFaturas();
}
} catch (error) {
console.error('Usuário não autenticado:', error);
router.push('/');
}
};
initializeUser();
}, [activeTab, router, listarFaturas]);
const handleFormSubmit = async (formData: FaturaFormData): Promise<boolean> => {
if (editing) {
const success = await atualizarFatura(editing.$id, formData);
if (success) {
setEditing(null);
setActiveTab('lista');
}
return success;
}
const success = await cadastrarFatura(formData);
if (success) {
setTimeout(() => setActiveTab('lista'), 2000);
}
return success;
};
const handleEdit = (fatura: FaturaDocument) => {
setEditing(fatura);
setActiveTab('cadastro');
};
const handleCancelEdit = () => {
setEditing(null);
setActiveTab('lista');
};
const handlePrevPage = async () => {
if (currentPage <= 1) {
return;
}
if (searchTerm.trim()) {
await buscarFaturas(searchTerm, currentPage - 1);
return;
}
await listarFaturas(currentPage - 1);
};
const handleSearch = async (term: string) => {
setSearchTerm(term);
if (term.trim()) {
await buscarFaturas(term, 1);
return;
}
await listarFaturas(1);
};
const handleNextPage = async () => {
const totalPages = Math.ceil(totalFaturas / 10);
if (currentPage >= totalPages) {
return;
}
if (searchTerm.trim()) {
await buscarFaturas(searchTerm, currentPage + 1);
return;
}
await listarFaturas(currentPage + 1);
};
if (!user) {
return (
<div className="min-h-screen bg-gray-50 flex items-center justify-center">
<div className="text-center">
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto mb-4"></div>
<p className="text-gray-600">Verificando autenticação...</p>
</div>
</div>
);
}
return (
<RoleGuard allowedRoles={[UserRole.ADMIN, UserRole.ADMIN]}>
<div className="min-h-screen bg-gray-50">
<Header
user={user}
title="Gestão de Faturas"
subtitle="Gerencie as faturas da plataforma SaveInMed"
/>
<main className="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
<div className="mb-6">
<nav className="flex space-x-8 bg-white p-4 rounded-lg shadow-sm">
<button
onClick={() => {
setActiveTab('lista');
setEditing(null);
}}
className={`py-2 px-4 border-b-2 font-medium text-sm transition-colors cursor-pointer rounded-t-md ${
activeTab === 'lista'
? 'border-blue-500 text-blue-600 bg-blue-50'
: 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 hover:bg-gray-50'
}`}
>
<FileSpreadsheet className="w-4 h-4 inline-block mr-2" /> Listar Faturas
</button>
<button
onClick={() => {
setActiveTab('cadastro');
setEditing(null);
}}
className={`py-2 px-4 border-b-2 font-medium text-sm transition-colors cursor-pointer rounded-t-md ${
activeTab === 'cadastro'
? 'border-blue-500 text-blue-600 bg-blue-50'
: 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 hover:bg-gray-50'
}`}
>
<Plus className="w-4 h-4 inline-block mr-2" /> Cadastrar Fatura
</button>
</nav>
</div>
{activeTab === 'lista' && (
<FaturaList
faturas={faturas}
loading={loading}
error={error}
totalFaturas={totalFaturas}
currentPage={currentPage}
pageSize={10}
onEdit={handleEdit}
onDelete={deletarFatura}
onRefresh={() =>
searchTerm.trim()
? buscarFaturas(searchTerm, currentPage)
: listarFaturas(currentPage)
}
onPrevPage={handlePrevPage}
onNextPage={handleNextPage}
onSearch={handleSearch}
/>
)}
{activeTab === 'cadastro' && (
<FaturaForm
onSubmit={handleFormSubmit}
onCancel={editing ? handleCancelEdit : undefined}
initialData={editing}
loading={loading}
/>
)}
</main>
</div>
</RoleGuard>
);
};
export default GestaoFaturas;