'use client'; import React, { useEffect, useState } from 'react'; import Link from 'next/link'; import { AlertTriangle, Bell, CheckCircle2, CircleDashed, ExternalLink, Plug, XCircle, } from 'lucide-react'; type PortfolioRow = { id: string; name: string; slug: string; stats: { connected: number; errors: number; pending: number; totalProviders: number; health: string; }; }; type AlertRow = { id: string; title: string; body?: string | null; severity: string; tenant_id?: string | null; href?: string | null; created_at: string; read_at?: string | null; }; function healthBadge(h: string) { if (h === 'ok') return ( OK ); if (h === 'critical') return ( Error ); if (h === 'warning') return ( Pendiente ); return ( Sin conectar ); } export default function AgencyPortfolioBoard() { const [portfolio, setPortfolio] = useState([]); const [alerts, setAlerts] = useState([]); const [warning, setWarning] = useState(null); const [loading, setLoading] = useState(true); async function load() { setLoading(true); const res = await fetch('/api/admin/portfolio'); const data = await res.json(); setPortfolio(data.portfolio || []); setAlerts((data.alerts || []).filter((a: AlertRow) => !a.read_at)); setWarning(data.warning || null); setLoading(false); } useEffect(() => { void load(); }, []); async function enterTenant(id: string) { await fetch('/api/admin/active-tenant', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ tenantId: id }), }); window.location.href = '/dashboard/kpis'; } async function dismiss(id: string) { await fetch('/api/admin/alerts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id, markRead: true }), }); setAlerts((prev) => prev.filter((a) => a.id !== id)); } if (loading) { return

Cargando portafolio…

; } return (
{warning && (

{warning}

)} {alerts.length > 0 && (
Alertas ({alerts.length})
    {alerts.map((a) => (
  • {a.title}

    {a.body && (

    {a.body}

    )}
    {a.href && ( Ver )}
  • ))}
)}

Portafolio · estado de conexiones

Meta · Google Ads · GA4 · GSC · GTM · CRM · Email

{portfolio.length === 0 ? (

No hay clientes. Usa «Dar de Alta Cliente» abajo.

) : (
{portfolio.map((t) => (

{t.name}

{t.slug}

{healthBadge(t.stats.health)}

{t.stats.connected}/{t.stats.totalProviders} conectadas {t.stats.errors > 0 && ( {' '} · {t.stats.errors} error )}

Integraciones
))}
)}
); }