MCPcopy Create free account
hub / github.com/AmazingAng/PolyWorld / useSignalData

Function useSignalData

src/components/SignalPanel.tsx:53–105  ·  view source on GitHub ↗
(trades: WhaleTrade[], markets: ProcessedMarket[], leaderboard: SmartWallet[])

Source from the content-addressed store, hash-verified

51
52/** Hook for page.tsx to get signal data + available categories for the dropdown */
53export function useSignalData(trades: WhaleTrade[], markets: ProcessedMarket[], leaderboard: SmartWallet[]) {
54 const deferredTrades = useDeferredValue(trades);
55 const deferredMarkets = useDeferredValue(markets);
56 const [news, setNews] = useState<NewsItem[]>([]);
57 const newsRetry = useRef(0);
58 const fetchNewsRef = useRef<(() => Promise<void>) | undefined>(undefined);
59
60 const fetchNews = useCallback(async () => {
61 try {
62 const res = await fetch("/api/news");
63 if (!res.ok) return;
64 setNews(await res.json());
65 newsRetry.current = 0;
66 } catch {
67 if (newsRetry.current < 2) {
68 newsRetry.current++;
69 setTimeout(() => fetchNewsRef.current?.(), 3000);
70 }
71 }
72 }, []);
73
74 useEffect(() => {
75 fetchNewsRef.current = fetchNews;
76 queueMicrotask(() => {
77 void fetchNews();
78 });
79 const iv = setInterval(fetchNews, 120_000);
80 return () => clearInterval(iv);
81 }, [fetchNews]);
82
83 const signals = useMemo(
84 () => generateSignals(deferredTrades, deferredMarkets, leaderboard, news),
85 [deferredTrades, deferredMarkets, leaderboard, news]
86 );
87
88 // Build slug → category lookup
89 const slugToCategory = useMemo(() => {
90 const map = new Map<string, string>();
91 for (const m of deferredMarkets) map.set(m.slug, m.category);
92 return map;
93 }, [deferredMarkets]);
94
95 const categories = useMemo(() => {
96 const cats = new Set<string>();
97 for (const s of signals) {
98 const cat = slugToCategory.get(s.market.slug);
99 if (cat) cats.add(cat);
100 }
101 return Array.from(cats).sort();
102 }, [signals, slugToCategory]);
103
104 return { signals, categories, slugToCategory };
105}
106
107export default function SignalPanel({
108 trades,

Callers 1

SignalPanelFunction · 0.85

Calls 3

generateSignalsFunction · 0.90
setMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected