()
| 172 | }; |
| 173 | |
| 174 | const SystemEvents = () => { |
| 175 | const [events, setEvents] = useState([]); |
| 176 | const [totalEvents, setTotalEvents] = useState(0); |
| 177 | const [isExpanded, setIsExpanded] = useState(false); |
| 178 | const { ref: cardRef, width: cardWidth } = useElementSize(); |
| 179 | const isNarrow = cardWidth < 650; |
| 180 | const [isLoading, setIsLoading] = useState(false); |
| 181 | |
| 182 | const [eventsRefreshInterval, setEventsRefreshInterval] = useLocalStorage( |
| 183 | 'events-refresh-interval', |
| 184 | 0 |
| 185 | ); |
| 186 | const [eventsLimit, setEventsLimit] = useLocalStorage('events-limit', 100); |
| 187 | const [currentPage, setCurrentPage] = useState(1); |
| 188 | |
| 189 | // Calculate offset based on current page and limit |
| 190 | const offset = (currentPage - 1) * eventsLimit; |
| 191 | const totalPages = Math.ceil(totalEvents / eventsLimit); |
| 192 | |
| 193 | const fetchEvents = useCallback(async () => { |
| 194 | try { |
| 195 | setIsLoading(true); |
| 196 | const response = await getSystemEvents(eventsLimit, offset); |
| 197 | if (response && response.events) { |
| 198 | setEvents(response.events); |
| 199 | setTotalEvents(response.total || 0); |
| 200 | } |
| 201 | } catch (error) { |
| 202 | console.error('Error fetching system events:', error); |
| 203 | } finally { |
| 204 | setIsLoading(false); |
| 205 | } |
| 206 | }, [eventsLimit, offset]); |
| 207 | |
| 208 | // Fetch events on mount and when eventsRefreshInterval changes |
| 209 | useEffect(() => { |
| 210 | fetchEvents(); |
| 211 | |
| 212 | // Set up polling if interval is set and events section is expanded |
| 213 | if (eventsRefreshInterval > 0 && isExpanded) { |
| 214 | const interval = setInterval(fetchEvents, eventsRefreshInterval * 1000); |
| 215 | return () => clearInterval(interval); |
| 216 | } |
| 217 | }, [fetchEvents, eventsRefreshInterval, isExpanded]); |
| 218 | |
| 219 | // Reset to first page when limit changes |
| 220 | useEffect(() => { |
| 221 | setCurrentPage(1); |
| 222 | }, [eventsLimit]); |
| 223 | |
| 224 | return ( |
| 225 | <Card |
| 226 | ref={cardRef} |
| 227 | shadow="sm" |
| 228 | padding="sm" |
| 229 | radius="md" |
| 230 | withBorder |
| 231 | style={{ |
nothing calls this directly
no test coverage detected