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