// AdminDashboard.jsx — vista principal del panel admin function AdminDashboard({ session }) { const [tab, setTab] = React.useState('articles'); const [articles, setArticles] = React.useState([]); const [works, setWorks] = React.useState([]); const [contacts, setContacts] = React.useState([]); const [loading, setLoading] = React.useState(true); const [editing, setEditing] = React.useState(null); const [err, setErr] = React.useState(''); const reloadAll = React.useCallback(async () => { setLoading(true); try { const [a, w, c] = await Promise.all([ window.supabaseApi.fetchAllArticles(), window.supabaseApi.fetchAllWorks(), window.supabaseApi.fetchContacts(), ]); setArticles(a); setWorks(w); setContacts(c); } catch (e) { setErr(e.message || 'Error cargando'); } finally { setLoading(false); } }, []); React.useEffect(() => { reloadAll(); }, [reloadAll]); const toggleStatus = async (kind, item) => { const next = item.status === 'public' ? 'private' : 'public'; try { if (kind === 'article') { await window.supabaseApi.setArticleStatus(item._row.id, next); window.dispatchEvent(new Event('articles:refresh')); } else { await window.supabaseApi.setWorkStatus(item._row.id, next); window.dispatchEvent(new Event('works:refresh')); } reloadAll(); } catch (e) { alert(e.message || 'Error'); } }; const remove = async (kind, item) => { if (!confirm(`¿Borrar "${item.title}"? Esta acción no se puede deshacer.`)) return; try { if (kind === 'article') { await window.supabaseApi.deleteArticle(item._row.id); window.dispatchEvent(new Event('articles:refresh')); } else { await window.supabaseApi.deleteWork(item._row.id); window.dispatchEvent(new Event('works:refresh')); } reloadAll(); } catch (e) { alert(e.message || 'Error'); } }; const toggleRead = async (contact) => { try { await window.supabaseApi.markContactRead(contact.id, !contact.read); setContacts((prev) => prev.map((c) => c.id === contact.id ? { ...c, read: !c.read } : c)); } catch (e) { alert(e.message || 'Error'); } }; const removeContact = async (contact) => { if (!confirm(`¿Borrar el mensaje de "${contact.name}"?`)) return; try { await window.supabaseApi.deleteContact(contact.id); setContacts((prev) => prev.filter((c) => c.id !== contact.id)); } catch (e) { alert(e.message || 'Error'); } }; const logout = async () => { await window.supabaseApi.signOut(); }; if (editing) { if (editing.kind === 'article') { return ( setEditing(null)} onSaved={() => { setEditing(null); reloadAll(); }} /> ); } return ( setEditing(null)} onSaved={() => { setEditing(null); reloadAll(); }} /> ); } const unread = contacts.filter((c) => !c.read).length; return (
iM
Panel
{session?.user?.email}
Ver web
{tab === 'contacts' ? ( <>

Mensajes de contacto

{err &&
{err}
} {loading ? (
Cargando…
) : contacts.length === 0 ? (
Aún no hay mensajes.
) : ( {contacts.map((c) => ( ))}
Remitente Mensaje Fecha
{c.name}
{c.email}
{c.message} {window.supabaseApi.fmtDate(c.created_at)} Responder
)} ) : ( <>

{tab === 'articles' ? 'Artículos' : 'Trabajos'}

{err &&
{err}
} {loading ? (
Cargando…
) : (tab === 'articles' ? articles : works).length === 0 ? (
Aún no hay {tab === 'articles' ? 'artículos' : 'trabajos'}. Crea el primero.
) : ( {(tab === 'articles' ? articles : works).map((it) => ( ))}
Título {tab === 'articles' ? 'Categoría' : 'Cliente'} Estado Actualizado
{it.coverUrl && }
{it.title}
/{it.slug}
{tab === 'articles' ? it.category : it.client} {window.supabaseApi.fmtDate(it._row.updated_at)}
)} )}
); } window.AdminDashboard = AdminDashboard;