import { useState, useEffect, useCallback } from 'react';
export interface WhaleAlert {
id: number;
whaleAddress: string;
pendingCount: number;
createdAt: string | null;
label: string | null;
totalVolume: number | null;
totalTrades: number | null;
winRate: number | null;
}
export function useWhaleAlerts() {
const [alerts, setAlerts] = useState<WhaleAlert[]>([]);
const [loading, setLoading] = useState(true);
const refresh = useCallback(async () => {
setLoading(true);
try {
const res = await fetch('/api/signals/whale-alerts');
const d = await res.json();
if (d.success) setAlerts(d.data ?? []);
} catch { /* ignore */ }
finally { setLoading(false); }
}, []);
useEffect(() => {
const t = setTimeout(refresh, 0);
const interval = setInterval(refresh, 60_000);
return () => { clearTimeout(t); clearInterval(interval); };
}, [refresh]);
const subscribe = useCallback(async (address: string) => {
await fetch('/api/signals/whale-alerts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ whale_address: address }),
});
await refresh();
}, [refresh]);
const unsubscribe = useCallback(async (address: string) => {
await fetch(`/api/signals/whale-alerts/${encodeURIComponent(address)}`, { method: 'DELETE' });
await refresh();
}, [refresh]);
const markSeen = useCallback(async (address: string) => {
await fetch(`/api/signals/whale-alerts/${encodeURIComponent(address)}/seen`, { method: 'POST' });
await refresh();
}, [refresh]);
return { alerts, loading, refresh, subscribe, unsubscribe, markSeen };
}
📜 Git History
6c47fa4chore: local Polikopi project home + Phase 1 redesign artifacts12 days ago
Show last diff
Loading...