← Back
import { useState, useEffect, useCallback } from 'react';

export interface EdgeEntry {
  marketId: string;
  question: string;
  category: string;
  imageUrl: string;
  marketPrice: number;
  edgeScore: number;
  signal: 'BUY_YES' | 'BUY_NO' | 'NEUTRAL';
  confidence: 'HIGH' | 'MED' | 'LOW';
  factors: {
    spread: number;
    volume: number;
    whale: number;
    momentum: number;
    price: number;
  };
  whaleYesPct: number;
  volumeRatio: number;
  scoredAt: string;
}

interface Params {
  minScore?: number;
  signal?: string;
  category?: string;
  limit?: number;
}

export function useEdgeScanner(params: Params = {}) {
  const [edges, setEdges] = useState<EdgeEntry[]>([]);
  const [loading, setLoading] = useState(true);

  const fetch_ = useCallback(async () => {
    setLoading(true);
    try {
      const qs = new URLSearchParams();
      if (params.minScore) qs.set('min_score', String(params.minScore));
      if (params.signal) qs.set('signal', params.signal);
      if (params.category && params.category !== 'All') qs.set('category', params.category);
      qs.set('limit', String(params.limit || 30));

      const res = await fetch(`/api/signals/edge?${qs}`);
      const d = await res.json();
      if (d.success) setEdges(d.data ?? []);
    } catch { /* ignore */ }
    setLoading(false);
  }, [params.minScore, params.signal, params.category, params.limit]);

  useEffect(() => {
    const t = setTimeout(fetch_, 0);
    return () => { clearTimeout(t); };
  }, [fetch_]);

  return { edges, loading, refresh: fetch_ };
}

📜 Git History

6c47fa4chore: local Polikopi project home + Phase 1 redesign artifacts12 days ago
Show last diff
Loading...