0, 'msgs' => 0, 'media' => 0, 'statuses' => 0]; $pending = 0; $companies = []; $logs = []; $total = 0; } $pages = $total > 0 ? (int)ceil($total / self::PER_PAGE) : 1; $companyCount = count($companies); self::render(compact('stats', 'pending', 'companies', 'companyCount', 'companyId', 'logs', 'total', 'page', 'pages', 'filter', 'search', 'date', 'user')); } // ─── GET /admin/live ──────────────────────────────────────────────────── public static function live(): void { SessionAuth::require(); $user = SessionAuth::user(); $userName = htmlspecialchars($user['name'] ?? 'Admin', ENT_QUOTES, 'UTF-8'); http_response_code(200); header('Content-Type: text/html; charset=utf-8'); echo Layout::open('Live Feed', 'live', $user['name'] ?? 'Admin'); echo << .toolbar{padding:14px 24px;display:flex;align-items:center;gap:12px;background:#fff;margin:14px 24px 0;border-radius:10px;box-shadow:0 1px 5px rgba(0,0,0,.06)} .dot{width:10px;height:10px;border-radius:50%;background:#e74c3c;animation:pulse 1.2s infinite} @keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}} .dot.paused{background:#aaa;animation:none} #status{font-size:13px;color:#555} .btn-pause{background:#0b3d91;color:#fff;border:none;border-radius:7px;padding:6px 16px;font-size:13px;cursor:pointer} .btn-pause:hover{background:#1565c0} .counter{margin-left:auto;font-size:12px;color:#888} .feed{padding:0 24px 24px;margin-top:12px;display:flex;flex-direction:column;gap:6px} .feed-card{background:#fff;border-radius:10px;padding:13px 16px;box-shadow:0 1px 4px rgba(0,0,0,.07);display:flex;align-items:flex-start;gap:12px;animation:slidein .3s ease} @keyframes slidein{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}} .card-icon{font-size:22px;line-height:1;flex-shrink:0;margin-top:2px} .card-body{flex:1;min-width:0} .card-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap} .card-phone{font-family:monospace;font-size:13px;font-weight:600;color:#0b3d91} .card-name{font-size:12px;color:#888} .card-time{margin-left:auto;font-size:11px;color:#bbb;white-space:nowrap} .card-preview{font-size:13px;color:#444;margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .b-text{background:#e8f4fd;color:#1565c0} .b-image{background:#fce8fd;color:#7b1fa2} .b-audio{background:#e8fdf0;color:#1b5e20} .b-video{background:#fdf3e8;color:#e65100} .b-document{background:#e8eaf6;color:#283593} .b-sticker{background:#fff8e1;color:#f57f17} .b-reaction{background:#fce4ec;color:#880e4f} .b-location{background:#e0f2f1;color:#004d40} .b-interactive{background:#ede7f6;color:#4527a0} .b-button{background:#e3f2fd;color:#0d47a1} .b-status{background:#f3f4f6;color:#6b7280} .b-other{background:#f5f5f5;color:#555}
Esperando eventos en tiempo real...
Cargando...