'use client'; import React, { useState, useEffect, useCallback, useRef } from 'react'; import { Document, docApi } from '@/lib/api-docs'; import { XMarkIcon, CheckIcon, ArrowLeftIcon, Bars3BottomLeftIcon, HashtagIcon, CloudArrowUpIcon, SparklesIcon } from "@heroicons/react/24/outline"; import NotionEditor from './NotionEditor'; import DocumentSidebar from './DocumentSidebar'; import { toast } from 'react-hot-toast'; interface DocumentEditorProps { initialDocument: Partial | null; onSave: (doc: Partial) => void; onCancel: () => void; } export default function DocumentEditor({ initialDocument, onSave, onCancel }: DocumentEditorProps) { const [document, setDocument] = useState | null>(initialDocument); const [title, setTitle] = useState(initialDocument?.title || ''); const [content, setContent] = useState(initialDocument?.content || '[]'); const [showSidebar, setShowSidebar] = useState(true); const [saving, setSaving] = useState(false); // Refs para controle fino de salvamento const saveTimeout = useRef(null); const lastSaved = useRef({ title: initialDocument?.title || '', content: initialDocument?.content || '[]' }); useEffect(() => { if (initialDocument) { setDocument(initialDocument); setTitle(initialDocument.title || ''); setContent(initialDocument.content || '[]'); lastSaved.current = { title: initialDocument.title || '', content: initialDocument.content || '[]' }; } }, [initialDocument]); // Função de Auto-Save Robusta const autoSave = useCallback(async (newTitle: string, newContent: string) => { if (!document?.id) return; setSaving(true); console.log('💾 Inactivity detected. Saving document...', document.id); try { await docApi.updateDocument(document.id, { title: newTitle, content: newContent, status: 'published' }); // Atualiza o ref do último salvo para evitar loop lastSaved.current = { title: newTitle, content: newContent }; console.log('✅ Document saved successfully'); } catch (e) { console.error('❌ Auto-save failed', e); toast.error('Erro ao salvar automaticamente'); } finally { // Delay visual para o feedback de "Salvo" setTimeout(() => setSaving(false), 800); } }, [document?.id]); // Trigger de auto-save com debounce de 1 segundo useEffect(() => { if (!document?.id) return; // Verifica se houve mudança real em relação ao último salvo if (title === lastSaved.current.title && content === lastSaved.current.content) { return; } if (saveTimeout.current) clearTimeout(saveTimeout.current); saveTimeout.current = setTimeout(() => { autoSave(title, content); }, 1000); // Salva após 1 segundo de inatividade return () => { if (saveTimeout.current) clearTimeout(saveTimeout.current); }; }, [title, content, document?.id, autoSave]); const navigateToDoc = async (doc: Document) => { // Antes de navegar, salva o atual se necessário if (title !== lastSaved.current.title || content !== lastSaved.current.content) { await autoSave(title, content); } setDocument(doc); setTitle(doc.title); setContent(doc.content); lastSaved.current = { title: doc.title, content: doc.content }; toast.success(`Abrindo: ${doc.title || 'Untitled'}`, { duration: 1000, position: 'bottom-center' }); }; return (
{/* Header Clean */}
setTitle(e.target.value)} className="text-lg font-bold bg-transparent border-none outline-none text-zinc-900 dark:text-white placeholder:text-zinc-300 dark:placeholder:text-zinc-600 w-full max-w-xl" />
{saving ? (
Saving...
) : (
Sync Saved
)}
{/* Lateral Sidebar (Navegação) */} {showSidebar && document?.id && ( )} {/* Área do Editor */}
{/* Title Hero Display */}

{title || 'Untitled'}

Me
Editing Mode • Real-time Sync
); }