← Back
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...