import { useState } from "react"; import { Link } from "react-router-dom"; import { manualPoll, updateTracker, removeTracker } from "../../lib/api"; import type { WatchedTracker } from "../../lib/types"; import ConfirmModal from "../ui/ConfirmModal"; interface Props { trackers: WatchedTracker[]; projectId: string; onRefresh: () => void; } export default function TrackerList({ trackers, projectId, onRefresh }: Props) { const [pollingIds, setPollingIds] = useState([]); const [trackerToRemove, setTrackerToRemove] = useState(null); async function handlePollNow(tracker: WatchedTracker) { try { setPollingIds((prev) => [...prev, tracker.id]); await manualPoll(tracker.id); onRefresh(); } catch (err) { console.error("Poll failed:", err); } finally { setPollingIds((prev) => prev.filter((id) => id !== tracker.id)); } } async function handleToggleEnabled(tracker: WatchedTracker) { try { await updateTracker( tracker.id, tracker.tracker_id, tracker.tracker_label, tracker.polling_interval, tracker.agent_config, tracker.filters, !tracker.enabled ); onRefresh(); } catch (err) { console.error("Update failed:", err); } } async function handleConfirmRemove() { if (!trackerToRemove) return; const tracker = trackerToRemove; setTrackerToRemove(null); try { await removeTracker(tracker.id); onRefresh(); } catch (err) { console.error("Remove failed:", err); } } return (
{trackers.length === 0 && (
No trackers configured.
)} {trackers.map((tracker) => (
{tracker.tracker_label} #{tracker.tracker_id} {tracker.enabled ? "Active" : "Paused"}
{tracker.last_polled_at ? `Last poll: ${new Date(tracker.last_polled_at).toLocaleString()}` : "Never polled"}
Edit
))} Add tracker setTrackerToRemove(null)} onConfirm={() => void handleConfirmRemove()} />
); }