45 lines
1.0 KiB
TypeScript
45 lines
1.0 KiB
TypeScript
"use client";
|
|
|
|
import { useState, useEffect, useCallback } from "react";
|
|
|
|
export interface HeatmapPoint {
|
|
lat: number;
|
|
lng: number;
|
|
weight: number;
|
|
clawCount: number;
|
|
city: string;
|
|
country: string;
|
|
}
|
|
|
|
interface HeatmapData {
|
|
points: HeatmapPoint[];
|
|
lastUpdated: string;
|
|
}
|
|
|
|
export function useHeatmapData(refreshInterval = 30000) {
|
|
const [data, setData] = useState<HeatmapData>({ points: [], lastUpdated: "" });
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
|
|
const fetchData = useCallback(async () => {
|
|
try {
|
|
const res = await fetch("/api/v1/heatmap");
|
|
if (res.ok) {
|
|
const json = await res.json();
|
|
setData(json);
|
|
}
|
|
} catch {
|
|
// silently fail, will retry on next interval
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
fetchData();
|
|
const interval = setInterval(fetchData, refreshInterval);
|
|
return () => clearInterval(interval);
|
|
}, [fetchData, refreshInterval]);
|
|
|
|
return { ...data, isLoading, refresh: fetchData };
|
|
}
|