import React, { useState, useEffect, useCallback, useRef } from 'react'; import { FiAward, FiPercent, FiActivity, FiCheckCircle, FiClock, FiGlobe, FiLock } from 'react-icons/fi'; import { DateTime } from 'luxon'; import Tippy from '@tippyjs/react'; import 'tippy.js/dist/tippy.css'; function getStatusColor(validCert) { if (validCert === false) return 'bg-red-600'; if (validCert === true) return 'bg-green-600'; return 'bg-gray-400'; } function getHeartbeatColor(status) { if (status === 1) return 'bg-green-600'; // UP if (status === 0) return 'bg-red-600'; // DOWN if (status === 2) return 'bg-yellow-400'; // PENDING if (status === 3) return 'bg-blue-500'; // MAINTENANCE return 'bg-gray-300'; } function getCertBg(days) { if (typeof days !== 'number') return 'bg-gray-400 dark:bg-gray-600'; if (days < 0) return 'bg-red-600 animate-pulse border-2 border-red-500 dark:bg-red-800'; if (days < 5) return 'bg-red-600 dark:bg-red-800'; if (days <= 15) return 'bg-yellow-400 dark:bg-yellow-500 text-gray-900'; return 'bg-green-600 dark:bg-green-700'; } function getCertText(days) { if (typeof days !== 'number') return 'Cert Exp'; if (days < 0) return 'Cert Expired!'; return 'Cert Exp'; } function getAvgPingBg(avgPing) { if (typeof avgPing !== 'number') return 'bg-gray-300 dark:bg-gray-700'; if (avgPing <= 80) return 'bg-green-600 text-white dark:bg-green-700 dark:text-white'; if (avgPing <= 200) return 'bg-yellow-400 text-gray-900 dark:bg-yellow-500 dark:text-gray-900'; return 'bg-red-600 text-white dark:bg-red-800 dark:text-white'; } function getUptime24hBg(uptime) { if (typeof uptime !== 'number') return 'bg-gray-300 dark:bg-gray-700'; if (uptime >= 99) return 'bg-green-600 text-white dark:bg-green-700 dark:text-white'; if (uptime >= 95) return 'bg-yellow-400 text-gray-900 dark:bg-yellow-500 dark:text-gray-900'; return 'bg-red-600 text-white dark:bg-red-800 dark:text-white'; } function formatLocalTime(rawTime, zone = 'utc') { if (!rawTime) return ''; const dt = DateTime.fromFormat(rawTime, 'yyyy-MM-dd HH:mm:ss.SSS', { zone: 'utc' }); const localDt = dt.isValid ? dt.setZone(zone) : null; return localDt && localDt.isValid ? localDt.toFormat('dd-MM-yyyy, HH:mm:ss') : 'Invalid DateTime'; } function HeartbeatPopup({ hb, userZone, monitor }) { const localTime = hb ? formatLocalTime(hb.time, userZone) : ''; const utcTime = hb ? formatLocalTime(hb.time, 'utc') : ''; return (