'use client'; import React, { useState, useEffect, useMemo } from 'react'; import { SolutionGuard } from '@/components/auth/SolutionGuard'; import { PageHeader, DataTable, Card, Badge } from '@/components/ui'; import { PlusIcon, MagnifyingGlassIcon, DocumentTextIcon, PencilSquareIcon, TrashIcon, ArrowPathIcon, EyeIcon, ClockIcon } from '@heroicons/react/24/outline'; import { docApi, Document } from '@/lib/api-docs'; import { toast } from 'react-hot-toast'; import DocumentEditor from '@/components/documentos/DocumentEditor'; import { format, parseISO } from 'date-fns'; import { ptBR } from 'date-fns/locale'; export default function DocumentosPage() { const [documents, setDocuments] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [isEditing, setIsEditing] = useState(false); const [currentDoc, setCurrentDoc] = useState | null>(null); // Pagination const [currentPage, setCurrentPage] = useState(1); const itemsPerPage = 8; useEffect(() => { fetchDocuments(); }, []); const fetchDocuments = async () => { try { setLoading(true); const data = await docApi.getDocuments(); setDocuments(data || []); } catch (error) { toast.error('Erro ao carregar documentos'); } finally { setLoading(false); } }; const handleCreate = async () => { try { const newDoc = await docApi.createDocument({ title: 'Novo Documento', content: '{"type":"doc","content":[{"type":"paragraph"}]}', status: 'published', parent_id: null }); setCurrentDoc(newDoc); setIsEditing(true); fetchDocuments(); } catch (error) { toast.error('Erro ao iniciar novo documento'); } }; const handleEdit = (doc: Document) => { setCurrentDoc(doc); setIsEditing(true); }; const handleSave = async (docData: Partial) => { try { if (docData.id) { await docApi.updateDocument(docData.id, docData); // toast.success('Documento atualizado!'); // Auto-save já acontece } else { await docApi.createDocument(docData); toast.success('Documento criado!'); } setIsEditing(false); fetchDocuments(); } catch (error) { toast.error('Erro ao salvar documento'); } }; const handleDelete = async (id: string) => { if (!confirm('Tem certeza que deseja excluir este documento e todas as suas subpáginas?')) return; try { await docApi.deleteDocument(id); toast.success('Documento excluído!'); fetchDocuments(); } catch (error) { toast.error('Erro ao excluir documento'); } }; const filteredDocuments = useMemo(() => { return documents.filter(doc => (doc.title || '').toLowerCase().includes(searchTerm.toLowerCase()) || (doc.content || '').toLowerCase().includes(searchTerm.toLowerCase()) ); }, [documents, searchTerm]); const paginatedDocuments = useMemo(() => { const start = (currentPage - 1) * itemsPerPage; return filteredDocuments.slice(start, start + itemsPerPage); }, [filteredDocuments, currentPage]); const columns = [ { header: 'Documento', accessor: (doc: Document) => (

{doc.title || 'Sem título'}

v{doc.version || 1} #{doc.id.substring(0, 8)}
) }, { header: 'Última Modificação', accessor: (doc: Document) => (
{format(parseISO(doc.updated_at), "dd 'de' MMM", { locale: ptBR })} às {format(parseISO(doc.updated_at), "HH:mm")}
) }, { header: 'Ações', align: 'right' as const, accessor: (doc: Document) => (
) } ]; return (
, onClick: handleCreate }} />
setSearchTerm(e.target.value)} className="w-full bg-zinc-50 dark:bg-zinc-950 border border-zinc-100 dark:border-zinc-800 rounded-2xl pl-12 pr-4 py-3 text-sm outline-none focus:ring-2 ring-brand-500/20 transition-all font-semibold placeholder:text-zinc-400" />
{filteredDocuments.length} Documentos
{/* Pagination */}

{filteredDocuments.length} itens no total

{isEditing && ( { setIsEditing(false); fetchDocuments(); }} /> )}
); }