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