@liberfi.io/ui-predict 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.d.mts +21 -0
- package/dist/client/index.d.ts +21 -0
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +2 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/index-CT0nyuNQ.d.mts +1029 -0
- package/dist/index-CT0nyuNQ.d.ts +1029 -0
- package/dist/index.d.mts +242 -0
- package/dist/index.d.ts +242 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/contexts/PredictContext.tsx","../src/hooks/usePredictContext.ts","../src/hooks/usePredictClient.ts","../src/hooks/useMarketsQuery.ts","../src/hooks/useMarketByIdQuery.ts","../src/hooks/useMarketBySlugQuery.ts","../src/hooks/useMarketTagsByIdQuery.ts","../src/hooks/useSearchQuery.ts","../src/hooks/useMarketPriceQuery.ts","../src/hooks/useMultipleMarketPricesQuery.ts","../src/hooks/useMultipleMarketPricesByRequestQuery.ts","../src/hooks/usePriceHistoryQuery.ts","../src/hooks/useEventsQuery.ts","../src/hooks/useEventByIdQuery.ts","../src/hooks/useEventTagsByIdQuery.ts","../src/hooks/useEventBySlugQuery.ts","../src/components/events/events.script.tsx","../src/components/events/events.skeleton.tsx","../src/components/events/gauge-chart.ui.tsx","../src/components/events/event-item.ui.tsx","../src/components/events/events.ui.tsx","../src/components/events/events.widget.tsx","../src/types/index.ts","../src/consts/index.ts","../src/components/event-detail/event-price-history-chart.ui.tsx","../src/components/event-detail/event-detail.ui.tsx","../src/components/event-detail/event-detail-skeleton.tsx","../src/components/event-detail/event-detail.scripts.ts","../src/components/event-detail/event-detail.widget.tsx","../src/providers/PredictProvider.tsx"],"names":["version_default","PredictContext","createContext","usePredictContext","context","useContext","usePredictClient","client","marketsQueryKey","options","fetchMarkets","useMarketsQuery","queryOptions","useQuery","marketByIdQueryKey","params","fetchMarketById","useMarketByIdQuery","marketBySlugQueryKey","fetchMarketBySlug","useMarketBySlugQuery","marketTagsByIdQueryKey","id","fetchMarketTagsById","useMarketTagsByIdQuery","searchQueryKey","fetchSearch","useSearchQuery","marketPriceQueryKey","query","fetchMarketPrice","useMarketPriceQuery","multipleMarketPricesQueryKey","fetchMultipleMarketPrices","useMultipleMarketPricesQuery","multipleMarketPricesByRequestQueryKey","requests","fetchMultipleMarketPricesByRequest","useMultipleMarketPricesByRequestQuery","priceHistoryQueryKey","fetchPriceHistory","usePriceHistoryQuery","eventsQueryKey","fetchEvents","useEventsQuery","eventByIdQueryKey","fetchEventById","useEventByIdQuery","eventTagsByIdQueryKey","fetchEventTagsById","useEventTagsByIdQuery","eventBySlugQueryKey","slug","fetchEventBySlug","useEventBySlugQuery","DEFAULT_PAGE_SIZE","useEvents","initialPage","pageSize","initialQueryOptions","page","setPage","useState","setQueryOptions","offset","useMemo","mergedQueryOptions","rawData","isLoading","isFetching","isError","error","refetch","data","hasNextPage","hasPrevPage","goToPage","useCallback","newPage","nextPage","prev","prevPage","handleSetQueryOptions","EventItemSkeleton","className","jsxs","jsx","Skeleton","EventsSkeleton","count","_","index","GaugeChartUI","value","showLabel","percentage","EventItemUI","event","onSelect","onSelectOutcome","t","useTranslation","manualSelectedMarket","setManualSelectedMarket","markets","activeMarkets","market","isSingleMarket","selectedMarket","formattedVolume","formatAmountUSD3","formattedEndDate","timestampToString","eventStatus","getMarketPrice","prices","handleMarketClick","handleBack","handleYesClick","handleNoClick","handleSelect","displayedMarkets","hasMoreMarkets","Avatar","StyledTooltip","e","ChevronUpIcon","price","Button","ChevronRightIcon","ChevronLeftIcon","EventsUI","events","EventsWidget","total","Pagination","PriceSide","PriceHistoryInterval","DEFAULT_PRICE_HISTORY_FIDELITY","PRICE_HISTORY_SAMPLE_INTERVAL","CHART_COLORS","formatTimestamp","timestamp","interval","date","alignTimestamp","sampleInterval","transformPriceHistories","priceHistories","marketIds","alignedDataMap","history","marketId","point","alignedTs","marketData","dataPoints","b","dataPoint","avgPrice","lastValue","i","EventPriceHistoryChart","onDataChange","activeIndex","setActiveIndex","onDataChangeRef","useRef","useEffect","chartData","yAxisDomain","minValue","maxValue","range","padding","domainMin","domainMax","getDataAtIndex","idx","m","handleMouseMove","state","handleMouseLeave","ResponsiveContainer","LineChart","XAxis","props","x","payload","totalPoints","isFirst","isLast","isSampled","YAxis","Tooltip","name","label","Line","getLatestEventData","INTERVAL_OPTIONS","MAX_SELECTED_MARKETS","EventDetailUI","priceHistoryInterval","isPriceHistoryLoading","priceHistoryErrors","onIntervalChange","selectedMarketIds","onMarketSelectionChange","currentData","setCurrentData","isRulesExpanded","setIsRulesExpanded","month","day","year","Fragment","option","Select","keys","selected","SelectItem","StyledTable","TableHeader","TableColumn","TableBody","TableRow","TableCell","EventDetailSkeleton","marketCount","samplePriceHistory","sampled","lastSampledTime","DEFAULT_PRICE_HISTORY_MARKET_COUNT","MAX_PRICE_HISTORY_MARKET_COUNT","DEFAULT_PRICE_HISTORY_INTERVAL","useEventDetail","priceHistoryMarketIds","isEventLoading","eventError","getQueryToken","clobTokenIds","marketsToQuery","queryToken","item","priceHistoryQueries","useQueries","q","errors","map","DEFAULT_INTERVAL","DEFAULT_MAX_MARKETS","EventDetailWidget","eventId","initialMarketIds","initialInterval","setInterval","setSelectedMarketIds","defaultMarketIds","handleIntervalChange","newInterval","handleMarketSelectionChange","PredictProvider","children"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-predict\"] = \"0.1.0\";\n}\n\nexport default \"0.1.0\";\n","import { createContext } from \"react\";\nimport { IPredictClient } from \"../types\";\n\nexport interface PredictContextValue {\n client: IPredictClient;\n}\n\nexport const PredictContext = createContext<PredictContextValue>(\n {} as PredictContextValue,\n);\n","import { useContext } from \"react\";\nimport { PredictContext } from \"../contexts\";\n\nexport function usePredictContext() {\n const context = useContext(PredictContext);\n if (!context) {\n throw new Error(\"usePredictContext must be used within a PredictProvider\");\n }\n return context;\n}\n","import { usePredictContext } from \"./usePredictContext\";\n\nexport function usePredictClient() {\n const { client } = usePredictContext();\n return client;\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IPredictClient, Market, MarketQueryOptions } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function marketsQueryKey(options?: MarketQueryOptions): unknown[] {\n return [\"predict\", \"markets\", options ?? {}];\n}\n\nexport async function fetchMarkets(\n client: IPredictClient,\n options?: MarketQueryOptions,\n): Promise<Market[]> {\n return await client.getMarkets(options);\n}\n\nexport function useMarketsQuery(\n options?: MarketQueryOptions,\n queryOptions: Omit<\n UseQueryOptions<Market[], Error, Market[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketsQueryKey(options),\n queryFn: async () => fetchMarkets(client, options),\n ...queryOptions,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IPredictClient, Market } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseMarketByIdQueryParams {\n id: string;\n includeTag?: boolean;\n}\n\nexport function marketByIdQueryKey(\n params: UseMarketByIdQueryParams,\n): unknown[] {\n return [\n \"predict\",\n \"market\",\n \"byId\",\n params.id,\n { includeTag: params.includeTag },\n ];\n}\n\nexport async function fetchMarketById(\n client: IPredictClient,\n params: UseMarketByIdQueryParams,\n): Promise<Market> {\n return await client.getMarketById(params.id, params.includeTag);\n}\n\nexport function useMarketByIdQuery(\n params: UseMarketByIdQueryParams,\n options: Omit<\n UseQueryOptions<Market, Error, Market, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketByIdQueryKey(params),\n queryFn: async () => fetchMarketById(client, params),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IPredictClient, Market } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseMarketBySlugQueryParams {\n slug: string;\n includeTag?: boolean;\n}\n\nexport function marketBySlugQueryKey(\n params: UseMarketBySlugQueryParams,\n): unknown[] {\n return [\n \"predict\",\n \"market\",\n \"bySlug\",\n params.slug,\n { includeTag: params.includeTag },\n ];\n}\n\nexport async function fetchMarketBySlug(\n client: IPredictClient,\n params: UseMarketBySlugQueryParams,\n): Promise<Market> {\n return await client.getMarketBySlug(params.slug, params.includeTag);\n}\n\nexport function useMarketBySlugQuery(\n params: UseMarketBySlugQueryParams,\n options: Omit<\n UseQueryOptions<Market, Error, Market, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketBySlugQueryKey(params),\n queryFn: async () => fetchMarketBySlug(client, params),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IPredictClient, MarketTag } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function marketTagsByIdQueryKey(id: string): unknown[] {\n return [\"predict\", \"market\", \"tags\", id];\n}\n\nexport async function fetchMarketTagsById(\n client: IPredictClient,\n id: string,\n): Promise<MarketTag[]> {\n return await client.getMarketTagsById(id);\n}\n\nexport function useMarketTagsByIdQuery(\n id: string,\n options: Omit<\n UseQueryOptions<MarketTag[], Error, MarketTag[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketTagsByIdQueryKey(id),\n queryFn: async () => fetchMarketTagsById(client, id),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IPredictClient, SearchQueryOptions, SearchResult } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function searchQueryKey(options: SearchQueryOptions): unknown[] {\n return [\"predict\", \"search\", options];\n}\n\nexport async function fetchSearch(\n client: IPredictClient,\n options: SearchQueryOptions,\n): Promise<SearchResult> {\n return await client.search(options);\n}\n\nexport function useSearchQuery(\n options: SearchQueryOptions,\n queryOptions: Omit<\n UseQueryOptions<SearchResult, Error, SearchResult, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: searchQueryKey(options),\n queryFn: async () => fetchSearch(client, options),\n ...queryOptions,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IPredictClient, MarketPrice, MarketPriceQuery } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function marketPriceQueryKey(query: MarketPriceQuery): unknown[] {\n return [\"predict\", \"price\", query.tokenId, query.side];\n}\n\nexport async function fetchMarketPrice(\n client: IPredictClient,\n query: MarketPriceQuery,\n): Promise<MarketPrice> {\n return await client.getMarketPrice(query);\n}\n\nexport function useMarketPriceQuery(\n query: MarketPriceQuery,\n options: Omit<\n UseQueryOptions<MarketPrice, Error, MarketPrice, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketPriceQueryKey(query),\n queryFn: async () => fetchMarketPrice(client, query),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IPredictClient, MultipleMarketPrices } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function multipleMarketPricesQueryKey(): unknown[] {\n return [\"predict\", \"prices\", \"all\"];\n}\n\nexport async function fetchMultipleMarketPrices(\n client: IPredictClient,\n): Promise<MultipleMarketPrices> {\n return await client.getMultipleMarketPrices();\n}\n\nexport function useMultipleMarketPricesQuery(\n options: Omit<\n UseQueryOptions<\n MultipleMarketPrices,\n Error,\n MultipleMarketPrices,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: multipleMarketPricesQueryKey(),\n queryFn: async () => fetchMultipleMarketPrices(client),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport {\n IPredictClient,\n MarketPriceRequestItem,\n MultipleMarketPrices,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function multipleMarketPricesByRequestQueryKey(\n requests: MarketPriceRequestItem[],\n): unknown[] {\n return [\"predict\", \"prices\", \"byRequest\", requests];\n}\n\nexport async function fetchMultipleMarketPricesByRequest(\n client: IPredictClient,\n requests: MarketPriceRequestItem[],\n): Promise<MultipleMarketPrices> {\n return await client.getMultipleMarketPricesByRequest(requests);\n}\n\nexport function useMultipleMarketPricesByRequestQuery(\n requests: MarketPriceRequestItem[],\n options: Omit<\n UseQueryOptions<\n MultipleMarketPrices,\n Error,\n MultipleMarketPrices,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: multipleMarketPricesByRequestQueryKey(requests),\n queryFn: async () => fetchMultipleMarketPricesByRequest(client, requests),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IPredictClient, PriceHistory, PriceHistoryQuery } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function priceHistoryQueryKey(query: PriceHistoryQuery): unknown[] {\n return [\"predict\", \"priceHistory\", query];\n}\n\nexport async function fetchPriceHistory(\n client: IPredictClient,\n query: PriceHistoryQuery,\n): Promise<PriceHistory> {\n return await client.getPriceHistory(query);\n}\n\nexport function usePriceHistoryQuery(\n query: PriceHistoryQuery,\n options: Omit<\n UseQueryOptions<PriceHistory, Error, PriceHistory, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: priceHistoryQueryKey(query),\n queryFn: async () => fetchPriceHistory(client, query),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { Event, EventQueryOptions, IPredictClient } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventsQueryKey(options?: EventQueryOptions): unknown[] {\n return [\"predict\", \"events\", options ?? {}];\n}\n\nexport async function fetchEvents(\n client: IPredictClient,\n options?: EventQueryOptions,\n): Promise<Event[]> {\n return await client.getEvents(options);\n}\n\nexport function useEventsQuery(\n options?: EventQueryOptions,\n queryOptions: Omit<\n UseQueryOptions<Event[], Error, Event[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventsQueryKey(options),\n queryFn: async () => fetchEvents(client, options),\n ...queryOptions,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { Event, IPredictClient } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseEventByIdQueryParams {\n id: string;\n includeChat?: boolean;\n includeTemplate?: boolean;\n}\n\nexport function eventByIdQueryKey(params: UseEventByIdQueryParams): unknown[] {\n return [\n \"predict\",\n \"event\",\n \"byId\",\n params.id,\n {\n includeChat: params.includeChat,\n includeTemplate: params.includeTemplate,\n },\n ];\n}\n\nexport async function fetchEventById(\n client: IPredictClient,\n params: UseEventByIdQueryParams,\n): Promise<Event> {\n return await client.getEventById(\n params.id,\n params.includeChat,\n params.includeTemplate,\n );\n}\n\nexport function useEventByIdQuery(\n params: UseEventByIdQueryParams,\n options: Omit<\n UseQueryOptions<Event, Error, Event, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventByIdQueryKey(params),\n queryFn: async () => fetchEventById(client, params),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { IPredictClient, MarketTag } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventTagsByIdQueryKey(id: string): unknown[] {\n return [\"predict\", \"event\", \"tags\", id];\n}\n\nexport async function fetchEventTagsById(\n client: IPredictClient,\n id: string,\n): Promise<MarketTag[]> {\n return await client.getEventTagsById(id);\n}\n\nexport function useEventTagsByIdQuery(\n id: string,\n options: Omit<\n UseQueryOptions<MarketTag[], Error, MarketTag[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventTagsByIdQueryKey(id),\n queryFn: async () => fetchEventTagsById(client, id),\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport { Event, IPredictClient } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventBySlugQueryKey(slug: string): unknown[] {\n return [\"predict\", \"event\", \"bySlug\", slug];\n}\n\nexport async function fetchEventBySlug(\n client: IPredictClient,\n slug: string,\n): Promise<Event> {\n return await client.getEventBySlug(slug);\n}\n\nexport function useEventBySlugQuery(\n slug: string,\n options: Omit<\n UseQueryOptions<Event, Error, Event, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventBySlugQueryKey(slug),\n queryFn: async () => fetchEventBySlug(client, slug),\n ...options,\n });\n}\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useEventsQuery } from \"../../hooks\";\nimport { Event, EventQueryOptions } from \"../../types\";\n\n/** Default page size */\nconst DEFAULT_PAGE_SIZE = 48;\n\n/**\n * useEvents parameters\n */\nexport interface UseEventsParams {\n /** Initial page number, defaults to 1 */\n initialPage?: number;\n /** Number of items per page, defaults to 48 */\n pageSize?: number;\n /** Query options (excluding limit and offset) */\n queryOptions?: Omit<EventQueryOptions, \"limit\" | \"offset\">;\n}\n\n/**\n * useEvents return value\n */\nexport interface UseEventsResult {\n /** Events list data */\n data: Event[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether data is being fetched (including background refresh) */\n isFetching: boolean;\n /** Whether there is an error */\n isError: boolean;\n /** Error information */\n error: Error | null;\n /** Current page number (starts from 1) */\n page: number;\n /** Number of items per page */\n pageSize: number;\n /** Whether there is a next page */\n hasNextPage: boolean;\n /** Whether there is a previous page */\n hasPrevPage: boolean;\n /** Navigate to a specific page */\n goToPage: (page: number) => void;\n /** Go to next page */\n nextPage: () => void;\n /** Go to previous page */\n prevPage: () => void;\n /** Update query options */\n setQueryOptions: (\n options: Omit<EventQueryOptions, \"limit\" | \"offset\">,\n ) => void;\n /** Refetch data */\n refetch: () => void;\n}\n\n/**\n * Events list hook with pagination and query options support\n *\n * @example\n * ```tsx\n * const {\n * data,\n * isLoading,\n * page,\n * hasNextPage,\n * nextPage,\n * setQueryOptions\n * } = useEvents({\n * pageSize: 20,\n * queryOptions: { category: 'sports' }\n * });\n * ```\n */\nexport function useEvents({\n initialPage = 1,\n pageSize = DEFAULT_PAGE_SIZE,\n queryOptions: initialQueryOptions = {},\n}: UseEventsParams = {}): UseEventsResult {\n // Current page state\n const [page, setPage] = useState(initialPage);\n // Query options state\n const [queryOptions, setQueryOptions] = useState(initialQueryOptions);\n\n // Calculate offset\n const offset = useMemo(() => (page - 1) * pageSize, [page, pageSize]);\n\n // Merge query options with defaults\n const mergedQueryOptions = useMemo<EventQueryOptions>(\n () => ({\n active: true,\n closed: false,\n ended: false,\n archived: false,\n ...queryOptions,\n limit: pageSize,\n offset,\n }),\n [queryOptions, pageSize, offset],\n );\n\n // Call useEventsQuery\n const {\n data: rawData,\n isLoading,\n isFetching,\n isError,\n error,\n refetch,\n } = useEventsQuery(mergedQueryOptions);\n\n // Process data\n const data = useMemo(() => rawData ?? [], [rawData]);\n\n // Determine if there is a next page (when returned data length equals pageSize, there may be more)\n const hasNextPage = useMemo(\n () => data.length === pageSize,\n [data.length, pageSize],\n );\n\n // Determine if there is a previous page\n const hasPrevPage = useMemo(() => page > 1, [page]);\n\n // Navigate to a specific page\n const goToPage = useCallback((newPage: number) => {\n if (newPage >= 1) {\n setPage(newPage);\n }\n }, []);\n\n // Go to next page\n const nextPage = useCallback(() => {\n if (hasNextPage) {\n setPage((prev) => prev + 1);\n }\n }, [hasNextPage]);\n\n // Go to previous page\n const prevPage = useCallback(() => {\n if (hasPrevPage) {\n setPage((prev) => prev - 1);\n }\n }, [hasPrevPage]);\n\n // Update query options (also resets page to first page)\n const handleSetQueryOptions = useCallback(\n (options: Omit<EventQueryOptions, \"limit\" | \"offset\">) => {\n setQueryOptions(options);\n setPage(1); // Reset to first page when query options change\n },\n [],\n );\n\n return {\n data,\n isLoading,\n isFetching,\n isError,\n error,\n page,\n pageSize,\n hasNextPage,\n hasPrevPage,\n goToPage,\n nextPage,\n prevPage,\n setQueryOptions: handleSetQueryOptions,\n refetch,\n };\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport type EventItemSkeletonProps = {\n className?: string;\n};\n\nexport function EventItemSkeleton({ className }: EventItemSkeletonProps) {\n return (\n <div\n className={`flex min-h-44 w-full flex-col justify-between gap-y-1.5 rounded-xl border border-border bg-content1 p-3 lg:min-h-56 lg:max-w-md lg:gap-y-3 lg:p-4 ${className ?? \"\"}`}\n >\n <div className=\"flex w-full flex-col gap-y-1.5 lg:gap-y-3\">\n {/* Header: avatar, title, gauge/status */}\n <div className=\"flex items-center gap-4\">\n <Skeleton className=\"h-8 w-8 flex-shrink-0 rounded-lg lg:h-12 lg:w-12\" />\n <Skeleton className=\"h-5 flex-1 rounded-md lg:h-6\" />\n <Skeleton className=\"h-8 w-12 flex-shrink-0 rounded-lg lg:h-10 lg:w-14\" />\n </div>\n\n {/* Market rows placeholder */}\n <div className=\"flex w-full flex-col gap-y-0.5 lg:gap-y-1\">\n <div className=\"flex min-h-8 w-full items-center justify-between gap-x-2\">\n <Skeleton className=\"h-4 w-2/3 rounded-md\" />\n <div className=\"flex items-center gap-x-2\">\n <Skeleton className=\"h-4 w-8 rounded-md\" />\n <Skeleton className=\"h-6 w-16 rounded-lg\" />\n </div>\n </div>\n <div className=\"flex min-h-8 w-full items-center justify-between gap-x-2\">\n <Skeleton className=\"h-4 w-1/2 rounded-md\" />\n <div className=\"flex items-center gap-x-2\">\n <Skeleton className=\"h-4 w-8 rounded-md\" />\n <Skeleton className=\"h-6 w-16 rounded-lg\" />\n </div>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-between gap-x-2\">\n <Skeleton className=\"h-3 w-16 rounded-md lg:h-4\" />\n <Skeleton className=\"h-3 w-12 rounded-md lg:h-4\" />\n </div>\n </div>\n );\n}\n\nexport type EventsSkeletonProps = {\n count?: number;\n};\n\nexport function EventsSkeleton({ count = 8 }: EventsSkeletonProps) {\n return (\n <div className=\"w-full h-full\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {Array.from({ length: count }).map((_, index) => (\n <EventItemSkeleton key={index} />\n ))}\n </div>\n </div>\n );\n}\n","export type GaugeChartUIProps = {\n /** Value between 0 and 1 */\n value: number;\n /** Whether to show percentage label */\n showLabel?: boolean;\n};\n\nexport function GaugeChartUI({ value, showLabel = true }: GaugeChartUIProps) {\n const percentage = value * 100;\n\n return (\n <div className=\"flex-shrink-0 flex flex-col items-center\">\n <div className=\"relative w-16 h-12 lg:w-20 lg:h-14\">\n <svg className=\"w-full h-full\" viewBox=\"0 0 100 70\">\n {/* Background arc */}\n <path\n d=\"M 10 55 A 40 40 0 0 1 90 55\"\n fill=\"none\"\n className=\"stroke-default-200\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n {/* Progress arc */}\n <path\n d=\"M 10 55 A 40 40 0 0 1 90 55\"\n fill=\"none\"\n className=\"stroke-primary\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n strokeDasharray={`${value * 125.6} 125.6`}\n style={{\n transition: \"stroke-dasharray 0.5s ease-in-out\",\n }}\n />\n </svg>\n {/* Percentage in center */}\n {showLabel && (\n <div className=\"absolute inset-0 flex items-center justify-center pt-3 lg:pt-4\">\n <span className=\"text-sm font-bold text-foreground lg:text-base leading-none\">\n {percentage.toFixed(0)}%\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Avatar,\n Button,\n ChevronLeftIcon,\n ChevronRightIcon,\n ChevronUpIcon,\n StyledTooltip,\n} from \"@liberfi.io/ui\";\nimport { formatAmountUSD3, timestampToString } from \"@liberfi.io/utils\";\nimport type { Event, Market } from \"../../types\";\nimport { GaugeChartUI } from \"./gauge-chart.ui\";\n\nexport type EventItemUIProps = {\n event: Event;\n onSelect?: (event: Event) => void;\n onSelectOutcome?: (event: Event, market: Market, side: \"yes\" | \"no\") => void;\n};\n\nexport function EventItemUI({\n event,\n onSelect,\n onSelectOutcome,\n}: EventItemUIProps) {\n const { t } = useTranslation();\n const [manualSelectedMarket, setManualSelectedMarket] =\n useState<Market | null>(null);\n\n // Get markets from event\n const markets = event.markets || [];\n const activeMarkets = markets.filter(\n (market) => market.active && !market.closed && !market.archived,\n );\n\n // If only one market, auto-select it; otherwise use manual selection\n const isSingleMarket = markets.length === 1;\n const selectedMarket = isSingleMarket ? markets[0] : manualSelectedMarket;\n\n // Format volume\n const formattedVolume = useMemo(\n () => formatAmountUSD3(event.volume || 0),\n [event.volume],\n );\n\n // Format end date\n const formattedEndDate = useMemo(() => {\n if (!event.endDate) return null;\n // timestampToString returns 'yyyy-mm-dd hh:MM:ss', extract date part\n return timestampToString(new Date(event.endDate)).split(\" \")[0];\n }, [event.endDate]);\n\n // Get event status\n const eventStatus = useMemo(() => {\n if (event.closed)\n return {\n label: t(\"predict.event.status.closed\"),\n color: \"bg-danger-100/50 text-danger\",\n };\n if (event.active)\n return {\n label: t(\"predict.event.status.live\"),\n color: \"bg-primary-100/50 text-primary\",\n };\n return {\n label: t(\"predict.event.status.pending\"),\n color: \"bg-warning-100/50 text-warning\",\n };\n }, [event.active, event.closed, t]);\n\n // Get market price (first outcome price)\n const getMarketPrice = (market: Market): number => {\n try {\n if (market.outcomePrices) {\n const prices = JSON.parse(market.outcomePrices);\n return parseFloat(prices[0]) || 0;\n }\n } catch {\n // ignore\n }\n return 0;\n };\n\n const handleMarketClick = (market: Market) => {\n setManualSelectedMarket(market);\n };\n\n const handleBack = () => {\n setManualSelectedMarket(null);\n };\n\n const handleYesClick = () => {\n if (selectedMarket && onSelectOutcome) {\n onSelectOutcome(event, selectedMarket, \"yes\");\n }\n };\n\n const handleNoClick = () => {\n if (selectedMarket && onSelectOutcome) {\n onSelectOutcome(event, selectedMarket, \"no\");\n }\n };\n\n const handleSelect = () => {\n if (onSelect) {\n onSelect(event);\n }\n };\n\n // Limit markets to display max 2\n const displayedMarkets = activeMarkets.slice(0, 2);\n const hasMoreMarkets = activeMarkets.length > 2;\n\n return (\n <div\n className=\"flex min-h-44 w-full flex-col justify-between gap-y-1.5 rounded-xl border border-border bg-content1 p-3 transition-all duration-300 cursor-pointer hover:border-primary hover:ring-2 hover:ring-primary/20 focus-within:border-primary focus-within:bg-content2 focus-within:ring-2 focus-within:ring-primary/20 lg:min-h-56 lg:max-w-md lg:gap-y-3 lg:p-4\"\n onClick={handleSelect}\n >\n <div className=\"flex w-full flex-col gap-y-1.5 lg:gap-y-3\">\n {/* Header: image, title, status */}\n <div className=\"flex items-center gap-4\">\n <Avatar\n src={event.image || event.icon || undefined}\n name={event.title || \"Event\"}\n radius=\"md\"\n className=\"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover:scale-110 lg:h-12 lg:w-12\"\n />\n <StyledTooltip\n content={event.title}\n closeDelay={0}\n placement=\"bottom\"\n >\n <p className=\"flex-1 min-w-0 text-sm font-semibold lg:text-base line-clamp-2\">\n {event.title}\n </p>\n </StyledTooltip>\n\n {isSingleMarket ? (\n // Show gauge chart if there is only one market\n <GaugeChartUI value={getMarketPrice(markets[0])} />\n ) : (\n // Show event status if there are multiple markets\n !(event.active && !event.closed && !event.archived) && (\n <div\n className={`flex-shrink-0 flex items-center gap-x-2 rounded-lg px-2 py-1 text-sm lg:px-4 lg:py-2 ${eventStatus.color}`}\n >\n <span>{eventStatus.label}</span>\n </div>\n )\n )}\n </div>\n\n {/* Selected state: show selected market (only for multiple markets) */}\n {selectedMarket && !isSingleMarket && (\n <button\n type=\"button\"\n className=\"flex min-h-9 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80\"\n onClick={(e) => {\n e.stopPropagation();\n handleBack();\n }}\n >\n <span className=\"text-left text-xs text-foreground lg:text-sm line-clamp-1\">\n {selectedMarket.groupItemTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-foreground lg:text-lg\">\n {(getMarketPrice(selectedMarket) * 100).toFixed(0)}%\n </span>\n <ChevronUpIcon className=\"w-3 h-3 text-default-500 lg:w-4 lg:h-4\" />\n </div>\n </button>\n )}\n\n {/* Unselected state: show max 2 markets (only for multiple markets) */}\n {!selectedMarket && !isSingleMarket && displayedMarkets.length > 0 && (\n <div className=\"flex w-full flex-col gap-y-0.5 text-xs lg:gap-y-1 lg:text-sm\">\n {displayedMarkets.map((market) => {\n const price = getMarketPrice(market);\n return (\n <button\n type=\"button\"\n key={market.id}\n className=\"flex min-h-8 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80\"\n onClick={(e) => {\n e.stopPropagation();\n handleMarketClick(market);\n }}\n >\n <span className=\"text-left text-xs text-foreground lg:text-sm line-clamp-1\">\n {market.groupItemTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-xs text-foreground lg:text-base\">\n {(price * 100).toFixed(0)}%\n </span>\n <div className=\"flex h-full items-center gap-x-3 rounded-lg p-1 lg:p-1.5 bg-gradient-to-r from-primary-50/20 via-primary-50/20 to-secondary-50/20\">\n <span className=\"text-primary\">\n {t(\"predict.market.yes\")}\n </span>\n <span className=\"text-default-400\">/</span>\n <span className=\"text-secondary\">\n {t(\"predict.market.no\")}\n </span>\n </div>\n </div>\n </button>\n );\n })}\n {hasMoreMarkets && (\n <span className=\"text-xxs text-default-500 lg:text-xs\">\n {t(\"predict.event.moreMarkets\", {\n count: activeMarkets.length - 2,\n })}\n </span>\n )}\n </div>\n )}\n\n {/* Selected state: show Yes/No buttons */}\n {selectedMarket && (\n <div\n className={`flex items-center gap-x-2 text-sm lg:text-base ${isSingleMarket ? \"mt-3\" : \"\"}`}\n >\n <Button\n color=\"primary\"\n fullWidth\n className=\"bg-primary-100 text-primary\"\n size=\"lg\"\n onPress={handleYesClick}\n >\n {t(\"predict.market.yes\")}\n </Button>\n <Button\n color=\"secondary\"\n fullWidth\n className=\"bg-secondary-100 text-secondary\"\n size=\"lg\"\n onPress={handleNoClick}\n >\n {t(\"predict.market.no\")}\n </Button>\n </div>\n )}\n </div>\n\n {/* Footer */}\n {!selectedMarket || isSingleMarket ? (\n <div className=\"flex items-center justify-between gap-x-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-x-1 text-xxs text-default-600 hover:text-foreground lg:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n handleSelect();\n }}\n >\n <span>{t(\"predict.event.showMore\")}</span>\n <ChevronRightIcon className=\"h-3 w-3 lg:h-4 lg:w-4\" />\n </button>\n <div className=\"flex items-center gap-x-2 text-xxs text-default-600 lg:text-xs\">\n {formattedEndDate && <span>{formattedEndDate}</span>}\n <span>\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n </div>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"flex items-center cursor-pointer gap-x-1 text-xxs text-default-600 hover:text-foreground lg:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n handleBack();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3 lg:h-4 lg:w-4\" />\n <span>{t(\"predict.event.back\")}</span>\n </button>\n )}\n </div>\n );\n}\n","import type { Event, Market } from \"../../types\";\nimport { EventItemUI } from \"./event-item.ui\";\n\nexport type EventsUIProps = {\n events: Event[];\n onSelect?: (event: Event) => void;\n onSelectOutcome?: (event: Event, market: Market, side: \"yes\" | \"no\") => void;\n};\n\nexport function EventsUI({ events, onSelect, onSelectOutcome }: EventsUIProps) {\n return (\n <div className=\"w-full h-full\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {events.map((event) => (\n <EventItemUI\n key={event.id}\n event={event}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { Pagination } from \"@liberfi.io/ui\";\nimport type { Event, Market } from \"../../types\";\nimport { useEvents } from \"./events.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { EventsUI } from \"./events.ui\";\n\nconst DEFAULT_PAGE_SIZE = 48;\n\nexport interface EventsWidgetProps {\n /** Callback when an event is selected */\n onSelect?: (event: Event) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (event: Event, market: Market, side: \"yes\" | \"no\") => void;\n}\n\nexport function EventsWidget({ onSelect, onSelectOutcome }: EventsWidgetProps) {\n const {\n data: events,\n page,\n hasNextPage,\n goToPage,\n isLoading,\n isFetching,\n } = useEvents({ pageSize: DEFAULT_PAGE_SIZE });\n\n const total = hasNextPage ? page + 1 : page;\n\n if (isLoading) {\n return <EventsSkeleton count={DEFAULT_PAGE_SIZE} />;\n }\n\n return (\n <div className=\"w-full flex flex-col gap-6\">\n {isFetching ? (\n <EventsSkeleton count={DEFAULT_PAGE_SIZE} />\n ) : (\n <EventsUI\n events={events ?? []}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n )}\n {total > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n total={total}\n page={page}\n onChange={goToPage}\n showControls\n isDisabled={isLoading}\n classNames={{\n cursor: \"bg-primary\",\n }}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * Image Optimized object structure\n */\nexport interface ImageOptimized {\n /** Image ID */\n id?: string | null;\n\n /** Source image URL */\n imageUrlSource?: string | null;\n\n /** Optimized image URL */\n imageUrlOptimized?: string | null;\n\n /** Source image size in KB */\n imageSizeKbSource?: number | null;\n\n /** Optimized image size in KB */\n imageSizeKbOptimized?: number | null;\n\n /** Whether optimization is complete */\n imageOptimizedComplete?: boolean | null;\n\n /** Last updated timestamp */\n imageOptimizedLastUpdated?: string | null;\n\n /** Related ID */\n relID?: number | null;\n\n /** Field name */\n field?: string | null;\n\n /** Relation name */\n relname?: string | null;\n}\n\n/**\n * Market Event structure\n */\nexport interface MarketEvent {\n /** Event ID */\n id?: string | null;\n\n /** Event ticker */\n ticker?: string | null;\n\n /** Event slug */\n slug?: string | null;\n\n /** Event title */\n title?: string | null;\n\n /** Event subtitle */\n subtitle?: string | null;\n\n /** Event description */\n description?: string | null;\n\n /** Resolution source */\n resolutionSource?: string | null;\n\n /** Start date */\n startDate?: string | null;\n\n /** Creation date */\n creationDate?: string | null;\n\n /** End date */\n endDate?: string | null;\n\n /** Event image URL */\n image?: string | null;\n\n /** Event icon URL */\n icon?: string | null;\n\n /** Whether event is active */\n active?: boolean | null;\n\n /** Whether event is closed */\n closed?: boolean | null;\n\n /** Whether event is archived */\n archived?: boolean | null;\n\n /** Whether event is new */\n new?: boolean | null;\n\n /** Whether event is featured */\n featured?: boolean | null;\n\n /** Whether event is restricted */\n restricted?: boolean | null;\n\n /** Event liquidity */\n liquidity?: number | null;\n\n /** Event volume */\n volume?: number | null;\n\n /** Open interest */\n openInterest?: number | null;\n\n /** Sort by field */\n sortBy?: string | null;\n\n /** Event category */\n category?: string | null;\n\n /** Event subcategory */\n subcategory?: string | null;\n\n /** Created at timestamp */\n createdAt?: string | null;\n\n /** Updated at timestamp */\n updatedAt?: string | null;\n\n /** Competitive score */\n competitive?: number | null;\n\n /** 24 hour volume */\n volume24hr?: number | null;\n\n /** 1 week volume */\n volume1wk?: number | null;\n\n /** 1 month volume */\n volume1mo?: number | null;\n\n /** 1 year volume */\n volume1yr?: number | null;\n\n /** Enable order book */\n enableOrderBook?: boolean | null;\n\n /** AMM liquidity */\n liquidityAmm?: number | null;\n\n /** CLOB liquidity */\n liquidityClob?: number | null;\n\n /** Comment count */\n commentCount?: number | null;\n\n /** Create your own market */\n cyom?: boolean | null;\n\n /** Show all outcomes */\n showAllOutcomes?: boolean | null;\n\n /** Show market images */\n showMarketImages?: boolean | null;\n\n /** Enable negative risk */\n enableNegRisk?: boolean | null;\n\n /** Negative risk augmented */\n negRiskAugmented?: boolean | null;\n\n /** Pending deployment */\n pendingDeployment?: boolean | null;\n\n /** Currently deploying */\n deploying?: boolean | null;\n}\n\n/**\n * Market Category structure\n */\nexport interface MarketCategory {\n /** Category ID */\n id?: string | null;\n\n /** Category label */\n label?: string | null;\n\n /** Parent category */\n parentCategory?: string | null;\n\n /** Category slug */\n slug?: string | null;\n\n /** Published at timestamp */\n publishedAt?: string | null;\n\n /** Created by user ID */\n createdBy?: string | null;\n\n /** Updated by user ID */\n updatedBy?: string | null;\n\n /** Created at timestamp */\n createdAt?: string | null;\n\n /** Updated at timestamp */\n updatedAt?: string | null;\n}\n\n/**\n * Market data structure based on Polymarket API\n */\nexport interface Market {\n /** Market ID */\n id: string;\n\n /** Market question */\n question: string | null;\n\n /** Condition ID */\n conditionId: string;\n\n /** Market slug */\n slug: string | null;\n\n /** Whether market is active */\n active: boolean | null;\n\n /** Whether market is closed */\n closed: boolean | null;\n\n /** Market volume */\n volume: string | null;\n\n /** Market liquidity */\n liquidity: string | null;\n\n /** Market end date */\n endDate: string | null;\n\n /** Market start date */\n startDate: string | null;\n\n /** Market category */\n category: string | null;\n\n /** Market description */\n description: string | null;\n\n /** Market outcomes */\n outcomes: string | null;\n\n /** Outcome prices */\n outcomePrices: string | null;\n\n /** Twitter card image URL */\n twitterCardImage?: string | null;\n\n /** Resolution source */\n resolutionSource?: string | null;\n\n /** AMM type */\n ammType?: string | null;\n\n /** Sponsor name */\n sponsorName?: string | null;\n\n /** Sponsor image URL */\n sponsorImage?: string | null;\n\n /** X-axis value */\n xAxisValue?: string | null;\n\n /** Y-axis value */\n yAxisValue?: string | null;\n\n /** Denomination token */\n denominationToken?: string | null;\n\n /** Market fee */\n fee?: string | null;\n\n /** Market image URL */\n image?: string | null;\n\n /** Market icon URL */\n icon?: string | null;\n\n /** Lower bound value */\n lowerBound?: string | null;\n\n /** Upper bound value */\n upperBound?: string | null;\n\n /** Market type */\n marketType?: string | null;\n\n /** Format type */\n formatType?: string | null;\n\n /** Lower bound date */\n lowerBoundDate?: string | null;\n\n /** Upper bound date */\n upperBoundDate?: string | null;\n\n /** Market maker address */\n marketMakerAddress?: string;\n\n /** Created by user ID */\n createdBy?: number | null;\n\n /** Updated by user ID */\n updatedBy?: number | null;\n\n /** Creation timestamp */\n createdAt?: string | null;\n\n /** Update timestamp */\n updatedAt?: string | null;\n\n /** Closed time */\n closedTime?: string | null;\n\n /** Wide format flag */\n wideFormat?: boolean | null;\n\n /** New market flag */\n new?: boolean | null;\n\n /** Mailchimp tag */\n mailchimpTag?: string | null;\n\n /** Featured market flag */\n featured?: boolean | null;\n\n /** Archived flag */\n archived?: boolean | null;\n\n /** Resolved by */\n resolvedBy?: string | null;\n\n /** Restricted flag */\n restricted?: boolean | null;\n\n /** Market group ID */\n marketGroup?: number | null;\n\n /** Group item title */\n groupItemTitle?: string | null;\n\n /** Group item threshold */\n groupItemThreshold?: string | null;\n\n /** Question ID */\n questionID?: string | null;\n\n /** UMA end date */\n umaEndDate?: string | null;\n\n /** Enable order book flag */\n enableOrderBook?: boolean | null;\n\n /** Order price minimum tick size */\n orderPriceMinTickSize?: number | null;\n\n /** Order minimum size */\n orderMinSize?: number | null;\n\n /** UMA resolution status */\n umaResolutionStatus?: string | null;\n\n /** Curation order */\n curationOrder?: number | null;\n\n /** Volume (numeric) */\n volumeNum?: number | null;\n\n /** Liquidity (numeric) */\n liquidityNum?: number | null;\n\n /** End date (ISO format) */\n endDateIso?: string | null;\n\n /** Start date (ISO format) */\n startDateIso?: string | null;\n\n /** UMA end date (ISO format) */\n umaEndDateIso?: string | null;\n\n /** Has reviewed dates flag */\n hasReviewedDates?: boolean | null;\n\n /** Ready for cron flag */\n readyForCron?: boolean | null;\n\n /** Comments enabled flag */\n commentsEnabled?: boolean | null;\n\n /** 24-hour volume */\n volume24hr?: number | null;\n\n /** 1-week volume */\n volume1wk?: number | null;\n\n /** 1-month volume */\n volume1mo?: number | null;\n\n /** 1-year volume */\n volume1yr?: number | null;\n\n /** Game start time */\n gameStartTime?: string | null;\n\n /** Seconds delay */\n secondsDelay?: number | null;\n\n /** CLOB token IDs */\n clobTokenIds?: string | null;\n\n /** Disqus thread ID */\n disqusThread?: string | null;\n\n /** Short outcomes */\n shortOutcomes?: string | null;\n\n /** Team A ID */\n teamAID?: string | null;\n\n /** Team B ID */\n teamBID?: string | null;\n\n /** UMA bond */\n umaBond?: string | null;\n\n /** UMA reward */\n umaReward?: string | null;\n\n /** FPMM live flag */\n fpmmLive?: boolean | null;\n\n /** 24-hour AMM volume */\n volume24hrAmm?: number | null;\n\n /** 1-week AMM volume */\n volume1wkAmm?: number | null;\n\n /** 1-month AMM volume */\n volume1moAmm?: number | null;\n\n /** 1-year AMM volume */\n volume1yrAmm?: number | null;\n\n /** 24-hour CLOB volume */\n volume24hrClob?: number | null;\n\n /** 1-week CLOB volume */\n volume1wkClob?: number | null;\n\n /** 1-month CLOB volume */\n volume1moClob?: number | null;\n\n /** 1-year CLOB volume */\n volume1yrClob?: number | null;\n\n /** AMM volume */\n volumeAmm?: number | null;\n\n /** CLOB volume */\n volumeClob?: number | null;\n\n /** AMM liquidity */\n liquidityAmm?: number | null;\n\n /** CLOB liquidity */\n liquidityClob?: number | null;\n\n /** Maker base fee */\n makerBaseFee?: number | null;\n\n /** Taker base fee */\n takerBaseFee?: number | null;\n\n /** Custom liveness */\n customLiveness?: number | null;\n\n /** Accepting orders flag */\n acceptingOrders?: boolean | null;\n\n /** Notifications enabled flag */\n notificationsEnabled?: boolean | null;\n\n /** Market score */\n score?: number | null;\n\n /** Image optimized object */\n imageOptimized?: ImageOptimized | null;\n\n /** Icon optimized object */\n iconOptimized?: ImageOptimized | null;\n\n /** Associated events */\n events?: MarketEvent[] | null;\n\n /** Market categories */\n categories?: MarketCategory[] | null;\n\n /** Market tags */\n tags?: MarketTag[] | null;\n\n /** Creator address */\n creator?: string | null;\n\n /** Ready flag */\n ready?: boolean | null;\n\n /** Funded flag */\n funded?: boolean | null;\n\n /** Past slugs */\n pastSlugs?: string | null;\n\n /** Ready timestamp */\n readyTimestamp?: string | null;\n\n /** Funded timestamp */\n fundedTimestamp?: string | null;\n\n /** Accepting orders timestamp */\n acceptingOrdersTimestamp?: string | null;\n\n /** Competitive score */\n competitive?: number | null;\n\n /** Rewards minimum size */\n rewardsMinSize?: number | null;\n\n /** Rewards maximum spread */\n rewardsMaxSpread?: number | null;\n\n /** Market spread */\n spread?: number | null;\n\n /** Automatically resolved flag */\n automaticallyResolved?: boolean | null;\n\n /** One day price change */\n oneDayPriceChange?: number | null;\n\n /** One hour price change */\n oneHourPriceChange?: number | null;\n\n /** One week price change */\n oneWeekPriceChange?: number | null;\n\n /** One month price change */\n oneMonthPriceChange?: number | null;\n\n /** One year price change */\n oneYearPriceChange?: number | null;\n\n /** Last trade price */\n lastTradePrice?: number | null;\n\n /** Best bid price */\n bestBid?: number | null;\n\n /** Best ask price */\n bestAsk?: number | null;\n\n /** Automatically active flag */\n automaticallyActive?: boolean | null;\n\n /** Clear book on start flag */\n clearBookOnStart?: boolean | null;\n\n /** Chart color */\n chartColor?: string | null;\n\n /** Series color */\n seriesColor?: string | null;\n\n /** Show GMP series flag */\n showGmpSeries?: boolean | null;\n\n /** Show GMP outcome flag */\n showGmpOutcome?: boolean | null;\n\n /** Manual activation flag */\n manualActivation?: boolean | null;\n\n /** Negative risk other flag */\n negRiskOther?: boolean | null;\n\n /** Game ID */\n gameId?: string | null;\n\n /** Group item range */\n groupItemRange?: string | null;\n\n /** Sports market type */\n sportsMarketType?: string | null;\n\n /** Line value */\n line?: number | null;\n\n /** UMA resolution statuses */\n umaResolutionStatuses?: string | null;\n\n /** Pending deployment flag */\n pendingDeployment?: boolean | null;\n\n /** Deploying flag */\n deploying?: boolean | null;\n\n /** Deploying timestamp */\n deployingTimestamp?: string | null;\n\n /** Scheduled deployment timestamp */\n scheduledDeploymentTimestamp?: string | null;\n\n /** RFQ enabled flag */\n rfqEnabled?: boolean | null;\n\n /** Event start time */\n eventStartTime?: string | null;\n}\n\n/**\n * Market query options\n */\nexport interface MarketQueryOptions {\n limit?: number;\n offset?: number;\n order?: string;\n ascending?: boolean;\n id?: number[];\n slug?: string[];\n clobTokenIds?: string[];\n conditionIds?: string[];\n marketMakerAddress?: string[];\n liquidityNumMin?: number;\n liquidityNumMax?: number;\n volumeNumMin?: number;\n volumeNumMax?: number;\n startDateMin?: string;\n startDateMax?: string;\n endDateMin?: string;\n endDateMax?: string;\n tagId?: number;\n relatedTags?: boolean;\n cyom?: boolean;\n umaResolutionStatus?: string;\n gameId?: string;\n sportsMarketTypes?: string[];\n rewardsMinSize?: number;\n questionIds?: string[];\n includeTag?: boolean;\n closed?: boolean;\n}\n\n/**\n * Market tag structure based on Polymarket API\n */\nexport interface MarketTag {\n /** Tag ID */\n id: string;\n\n /** Tag label */\n label: string | null;\n\n /** Tag slug */\n slug: string | null;\n\n /** Force show flag */\n forceShow: boolean | null;\n\n /** Published date */\n publishedAt: string | null;\n\n /** Created by user ID */\n createdBy: number | null;\n\n /** Updated by user ID */\n updatedBy: number | null;\n\n /** Creation date */\n createdAt: string | null;\n\n /** Update date */\n updatedAt: string | null;\n\n /** Force hide flag */\n forceHide: boolean | null;\n\n /** Is carousel flag */\n isCarousel: boolean | null;\n}\n\n/**\n * Market Price Side enum\n */\nexport enum PriceSide {\n BUY = \"BUY\",\n SELL = \"SELL\",\n}\n\n/**\n * Market Price Response\n */\nexport interface MarketPrice {\n /** The market price (as string to maintain precision) */\n price: string;\n}\n\n/**\n * Market Price Query Options\n */\nexport interface MarketPriceQuery {\n tokenId: string;\n side: PriceSide;\n}\n\n/**\n * Token Price Data - prices for both BUY and SELL sides\n */\nexport interface TokenPriceData {\n /** Buy price for the token */\n BUY: string;\n\n /** Sell price for the token */\n SELL: string;\n}\n\n/**\n * Multiple Market Prices Response\n * Map of token_id to price data (BUY/SELL prices)\n */\nexport interface MultipleMarketPrices {\n [tokenId: string]: TokenPriceData;\n}\n\n/**\n * Market Price Request Item for batch price requests\n */\nexport interface MarketPriceRequestItem {\n /** The unique identifier for the token */\n token_id: string;\n\n /** The side of the market (BUY or SELL) */\n side: PriceSide;\n}\n\n/**\n * Search event structure\n */\nexport interface SearchEvent {\n id: string;\n ticker: string | null;\n slug: string | null;\n title: string | null;\n subtitle: string | null;\n description: string | null;\n resolutionSource: string | null;\n startDate: string | null;\n creationDate: string | null;\n endDate: string | null;\n image: string | null;\n icon: string | null;\n active: boolean | null;\n closed: boolean | null;\n archived: boolean | null;\n new: boolean | null;\n featured: boolean | null;\n restricted: boolean | null;\n liquidity: number | null;\n volume: number | null;\n openInterest: number | null;\n sortBy: string | null;\n category: string | null;\n subcategory: string | null;\n isTemplate: boolean | null;\n templateVariables: string | null;\n published_at: string | null;\n createdBy: string | null;\n updatedBy: string | null;\n createdAt: string | null;\n updatedAt: string | null;\n commentsEnabled: boolean | null;\n competitive: number | null;\n volume24hr: number | null;\n volume1wk: number | null;\n volume1mo: number | null;\n volume1yr: number | null;\n featuredImage: string | null;\n disqusThread: string | null;\n parentEvent: string | null;\n enableOrderBook: boolean | null;\n liquidityAmm: number | null;\n liquidityClob: number | null;\n negRisk: boolean | null;\n negRiskMarketID: string | null;\n negRiskFeeBips: number | null;\n commentCount: number | null;\n markets?: Market[];\n}\n\n/**\n * Search tag structure\n */\nexport interface SearchTag {\n id: string;\n label: string | null;\n slug: string | null;\n event_count: number | null;\n}\n\n/**\n * Search profile structure\n */\nexport interface SearchProfile {\n id: string;\n name: string | null;\n user: number | null;\n referral: string | null;\n createdBy: number | null;\n updatedBy: number | null;\n createdAt: string | null;\n updatedAt: string | null;\n utmSource: string | null;\n utmMedium: string | null;\n utmCampaign: string | null;\n utmContent: string | null;\n utmTerm: string | null;\n walletActivated: boolean | null;\n pseudonym: string | null;\n displayUsernamePublic: boolean | null;\n profileImage: string | null;\n bio: string | null;\n proxyWallet: string | null;\n isCloseOnly: boolean | null;\n isCertReq: boolean | null;\n certReqDate: string | null;\n}\n\n/**\n * Search pagination structure\n */\nexport interface SearchPagination {\n /** Whether there are more results */\n hasMore: boolean;\n\n /** Total number of results */\n totalResults: number | null;\n}\n\n/**\n * Search result structure based on Polymarket API\n */\nexport interface SearchResult {\n /** Search events */\n events: SearchEvent[] | null;\n\n /** Search tags */\n tags: SearchTag[] | null;\n\n /** Search profiles */\n profiles: SearchProfile[] | null;\n\n /** Pagination information */\n pagination: SearchPagination;\n}\n\n/**\n * Search query options\n */\nexport interface SearchQueryOptions {\n q: string; // required\n cache?: boolean;\n eventsStatus?: string;\n limitPerType?: number;\n page?: number;\n eventsTag?: string[];\n keepClosedMarkets?: number;\n sort?: string;\n ascending?: boolean;\n searchTags?: boolean;\n searchProfiles?: boolean;\n recurrence?: string;\n excludeTagId?: number[];\n optimized?: boolean;\n}\n\n/**\n * Price History Interval Options\n */\nexport enum PriceHistoryInterval {\n ONE_MINUTE = \"1m\",\n ONE_HOUR = \"1h\",\n SIX_HOURS = \"6h\",\n ONE_DAY = \"1d\",\n ONE_WEEK = \"1w\",\n MAX = \"max\",\n}\n\n/**\n * Price History Data Point\n */\nexport interface PriceHistoryPoint {\n /** Unix timestamp */\n t: number;\n\n /** Price at timestamp */\n p: number;\n}\n\n/**\n * Price History Response\n */\nexport interface PriceHistory {\n /** Array of price history data points */\n history: PriceHistoryPoint[];\n}\n\n/**\n * Price History Query Options\n */\nexport interface PriceHistoryQuery {\n market: string;\n startTs?: number;\n endTs?: number;\n interval?: PriceHistoryInterval;\n fidelity?: number;\n}\n\n/**\n * Event Creator object\n */\nexport interface EventCreator {\n /** Creator ID */\n id: string;\n\n /** Creator name */\n creatorName?: string | null;\n\n /** Creator handle */\n creatorHandle?: string | null;\n\n /** Creator URL */\n creatorUrl?: string | null;\n\n /** Creator image URL */\n creatorImage?: string | null;\n\n /** Created timestamp */\n createdAt?: string | null;\n\n /** Updated timestamp */\n updatedAt?: string | null;\n}\n\n/**\n * Chat object\n */\nexport interface Chat {\n /** Chat ID */\n id: string;\n\n /** Channel ID */\n channelId?: string | null;\n\n /** Channel name */\n channelName?: string | null;\n\n /** Channel image URL */\n channelImage?: string | null;\n\n /** Whether chat is live */\n live?: boolean | null;\n\n /** Chat start time */\n startTime?: string | null;\n\n /** Chat end time */\n endTime?: string | null;\n}\n\n/**\n * Template object\n */\nexport interface Template {\n /** Template ID */\n id: string;\n\n /** Event title */\n eventTitle?: string | null;\n\n /** Event slug */\n eventSlug?: string | null;\n\n /** Event image URL */\n eventImage?: string | null;\n\n /** Market title */\n marketTitle?: string | null;\n\n /** Template description */\n description?: string | null;\n\n /** Resolution source */\n resolutionSource?: string | null;\n\n /** Negative risk enabled */\n negRisk?: boolean | null;\n\n /** Sort by field */\n sortBy?: string | null;\n\n /** Show market images */\n showMarketImages?: boolean | null;\n\n /** Series slug */\n seriesSlug?: string | null;\n\n /** Outcomes JSON string */\n outcomes?: string | null;\n}\n\n/**\n * Event object from Polymarket API\n */\nexport interface Event {\n /** Event ID */\n id: string;\n\n /** Event ticker */\n ticker?: string | null;\n\n /** Event slug */\n slug?: string | null;\n\n /** Event title */\n title?: string | null;\n\n /** Event subtitle */\n subtitle?: string | null;\n\n /** Event description */\n description?: string | null;\n\n /** Resolution source */\n resolutionSource?: string | null;\n\n /** Start date */\n startDate?: string | null;\n\n /** Creation date */\n creationDate?: string | null;\n\n /** End date */\n endDate?: string | null;\n\n /** Event image URL */\n image?: string | null;\n\n /** Event icon URL */\n icon?: string | null;\n\n /** Whether event is active */\n active?: boolean | null;\n\n /** Whether event is closed */\n closed?: boolean | null;\n\n /** Whether event is archived */\n archived?: boolean | null;\n\n /** Whether event is new */\n new?: boolean | null;\n\n /** Whether event is featured */\n featured?: boolean | null;\n\n /** Whether event is restricted */\n restricted?: boolean | null;\n\n /** Event liquidity */\n liquidity?: number | null;\n\n /** Event volume */\n volume?: number | null;\n\n /** Open interest */\n openInterest?: number | null;\n\n /** Sort by field */\n sortBy?: string | null;\n\n /** Event category */\n category?: string | null;\n\n /** Event subcategory */\n subcategory?: string | null;\n\n /** Whether event is template */\n isTemplate?: boolean | null;\n\n /** Template variables JSON string */\n templateVariables?: string | null;\n\n /** Published timestamp */\n published_at?: string | null;\n\n /** Created by user ID */\n createdBy?: string | null;\n\n /** Updated by user ID */\n updatedBy?: string | null;\n\n /** Creation timestamp */\n createdAt?: string | null;\n\n /** Update timestamp */\n updatedAt?: string | null;\n\n /** Whether comments are enabled */\n commentsEnabled?: boolean | null;\n\n /** Competitive score */\n competitive?: number | null;\n\n /** 24h volume */\n volume24hr?: number | null;\n\n /** 1 week volume */\n volume1wk?: number | null;\n\n /** 1 month volume */\n volume1mo?: number | null;\n\n /** 1 year volume */\n volume1yr?: number | null;\n\n /** Featured image URL */\n featuredImage?: string | null;\n\n /** Disqus thread identifier */\n disqusThread?: string | null;\n\n /** Parent event ID */\n parentEvent?: string | null;\n\n /** Whether order book is enabled */\n enableOrderBook?: boolean | null;\n\n /** AMM liquidity */\n liquidityAmm?: number | null;\n\n /** CLOB liquidity */\n liquidityClob?: number | null;\n\n /** Negative risk enabled */\n negRisk?: boolean | null;\n\n /** Negative risk market ID */\n negRiskMarketID?: string | null;\n\n /** Negative risk fee in basis points */\n negRiskFeeBips?: number | null;\n\n /** Comment count */\n commentCount?: number | null;\n\n /** Image optimized object */\n imageOptimized?: ImageOptimized | null;\n\n /** Icon optimized object */\n iconOptimized?: ImageOptimized | null;\n\n /** Featured image optimized object */\n featuredImageOptimized?: ImageOptimized | null;\n\n /** Sub events array */\n subEvents?: string[] | null;\n\n /** Associated markets */\n markets?: Market[] | null;\n\n /** CYOM flag */\n cyom?: boolean | null;\n\n /** Closed time */\n closedTime?: string | null;\n\n /** Show all outcomes */\n showAllOutcomes?: boolean | null;\n\n /** Show market images */\n showMarketImages?: boolean | null;\n\n /** Automatically resolved */\n automaticallyResolved?: boolean | null;\n\n /** Enable negative risk */\n enableNegRisk?: boolean | null;\n\n /** Automatically active */\n automaticallyActive?: boolean | null;\n\n /** Event date */\n eventDate?: string | null;\n\n /** Start time */\n startTime?: string | null;\n\n /** Event week number */\n eventWeek?: number | null;\n\n /** Series slug */\n seriesSlug?: string | null;\n\n /** Score */\n score?: string | null;\n\n /** Elapsed time */\n elapsed?: string | null;\n\n /** Period */\n period?: string | null;\n\n /** Whether event is live */\n live?: boolean | null;\n\n /** Whether event has ended */\n ended?: boolean | null;\n\n /** Finished timestamp */\n finishedTimestamp?: string | null;\n\n /** GMP chart mode */\n gmpChartMode?: string | null;\n\n /** Event creators */\n eventCreators?: EventCreator[] | null;\n\n /** Tweet count */\n tweetCount?: number | null;\n\n /** Chats */\n chats?: Chat[] | null;\n\n /** Featured order */\n featuredOrder?: number | null;\n\n /** Estimate value flag */\n estimateValue?: boolean | null;\n\n /** Cannot estimate flag */\n cantEstimate?: boolean | null;\n\n /** Estimated value */\n estimatedValue?: string | null;\n\n /** Templates */\n templates?: Template[] | null;\n\n /** Spreads main line */\n spreadsMainLine?: number | null;\n\n /** Totals main line */\n totalsMainLine?: number | null;\n\n /** Carousel map */\n carouselMap?: string | null;\n\n /** Pending deployment */\n pendingDeployment?: boolean | null;\n\n /** Deploying */\n deploying?: boolean | null;\n\n /** Deploying timestamp */\n deployingTimestamp?: string | null;\n\n /** Scheduled deployment timestamp */\n scheduledDeploymentTimestamp?: string | null;\n\n /** Game status */\n gameStatus?: string | null;\n}\n\n/**\n * Event Query Options\n */\nexport interface EventQueryOptions {\n limit?: number;\n offset?: number;\n order?: string;\n active?: boolean;\n closed?: boolean;\n archived?: boolean;\n featured?: boolean;\n restricted?: boolean;\n new?: boolean;\n live?: boolean;\n ended?: boolean;\n category?: string;\n subcategory?: string;\n startDate?: string;\n endDate?: string;\n creationDate?: string;\n ticker?: string;\n slug?: string;\n title?: string;\n isTemplate?: boolean;\n enableOrderBook?: boolean;\n negRisk?: boolean;\n commentsEnabled?: boolean;\n automaticallyResolved?: boolean;\n automaticallyActive?: boolean;\n showAllOutcomes?: boolean;\n showMarketImages?: boolean;\n enableNegRisk?: boolean;\n pendingDeployment?: boolean;\n deploying?: boolean;\n seriesSlug?: string;\n parentEvent?: string;\n eventWeek?: number;\n gameStatus?: string;\n}\n\nexport interface IPredictClient {\n /**\n * Get markets list\n */\n getMarkets(options?: MarketQueryOptions): Promise<Market[]>;\n\n /**\n * Get market by ID\n */\n getMarketById(id: string, includeTag?: boolean): Promise<Market>;\n\n /**\n * Get market by slug\n */\n getMarketBySlug(slug: string, includeTag?: boolean): Promise<Market>;\n\n /**\n * Get market tags by ID\n */\n getMarketTagsById(id: string): Promise<MarketTag[]>;\n\n /**\n * Search markets, events, and profiles\n */\n search(options: SearchQueryOptions): Promise<SearchResult>;\n\n /**\n * Get market price for a specific token and side\n */\n getMarketPrice(query: MarketPriceQuery): Promise<MarketPrice>;\n\n /**\n * Get multiple market prices for all tokens\n */\n getMultipleMarketPrices(): Promise<MultipleMarketPrices>;\n\n /**\n * Get multiple market prices by request (POST method with specific tokens)\n */\n getMultipleMarketPricesByRequest(\n requests: MarketPriceRequestItem[],\n ): Promise<MultipleMarketPrices>;\n\n /**\n * Get price history for a traded token\n */\n getPriceHistory(query: PriceHistoryQuery): Promise<PriceHistory>;\n\n /**\n * Get events list\n */\n getEvents(options?: EventQueryOptions): Promise<Event[]>;\n\n /**\n * Get event by ID\n */\n getEventById(\n id: string,\n includeChat?: boolean,\n includeTemplate?: boolean,\n ): Promise<Event>;\n\n /**\n * Get event tags by ID\n */\n getEventTagsById(id: string): Promise<MarketTag[]>;\n\n /**\n * Get event by slug\n */\n getEventBySlug(slug: string): Promise<Event>;\n}\n","import { PriceHistoryInterval } from \"../types\";\n\n/**\n * Default fidelity values for price history queries based on interval\n */\nexport const DEFAULT_PRICE_HISTORY_FIDELITY: Record<\n PriceHistoryInterval,\n number\n> = {\n [PriceHistoryInterval.ONE_MINUTE]: 1,\n [PriceHistoryInterval.ONE_HOUR]: 1,\n [PriceHistoryInterval.SIX_HOURS]: 1,\n [PriceHistoryInterval.ONE_DAY]: 5,\n [PriceHistoryInterval.ONE_WEEK]: 30,\n [PriceHistoryInterval.MAX]: 30,\n};\n\n/**\n * Sampling interval in seconds based on price history interval\n * Used for aligning timestamps and sampling price history data\n */\nexport const PRICE_HISTORY_SAMPLE_INTERVAL: Record<\n PriceHistoryInterval,\n number\n> = {\n [PriceHistoryInterval.ONE_MINUTE]: 60, // 1 minute\n [PriceHistoryInterval.ONE_HOUR]: 60, // 1 minute\n [PriceHistoryInterval.SIX_HOURS]: 60, // 1 minute\n [PriceHistoryInterval.ONE_DAY]: 300, // 5 minutes\n [PriceHistoryInterval.ONE_WEEK]: 1800, // 30 minutes\n [PriceHistoryInterval.MAX]: 1800, // 30 minutes\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport { PRICE_HISTORY_SAMPLE_INTERVAL } from \"../../consts\";\nimport {\n PriceHistoryInterval,\n type Market,\n type PriceHistory,\n} from \"../../types\";\n\n// Chart colors for different markets\nconst CHART_COLORS = [\n { stroke: \"hsl(var(--heroui-primary))\", id: \"colorMarket0\" },\n { stroke: \"hsl(var(--heroui-secondary))\", id: \"colorMarket1\" },\n { stroke: \"hsl(var(--heroui-success))\", id: \"colorMarket2\" },\n { stroke: \"hsl(var(--heroui-warning))\", id: \"colorMarket3\" },\n];\n\n// Format timestamp based on interval\nfunction formatTimestamp(\n timestamp: number,\n interval: PriceHistoryInterval,\n): string {\n const date = new Date(timestamp * 1000);\n\n switch (interval) {\n case PriceHistoryInterval.ONE_MINUTE:\n case PriceHistoryInterval.ONE_HOUR:\n case PriceHistoryInterval.SIX_HOURS:\n // Show time only: \"14:30\"\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case PriceHistoryInterval.ONE_DAY:\n // Show time with date: \"Jan 5 14:00\"\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case PriceHistoryInterval.ONE_WEEK:\n // Show date: \"Jan 5\"\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n case PriceHistoryInterval.MAX:\n default:\n // Show month and day: \"Jan 5\"\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n\nexport type MarketDataPoint = {\n date: string;\n timestamp: number;\n [key: string]: number | string; // Dynamic keys for market values\n};\n\nexport type CurrentMarketData = {\n timestamp: number;\n date: string;\n markets: Array<{\n id: string;\n label: string;\n value: number;\n color: string;\n }>;\n};\n\nexport interface EventPriceHistoryChartProps {\n /** Map of marketId to price history data */\n priceHistories?: Map<string, PriceHistory>;\n /** Markets to display (used for labels) */\n markets?: Market[];\n /** Loading state */\n isLoading?: boolean;\n /** Time interval for X-axis formatting */\n interval?: PriceHistoryInterval;\n /** Callback when hovered data changes */\n onDataChange?: (data: CurrentMarketData | null) => void;\n}\n\n// Align timestamp to interval boundary\nfunction alignTimestamp(\n timestamp: number,\n interval: PriceHistoryInterval,\n): number {\n const sampleInterval = PRICE_HISTORY_SAMPLE_INTERVAL[interval];\n return timestamp - (timestamp % sampleInterval);\n}\n\n// Transform price histories into chart data\nfunction transformPriceHistories(\n priceHistories: Map<string, PriceHistory>,\n marketIds: string[],\n interval: PriceHistoryInterval,\n): MarketDataPoint[] {\n // Group data points by aligned timestamp\n const alignedDataMap = new Map<\n number,\n Map<string, { sum: number; count: number }>\n >();\n\n priceHistories.forEach((history, marketId) => {\n history.history.forEach((point) => {\n const alignedTs = alignTimestamp(point.t, interval);\n\n if (!alignedDataMap.has(alignedTs)) {\n alignedDataMap.set(alignedTs, new Map());\n }\n\n const marketData = alignedDataMap.get(alignedTs)!;\n if (!marketData.has(marketId)) {\n marketData.set(marketId, { sum: 0, count: 0 });\n }\n\n const data = marketData.get(marketId)!;\n data.sum += point.p;\n data.count += 1;\n });\n });\n\n // Sort aligned timestamps\n const alignedTimestamps = Array.from(alignedDataMap.keys()).sort(\n (a, b) => a - b,\n );\n\n // Create data points with averaged values\n const dataPoints = alignedTimestamps.map((timestamp) => {\n const date = new Date(timestamp * 1000);\n const dataPoint: MarketDataPoint = {\n date: date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n timestamp,\n };\n\n // Add averaged values for each market\n const marketData = alignedDataMap.get(timestamp)!;\n marketIds.forEach((marketId) => {\n const data = marketData.get(marketId);\n if (data && data.count > 0) {\n // Convert price to percentage (0-1 -> 0-100)\n const avgPrice = data.sum / data.count;\n dataPoint[marketId] = Math.round(avgPrice * 100 * 100) / 100;\n }\n });\n\n return dataPoint;\n });\n\n // Interpolate missing values for each market using nearest previous value\n // If market has no data at all, default to 0\n marketIds.forEach((marketId) => {\n let lastValue: number | null = null;\n\n // Forward pass: fill with previous value\n for (const dataPoint of dataPoints) {\n if (dataPoint[marketId] !== undefined) {\n lastValue = dataPoint[marketId] as number;\n } else if (lastValue !== null) {\n dataPoint[marketId] = lastValue;\n }\n }\n\n // Backward pass: fill remaining gaps at the start with first available value\n lastValue = null;\n for (let i = dataPoints.length - 1; i >= 0; i--) {\n const dataPoint = dataPoints[i];\n if (dataPoint[marketId] !== undefined) {\n lastValue = dataPoint[marketId] as number;\n } else if (lastValue !== null) {\n dataPoint[marketId] = lastValue;\n }\n }\n\n // Final pass: if market has no data at all, default to 0\n for (const dataPoint of dataPoints) {\n if (dataPoint[marketId] === undefined) {\n dataPoint[marketId] = 0;\n }\n }\n });\n\n return dataPoints;\n}\n\nexport function EventPriceHistoryChart({\n priceHistories,\n markets = [],\n isLoading,\n interval = PriceHistoryInterval.MAX,\n onDataChange,\n}: EventPriceHistoryChartProps) {\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n\n // Use ref to store callback to avoid infinite loops\n const onDataChangeRef = useRef(onDataChange);\n useEffect(() => {\n onDataChangeRef.current = onDataChange;\n });\n\n // Get market IDs that have price history\n const marketIds = useMemo(() => {\n if (!priceHistories) return [];\n return Array.from(priceHistories.keys()).slice(0, 4); // Max 4 markets\n }, [priceHistories]);\n\n // Transform data for chart\n const chartData = useMemo(() => {\n if (!priceHistories || priceHistories.size === 0) return [];\n return transformPriceHistories(priceHistories, marketIds, interval);\n }, [priceHistories, marketIds, interval]);\n\n // Calculate Y-axis domain based on actual data values\n const yAxisDomain = useMemo(() => {\n if (chartData.length === 0 || marketIds.length === 0) {\n return [0, 100] as [number, number];\n }\n\n let minValue = Infinity;\n let maxValue = -Infinity;\n\n chartData.forEach((dataPoint) => {\n marketIds.forEach((marketId) => {\n const value = dataPoint[marketId] as number;\n if (value !== undefined) {\n minValue = Math.min(minValue, value);\n maxValue = Math.max(maxValue, value);\n }\n });\n });\n\n // Handle edge cases\n if (minValue === Infinity || maxValue === -Infinity) {\n return [0, 100] as [number, number];\n }\n\n // Add padding (10% of range) to keep curves in the middle\n const range = maxValue - minValue;\n const padding = Math.max(range * 0.2, 5); // At least 5% padding\n\n const domainMin = Math.max(0, Math.floor(minValue - padding));\n const domainMax = Math.min(100, Math.ceil(maxValue + padding));\n\n return [domainMin, domainMax] as [number, number];\n }, [chartData, marketIds]);\n\n // Get data at specific index or latest\n const getDataAtIndex = useCallback(\n (index: number | null): CurrentMarketData | null => {\n if (chartData.length === 0) return null;\n\n const dataPoint =\n index !== null ? chartData[index] : chartData[chartData.length - 1];\n if (!dataPoint) return null;\n\n return {\n timestamp: dataPoint.timestamp,\n date: dataPoint.date,\n markets: marketIds.map((marketId, idx) => {\n const market = markets.find((m) => m.id === marketId);\n return {\n id: marketId,\n label:\n market?.groupItemTitle || market?.question || `Market ${idx + 1}`,\n value: (dataPoint[marketId] as number) ?? 0,\n color: CHART_COLORS[idx % CHART_COLORS.length].stroke,\n };\n }),\n };\n },\n [chartData, marketIds, markets],\n );\n\n // Notify parent of initial data\n useEffect(() => {\n if (onDataChangeRef.current && chartData.length > 0) {\n onDataChangeRef.current(getDataAtIndex(null));\n }\n }, [chartData, getDataAtIndex]);\n\n // Update parent when active index changes\n useEffect(() => {\n if (onDataChangeRef.current) {\n onDataChangeRef.current(getDataAtIndex(activeIndex));\n }\n }, [activeIndex, getDataAtIndex]);\n\n const handleMouseMove = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state: any) => {\n if (typeof state?.activeTooltipIndex === \"number\") {\n setActiveIndex(state.activeTooltipIndex);\n }\n },\n [],\n );\n\n const handleMouseLeave = useCallback(() => {\n setActiveIndex(null);\n }, []);\n\n // Show loading or empty state\n if (isLoading) {\n return (\n <div className=\"h-[200px] w-full lg:h-[300px] flex items-center justify-center\">\n <div className=\"text-default-400 text-sm\">Loading chart...</div>\n </div>\n );\n }\n\n if (chartData.length === 0) {\n return (\n <div className=\"h-[200px] w-full lg:h-[300px] flex items-center justify-center\">\n <div className=\"text-default-400 text-sm\">No price history data</div>\n </div>\n );\n }\n\n return (\n <div className=\"h-[200px] w-full lg:h-[300px]\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 10, right: 16, left: 16, bottom: 0 }}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n >\n <XAxis\n dataKey=\"timestamp\"\n tick={(props) => {\n const { x, y, payload, index } = props;\n // Calculate sample interval: show ~5-8 labels max\n const totalPoints = chartData.length;\n const maxLabels = 6;\n const sampleInterval = Math.max(\n 1,\n Math.ceil(totalPoints / maxLabels),\n );\n // Always show first and last, sample the rest\n const isFirst = index === 0;\n const isLast = index === totalPoints - 1;\n const isSampled = index % sampleInterval === 0;\n\n if (!isFirst && !isLast && !isSampled) {\n return null;\n }\n\n return (\n <text\n x={x}\n y={y + 10}\n textAnchor=\"middle\"\n fill=\"hsl(var(--heroui-default-500))\"\n fontSize={10}\n >\n {formatTimestamp(payload.value, interval)}\n </text>\n );\n }}\n tickLine={false}\n axisLine={false}\n interval={0}\n />\n <YAxis hide domain={yAxisDomain} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"hsl(var(--heroui-content1))\",\n border: \"1px solid hsl(var(--heroui-default-200))\",\n borderRadius: \"8px\",\n fontSize: \"12px\",\n }}\n labelFormatter={(value: number) => {\n const date = new Date(value * 1000);\n return date.toLocaleString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }}\n formatter={(value: number, name: string) => {\n const market = markets.find((m) => m.id === name);\n const label = market?.groupItemTitle || market?.question || name;\n return [`${value.toFixed(2)}%`, label];\n }}\n />\n {marketIds.map((marketId, index) => (\n <Line\n key={marketId}\n type=\"monotone\"\n dataKey={marketId}\n stroke={CHART_COLORS[index % CHART_COLORS.length].stroke}\n strokeWidth={2}\n dot={false}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n// Export helper for getting latest data (for initial state)\nexport function getLatestEventData(): CurrentMarketData {\n return {\n timestamp: Date.now() / 1000,\n date: new Date().toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n markets: [],\n };\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Avatar,\n TableBody,\n TableCell,\n TableColumn,\n TableHeader,\n TableRow,\n ChevronUpIcon,\n StyledTable,\n Select,\n SelectItem,\n} from \"@liberfi.io/ui\";\nimport { formatAmountUSD3 } from \"@liberfi.io/utils\";\nimport { Event, Market, PriceHistory, PriceHistoryInterval } from \"../../types\";\nimport {\n EventPriceHistoryChart,\n getLatestEventData,\n type CurrentMarketData,\n} from \"./event-price-history-chart.ui\";\n\n// Interval options for the chart\nconst INTERVAL_OPTIONS = [\n { value: PriceHistoryInterval.ONE_HOUR, label: \"1H\" },\n { value: PriceHistoryInterval.SIX_HOURS, label: \"6H\" },\n { value: PriceHistoryInterval.ONE_DAY, label: \"1D\" },\n { value: PriceHistoryInterval.ONE_WEEK, label: \"1W\" },\n];\n\n/** Maximum number of markets that can be selected for price history */\nconst MAX_SELECTED_MARKETS = 4;\n\nexport interface EventDetailUIProps {\n event: Event;\n /** Map of marketId to price history data */\n priceHistories?: Map<string, PriceHistory>;\n /** Interval for price history query */\n priceHistoryInterval?: PriceHistoryInterval;\n /** Whether price history is loading */\n isPriceHistoryLoading?: boolean;\n /** Map of marketId to price history error */\n priceHistoryErrors?: Map<string, Error>;\n /** Callback when interval changes */\n onIntervalChange?: (interval: PriceHistoryInterval) => void;\n /** Selected market IDs for price history chart */\n selectedMarketIds?: string[];\n /** Callback when selected markets change */\n onMarketSelectionChange?: (marketIds: string[]) => void;\n}\n\nexport function EventDetailUI({\n event,\n priceHistories,\n priceHistoryInterval = PriceHistoryInterval.ONE_WEEK,\n isPriceHistoryLoading,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n priceHistoryErrors,\n onIntervalChange,\n selectedMarketIds,\n onMarketSelectionChange,\n}: EventDetailUIProps) {\n const { t } = useTranslation();\n const [currentData, setCurrentData] = useState<CurrentMarketData | null>(\n getLatestEventData(),\n );\n const [isRulesExpanded, setIsRulesExpanded] = useState(false);\n\n // Get markets from event\n const markets = useMemo(() => event.markets || [], [event.markets]);\n\n // Format volume\n const formattedVolume = useMemo(\n () => formatAmountUSD3(event.volume || 0),\n [event.volume],\n );\n\n // Get event status\n const eventStatus = useMemo(() => {\n if (event.closed)\n return {\n label: t(\"predict.event.status.closed\"),\n color: \"bg-danger-100/50 text-danger\",\n };\n if (event.active)\n return {\n label: t(\"predict.event.status.live\"),\n color: \"bg-primary-100/50 text-primary\",\n isLive: true,\n };\n return {\n label: t(\"predict.event.status.pending\"),\n color: \"bg-warning-100/50 text-warning\",\n };\n }, [event.active, event.closed, t]);\n\n // Format end date\n const formattedEndDate = useMemo(() => {\n if (!event.endDate) return null;\n const date = new Date(event.endDate);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n return `${month} ${day}, ${year}`;\n }, [event.endDate]);\n\n // Get market price (first outcome price)\n const getMarketPrice = (market: Market): number => {\n try {\n if (market.outcomePrices) {\n const prices = JSON.parse(market.outcomePrices);\n return parseFloat(prices[0]) || 0;\n }\n } catch {\n // ignore\n }\n return 0;\n };\n\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 lg:px-4 lg:max-w-3xl mx-auto\">\n {/* Event header */}\n <div className=\"flex items-center justify-between gap-x-2 lg:gap-x-4\">\n <div className=\"flex items-center gap-x-2 lg:gap-x-4\">\n <Avatar\n src={event.image || event.icon || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className=\"!h-10 !w-10 flex-shrink-0 transition-transform duration-300 group-hover:scale-110 lg:!h-14 lg:!w-14\"\n />\n <div className=\"flex flex-col\">\n <span className=\"text-base font-semibold lg:text-lg line-clamp-2\">\n {event.title}\n </span>\n </div>\n </div>\n <div\n className={`flex-shrink-0 flex items-center gap-x-2 rounded-lg px-2 py-1 text-sm lg:px-4 lg:py-2 ${eventStatus.color}`}\n >\n {eventStatus.isLive && (\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-current lg:h-2 lg:w-2\" />\n )}\n <span>{eventStatus.label}</span>\n </div>\n </div>\n\n {/* Volume and end date */}\n <div className=\"flex items-center gap-x-3 text-xs text-default-500 lg:text-sm\">\n <span>\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n {formattedEndDate && (\n <>\n <span className=\"text-default-300\">·</span>\n <span>\n {t(\"predict.event.endDate\", { date: formattedEndDate })}\n </span>\n </>\n )}\n </div>\n\n {/* Chart section */}\n <div className=\"flex flex-col gap-y-4\">\n <div className=\"flex flex-col\">\n {/* Market legend */}\n {currentData && currentData.markets.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 text-xs lg:text-sm\">\n {currentData.markets.map((market) => (\n <div key={market.id} className=\"flex items-center gap-x-2\">\n <div\n className=\"h-3 w-3 shrink-0 rounded-full\"\n style={{ backgroundColor: market.color }}\n />\n <span className=\"text-default-600\">{market.label}</span>\n </div>\n ))}\n </div>\n )}\n\n <EventPriceHistoryChart\n priceHistories={priceHistories}\n interval={priceHistoryInterval}\n markets={markets}\n isLoading={isPriceHistoryLoading}\n onDataChange={(data) => setCurrentData(data)}\n />\n\n {/* Interval selector and Market selector */}\n <div className=\"flex items-center justify-between gap-x-4 mt-2\">\n {/* Interval selector - left */}\n <div className=\"flex items-center gap-x-1\">\n {INTERVAL_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => onIntervalChange?.(option.value)}\n className={`px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${\n priceHistoryInterval === option.value\n ? \"bg-primary text-primary-foreground\"\n : \"bg-default-100 text-default-600 hover:bg-default-200\"\n }`}\n >\n {option.label}\n </button>\n ))}\n </div>\n\n {/* Market selector - right */}\n {markets.length > 1 && (\n <Select\n size=\"sm\"\n selectionMode=\"multiple\"\n placeholder=\"Markets\"\n aria-label=\"Select markets\"\n className=\"max-w-48\"\n classNames={{\n trigger: \"min-h-8 h-8\",\n value: \"text-xs\",\n }}\n selectedKeys={\n selectedMarketIds ? new Set(selectedMarketIds) : undefined\n }\n onSelectionChange={(keys) => {\n if (keys === \"all\") return;\n const selected = Array.from(keys) as string[];\n if (selected.length <= MAX_SELECTED_MARKETS) {\n onMarketSelectionChange?.(selected);\n }\n }}\n >\n {markets.map((market) => (\n <SelectItem\n key={market.id}\n textValue={\n market.groupItemTitle || market.question || market.id\n }\n >\n <span className=\"text-xs truncate\">\n {market.groupItemTitle || market.question}\n </span>\n </SelectItem>\n ))}\n </Select>\n )}\n </div>\n </div>\n </div>\n\n {/* Rules section */}\n {event.description && (\n <div className=\"flex flex-col gap-y-2\">\n <span className=\"text-sm font-medium lg:text-base\">\n {t(\"predict.event.rules\")}\n </span>\n <div\n className={`text-xs text-foreground lg:text-sm ${!isRulesExpanded ? \"line-clamp-2\" : \"\"}`}\n >\n {event.description}\n </div>\n <button\n type=\"button\"\n onClick={() => setIsRulesExpanded(!isRulesExpanded)}\n className=\"self-end flex items-center gap-x-1 text-xxs text-default-500 hover:text-default-700 lg:text-xs cursor-pointer\"\n >\n {isRulesExpanded\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.rules.expand\")}\n <ChevronUpIcon\n className={`h-3 w-3 transition-transform duration-200 lg:h-4 lg:w-4 ${isRulesExpanded ? \"\" : \"rotate-180\"}`}\n />\n </button>\n </div>\n )}\n\n {/* Markets table */}\n {markets.length > 0 && (\n <div className=\"w-full overflow-x-auto\">\n <StyledTable radius=\"lg\" aria-label=\"Markets\" className=\"min-w-160\">\n <TableHeader>\n <TableColumn textValue=\"Outcome\" width={320}>\n {t(\"predict.market.table.outcome\")}\n </TableColumn>\n <TableColumn textValue=\"Chance\" width={80}>\n {t(\"predict.market.table.chance\")}\n </TableColumn>\n <TableColumn textValue=\"Actions\" width={240} align=\"end\">\n {t(\"predict.market.table.actions\")}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {markets.map((market) => {\n const price = getMarketPrice(market);\n return (\n <TableRow key={market.id}>\n <TableCell>\n {market.groupItemTitle || market.question}\n </TableCell>\n <TableCell>{(price * 100).toFixed(2)}%</TableCell>\n <TableCell className=\"text-right\">\n <Button\n size=\"sm\"\n color=\"primary\"\n className=\"w-20 bg-primary-100 text-primary\"\n >\n {t(\"predict.market.action.yes\", {\n price: (price * 100).toFixed(0),\n })}\n </Button>\n <Button\n size=\"sm\"\n color=\"secondary\"\n className=\"ml-2 w-20 bg-secondary-100 text-secondary\"\n >\n {t(\"predict.market.action.no\", {\n price: ((1 - price) * 100).toFixed(0),\n })}\n </Button>\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </StyledTable>\n </div>\n )}\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport interface EventDetailSkeletonProps {\n /** Number of market rows to show in table skeleton */\n marketCount?: number;\n}\n\nexport function EventDetailSkeleton({\n marketCount = 3,\n}: EventDetailSkeletonProps) {\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 lg:px-4 lg:max-w-3xl mx-auto\">\n {/* Event header skeleton */}\n <div className=\"flex items-center justify-between gap-x-2 lg:gap-x-4\">\n <div className=\"flex items-center gap-x-2 lg:gap-x-4\">\n {/* Avatar skeleton */}\n <Skeleton className=\"!h-10 !w-10 flex-shrink-0 rounded-lg lg:!h-14 lg:!w-14\" />\n <div className=\"flex flex-col gap-y-1\">\n {/* Title skeleton */}\n <Skeleton className=\"h-5 w-48 rounded-md lg:h-6 lg:w-64\" />\n <Skeleton className=\"h-4 w-32 rounded-md lg:w-40\" />\n </div>\n </div>\n {/* Status badge skeleton */}\n <Skeleton className=\"h-7 w-16 rounded-lg lg:h-9 lg:w-20\" />\n </div>\n\n {/* Volume and end date skeleton */}\n <div className=\"flex items-center gap-x-3\">\n <Skeleton className=\"h-4 w-20 rounded-md lg:w-24\" />\n <Skeleton className=\"h-4 w-28 rounded-md lg:w-32\" />\n </div>\n\n {/* Chart section skeleton */}\n <div className=\"flex flex-col gap-y-4\">\n <div className=\"flex flex-col gap-y-2\">\n {/* Market legend skeleton */}\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-2\">\n <div className=\"flex items-center gap-x-2\">\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n <Skeleton className=\"h-4 w-24 rounded-md\" />\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n </div>\n <div className=\"flex items-center gap-x-2\">\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n <Skeleton className=\"h-4 w-20 rounded-md\" />\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n </div>\n </div>\n\n {/* Chart skeleton */}\n <Skeleton className=\"h-[200px] w-full rounded-lg lg:h-[300px]\" />\n </div>\n </div>\n\n {/* Rules section skeleton */}\n <div className=\"flex flex-col gap-y-2\">\n <Skeleton className=\"h-5 w-12 rounded-md lg:h-6\" />\n <Skeleton className=\"h-4 w-full rounded-md\" />\n <Skeleton className=\"h-4 w-3/4 rounded-md\" />\n </div>\n\n {/* Markets table skeleton */}\n <div className=\"w-full overflow-x-auto\">\n <div className=\"min-w-160 rounded-lg border border-default-200 p-4\">\n {/* Table header skeleton */}\n <div className=\"flex items-center border-b border-default-200 pb-3 mb-3\">\n <Skeleton className=\"h-4 w-24 rounded-md\" />\n <Skeleton className=\"h-4 w-16 rounded-md ml-auto mr-8\" />\n <Skeleton className=\"h-4 w-20 rounded-md\" />\n </div>\n\n {/* Table rows skeleton */}\n <div className=\"flex flex-col gap-y-3\">\n {Array.from({ length: marketCount }).map((_, index) => (\n <div key={index} className=\"flex items-center py-2\">\n <Skeleton className=\"h-4 w-48 rounded-md lg:w-64\" />\n <Skeleton className=\"h-4 w-12 rounded-md ml-auto mr-8\" />\n <div className=\"flex gap-x-2\">\n <Skeleton className=\"h-8 w-20 rounded-md\" />\n <Skeleton className=\"h-8 w-20 rounded-md\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport {\n DEFAULT_PRICE_HISTORY_FIDELITY,\n PRICE_HISTORY_SAMPLE_INTERVAL,\n} from \"../../consts\";\nimport { useEventByIdQuery } from \"../../hooks/useEventByIdQuery\";\nimport { usePredictClient } from \"../../hooks/usePredictClient\";\nimport {\n priceHistoryQueryKey,\n fetchPriceHistory,\n} from \"../../hooks/usePriceHistoryQuery\";\nimport { PriceHistoryInterval, type PriceHistory } from \"../../types\";\n\n/**\n * Sample price history data based on the interval\n * Keeps points that fall on the sampling boundary\n */\nconst samplePriceHistory = (\n history: PriceHistory,\n interval: PriceHistoryInterval,\n): PriceHistory => {\n const sampleInterval = PRICE_HISTORY_SAMPLE_INTERVAL[interval];\n if (!history.history.length) return history;\n\n const sampled: PriceHistory[\"history\"] = [];\n let lastSampledTime = -Infinity;\n\n for (const point of history.history) {\n // Check if this point is at least sampleInterval seconds from the last sampled point\n if (point.t - lastSampledTime >= sampleInterval) {\n sampled.push(point);\n lastSampledTime = point.t;\n }\n }\n\n return { history: sampled };\n};\n\nexport interface UseEventDetailParams {\n eventId: string;\n /** Market IDs to query price history for. Default is first 4 markets of the event, max is 4. */\n priceHistoryMarketIds?: string[];\n /** Interval for price history query. Default is ONE_WEEK. */\n priceHistoryInterval?: PriceHistoryInterval;\n}\n\nconst DEFAULT_PRICE_HISTORY_MARKET_COUNT = 4;\nconst MAX_PRICE_HISTORY_MARKET_COUNT = 4;\nconst DEFAULT_PRICE_HISTORY_INTERVAL = PriceHistoryInterval.ONE_WEEK;\n\nexport const useEventDetail = (params: UseEventDetailParams) => {\n const {\n priceHistoryMarketIds,\n priceHistoryInterval = DEFAULT_PRICE_HISTORY_INTERVAL,\n } = params;\n\n const client = usePredictClient();\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEventByIdQuery({\n id: params.eventId,\n includeChat: true,\n includeTemplate: true,\n });\n\n // Helper to extract queryToken (clobTokenIds[0]) from a market\n const getQueryToken = (\n clobTokenIds: string | null | undefined,\n ): string | null => {\n if (!clobTokenIds) return null;\n try {\n const tokenIds = JSON.parse(clobTokenIds) as string[];\n return tokenIds[0] ?? null;\n } catch {\n return null;\n }\n };\n\n // Build a list of { marketId, queryToken } for price history queries\n // marketId: market.id (used as key in returned Map)\n // queryToken: clobTokenIds[0] (used as API query parameter)\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n // Determine which markets to use\n const markets =\n priceHistoryMarketIds && priceHistoryMarketIds.length > 0\n ? // Filter event.markets by provided IDs\n priceHistoryMarketIds\n .slice(0, MAX_PRICE_HISTORY_MARKET_COUNT)\n .map((id) => event.markets!.find((m) => m.id === id))\n .filter((m) => m !== undefined)\n : // Default: use first 4 markets from event\n event.markets.slice(0, DEFAULT_PRICE_HISTORY_MARKET_COUNT);\n\n return markets\n .map((m) => {\n const queryToken = getQueryToken(m.clobTokenIds);\n if (!queryToken) return null;\n return { marketId: m.id, queryToken };\n })\n .filter(\n (item): item is { marketId: string; queryToken: string } =>\n item !== null,\n );\n }, [priceHistoryMarketIds, event?.markets]);\n\n // Query price history for each market in parallel\n const priceHistoryQueries = useQueries({\n queries: marketsToQuery.map(({ queryToken }) => ({\n queryKey: priceHistoryQueryKey({\n market: queryToken,\n interval: priceHistoryInterval,\n fidelity: DEFAULT_PRICE_HISTORY_FIDELITY[priceHistoryInterval],\n }),\n queryFn: () =>\n fetchPriceHistory(client, {\n market: queryToken,\n interval: priceHistoryInterval,\n fidelity: DEFAULT_PRICE_HISTORY_FIDELITY[priceHistoryInterval],\n }),\n enabled: marketsToQuery.length > 0,\n })),\n });\n\n const isPriceHistoryLoading = priceHistoryQueries.some((q) => q.isLoading);\n const priceHistoryErrors = useMemo(() => {\n const errors = new Map<string, Error>();\n marketsToQuery.forEach(({ marketId }, index) => {\n const error = priceHistoryQueries[index]?.error;\n if (error) {\n errors.set(marketId, error);\n }\n });\n return errors;\n }, [marketsToQuery, priceHistoryQueries]);\n\n // Build a map of marketId -> priceHistory (sampled based on interval)\n const priceHistories = useMemo(() => {\n const map = new Map<string, PriceHistory>();\n marketsToQuery.forEach(({ marketId }, index) => {\n const data = priceHistoryQueries[index]?.data;\n if (data) {\n map.set(marketId, samplePriceHistory(data, priceHistoryInterval));\n }\n });\n return map;\n }, [marketsToQuery, priceHistoryQueries, priceHistoryInterval]);\n\n return {\n event,\n isEventLoading,\n eventError,\n priceHistories,\n isPriceHistoryLoading,\n priceHistoryErrors,\n };\n};\n","import { useState, useEffect, useMemo } from \"react\";\nimport { PriceHistoryInterval } from \"../../types\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport { useEventDetail } from \"./event-detail.scripts\";\nimport { EventDetailUI } from \"./event-detail.ui\";\n\n/** Default interval for price history */\nconst DEFAULT_INTERVAL = PriceHistoryInterval.ONE_WEEK;\n/** Maximum number of markets to select by default */\nconst DEFAULT_MAX_MARKETS = 4;\n\n// ------------------------------------------------------------\nexport interface EventDetailWidgetProps {\n eventId: string;\n /** Initial market IDs to query price history for. Default is first 4 markets of the event, max is 4. */\n initialMarketIds?: string[];\n /** Initial interval for price history. Default is ONE_WEEK. */\n initialInterval?: PriceHistoryInterval;\n}\n\nexport function EventDetailWidget({\n eventId,\n initialMarketIds,\n initialInterval = DEFAULT_INTERVAL,\n}: EventDetailWidgetProps) {\n const [interval, setInterval] =\n useState<PriceHistoryInterval>(initialInterval);\n const [selectedMarketIds, setSelectedMarketIds] = useState<\n string[] | undefined\n >(initialMarketIds);\n\n const {\n event,\n isEventLoading,\n eventError,\n priceHistories,\n isPriceHistoryLoading,\n priceHistoryErrors,\n } = useEventDetail({\n eventId,\n priceHistoryMarketIds: selectedMarketIds,\n priceHistoryInterval: interval,\n });\n\n // Set default selected markets when event loads (first 4 markets)\n useEffect(() => {\n if (event?.markets && !selectedMarketIds) {\n const defaultMarketIds = event.markets\n .slice(0, DEFAULT_MAX_MARKETS)\n .map((m) => m.id);\n setSelectedMarketIds(defaultMarketIds);\n }\n }, [event?.markets, selectedMarketIds]);\n\n // Memoize handlers\n const handleIntervalChange = useMemo(\n () => (newInterval: PriceHistoryInterval) => {\n setInterval(newInterval);\n },\n [],\n );\n\n const handleMarketSelectionChange = useMemo(\n () => (marketIds: string[]) => {\n setSelectedMarketIds(marketIds);\n },\n [],\n );\n\n if (isEventLoading) {\n return <EventDetailSkeleton />;\n }\n\n if (eventError || !event) {\n return (\n <div className=\"flex w-full items-center justify-center py-20 text-danger\">\n {eventError?.message || \"Event not found\"}\n </div>\n );\n }\n\n return (\n <EventDetailUI\n event={event}\n priceHistories={priceHistories}\n priceHistoryInterval={interval}\n isPriceHistoryLoading={isPriceHistoryLoading}\n priceHistoryErrors={priceHistoryErrors}\n onIntervalChange={handleIntervalChange}\n selectedMarketIds={selectedMarketIds}\n onMarketSelectionChange={handleMarketSelectionChange}\n />\n );\n}\n","import { PropsWithChildren } from \"react\";\nimport { PredictContext } from \"../contexts\";\nimport { IPredictClient } from \"../types\";\n\nexport type PredictProviderProps = PropsWithChildren<{\n client: IPredictClient;\n}>;\n\nexport function PredictProvider({ client, children }: PredictProviderProps) {\n return (\n <PredictContext.Provider value={{ client }}>\n {children}\n </PredictContext.Provider>\n );\n}\n"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {Skeleton,Avatar,StyledTooltip,ChevronUpIcon,Button,ChevronRightIcon,ChevronLeftIcon,Pagination,Select,SelectItem,StyledTable,TableHeader,TableColumn,TableBody,TableRow,TableCell}from'@liberfi.io/ui';import {createContext,useContext,useState,useMemo,useCallback,useEffect,useRef}from'react';import {useQuery,useQueries}from'@tanstack/react-query';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useTranslation}from'@liberfi.io/i18n';import {formatAmountUSD3,timestampToString}from'@liberfi.io/utils';import {ResponsiveContainer,LineChart,XAxis,YAxis,Tooltip,Line}from'recharts';typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/ui-predict"]="0.1.0");var Ie="0.1.0";var A=createContext({});function oe(){let e=useContext(A);if(!e)throw new Error("usePredictContext must be used within a PredictProvider");return e}function g(){let{client:e}=oe();return e}function Se(e){return ["predict","markets",e??{}]}async function Te(e,t){return await e.getMarkets(t)}function br(e,t={}){let r=g();return useQuery({queryKey:Se(e),queryFn:async()=>Te(r,e),...t})}function De(e){return ["predict","market","byId",e.id,{includeTag:e.includeTag}]}async function Qe(e,t){return await e.getMarketById(t.id,t.includeTag)}function Mr(e,t={}){let r=g();return useQuery({queryKey:De(e),queryFn:async()=>Qe(r,e),...t})}function Ue(e){return ["predict","market","bySlug",e.slug,{includeTag:e.includeTag}]}async function qe(e,t){return await e.getMarketBySlug(t.slug,t.includeTag)}function Cr(e,t={}){let r=g();return useQuery({queryKey:Ue(e),queryFn:async()=>qe(r,e),...t})}function Ae(e){return ["predict","market","tags",e]}async function He(e,t){return await e.getMarketTagsById(t)}function Qr(e,t={}){let r=g();return useQuery({queryKey:Ae(e),queryFn:async()=>He(r,e),...t})}function Le(e){return ["predict","search",e]}async function Fe(e,t){return await e.search(t)}function Ar(e,t={}){let r=g();return useQuery({queryKey:Le(e),queryFn:async()=>Fe(r,e),...t})}function Ve(e){return ["predict","price",e.tokenId,e.side]}async function ze(e,t){return await e.getMarketPrice(t)}function Kr(e,t={}){let r=g();return useQuery({queryKey:Ve(e),queryFn:async()=>ze(r,e),...t})}function Ye(){return ["predict","prices","all"]}async function Xe(e){return await e.getMultipleMarketPrices()}function Xr(e={}){let t=g();return useQuery({queryKey:Ye(),queryFn:async()=>Xe(t),...e})}function Ge(e){return ["predict","prices","byRequest",e]}async function je(e,t){return await e.getMultipleMarketPricesByRequest(t)}function Zr(e,t={}){let r=g();return useQuery({queryKey:Ge(e),queryFn:async()=>je(r,e),...t})}function z(e){return ["predict","priceHistory",e]}async function W(e,t){return await e.getPriceHistory(t)}function ln(e,t={}){let r=g();return useQuery({queryKey:z(e),queryFn:async()=>W(r,e),...t})}function et(e){return ["predict","events",e??{}]}async function tt(e,t){return await e.getEvents(t)}function ae(e,t={}){let r=g();return useQuery({queryKey:et(e),queryFn:async()=>tt(r,e),...t})}function nt(e){return ["predict","event","byId",e.id,{includeChat:e.includeChat,includeTemplate:e.includeTemplate}]}async function lt(e,t){return await e.getEventById(t.id,t.includeChat,t.includeTemplate)}function se(e,t={}){let r=g();return useQuery({queryKey:nt(e),queryFn:async()=>lt(r,e),...t})}function ot(e){return ["predict","event","tags",e]}async function at(e,t){return await e.getEventTagsById(t)}function bn(e,t={}){let r=g();return useQuery({queryKey:ot(e),queryFn:async()=>at(r,e),...t})}function ut(e){return ["predict","event","bySlug",e]}async function ct(e,t){return await e.getEventBySlug(t)}function Mn(e,t={}){let r=g();return useQuery({queryKey:ut(e),queryFn:async()=>ct(r,e),...t})}var mt=48;function ce({initialPage:e=1,pageSize:t=mt,queryOptions:r={}}={}){let[o,x]=useState(e),[d,a]=useState(r),c=useMemo(()=>(o-1)*t,[o,t]),n=useMemo(()=>({active:true,closed:false,ended:false,archived:false,...d,limit:t,offset:c}),[d,t,c]),{data:l,isLoading:M,isFetching:v,isError:C,error:m,refetch:u}=ae(n),s=useMemo(()=>l??[],[l]),y=useMemo(()=>s.length===t,[s.length,t]),I=useMemo(()=>o>1,[o]),i=useCallback(E=>{E>=1&&x(E);},[]),k=useCallback(()=>{y&&x(E=>E+1);},[y]),R=useCallback(()=>{I&&x(E=>E-1);},[I]),f=useCallback(E=>{a(E),x(1);},[]);return {data:s,isLoading:M,isFetching:v,isError:C,error:m,page:o,pageSize:t,hasNextPage:y,hasPrevPage:I,goToPage:i,nextPage:k,prevPage:R,setQueryOptions:f,refetch:u}}function dt({className:e}){return jsxs("div",{className:`flex min-h-44 w-full flex-col justify-between gap-y-1.5 rounded-xl border border-border bg-content1 p-3 lg:min-h-56 lg:max-w-md lg:gap-y-3 lg:p-4 ${e??""}`,children:[jsxs("div",{className:"flex w-full flex-col gap-y-1.5 lg:gap-y-3",children:[jsxs("div",{className:"flex items-center gap-4",children:[jsx(Skeleton,{className:"h-8 w-8 flex-shrink-0 rounded-lg lg:h-12 lg:w-12"}),jsx(Skeleton,{className:"h-5 flex-1 rounded-md lg:h-6"}),jsx(Skeleton,{className:"h-8 w-12 flex-shrink-0 rounded-lg lg:h-10 lg:w-14"})]}),jsxs("div",{className:"flex w-full flex-col gap-y-0.5 lg:gap-y-1",children:[jsxs("div",{className:"flex min-h-8 w-full items-center justify-between gap-x-2",children:[jsx(Skeleton,{className:"h-4 w-2/3 rounded-md"}),jsxs("div",{className:"flex items-center gap-x-2",children:[jsx(Skeleton,{className:"h-4 w-8 rounded-md"}),jsx(Skeleton,{className:"h-6 w-16 rounded-lg"})]})]}),jsxs("div",{className:"flex min-h-8 w-full items-center justify-between gap-x-2",children:[jsx(Skeleton,{className:"h-4 w-1/2 rounded-md"}),jsxs("div",{className:"flex items-center gap-x-2",children:[jsx(Skeleton,{className:"h-4 w-8 rounded-md"}),jsx(Skeleton,{className:"h-6 w-16 rounded-lg"})]})]})]})]}),jsxs("div",{className:"flex items-center justify-between gap-x-2",children:[jsx(Skeleton,{className:"h-3 w-16 rounded-md lg:h-4"}),jsx(Skeleton,{className:"h-3 w-12 rounded-md lg:h-4"})]})]})}function Y({count:e=8}){return jsx("div",{className:"w-full h-full",children:jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:Array.from({length:e}).map((t,r)=>jsx(dt,{},r))})})}function me({value:e,showLabel:t=true}){let r=e*100;return jsx("div",{className:"flex-shrink-0 flex flex-col items-center",children:jsxs("div",{className:"relative w-16 h-12 lg:w-20 lg:h-14",children:[jsxs("svg",{className:"w-full h-full",viewBox:"0 0 100 70",children:[jsx("path",{d:"M 10 55 A 40 40 0 0 1 90 55",fill:"none",className:"stroke-default-200",strokeWidth:"6",strokeLinecap:"round"}),jsx("path",{d:"M 10 55 A 40 40 0 0 1 90 55",fill:"none",className:"stroke-primary",strokeWidth:"6",strokeLinecap:"round",strokeDasharray:`${e*125.6} 125.6`,style:{transition:"stroke-dasharray 0.5s ease-in-out"}})]}),t&&jsx("div",{className:"absolute inset-0 flex items-center justify-center pt-3 lg:pt-4",children:jsxs("span",{className:"text-sm font-bold text-foreground lg:text-base leading-none",children:[r.toFixed(0),"%"]})})]})})}function ge({event:e,onSelect:t,onSelectOutcome:r}){let{t:o}=useTranslation(),[x,d]=useState(null),a=e.markets||[],c=a.filter(f=>f.active&&!f.closed&&!f.archived),n=a.length===1,l=n?a[0]:x,M=useMemo(()=>formatAmountUSD3(e.volume||0),[e.volume]),v=useMemo(()=>e.endDate?timestampToString(new Date(e.endDate)).split(" ")[0]:null,[e.endDate]),C=useMemo(()=>e.closed?{label:o("predict.event.status.closed"),color:"bg-danger-100/50 text-danger"}:e.active?{label:o("predict.event.status.live"),color:"bg-primary-100/50 text-primary"}:{label:o("predict.event.status.pending"),color:"bg-warning-100/50 text-warning"},[e.active,e.closed,o]),m=f=>{try{if(f.outcomePrices){let E=JSON.parse(f.outcomePrices);return parseFloat(E[0])||0}}catch{}return 0},u=f=>{d(f);},s=()=>{d(null);},y=()=>{l&&r&&r(e,l,"yes");},I=()=>{l&&r&&r(e,l,"no");},i=()=>{t&&t(e);},k=c.slice(0,2),R=c.length>2;return jsxs("div",{className:"flex min-h-44 w-full flex-col justify-between gap-y-1.5 rounded-xl border border-border bg-content1 p-3 transition-all duration-300 cursor-pointer hover:border-primary hover:ring-2 hover:ring-primary/20 focus-within:border-primary focus-within:bg-content2 focus-within:ring-2 focus-within:ring-primary/20 lg:min-h-56 lg:max-w-md lg:gap-y-3 lg:p-4",onClick:i,children:[jsxs("div",{className:"flex w-full flex-col gap-y-1.5 lg:gap-y-3",children:[jsxs("div",{className:"flex items-center gap-4",children:[jsx(Avatar,{src:e.image||e.icon||void 0,name:e.title||"Event",radius:"md",className:"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover:scale-110 lg:h-12 lg:w-12"}),jsx(StyledTooltip,{content:e.title,closeDelay:0,placement:"bottom",children:jsx("p",{className:"flex-1 min-w-0 text-sm font-semibold lg:text-base line-clamp-2",children:e.title})}),n?jsx(me,{value:m(a[0])}):!(e.active&&!e.closed&&!e.archived)&&jsx("div",{className:`flex-shrink-0 flex items-center gap-x-2 rounded-lg px-2 py-1 text-sm lg:px-4 lg:py-2 ${C.color}`,children:jsx("span",{children:C.label})})]}),l&&!n&&jsxs("button",{type:"button",className:"flex min-h-9 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80",onClick:f=>{f.stopPropagation(),s();},children:[jsx("span",{className:"text-left text-xs text-foreground lg:text-sm line-clamp-1",children:l.groupItemTitle}),jsxs("div",{className:"flex items-center gap-x-2",children:[jsxs("span",{className:"text-sm font-semibold text-foreground lg:text-lg",children:[(m(l)*100).toFixed(0),"%"]}),jsx(ChevronUpIcon,{className:"w-3 h-3 text-default-500 lg:w-4 lg:h-4"})]})]}),!l&&!n&&k.length>0&&jsxs("div",{className:"flex w-full flex-col gap-y-0.5 text-xs lg:gap-y-1 lg:text-sm",children:[k.map(f=>{let E=m(f);return jsxs("button",{type:"button",className:"flex min-h-8 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80",onClick:V=>{V.stopPropagation(),u(f);},children:[jsx("span",{className:"text-left text-xs text-foreground lg:text-sm line-clamp-1",children:f.groupItemTitle}),jsxs("div",{className:"flex items-center gap-x-2",children:[jsxs("span",{className:"text-xs text-foreground lg:text-base",children:[(E*100).toFixed(0),"%"]}),jsxs("div",{className:"flex h-full items-center gap-x-3 rounded-lg p-1 lg:p-1.5 bg-gradient-to-r from-primary-50/20 via-primary-50/20 to-secondary-50/20",children:[jsx("span",{className:"text-primary",children:o("predict.market.yes")}),jsx("span",{className:"text-default-400",children:"/"}),jsx("span",{className:"text-secondary",children:o("predict.market.no")})]})]})]},f.id)}),R&&jsx("span",{className:"text-xxs text-default-500 lg:text-xs",children:o("predict.event.moreMarkets",{count:c.length-2})})]}),l&&jsxs("div",{className:`flex items-center gap-x-2 text-sm lg:text-base ${n?"mt-3":""}`,children:[jsx(Button,{color:"primary",fullWidth:true,className:"bg-primary-100 text-primary",size:"lg",onPress:y,children:o("predict.market.yes")}),jsx(Button,{color:"secondary",fullWidth:true,className:"bg-secondary-100 text-secondary",size:"lg",onPress:I,children:o("predict.market.no")})]})]}),!l||n?jsxs("div",{className:"flex items-center justify-between gap-x-2",children:[jsxs("button",{type:"button",className:"flex items-center gap-x-1 text-xxs text-default-600 hover:text-foreground lg:text-xs",onClick:f=>{f.stopPropagation(),i();},children:[jsx("span",{children:o("predict.event.showMore")}),jsx(ChevronRightIcon,{className:"h-3 w-3 lg:h-4 lg:w-4"})]}),jsxs("div",{className:"flex items-center gap-x-2 text-xxs text-default-600 lg:text-xs",children:[v&&jsx("span",{children:v}),jsxs("span",{children:[M," ",o("predict.event.volume")]})]})]}):jsxs("button",{type:"button",className:"flex items-center cursor-pointer gap-x-1 text-xxs text-default-600 hover:text-foreground lg:text-xs",onClick:f=>{f.stopPropagation(),s();},children:[jsx(ChevronLeftIcon,{className:"h-3 w-3 lg:h-4 lg:w-4"}),jsx("span",{children:o("predict.event.back")})]})]})}function pe({events:e,onSelect:t,onSelectOutcome:r}){return jsx("div",{className:"w-full h-full",children:jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:e.map(o=>jsx(ge,{event:o,onSelect:t,onSelectOutcome:r},o.id))})})}var j=48;function ul({onSelect:e,onSelectOutcome:t}){let{data:r,page:o,hasNextPage:x,goToPage:d,isLoading:a,isFetching:c}=ce({pageSize:j}),n=x?o+1:o;return a?jsx(Y,{count:j}):jsxs("div",{className:"w-full flex flex-col gap-6",children:[c?jsx(Y,{count:j}):jsx(pe,{events:r??[],onSelect:e,onSelectOutcome:t}),n>1&&jsx("div",{className:"flex justify-center py-4",children:jsx(Pagination,{total:n,page:o,onChange:d,showControls:true,isDisabled:a,classNames:{cursor:"bg-primary"}})})]})}var Et=(r=>(r.BUY="BUY",r.SELL="SELL",r))(Et||{}),U=(a=>(a.ONE_MINUTE="1m",a.ONE_HOUR="1h",a.SIX_HOURS="6h",a.ONE_DAY="1d",a.ONE_WEEK="1w",a.MAX="max",a))(U||{});var J={"1m":1,"1h":1,"6h":1,"1d":5,"1w":30,max:30},L={"1m":60,"1h":60,"6h":60,"1d":300,"1w":1800,max:1800};var F=[{stroke:"hsl(var(--heroui-primary))",id:"colorMarket0"},{stroke:"hsl(var(--heroui-secondary))",id:"colorMarket1"},{stroke:"hsl(var(--heroui-success))",id:"colorMarket2"},{stroke:"hsl(var(--heroui-warning))",id:"colorMarket3"}];function Qt(e,t){let r=new Date(e*1e3);switch(t){case "1m":case "1h":case "6h":return r.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",hour12:false});case "1d":return r.toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:false});case "1w":return r.toLocaleDateString("en-US",{month:"short",day:"numeric"});case "max":default:return r.toLocaleDateString("en-US",{month:"short",day:"numeric"})}}function Rt(e,t){let r=L[t];return e-e%r}function Ut(e,t,r){let o=new Map;e.forEach((a,c)=>{a.history.forEach(n=>{let l=Rt(n.t,r);o.has(l)||o.set(l,new Map);let M=o.get(l);M.has(c)||M.set(c,{sum:0,count:0});let v=M.get(c);v.sum+=n.p,v.count+=1;});});let d=Array.from(o.keys()).sort((a,c)=>a-c).map(a=>{let n={date:new Date(a*1e3).toLocaleDateString("en-US",{month:"short",day:"numeric"}),timestamp:a},l=o.get(a);return t.forEach(M=>{let v=l.get(M);if(v&&v.count>0){let C=v.sum/v.count;n[M]=Math.round(C*100*100)/100;}}),n});return t.forEach(a=>{let c=null;for(let n of d)n[a]!==void 0?c=n[a]:c!==null&&(n[a]=c);c=null;for(let n=d.length-1;n>=0;n--){let l=d[n];l[a]!==void 0?c=l[a]:c!==null&&(l[a]=c);}for(let n of d)n[a]===void 0&&(n[a]=0);}),d}function ye({priceHistories:e,markets:t=[],isLoading:r,interval:o="max",onDataChange:x}){let[d,a]=useState(null),c=useRef(x);useEffect(()=>{c.current=x;});let n=useMemo(()=>e?Array.from(e.keys()).slice(0,4):[],[e]),l=useMemo(()=>!e||e.size===0?[]:Ut(e,n,o),[e,n,o]),M=useMemo(()=>{if(l.length===0||n.length===0)return [0,100];let u=1/0,s=-1/0;if(l.forEach(R=>{n.forEach(f=>{let E=R[f];E!==void 0&&(u=Math.min(u,E),s=Math.max(s,E));});}),u===1/0||s===-1/0)return [0,100];let y=s-u,I=Math.max(y*.2,5),i=Math.max(0,Math.floor(u-I)),k=Math.min(100,Math.ceil(s+I));return [i,k]},[l,n]),v=useCallback(u=>{if(l.length===0)return null;let s=u!==null?l[u]:l[l.length-1];return s?{timestamp:s.timestamp,date:s.date,markets:n.map((y,I)=>{let i=t.find(k=>k.id===y);return {id:y,label:i?.groupItemTitle||i?.question||`Market ${I+1}`,value:s[y]??0,color:F[I%F.length].stroke}})}:null},[l,n,t]);useEffect(()=>{c.current&&l.length>0&&c.current(v(null));},[l,v]),useEffect(()=>{c.current&&c.current(v(d));},[d,v]);let C=useCallback(u=>{typeof u?.activeTooltipIndex=="number"&&a(u.activeTooltipIndex);},[]),m=useCallback(()=>{a(null);},[]);return r?jsx("div",{className:"h-[200px] w-full lg:h-[300px] flex items-center justify-center",children:jsx("div",{className:"text-default-400 text-sm",children:"Loading chart..."})}):l.length===0?jsx("div",{className:"h-[200px] w-full lg:h-[300px] flex items-center justify-center",children:jsx("div",{className:"text-default-400 text-sm",children:"No price history data"})}):jsx("div",{className:"h-[200px] w-full lg:h-[300px]",children:jsx(ResponsiveContainer,{width:"100%",height:"100%",children:jsxs(LineChart,{data:l,margin:{top:10,right:16,left:16,bottom:0},onMouseMove:C,onMouseLeave:m,children:[jsx(XAxis,{dataKey:"timestamp",tick:u=>{let{x:s,y,payload:I,index:i}=u,k=l.length,f=Math.max(1,Math.ceil(k/6)),E=i===0,V=i===k-1,Ee=i%f===0;return !E&&!V&&!Ee?null:jsx("text",{x:s,y:y+10,textAnchor:"middle",fill:"hsl(var(--heroui-default-500))",fontSize:10,children:Qt(I.value,o)})},tickLine:false,axisLine:false,interval:0}),jsx(YAxis,{hide:true,domain:M}),jsx(Tooltip,{contentStyle:{backgroundColor:"hsl(var(--heroui-content1))",border:"1px solid hsl(var(--heroui-default-200))",borderRadius:"8px",fontSize:"12px"},labelFormatter:u=>new Date(u*1e3).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit",hour12:false}),formatter:(u,s)=>{let y=t.find(i=>i.id===s),I=y?.groupItemTitle||y?.question||s;return [`${u.toFixed(2)}%`,I]}}),n.map((u,s)=>jsx(Line,{type:"monotone",dataKey:u,stroke:F[s%F.length].stroke,strokeWidth:2,dot:false},u))]})})})}function fe(){return {timestamp:Date.now()/1e3,date:new Date().toLocaleDateString("en-US",{month:"short",day:"numeric"}),markets:[]}}var Yt=[{value:"1h",label:"1H"},{value:"6h",label:"6H"},{value:"1d",label:"1D"},{value:"1w",label:"1W"}],Xt=4;function xe({event:e,priceHistories:t,priceHistoryInterval:r="1w",isPriceHistoryLoading:o,priceHistoryErrors:x,onIntervalChange:d,selectedMarketIds:a,onMarketSelectionChange:c}){let{t:n}=useTranslation(),[l,M]=useState(fe()),[v,C]=useState(false),m=useMemo(()=>e.markets||[],[e.markets]),u=useMemo(()=>formatAmountUSD3(e.volume||0),[e.volume]),s=useMemo(()=>e.closed?{label:n("predict.event.status.closed"),color:"bg-danger-100/50 text-danger"}:e.active?{label:n("predict.event.status.live"),color:"bg-primary-100/50 text-primary",isLive:true}:{label:n("predict.event.status.pending"),color:"bg-warning-100/50 text-warning"},[e.active,e.closed,n]),y=useMemo(()=>{if(!e.endDate)return null;let i=new Date(e.endDate),k=i.toLocaleString("default",{month:"short"}),R=i.getDate(),f=i.getFullYear();return `${k} ${R}, ${f}`},[e.endDate]),I=i=>{try{if(i.outcomePrices){let k=JSON.parse(i.outcomePrices);return parseFloat(k[0])||0}}catch{}return 0};return jsxs("div",{className:"w-full flex flex-col gap-4 lg:gap-y-6 px-1 lg:px-4 lg:max-w-3xl mx-auto",children:[jsxs("div",{className:"flex items-center justify-between gap-x-2 lg:gap-x-4",children:[jsxs("div",{className:"flex items-center gap-x-2 lg:gap-x-4",children:[jsx(Avatar,{src:e.image||e.icon||void 0,name:e.title||"Event",radius:"lg",className:"!h-10 !w-10 flex-shrink-0 transition-transform duration-300 group-hover:scale-110 lg:!h-14 lg:!w-14"}),jsx("div",{className:"flex flex-col",children:jsx("span",{className:"text-base font-semibold lg:text-lg line-clamp-2",children:e.title})})]}),jsxs("div",{className:`flex-shrink-0 flex items-center gap-x-2 rounded-lg px-2 py-1 text-sm lg:px-4 lg:py-2 ${s.color}`,children:[s.isLive&&jsx("span",{className:"h-1.5 w-1.5 animate-pulse rounded-full bg-current lg:h-2 lg:w-2"}),jsx("span",{children:s.label})]})]}),jsxs("div",{className:"flex items-center gap-x-3 text-xs text-default-500 lg:text-sm",children:[jsxs("span",{children:[u," ",n("predict.event.volume")]}),y&&jsxs(Fragment,{children:[jsx("span",{className:"text-default-300",children:"\xB7"}),jsx("span",{children:n("predict.event.endDate",{date:y})})]})]}),jsx("div",{className:"flex flex-col gap-y-4",children:jsxs("div",{className:"flex flex-col",children:[l&&l.markets.length>0&&jsx("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-2 text-xs lg:text-sm",children:l.markets.map(i=>jsxs("div",{className:"flex items-center gap-x-2",children:[jsx("div",{className:"h-3 w-3 shrink-0 rounded-full",style:{backgroundColor:i.color}}),jsx("span",{className:"text-default-600",children:i.label})]},i.id))}),jsx(ye,{priceHistories:t,interval:r,markets:m,isLoading:o,onDataChange:i=>M(i)}),jsxs("div",{className:"flex items-center justify-between gap-x-4 mt-2",children:[jsx("div",{className:"flex items-center gap-x-1",children:Yt.map(i=>jsx("button",{type:"button",onClick:()=>d?.(i.value),className:`px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${r===i.value?"bg-primary text-primary-foreground":"bg-default-100 text-default-600 hover:bg-default-200"}`,children:i.label},i.value))}),m.length>1&&jsx(Select,{size:"sm",selectionMode:"multiple",placeholder:"Markets","aria-label":"Select markets",className:"max-w-48",classNames:{trigger:"min-h-8 h-8",value:"text-xs"},selectedKeys:a?new Set(a):void 0,onSelectionChange:i=>{if(i==="all")return;let k=Array.from(i);k.length<=Xt&&c?.(k);},children:m.map(i=>jsx(SelectItem,{textValue:i.groupItemTitle||i.question||i.id,children:jsx("span",{className:"text-xs truncate",children:i.groupItemTitle||i.question})},i.id))})]})]})}),e.description&&jsxs("div",{className:"flex flex-col gap-y-2",children:[jsx("span",{className:"text-sm font-medium lg:text-base",children:n("predict.event.rules")}),jsx("div",{className:`text-xs text-foreground lg:text-sm ${v?"":"line-clamp-2"}`,children:e.description}),jsxs("button",{type:"button",onClick:()=>C(!v),className:"self-end flex items-center gap-x-1 text-xxs text-default-500 hover:text-default-700 lg:text-xs cursor-pointer",children:[n(v?"predict.event.rules.collapse":"predict.event.rules.expand"),jsx(ChevronUpIcon,{className:`h-3 w-3 transition-transform duration-200 lg:h-4 lg:w-4 ${v?"":"rotate-180"}`})]})]}),m.length>0&&jsx("div",{className:"w-full overflow-x-auto",children:jsxs(StyledTable,{radius:"lg","aria-label":"Markets",className:"min-w-160",children:[jsxs(TableHeader,{children:[jsx(TableColumn,{textValue:"Outcome",width:320,children:n("predict.market.table.outcome")}),jsx(TableColumn,{textValue:"Chance",width:80,children:n("predict.market.table.chance")}),jsx(TableColumn,{textValue:"Actions",width:240,align:"end",children:n("predict.market.table.actions")})]}),jsx(TableBody,{children:m.map(i=>{let k=I(i);return jsxs(TableRow,{children:[jsx(TableCell,{children:i.groupItemTitle||i.question}),jsxs(TableCell,{children:[(k*100).toFixed(2),"%"]}),jsxs(TableCell,{className:"text-right",children:[jsx(Button,{size:"sm",color:"primary",className:"w-20 bg-primary-100 text-primary",children:n("predict.market.action.yes",{price:(k*100).toFixed(0)})}),jsx(Button,{size:"sm",color:"secondary",className:"ml-2 w-20 bg-secondary-100 text-secondary",children:n("predict.market.action.no",{price:((1-k)*100).toFixed(0)})})]})]},i.id)})})]})})]})}function he({marketCount:e=3}){return jsxs("div",{className:"w-full flex flex-col gap-4 lg:gap-y-6 px-1 lg:px-4 lg:max-w-3xl mx-auto",children:[jsxs("div",{className:"flex items-center justify-between gap-x-2 lg:gap-x-4",children:[jsxs("div",{className:"flex items-center gap-x-2 lg:gap-x-4",children:[jsx(Skeleton,{className:"!h-10 !w-10 flex-shrink-0 rounded-lg lg:!h-14 lg:!w-14"}),jsxs("div",{className:"flex flex-col gap-y-1",children:[jsx(Skeleton,{className:"h-5 w-48 rounded-md lg:h-6 lg:w-64"}),jsx(Skeleton,{className:"h-4 w-32 rounded-md lg:w-40"})]})]}),jsx(Skeleton,{className:"h-7 w-16 rounded-lg lg:h-9 lg:w-20"})]}),jsxs("div",{className:"flex items-center gap-x-3",children:[jsx(Skeleton,{className:"h-4 w-20 rounded-md lg:w-24"}),jsx(Skeleton,{className:"h-4 w-28 rounded-md lg:w-32"})]}),jsx("div",{className:"flex flex-col gap-y-4",children:jsxs("div",{className:"flex flex-col gap-y-2",children:[jsxs("div",{className:"grid grid-cols-2 gap-x-4 gap-y-2",children:[jsxs("div",{className:"flex items-center gap-x-2",children:[jsx(Skeleton,{className:"h-3 w-3 rounded-full"}),jsx(Skeleton,{className:"h-4 w-24 rounded-md"}),jsx(Skeleton,{className:"h-4 w-12 rounded-md"})]}),jsxs("div",{className:"flex items-center gap-x-2",children:[jsx(Skeleton,{className:"h-3 w-3 rounded-full"}),jsx(Skeleton,{className:"h-4 w-20 rounded-md"}),jsx(Skeleton,{className:"h-4 w-12 rounded-md"})]})]}),jsx(Skeleton,{className:"h-[200px] w-full rounded-lg lg:h-[300px]"})]})}),jsxs("div",{className:"flex flex-col gap-y-2",children:[jsx(Skeleton,{className:"h-5 w-12 rounded-md lg:h-6"}),jsx(Skeleton,{className:"h-4 w-full rounded-md"}),jsx(Skeleton,{className:"h-4 w-3/4 rounded-md"})]}),jsx("div",{className:"w-full overflow-x-auto",children:jsxs("div",{className:"min-w-160 rounded-lg border border-default-200 p-4",children:[jsxs("div",{className:"flex items-center border-b border-default-200 pb-3 mb-3",children:[jsx(Skeleton,{className:"h-4 w-24 rounded-md"}),jsx(Skeleton,{className:"h-4 w-16 rounded-md ml-auto mr-8"}),jsx(Skeleton,{className:"h-4 w-20 rounded-md"})]}),jsx("div",{className:"flex flex-col gap-y-3",children:Array.from({length:e}).map((t,r)=>jsxs("div",{className:"flex items-center py-2",children:[jsx(Skeleton,{className:"h-4 w-48 rounded-md lg:w-64"}),jsx(Skeleton,{className:"h-4 w-12 rounded-md ml-auto mr-8"}),jsxs("div",{className:"flex gap-x-2",children:[jsx(Skeleton,{className:"h-8 w-20 rounded-md"}),jsx(Skeleton,{className:"h-8 w-20 rounded-md"})]})]},r))})]})})]})}var jt=(e,t)=>{let r=L[t];if(!e.history.length)return e;let o=[],x=-1/0;for(let d of e.history)d.t-x>=r&&(o.push(d),x=d.t);return {history:o}},Jt=4,Zt=4,er="1w",ke=e=>{let{priceHistoryMarketIds:t,priceHistoryInterval:r=er}=e,o=g(),{data:x,isLoading:d,error:a}=se({id:e.eventId,includeChat:true,includeTemplate:true}),c=m=>{if(!m)return null;try{return JSON.parse(m)[0]??null}catch{return null}},n=useMemo(()=>x?.markets?(t&&t.length>0?t.slice(0,Zt).map(u=>x.markets.find(s=>s.id===u)).filter(u=>u!==void 0):x.markets.slice(0,Jt)).map(u=>{let s=c(u.clobTokenIds);return s?{marketId:u.id,queryToken:s}:null}).filter(u=>u!==null):[],[t,x?.markets]),l=useQueries({queries:n.map(({queryToken:m})=>({queryKey:z({market:m,interval:r,fidelity:J[r]}),queryFn:()=>W(o,{market:m,interval:r,fidelity:J[r]}),enabled:n.length>0}))}),M=l.some(m=>m.isLoading),v=useMemo(()=>{let m=new Map;return n.forEach(({marketId:u},s)=>{let y=l[s]?.error;y&&m.set(u,y);}),m},[n,l]),C=useMemo(()=>{let m=new Map;return n.forEach(({marketId:u},s)=>{let y=l[s]?.data;y&&m.set(u,jt(y,r));}),m},[n,l,r]);return {event:x,isEventLoading:d,eventError:a,priceHistories:C,isPriceHistoryLoading:M,priceHistoryErrors:v}};var rr="1w",nr=4;function ei({eventId:e,initialMarketIds:t,initialInterval:r=rr}){let[o,x]=useState(r),[d,a]=useState(t),{event:c,isEventLoading:n,eventError:l,priceHistories:M,isPriceHistoryLoading:v,priceHistoryErrors:C}=ke({eventId:e,priceHistoryMarketIds:d,priceHistoryInterval:o});useEffect(()=>{if(c?.markets&&!d){let s=c.markets.slice(0,nr).map(y=>y.id);a(s);}},[c?.markets,d]);let m=useMemo(()=>s=>{x(s);},[]),u=useMemo(()=>s=>{a(s);},[]);return n?jsx(he,{}):l||!c?jsx("div",{className:"flex w-full items-center justify-center py-20 text-danger",children:l?.message||"Event not found"}):jsx(xe,{event:c,priceHistories:M,priceHistoryInterval:o,isPriceHistoryLoading:v,priceHistoryErrors:C,onIntervalChange:m,selectedMarketIds:d,onMarketSelectionChange:u})}function di({client:e,children:t}){return jsx(A.Provider,{value:{client:e},children:t})}export{he as EventDetailSkeleton,xe as EventDetailUI,ei as EventDetailWidget,dt as EventItemSkeleton,ge as EventItemUI,Y as EventsSkeleton,pe as EventsUI,ul as EventsWidget,A as PredictContext,di as PredictProvider,U as PriceHistoryInterval,Et as PriceSide,nt as eventByIdQueryKey,ut as eventBySlugQueryKey,ot as eventTagsByIdQueryKey,et as eventsQueryKey,lt as fetchEventById,ct as fetchEventBySlug,at as fetchEventTagsById,tt as fetchEvents,Qe as fetchMarketById,qe as fetchMarketBySlug,ze as fetchMarketPrice,He as fetchMarketTagsById,Te as fetchMarkets,Xe as fetchMultipleMarketPrices,je as fetchMultipleMarketPricesByRequest,W as fetchPriceHistory,Fe as fetchSearch,De as marketByIdQueryKey,Ue as marketBySlugQueryKey,Ve as marketPriceQueryKey,Ae as marketTagsByIdQueryKey,Se as marketsQueryKey,Ge as multipleMarketPricesByRequestQueryKey,Ye as multipleMarketPricesQueryKey,z as priceHistoryQueryKey,Le as searchQueryKey,se as useEventByIdQuery,Mn as useEventBySlugQuery,ke as useEventDetail,bn as useEventTagsByIdQuery,ce as useEvents,ae as useEventsQuery,Mr as useMarketByIdQuery,Cr as useMarketBySlugQuery,Kr as useMarketPriceQuery,Qr as useMarketTagsByIdQuery,br as useMarketsQuery,Zr as useMultipleMarketPricesByRequestQuery,Xr as useMultipleMarketPricesQuery,g as usePredictClient,oe as usePredictContext,ln as usePriceHistoryQuery,Ar as useSearchQuery,Ie as version};//# sourceMappingURL=index.mjs.map
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|