import { useState, useEffect, useCallback } from 'react';
export interface EventOutcome {
marketId: string;
label: string;
question: string;
yesPrice: number;
}
export interface ScreenerEvent {
eventId: string;
title: string;
slug: string;
category: string;
imageUrl: string;
outcomes: number;
volume24h: number;
liquidity: number;
endDate: string | null;
topOutcomes: EventOutcome[];
}
interface EventsMeta {
total: number;
limit: number;
offset: number;
has_more: boolean;
}
interface Params {
category?: string;
search?: string;
sort?: string;
order?: string;
limit?: number;
offset?: number;
enabled?: boolean;
}
export function useEvents(params: Params = {}) {
const { category, search, sort = 'volume', order = 'desc', limit = 50, offset = 0, enabled = true } = params;
const [events, setEvents] = useState<ScreenerEvent[]>([]);
const [meta, setMeta] = useState<EventsMeta | null>(null);
const [loading, setLoading] = useState(true);
const fetchEvents = useCallback(async () => {
if (!enabled) return;
setLoading(true);
try {
const qs = new URLSearchParams({ sort, order, limit: String(limit), offset: String(offset) });
if (category && category !== 'All') qs.set('category', category);
if (search) qs.set('search', search);
const res = await fetch(`/api/screener/events?${qs.toString()}`);
const d = await res.json();
if (d.success) {
setEvents(d.data?.events ?? []);
setMeta(d.data?.meta ?? null);
}
} catch { /* ignore */ }
finally { setLoading(false); }
}, [category, search, sort, order, limit, offset, enabled]);
useEffect(() => {
const t = setTimeout(fetchEvents, 0);
return () => clearTimeout(t);
}, [fetchEvents]);
return { events, meta, loading, refresh: fetchEvents };
}
📜 Git History
6c47fa4chore: local Polikopi project home + Phase 1 redesign artifacts12 days ago
Show last diff
Loading...