diff --git a/src/components/UptimeStatusIsland.jsx b/src/components/UptimeStatusIsland.jsx index acf626e..9011426 100644 --- a/src/components/UptimeStatusIsland.jsx +++ b/src/components/UptimeStatusIsland.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState, useEffect, useCallback, useRef } from 'react'; import { FiAward, FiPercent, FiActivity } from 'react-icons/fi'; function getStatusColor(validCert) { @@ -47,6 +47,10 @@ export default function UptimeStatusIsland() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); + // Track open badge for each monitor by monitor.id and badge type + const [openBadge, setOpenBadge] = useState({}); + // Refs for each badge popup + const badgeRefs = useRef({}); const fetchData = useCallback(async () => { setLoading(true); @@ -67,6 +71,41 @@ export default function UptimeStatusIsland() { fetchData(); }, [fetchData]); + // Helper to toggle badge info + const toggleBadge = (monitorId, badge) => { + setOpenBadge((prev) => ({ + ...prev, + [monitorId]: { + ...prev[monitorId], + [badge]: !prev[monitorId]?.[badge], + }, + })); + }; + + // Close popup on outside click + useEffect(() => { + function handleClick(e) { + let clickedInside = false; + Object.values(badgeRefs.current).forEach((monitorBadges) => { + Object.values(monitorBadges || {}).forEach((ref) => { + if (ref && ref.current && ref.current.contains(e.target)) { + clickedInside = true; + } + }); + }); + if (!clickedInside) setOpenBadge({}); + } + document.addEventListener('mousedown', handleClick); + return () => document.removeEventListener('mousedown', handleClick); + }, []); + + // Helper to get/create refs for each badge + const getBadgeRef = (monitorId, badge) => { + if (!badgeRefs.current[monitorId]) badgeRefs.current[monitorId] = {}; + if (!badgeRefs.current[monitorId][badge]) badgeRefs.current[monitorId][badge] = React.createRef(); + return badgeRefs.current[monitorId][badge]; + }; + return (