@liberfi.io/ui-predict 0.1.71 → 0.1.72
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/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/contexts/v2/PredictV2Context.tsx","../src/hooks/v2/usePredictV2Context.ts","../src/hooks/v2/usePredictV2Client.ts","../src/hooks/v2/useEventsV2Query.ts","../src/consts/index.ts","../src/hooks/v2/eventsV2.params.ts","../src/hooks/v2/useEventV2Query.ts","../src/hooks/v2/useEventsV2InfiniteQuery.ts","../src/hooks/v2/useSearchEventsInfiniteQuery.ts","../src/hooks/v2/useSimilarEventsV2Query.ts","../src/hooks/v2/useMarketV2Query.ts","../src/hooks/v2/usePriceHistoryV2Query.ts","../src/hooks/v2/useMarketHistoryV2.ts","../src/hooks/v2/useOrderbookV2Query.ts","../src/hooks/v2/useMarketTradesV2Query.ts","../src/hooks/v2/useCandlesticksV2Query.ts","../src/hooks/v2/usePositionsV2Query.ts","../src/hooks/v2/useOrdersV2Query.ts","../src/hooks/v2/useOrderV2Query.ts","../src/hooks/v2/useCancelOrderV2Mutation.ts","../src/hooks/v2/useDFlowQuoteV2.ts","../src/hooks/v2/useDFlowSubmitV2.ts","../src/hooks/v2/useTradesByWalletV2Query.ts","../src/contexts/PredictContext.tsx","../src/contexts/UserPredictContext.tsx","../src/hooks/usePredictContext.ts","../src/hooks/usePredictClient.ts","../src/hooks/useEventsQuery.ts","../src/hooks/useEventsInfiniteQuery.ts","../src/hooks/useEventByIdQuery.ts","../src/hooks/useMarketsQuery.ts","../src/hooks/useMarketByIdQuery.ts","../src/hooks/useMarketByMintQuery.ts","../src/hooks/useMarketsBatchQuery.ts","../src/hooks/useOrderBookQuery.ts","../src/hooks/useTradesQuery.ts","../src/hooks/useOnchainTradesQuery.ts","../src/hooks/useOnchainTradesInfiniteQuery.ts","../src/hooks/usePriceHistoryQuery.ts","../src/hooks/useForecastHistoryQuery.ts","../src/hooks/useLiveDataQuery.ts","../src/hooks/useSeriesQuery.ts","../src/hooks/useCategoriesQuery.ts","../src/hooks/useSearchQuery.ts","../src/hooks/usePositionsByWalletQuery.ts","../src/hooks/useUserPredictContext.ts","../src/hooks/useMarketPositions.ts","../src/hooks/useOutcomeMintsQuery.ts","../src/hooks/useQuoteQuery.ts","../src/hooks/useSwapMutation.ts","../src/hooks/useOrderQuery.ts","../src/hooks/useIntentQuery.ts","../src/hooks/usePredictionMarketMutation.ts","../src/hooks/useTokensQuery.ts","../src/hooks/useVenuesQuery.ts","../src/client/ws.ts","../src/hooks/useWsConnection.ts","../src/hooks/useWsClient.ts","../src/hooks/usePricesSubscription.ts","../src/hooks/useTradesSubscription.ts","../src/hooks/useOrderbookSubscription.ts","../src/components/categories/categories.script.ts","../src/components/categories/categories.ui.tsx","../src/components/categories/categories.widget.tsx","../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/components/events/events.page.tsx","../src/components/categories/categories.v2.script.ts","../src/components/categories/categories.v2.widget.tsx","../src/components/events/events-filter.v2.ui.tsx","../src/components/events/events-toolbar.v2.ui.tsx","../src/components/events/events.v2.script.ts","../src/components/events/event-item.v2.ui.tsx","../src/components/events/events.v2.ui.tsx","../src/components/events/events.v2.widget.tsx","../src/components/events/events.v2.page.tsx","../src/components/trade-form/trade-form.script.tsx","../src/components/trade-form/trade-form.ui.tsx","../src/components/trade-form/trade-form.widget.tsx","../src/components/event-detail/event-detail-skeleton.tsx","../src/components/event-detail/event-detail.scripts.ts","../src/hooks/useMarketsHoldings.ts","../src/components/event-detail/event-candlesticks.ui.tsx","../src/components/event-detail/event-market-candlesticks.script.ts","../src/components/event-detail/event-market-candlesticks.ui.tsx","../src/components/event-detail/event-market-orderbook.script.ts","../src/components/event-detail/event-market-orderbook.ui.tsx","../src/components/event-detail/event-market-positions.ui.tsx","../src/components/event-detail/event-market-trades.ui.tsx","../src/components/event-detail/event-market-detail.widget.tsx","../src/components/event-detail/event-markets.ui.tsx","../src/components/event-detail/event-rules.ui.tsx","../src/components/event-detail/event-detail.ui.tsx","../src/components/event-detail/event-detail.widget.tsx","../src/components/event-detail/event-detail.page.tsx","../src/utils/v2-market-adapter.ts","../src/components/trade-form/trade-form-v2.script.ts","../src/components/trade-form/trade-form-v2.widget.tsx","../src/components/event-detail/event-detail-activity-v2.ui.tsx","../src/components/event-detail/event-market-detail-v2.widget.tsx","../src/components/event-detail/event-price-chart-v2.ui.tsx","../src/components/event-detail/event-detail.v2.ui.tsx","../src/components/event-detail/event-detail.v2.widget.tsx","../src/components/event-detail/event-detail.v2.page.tsx","../src/components/event-detail/event-detail.v2.scripts.ts","../src/components/order-book/order-book.script.tsx","../src/components/order-book/order-book.ui.tsx","../src/components/order-book/order-book.widget.tsx","../src/components/open-orders/open-orders.script.tsx","../src/components/open-orders/open-orders.ui.tsx","../src/components/open-orders/open-orders.widget.tsx","../src/components/trade-history/trade-history.script.tsx","../src/components/trade-history/trade-history.ui.tsx","../src/components/trade-history/trade-history.widget.tsx","../src/components/positions/positions.script.tsx","../src/components/positions/positions.ui.tsx","../src/components/positions/positions.widget.tsx","../src/components/search/search-history.script.ts","../src/components/search/search-history.ui.tsx","../src/components/search/search-history.widget.tsx","../src/components/search/search-input.ui.tsx","../src/components/search/search-result-item.ui.tsx","../src/components/search/search-result-list.script.ts","../src/components/search/search-result-list.widget.tsx","../src/components/search/search.script.ts","../src/components/search/search.widget.tsx","../src/components/search/search.modal.tsx","../src/components/search/search-events-button.tsx","../src/providers/PredictProvider.tsx","../src/providers/UserPredictProvider.tsx","../src/providers/v2/PredictV2Provider.tsx","../src/client/base.ts","../src/client/dflow.ts","../src/client/v2/client.ts"],"names":["version_default","PredictV2Context","createContext","usePredictV2Context","context","useContext","usePredictV2Client","client","eventsV2QueryKey","params","fetchEventsV2","useEventsV2Query","queryOptions","useQuery","DEFAULT_PAGE_SIZE","MAX_PRICE_HISTORY_MARKETS","CandlestickPeriod","ChartRange","DEFAULT_CHART_RANGE","CHART_RANGE_PERIOD","CHART_RANGE_SAMPLE_INTERVAL","CHART_RANGE_DURATION","ORDER_MIN_QUANTITY","ORDER_PRICE_STEP","ORDER_MIN_PRICE","ORDER_MAX_PRICE","PriceHistoryInterval","DEFAULT_PRICE_HISTORY_INTERVAL","PRICE_HISTORY_SAMPLE_INTERVAL","resolveTagSlug","selection","resolveEventsV2Params","input","tagSlugSelection","limit","status","with_markets","source","sort_by","sort_asc","tag_slug","eventsV2InfiniteQueryKey","fetchEventsV2Page","eventV2QueryKey","slug","fetchEventV2","useEventV2Query","useEventsV2InfiniteQuery","useInfiniteQuery","pageParam","lastPage","searchEventsInfiniteQueryKey","useSearchEventsInfiniteQuery","apiParams","useMemo","similarEventsV2QueryKey","useSimilarEventsV2Query","marketV2QueryKey","fetchMarketV2","useMarketV2Query","priceHistoryV2QueryKey","range","usePriceHistoryV2Query","RANGE_MAP","useMarketHistoryV2","markets","apiRange","queries","useQueries","market","isLoading","q","idx","points","pt","currentPrice","o","now","orderbookV2QueryKey","useOrderbookV2Query","marketTradesV2QueryKey","useMarketTradesV2Query","candlesticksV2QueryKey","useCandlesticksV2Query","positionsV2QueryKey","user","usePositionsV2Query","ordersV2QueryKey","useOrdersV2Query","orderV2QueryKey","id","useOrderV2Query","useCancelOrderV2Mutation","mutationOptions","queryClient","useQueryClient","useMutation","vars","dflowQuoteV2QueryKey","useDFlowQuoteV2","enabled","useDFlowSubmitV2","body","tradesByWalletV2QueryKey","useTradesByWalletV2Query","PredictContext","UserPredictContext","usePredictContext","usePredictClient","eventsQueryKey","fetchEvents","useEventsQuery","eventsInfiniteQueryKey","useEventsInfiniteQuery","options","eventByIdQueryKey","fetchEventById","useEventByIdQuery","marketsQueryKey","fetchMarkets","useMarketsQuery","marketByIdQueryKey","fetchMarketById","useMarketByIdQuery","marketByMintQueryKey","mintAddress","fetchMarketByMint","useMarketByMintQuery","marketsBatchQueryKey","request","fetchMarketsBatch","useMarketsBatchQuery","orderBookQueryKey","marketTicker","fetchOrderBook","useOrderBookQuery","orderBookByMintQueryKey","fetchOrderBookByMint","useOrderBookByMintQuery","tradesQueryKey","fetchTrades","useTradesQuery","tradesByMintQueryKey","fetchTradesByMint","useTradesByMintQuery","onchainTradesByWalletQueryKey","fetchOnchainTradesByWallet","useOnchainTradesByWalletQuery","onchainTradesByEventQueryKey","fetchOnchainTradesByEvent","useOnchainTradesByEventQuery","onchainTradesByMarketQueryKey","fetchOnchainTradesByMarket","useOnchainTradesByMarketQuery","getNextPageParam","onchainTradesByWalletInfiniteQueryKey","useOnchainTradesByWalletInfiniteQuery","onchainTradesByEventInfiniteQueryKey","useOnchainTradesByEventInfiniteQuery","onchainTradesByMarketInfiniteQueryKey","useOnchainTradesByMarketInfiniteQuery","eventCandlesticksQueryKey","fetchEventCandlesticks","ticker","rest","useEventCandlesticksQuery","marketCandlesticksQueryKey","fetchMarketCandlesticks","useMarketCandlesticksQuery","marketCandlesticksByMintQueryKey","fetchMarketCandlesticksByMint","useMarketCandlesticksByMintQuery","usePriceHistoryQuery","forecastPercentileHistoryQueryKey","fetchForecastPercentileHistory","useForecastPercentileHistoryQuery","forecastPercentileHistoryByMintQueryKey","fetchForecastPercentileHistoryByMint","useForecastPercentileHistoryByMintQuery","liveDataQueryKey","fetchLiveData","useLiveDataQuery","liveDataByEventQueryKey","fetchLiveDataByEvent","useLiveDataByEventQuery","liveDataByMintQueryKey","fetchLiveDataByMint","useLiveDataByMintQuery","seriesQueryKey","fetchSeries","useSeriesQuery","seriesByTickerQueryKey","seriesTicker","fetchSeriesByTicker","useSeriesByTickerQuery","tagsByCategoriesQueryKey","fetchTagsByCategories","useTagsByCategoriesQuery","filtersBySportsQueryKey","fetchFiltersBySports","useFiltersBySportsQuery","useCategoriesQuery","searchQueryKey","fetchSearch","useSearchQuery","positionsByWalletQueryKey","fetchPositionsByWallet","usePositionsByWalletQuery","useUserPredictContext","useMarketPositions","ctx","p","outcomeMintsQueryKey","fetchOutcomeMints","useOutcomeMintsQuery","filterOutcomeMints","useFilterOutcomeMintsMutation","quoteQueryKey","fetchQuote","useQuoteQuery","createSwap","useCreateSwapMutation","createSwapInstructions","useCreateSwapInstructionsMutation","orderQueryKey","fetchOrder","useOrderQuery","orderStatusQueryKey","fetchOrderStatus","useOrderStatusQuery","intentQuoteQueryKey","fetchIntentQuote","useIntentQuoteQuery","submitIntentSwap","useSubmitIntentSwapMutation","initPredictionMarket","useInitPredictionMarketMutation","tokensQueryKey","fetchTokens","useTokensQuery","tokensWithDecimalsQueryKey","fetchTokensWithDecimals","useTokensWithDecimalsQuery","venuesQueryKey","fetchVenues","useVenuesQuery","DflowPredictWsClient","config","event","error","onUpdate","removeListener","callback","listeners","index","key","channel","subscription","data","listener","message","type","dataMsg","delay","createDflowPredictWsClient","useWsConnection","wsEndpoint","autoConnect","autoReconnect","setStatus","useState","setError","clientRef","useRef","useEffect","unsubStatus","newStatus","unsubError","err","unsubConnect","connect","useCallback","disconnect","useWsClient","wsClient","wsStatus","setWsStatus","usePricesSubscription","all","tickers","prices","setPrices","isSubscribed","setIsSubscribed","onUpdateRef","unsubscribe","update","prev","next","useTradesSubscription","maxHistory","trades","setTrades","trade","clearHistory","useOrderbookSubscription","orderbooks","setOrderbooks","getOrderbook","CATEGORY_ORDER","useEventsCategories","tagsData","isError","orderIndex","cat","category","tags","a","b","CategoriesUI","categories","selectedCategory","selectedTag","activeTags","onCategorySelect","onTagSelect","trailing","pulsingTab","className","t","useTranslation","handleSelectAll","trendingLabel","jsxs","cn","jsx","Tab","TabSeparator","Chip","tag","label","isSelected","onPress","badge","showPulse","icon","CategoriesSkeleton","count","_","i","Skeleton","CategoriesWidget","onSelect","setSelectedCategory","setSelectedTag","handleCategorySelect","c","handleTagSelect","useEvents","restParams","needsSeriesLookup","seriesData","isSeriesFetching","isSeriesError","seriesError","derivedSeriesTickers","s","mergedParams","infiniteData","isEventsLoading","isEventsFetching","isFetchingMore","hasMore","fetchMore","refetch","page","isSeriesResolving","EventItemSkeleton","EventsSkeleton","EventsPageSkeleton","GaugeChartUI","value","showLabel","normalized","EventItemUI","onSelectOutcome","manualSelectedMarket","setManualSelectedMarket","rawMarkets","openMarkets","isSingleMarket","selectedMarket","formattedVolume","formatAmountUSDCompact","getYesCents","getNoCents","getYesPercent","yesCents","noCents","formatPercent","getNoPercent","cents","eventStatus","hasActiveMarket","m","handleMarketClick","handleBack","handleYesClick","handleNoClick","handleSelect","displayedMarkets","hasMoreMarkets","Avatar","StyledTooltip","e","ChevronUpIcon","Button","ChevronRightIcon","ChevronLeftIcon","SM","MD","LG","XL","GAP","ROW_HEIGHT_XS","ROW_HEIGHT_SM","ROW_HEIGHT_LG","getColumnCount","width","getRowHeight","EventsUI","events","onFetchMore","containerRef","containerWidth","containerHeight","useResizeObserver","columnCount","rowHeight","dataRowCount","totalRowCount","isRowLoaded","loadMoreRows","onRowsRendered","useInfiniteLoader","List","EventGridRow","style","gap","Spinner","startIdx","rowEvents","emptySlots","innerStyle","EventsWidget","queryParams","isFetching","EventsPage","setSelection","RAW_TAGS_BY_CATEGORIES","CATEGORY_ORDER_V2","CATEGORIES_V2","rawTags","toUICategories","items","toUITags","CategoriesWidgetV2","selectedCategorySlug","setSelectedCategorySlug","selectedTagSlug","setSelectedTagSlug","categoryLabel","tagLabel","uiCategories","activeCat","DEFAULT_FILTER_STATE","countActiveFilters","state","EventsFilterV2UI","isOpen","onClose","onChange","draft","setDraft","handleOpenChange","open","handleReset","handleApply","updateDraft","val","activeCount","platformOptions","timeRemainingOptions","volumeOptions","liquidityOptions","StyledModal","ModalContent","ModalHeader","ModalBody","FilterSection","FilterChipGroup","v","ModalFooter","RefreshIcon","children","selected","allowDeselect","opt","isActive","SORT_PRESETS","SORT_LABEL_KEYS","SORT_ORDER","EventsToolbarV2UI","sortPreset","onSortChange","sortAsc","onSortAscChange","onFilterPress","filterCount","setIsOpen","dropdownRef","onClickOutside","onEscape","ActiveIcon","SORT_ICONS","Icon","StyledBadge","FilterIcon","CalendarIcon","ChartLineIcon","DropletIcon","TimerIcon","useEventsV2","baseParams","fetchNextPage","item","refetchAll","MAX_DISPLAYED_OUTCOMES","C_PRIMARY","C_SECONDARY","C_RED","TEAM_PALETTE","hashString","hash","getOutcomeColors","labels","l","label0","label1","idx0","idx1","getYesAsk","yes","price","no","yesPrice","formatCountdown","isoDate","diff","d","h","parts","injectedCSS","EventItemV2UI","href","LinkComponent","onHover","expandedSlug","setExpandedSlug","singleMarket","moreCount","expandedMarket","isExpanded","handleCardClick","handleHeaderClick","handleShowMore","CardHeader","SingleMarketView","ExpandedMarketView","MarketListView","onClick","countdown","Linkable","EventIndicators","getEventBadges","badges","isCrypto","isLive","remaining","fiveMin","fifteenMin","cryptoColor","LiveBadge","CryptoCountdownBadge","ClosedBadge","color","onMarketClick","onShowMore","Fragment","pct","YesNoPill","SourceIcon","ElevatedButton","bgColor","textColor","shadowColor","el","OutcomeButtons","dynamicColors","labelFormat","c0","c1","yesLabel","noLabel","onCollapse","PolymarketIcon","KalshiIcon","GLOW_INSET","END_ROW_HEIGHT","EventsV2UI","getEventHref","listRef","showEndOfList","handleScrollToTop","EventV2GridRow","onScrollToTop","EndOfListRow","EventsWidgetV2","EventsPageV2","setTagSlugSelection","filterState","setFilterState","isFilterOpen","openFilter","closeFilter","useDisclosure","handleSortChange","preset","handleSortAscChange","asc","handleFilterChange","sortBy","toolbar","getMintAddress","accounts","collateralMint","outcome","accountInfo","USDC_MINT","SOLANA_TOKENS","fireCelebration","defaults","confetti","useTradeForm","_chain","initialOutcome","initialSide","userPredictCtx","authStatus","useAuth","solanaWallet","useWallets","w","ChainNamespace","isAuthenticated","userPublicKey","setOutcome","side","setSideRaw","quantity","setQuantityRaw","outcomeMint","inputMint","outputMint","quoteEnabled","pricePerShare","shares","amount","order","isQuoteLoading","quoteError","refetchOrder","usdcBalance","isBalanceLoading","refetchBalance","positions","outcomeTokenBalance","pos","yesMint","noMint","yesTokenBalance","noTokenBalance","orderBook","bestBid","bestAsk","priceImpact","estimatedCost","bidPrice","potentialPayout","potentialProfit","setSide","setQuantity","clamped","rounded","validation","errors","txHash","setTxHash","isSubmitting","setIsSubmitting","pendingTxSignature","setPendingTxSignature","orderStatusData","toast","submit","currentOrder","txBytes","signature","reset","USDC_LOGO","TradeFormUI","isValid","onOutcomeChange","onSideChange","onQuantityChange","onSubmit","submitLabel","sideLabel","outcomeLabel","submitColor","Tabs","holdingBalance","StyledNumberInput","amt","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","MarketRow","EventDetailSkeleton","marketCount","TradeFormSkeleton","useEventDetail","candlestickMarketTickers","chartRange","candlestickPeriodInterval","rangeDuration","candlestickEndTs","isEventLoading","eventError","candlestickStartTs","series","isSeriesLoading","marketsToQuery","candlestickQueries","isCandlesticksLoading","candlestickErrors","candlesticks","map","useMarketsHoldings","address","walletPortfolios","useWalletPortfoliosQuery","Chain","balanceByMint","yesShares","noShares","BreathingDot","props","cx","cy","dataLength","stroke","CHART_COLORS","formatTimestamp","timestamp","date","transformCandlesticks","marketTickers","sampleInterval","perMarketMaps","response","point","bucket","allTimestamps","ts","sortedTimestamps","lastValues","dataPoint","lastValue","EventCandlesticks","onDataChange","activeIndex","setActiveIndex","onDataChangeRef","chartData","yAxisDomain","minValue","maxValue","padding","domainMin","domainMax","getDataAtIndex","handleMouseMove","handleMouseLeave","ResponsiveContainer","LineChart","XAxis","x","y","payload","totalPoints","sampleIntervalX","isFirst","isLast","isSampled","CartesianGrid","YAxis","Tooltip","name","Line","dotProps","getLatestEventData","useMarketCandlesticks","openTime","periodInterval","endTs","startTs","CHART_COLOR","RANGE_OPTIONS","formatCompact","n","bucketMap","existing","close","volume","EventMarketCandlesticksUI","onRangeChange","dp","RangeSelector","active","useMarketOrderbook","orderbook","isOrderbookLoading","orderbookError","yesBids","yesAsks","noBids","noAsks","buildRows","levels","maxLevels","sliced","cumulative","level","applyDepth","rows","maxCum","row","formatPrice","formatQty","qty","formatTotal","total","RowItem","showType","isAsk","barColor","typeColor","SkeletonRow","widths","DEFAULT_MAX_LEVELS","EventMarketOrderbookUI","bids","asks","onPriceClick","bidRows","askRows","spread","spreadPercent","mid","formatBalance","balance","formatPnL","pnl","abs","sign","EventMarketPositionsUI","isYes","sideColor","avgCostDisplay","priceDisplay","hasPnL","pnlColor","formatAmount","ui","formatTime","month","day","hours","minutes","EventMarketTradesUI","EventMarketDetailWidget","onTradeAction","activeTab","setActiveTab","setChartRange","isPositionsLoading","walletAddress","tradesData","isTradesLoading","marketTrades","positionsWithPnL","buyTrades","avgCost","computeAvgCost","parseNullablePrice","pnlPercent","handleYesPriceClick","_price","bookSide","handleNoPriceClick","totalContracts","totalCost","DEFAULT_VISIBLE_COUNT","getMarketPrices","EventMarketsUI","renderMarketDetail","marketHoldings","showAll","setShowAll","expandedTicker","setExpandedTicker","visibleMarkets","toggleExpand","holding","hasYes","hasNo","ChevronDownIcon","CLOSED_STATUSES","year","EventTimeline","isClosed","openItem","closeItem","payoutItem","closeDescription","EventRulesUI","selectedMarketTicker","setSelectedMarketTicker","marketsWithRules","Select","keys","SelectItem","EventDetailUI","selectedMarketTickers","onMarketSelectionChange","currentData","setCurrentData","isCompact","setIsCompact","sentinelRef","sentinel","compact","rafId","bottom","shouldBeCompact","onScroll","formattedEndDate","option","SelectSection","EventDetailWidget","eventId","initialMarketTickers","initialChartRange","setSelectedMarketTickers","marketsInitializedRef","defaultMarketTickers","handleRangeChange","newRange","handleMarketSelectionChange","EventDetailPage","widgetProps","isMobile","useScreen","onOpen","tradeSelection","setTradeSelection","handleTradeAction","tradeFormKey","Drawer","DrawerContent","DrawerBody","isoToUnix","iso","ms","priceToString","STATUS_MAP","v2MarketToStandard","v2","v2EventToStandard","useTradeFormV2","pendingSignature","setPendingSignature","amountStr","usdcMint","quoteData","refetchQuote","positionsData","sum","submitDFlow","orderStatus","transaction","TradeFormV2Widget","adaptedEvent","adaptedMarket","UserActivityV2Section","onCancelOrder","marketSlugs","tabs","tab","PositionsTab","OrdersTab","TradesTab","TabSkeleton","EmptyState","PositionRow","position","pnlSign","cancelMutation","orders","openStatuses","filtered","handleCancel","orderId","OrderRow","onCancel","isCancelling","isBuy","OrderStatusBadge","TradeRow","timeStr","unixSeconds","mins","EventMarketDetailV2Widget","V2TradesTable","ChartErrorBoundary","Component","info","MAX_SELECTED","INTERVAL_OPTIONS","IntervalSwitcher","BreathingDotsLayer","dots","useCursorOverlay","wrapperRef","overlayRef","onMouseMove","wrapper","overlay","rect","xPct","onMouseLeave","CustomTooltip","labelMap","sorted","MarketSelector","selectedSlugs","colorMap","onToggle","setOpen","rootRef","handleClick","atMax","triggerContent","isDisabled","isOnlyOne","yesOutcome","LegendBar","currentValues","buildChartData","lookups","last","EventPriceChartV2","EventPriceChartV2Inner","externalLoading","allMarkets","setSelectedSlugs","selectedMarkets","hookSeries","hookLoading","dayMs","yDomain","min","max","pad","chartWrapperRef","overlayDivRef","handleWrapperMouseMove","handleWrapperMouseLeave","handleToggle","Customized","xScale","yScale","lastRow","yVal","formatCents","getMarketLabel","getPlatformLabel","formatISOTimestamp","useCountdown","targetIso","setNow","target","days","secs","formatCountdownDate","offset","tzHours","EventDetailV2UI","startCountdown","endCountdown","startDateFormatted","endDateFormatted","PlatformBadge","EventMarketsV2UI","EventRulesV2UI","noPrice","isTopMarket","onToggleExpand","volumeFormatted","selectedSlug","setSelectedSlug","showFullRules","setShowFullRules","rulesText","truncatedRules","arr","EventDetailWidgetV2","eventSlug","EventDetailPageV2","onSimilarEventClick","SimilarEventsSection","onEventClick","similarEvents","ev","SimilarEventCard","useEventDetailV2","candlestickMarketSlugs","oldClient","useOrderBook","refetchInterval","rawBids","rawAsks","midpoint","OrderBookRowItem","isBid","OrderBookUI","isEmpty","OrderBookWidget","useOpenOrders","_params","cancellingOrderId","setCancellingOrderId","cancelError","cancelOrder","_orderId","formatDate","OpenOrdersUI","StyledTable","TableHeader","TableColumn","TableBody","TableRow","TableCell","OpenOrdersWidget","useTradeHistory","pageSize","setPage","cursors","setCursors","currentCursor","hasNextPage","hasPrevPage","goToPage","nextPage","newCursors","prevPage","TradeHistoryUI","onNextPage","onPrevPage","TradeHistoryWidget","usePositions","summary","fmtCents","PnlText","isPositive","PositionsUI","onSell","PositionsWidget","MAX_HISTORY_SIZE","searchHistoriesAtom","atomWithStorage","usePredictSearchHistory","histories","setHistories","useAtom","addHistory","keyword","trimmed","clearHistories","SearchHistoryUI","onClear","TrashIcon","SearchHistoryWidget","SearchInputUI","onValueChange","StyledInput","SearchIcon","XCloseIcon","Kbd","SearchResultItemUI","firstTag","useSearchResultListScript","isFetchingNextPage","ROW_HEIGHT","SearchResultListWidget","scriptParams","ref","height","isItemLoaded","loadMoreItems","itemCount","onRowsLoaded","LoadingState","SearchResultRow","EmptyIcon","useSearchScript","onKeywordChange","text","setText","setKeyword","onKeywordChangeStable","useCallbackRef","addHistoryStable","debouncedSearch","debounce","setText_","setKeyword_","clearKeyword","SearchWidget","onSelectEvent","PREDICT_SEARCH_MODAL_ID","PredictSearchModal","AsyncModal","modalProps","PredictSearchModalContent","onOpenChange","onResult","handleSelectEvent","handleEscape","SearchEventsButton","modalParams","isDesktop","useAsyncModal","onSelectEventStable","handleOpen","result","handleClose","handleKeyDown","activeElement","isInEditableElement","PredictProvider","DEFAULT_POLLING_INTERVAL","UserPredictProvider","pollingInterval","PredictV2Provider","buildQuery","provider","qs","str","toRecord","BasePredictClient","endpoint","path","query","url","httpGet","httpPost","parseSide","raw","sort","priceStr","normalizeOrderbook","DflowPredictClient","withNestedMarkets","marketId","eventTicker","buildV2Query","PredictClientV2","httpDelete","createPredictClientV2"],"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.71\";\n}\n\nexport default \"0.1.71\";\n","import { createContext } from \"react\";\nimport type { PredictClientV2 } from \"../../client/v2\";\n\nexport interface PredictV2ContextValue {\n /** The prediction-server v2 HTTP client instance. */\n client: PredictClientV2;\n}\n\n/**\n * Context that carries the v2 prediction client (prediction-server backend).\n *\n * Intentionally separate from `PredictContext` so that the legacy DFlow client\n * and the new prediction-server client can coexist in the same application\n * during an incremental migration.\n *\n * Consumers must be wrapped in `PredictV2Provider`.\n */\nexport const PredictV2Context = createContext<PredictV2ContextValue | null>(\n null,\n);\n","import { useContext } from \"react\";\nimport { PredictV2Context } from \"../../contexts/v2\";\n\n/**\n * Returns the v2 prediction context value.\n *\n * Must be called inside a component tree wrapped by `PredictV2Provider`.\n *\n * @throws When used outside of `PredictV2Provider`.\n */\nexport function usePredictV2Context() {\n const context = useContext(PredictV2Context);\n if (!context) {\n throw new Error(\n \"usePredictV2Context must be used within a PredictV2Provider\",\n );\n }\n return context;\n}\n","import { usePredictV2Context } from \"./usePredictV2Context\";\n\n/**\n * Convenience hook that returns the `PredictClientV2` instance from context.\n *\n * Must be called inside a component tree wrapped by `PredictV2Provider`.\n */\nexport function usePredictV2Client() {\n const { client } = usePredictV2Context();\n return client;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2Event, V2ListEventsParams, V2Page } from \"../../client/v2\";\nimport type { PredictClientV2 } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\n/** Stable TanStack Query key for the v2 events list. */\nexport function eventsV2QueryKey(params?: V2ListEventsParams): unknown[] {\n return [\"predict-v2\", \"events\", params ?? {}];\n}\n\n/**\n * Fetch function that can be used outside of React (e.g. in loaders or tests).\n *\n * @param client - A `PredictClientV2` instance.\n * @param params - Optional filter / sort / pagination parameters.\n */\nexport async function fetchEventsV2(\n client: PredictClientV2,\n params?: V2ListEventsParams,\n): Promise<V2Page<V2Event>> {\n return client.listEvents(params);\n}\n\n/**\n * React Query hook for `GET /api/v1/events` via the prediction-server v2 client.\n *\n * @param params - Optional filter / sort / pagination parameters.\n * @param queryOptions - Additional TanStack Query options (e.g. `enabled`, `staleTime`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useEventsV2Query({ status: \"open\", limit: 20 });\n * ```\n */\nexport function useEventsV2Query(\n params?: V2ListEventsParams,\n queryOptions: Omit<\n UseQueryOptions<V2Page<V2Event>, Error, V2Page<V2Event>, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: eventsV2QueryKey(params),\n queryFn: () => fetchEventsV2(client, params),\n ...queryOptions,\n });\n}\n\nexport type { V2Event, V2ListEventsParams, V2Page };\n","/** Default page size for list queries */\nexport const DEFAULT_PAGE_SIZE = 48;\n\n/** Maximum number of markets to display in price history chart */\nexport const MAX_PRICE_HISTORY_MARKETS = 4;\n\n/**\n * Candlestick period intervals in minutes (granularity for API queries)\n */\nexport const CandlestickPeriod = {\n /** 1 minute */\n ONE_MINUTE: 1,\n /** 1 hour (60 minutes) */\n ONE_HOUR: 60,\n /** 1 day (1440 minutes) */\n ONE_DAY: 1440,\n} as const;\n\nexport type CandlestickPeriodType =\n (typeof CandlestickPeriod)[keyof typeof CandlestickPeriod];\n\n/**\n * Chart range options (the user-facing time range selector)\n */\nexport const ChartRange = {\n /** 1 day */\n ONE_DAY: \"1d\",\n /** 1 week */\n ONE_WEEK: \"1w\",\n /** 1 month */\n ONE_MONTH: \"1m\",\n /** All time */\n ALL: \"all\",\n} as const;\n\nexport type ChartRangeType = (typeof ChartRange)[keyof typeof ChartRange];\n\n/** Default chart range */\nexport const DEFAULT_CHART_RANGE = ChartRange.ALL;\n\n/** Candlestick granularity derived from chart range (1D → minute, 1W/1M → hourly, ALL → daily) */\nexport const CHART_RANGE_PERIOD: Record<ChartRangeType, CandlestickPeriodType> =\n {\n [ChartRange.ONE_DAY]: CandlestickPeriod.ONE_MINUTE,\n [ChartRange.ONE_WEEK]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ONE_MONTH]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ALL]: CandlestickPeriod.ONE_DAY,\n };\n\n/** Chart sampling interval in seconds (used to downsample candlestick data for display) */\nexport const CHART_RANGE_SAMPLE_INTERVAL: Record<ChartRangeType, number> = {\n [ChartRange.ONE_DAY]: 5 * 60, // 5 minutes\n [ChartRange.ONE_WEEK]: 60 * 60, // 1 hour\n [ChartRange.ONE_MONTH]: 3 * 60 * 60, // 3 hours\n [ChartRange.ALL]: 24 * 60 * 60, // 1 day\n};\n\n/** Duration in seconds for each chart range (null = all time) */\nexport const CHART_RANGE_DURATION: Record<ChartRangeType, number | null> = {\n [ChartRange.ONE_DAY]: 24 * 60 * 60,\n [ChartRange.ONE_WEEK]: 7 * 24 * 60 * 60,\n [ChartRange.ONE_MONTH]: 30 * 24 * 60 * 60,\n [ChartRange.ALL]: null,\n};\n\n// -- Order-related constants -------------------------------------------------\n\n/** Minimum order quantity (contracts) */\nexport const ORDER_MIN_QUANTITY = 1;\n\n/** Price step size in cents */\nexport const ORDER_PRICE_STEP = 1;\n\n/** Minimum price in cents */\nexport const ORDER_MIN_PRICE = 1;\n\n/** Maximum price in cents */\nexport const ORDER_MAX_PRICE = 99;\n\n// -- Legacy aliases for backward compatibility -------------------------------\n\n/** @deprecated Use ChartRange instead */\nexport const PriceHistoryInterval = {\n ONE_HOUR: \"1h\",\n SIX_HOURS: \"6h\",\n ONE_DAY: \"1d\",\n ONE_WEEK: \"1w\",\n MAX: \"max\",\n} as const;\n\n/** @deprecated Use ChartRangeType instead */\nexport type PriceHistoryIntervalType =\n (typeof PriceHistoryInterval)[keyof typeof PriceHistoryInterval];\n\n/** @deprecated Use DEFAULT_CHART_RANGE instead */\nexport const DEFAULT_PRICE_HISTORY_INTERVAL = PriceHistoryInterval.ONE_WEEK;\n\n/** @deprecated */\nexport const PRICE_HISTORY_SAMPLE_INTERVAL: Record<\n PriceHistoryIntervalType,\n number\n> = {\n [PriceHistoryInterval.ONE_HOUR]: 60,\n [PriceHistoryInterval.SIX_HOURS]: 60,\n [PriceHistoryInterval.ONE_DAY]: 300,\n [PriceHistoryInterval.ONE_WEEK]: 1800,\n [PriceHistoryInterval.MAX]: 1800,\n};\n","/**\n * Server-safe pure functions for v2 events query parameters.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n V2Event,\n V2EventSortField,\n V2EventStatus,\n V2ListEventsParams,\n V2Page,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport type { PredictClientV2 } from \"../../client/v2\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\n\nexport type { V2ProviderSource };\n\n/**\n * Selection emitted by CategoriesWidgetV2.\n *\n * Duplicated from categories.v2.script to avoid pulling in the component\n * barrel (which has React dependencies) into server-only bundles.\n */\nexport interface TagSlugSelection {\n categorySlug: string | null;\n tagSlug: string | null;\n}\n\n/**\n * Resolve a `TagSlugSelection` to a single `tag_slug` string for the v2 API.\n */\nexport function resolveTagSlug(\n selection: TagSlugSelection | null | undefined,\n): string | undefined {\n if (!selection) return undefined;\n return selection.tagSlug ?? selection.categorySlug ?? undefined;\n}\n\n/**\n * Input accepted by {@link resolveEventsV2Params}. All fields optional;\n * defaults match the client-side `useEventsV2` hook's initial state.\n */\nexport interface ResolveEventsV2ParamsInput {\n tagSlugSelection?: TagSlugSelection | null;\n limit?: number;\n status?: V2EventStatus;\n sort_by?: V2EventSortField;\n sort_asc?: boolean;\n source?: V2ProviderSource;\n with_markets?: boolean;\n}\n\n/**\n * Build a clean `V2ListEventsParams` from loose user inputs.\n *\n * Server-side `prefetchInfiniteQuery` and client-side `useEventsV2` must both\n * use this function to guarantee identical query keys.\n */\nexport function resolveEventsV2Params(\n input: ResolveEventsV2ParamsInput = {},\n): V2ListEventsParams {\n const {\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status = \"open\",\n with_markets = true,\n source,\n sort_by,\n sort_asc,\n } = input;\n const tag_slug = resolveTagSlug(tagSlugSelection);\n return {\n limit,\n status,\n with_markets,\n ...(source ? { source } : {}),\n ...(tag_slug ? { tag_slug } : {}),\n ...(sort_by ? { sort_by } : {}),\n ...(sort_asc !== undefined ? { sort_asc } : {}),\n };\n}\n\n/** Stable TanStack Query key for the v2 events infinite query. */\nexport function eventsV2InfiniteQueryKey(\n params: V2ListEventsParams,\n): unknown[] {\n return [\"predict-v2\", \"events-infinite\", params];\n}\n\n/**\n * Fetch a single page of v2 events. Can be used outside of React\n * (e.g. in Server Components, loaders, or tests).\n */\nexport async function fetchEventsV2Page(\n client: PredictClientV2,\n params: V2ListEventsParams,\n): Promise<V2Page<V2Event>> {\n return client.listEvents(params);\n}\n\n// ---------------------------------------------------------------------------\n// Single-event helpers (also server-safe)\n// ---------------------------------------------------------------------------\n\n/** Stable TanStack Query key for a single v2 event. */\nexport function eventV2QueryKey(\n slug: string,\n source?: V2ProviderSource,\n): unknown[] {\n return [\"predict-v2\", \"event\", slug, source];\n}\n\n/**\n * Fetch a single v2 event. Can be used outside of React\n * (e.g. in Server Components, loaders, or tests).\n */\nexport async function fetchEventV2(\n client: PredictClientV2,\n slug: string,\n source?: V2ProviderSource,\n): Promise<V2Event> {\n return client.getEvent(slug, source);\n}\n\nexport type { V2Event, V2ListEventsParams, V2Page };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2Event, V2ProviderSource } from \"../../client/v2\";\nimport { eventV2QueryKey, fetchEventV2 } from \"./eventsV2.params\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport { eventV2QueryKey, fetchEventV2 } from \"./eventsV2.params\";\n\nexport interface UseEventV2QueryParams {\n /** Canonical event slug (e.g. \"will-trump-win-2024\" or \"KXBTCD-25FEB-T68000\"). */\n slug: string;\n /** Upstream provider. Required by prediction-server for single-event fetch. */\n source?: V2ProviderSource;\n}\n\n/**\n * React Query hook for `GET /api/v1/events/:slug` via the prediction-server v2 client.\n *\n * @param params - Object containing the event `slug` and optional `source`.\n * @param queryOptions - Additional TanStack Query options (e.g. `enabled`, `staleTime`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useEventV2Query({ slug: \"CONTROLH-2026\", source: \"dflow\" });\n * ```\n */\nexport function useEventV2Query(\n params: UseEventV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Event, Error, V2Event, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: eventV2QueryKey(params.slug, params.source),\n queryFn: () => fetchEventV2(client, params.slug, params.source),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n\nexport type { V2Event };\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { V2Event, V2ListEventsParams, V2Page } from \"../../client/v2\";\nimport { eventsV2InfiniteQueryKey, fetchEventsV2Page } from \"./eventsV2.params\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport {\n resolveTagSlug,\n resolveEventsV2Params,\n eventsV2InfiniteQueryKey,\n fetchEventsV2Page,\n} from \"./eventsV2.params\";\nexport type { ResolveEventsV2ParamsInput } from \"./eventsV2.params\";\n\n// ---------------------------------------------------------------------------\n// React hook\n// ---------------------------------------------------------------------------\n\ntype InfiniteQueryOptions = Omit<\n UseInfiniteQueryOptions<\n V2Page<V2Event>,\n Error,\n InfiniteData<V2Page<V2Event>>,\n unknown[],\n string | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n>;\n\n/**\n * TanStack Query infinite-query hook for `GET /api/v1/events` with cursor-based\n * pagination via the prediction-server v2 client.\n *\n * @param params - Resolved query parameters (use {@link resolveEventsV2Params}\n * to build from user inputs). Do NOT include `cursor` — it is\n * managed automatically by TanStack Query's `pageParam`.\n * @param queryOptions - Additional TanStack Query options.\n *\n * @example\n * ```tsx\n * const params = resolveEventsV2Params({ status: \"open\", limit: 20 });\n * const { data, hasNextPage, fetchNextPage } = useEventsV2InfiniteQuery(params);\n * ```\n */\nexport function useEventsV2InfiniteQuery(\n params: V2ListEventsParams,\n queryOptions: InfiniteQueryOptions = {},\n) {\n const client = usePredictV2Client();\n return useInfiniteQuery({\n queryKey: eventsV2InfiniteQueryKey(params),\n queryFn: ({ pageParam }) =>\n fetchEventsV2Page(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: V2Page<V2Event>) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n ...queryOptions,\n });\n}\n\nexport type { V2Event, V2ListEventsParams, V2Page };\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type {\n V2Event,\n V2EventStatus,\n V2ListEventsParams,\n V2Page,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseSearchEventsInfiniteQueryParams {\n /** Search keyword */\n keyword: string;\n /** Page size (default: 20) */\n limit?: number;\n /** Event status filter (default: \"open\") */\n status?: V2EventStatus;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: V2ProviderSource;\n /** Include nested markets (default: false for lighter search payloads) */\n with_markets?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Query key factory\n// ---------------------------------------------------------------------------\n\nfunction searchEventsInfiniteQueryKey(params: V2ListEventsParams): unknown[] {\n return [\"predict-v2\", \"search\", params];\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Infinite query hook for searching prediction events via the V2 `listEvents`\n * endpoint with a `search` parameter.\n *\n * Designed to be consumed by component-level scripts that flatten the paginated\n * data for rendering.\n *\n * @example\n * ```tsx\n * const { data, isLoading, hasNextPage, fetchNextPage } =\n * useSearchEventsInfiniteQuery({ keyword: \"trump\" });\n * ```\n */\nexport function useSearchEventsInfiniteQuery(\n params: UseSearchEventsInfiniteQueryParams,\n queryOptions?: { enabled?: boolean },\n) {\n const client = usePredictV2Client();\n\n const apiParams = useMemo<V2ListEventsParams>(\n () => ({\n search: params.keyword,\n limit: params.limit ?? 20,\n status: params.status ?? \"open\",\n source: params.source,\n with_markets: params.with_markets ?? false,\n }),\n [\n params.keyword,\n params.limit,\n params.status,\n params.source,\n params.with_markets,\n ],\n );\n\n return useInfiniteQuery({\n queryKey: searchEventsInfiniteQueryKey(apiParams),\n queryFn: ({ pageParam }) =>\n client.listEvents({\n ...apiParams,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: V2Page<V2Event>) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n enabled: queryOptions?.enabled ?? !!params.keyword,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2Event,\n V2ProviderSource,\n V2SimilarEventsParams,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function similarEventsV2QueryKey(\n slug: string,\n source: V2ProviderSource,\n params?: V2SimilarEventsParams,\n): unknown[] {\n return [\"predict-v2\", \"similar-events\", slug, source, params];\n}\n\nexport interface UseSimilarEventsV2QueryParams {\n slug: string;\n source: V2ProviderSource;\n limit?: number;\n same_source?: boolean;\n}\n\nexport function useSimilarEventsV2Query(\n params: UseSimilarEventsV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Event[], Error, V2Event[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const apiParams: V2SimilarEventsParams = {\n limit: params.limit,\n same_source: params.same_source,\n };\n return useQuery({\n queryKey: similarEventsV2QueryKey(params.slug, params.source, apiParams),\n queryFn: () =>\n client.getSimilarEvents(params.slug, params.source, apiParams),\n enabled: Boolean(params.slug),\n staleTime: 5 * 60_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2Market,\n V2ProviderSource,\n PredictClientV2,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\n/** Stable TanStack Query key for a single v2 market. */\nexport function marketV2QueryKey(\n slug: string,\n source?: V2ProviderSource,\n): unknown[] {\n return [\"predict-v2\", \"market\", slug, source];\n}\n\n/**\n * Fetch function that can be used outside of React (e.g. in loaders or tests).\n *\n * @param client - A `PredictClientV2` instance.\n * @param slug - Canonical market slug.\n * @param source - Upstream provider (`\"dflow\"` or `\"polymarket\"`).\n */\nexport async function fetchMarketV2(\n client: PredictClientV2,\n slug: string,\n source?: V2ProviderSource,\n): Promise<V2Market> {\n return client.getMarket(slug, source);\n}\n\nexport interface UseMarketV2QueryParams {\n /** Canonical market slug. */\n slug: string;\n /** Upstream provider. Required by prediction-server for single-market fetch. */\n source?: V2ProviderSource;\n}\n\n/**\n * React Query hook for `GET /api/v1/markets/:slug` via the prediction-server v2 client.\n *\n * @param params - Object containing the market `slug` and optional `source`.\n * @param queryOptions - Additional TanStack Query options (e.g. `enabled`, `staleTime`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useMarketV2Query({ slug: \"KXBTCD-25FEB-T68000-yes\", source: \"dflow\" });\n * ```\n */\nexport function useMarketV2Query(\n params: UseMarketV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Market, Error, V2Market, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: marketV2QueryKey(params.slug, params.source),\n queryFn: () => fetchMarketV2(client, params.slug, params.source),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n\nexport type { V2Market };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2PriceHistoryRange,\n V2PriceHistoryResponse,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function priceHistoryV2QueryKey(\n slug: string,\n source: V2ProviderSource,\n range?: V2PriceHistoryRange,\n): unknown[] {\n return [\"predict-v2\", \"price-history\", slug, source, range];\n}\n\nexport interface UsePriceHistoryV2QueryParams {\n slug: string;\n source: V2ProviderSource;\n range?: V2PriceHistoryRange;\n}\n\nexport function usePriceHistoryV2Query(\n params: UsePriceHistoryV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n V2PriceHistoryResponse,\n Error,\n V2PriceHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: priceHistoryV2QueryKey(params.slug, params.source, params.range),\n queryFn: () =>\n client.getPriceHistory(params.slug, params.source, params.range),\n enabled: Boolean(params.slug),\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { V2Market, V2PriceHistoryRange } from \"../../client/v2\";\nimport { ChartRange, type ChartRangeType } from \"../../consts\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\nimport { priceHistoryV2QueryKey } from \"./usePriceHistoryV2Query\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MarketHistoryPoint {\n /** Unix timestamp in milliseconds. */\n timestamp: number;\n /** Implied probability [0, 1]. */\n price: number;\n}\n\nexport interface MarketHistorySeries {\n marketSlug: string;\n label: string;\n /** Chronologically ordered price history. */\n data: MarketHistoryPoint[];\n}\n\nexport interface UseMarketHistoryV2Result {\n series: MarketHistorySeries[];\n isLoading: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Range mapping\n// ---------------------------------------------------------------------------\n\nconst RANGE_MAP: Record<ChartRangeType, V2PriceHistoryRange> = {\n [ChartRange.ONE_DAY]: \"1d\",\n [ChartRange.ONE_WEEK]: \"1w\",\n [ChartRange.ONE_MONTH]: \"1m\",\n [ChartRange.ALL]: \"all\",\n};\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Returns price history series for the provided V2Markets using the\n * prediction-server `GET /api/v1/markets/{slug}/price-history` endpoint.\n */\nexport function useMarketHistoryV2(\n markets: V2Market[],\n range: ChartRangeType = ChartRange.ALL,\n): UseMarketHistoryV2Result {\n const client = usePredictV2Client();\n const apiRange = RANGE_MAP[range];\n\n const queries = useQueries({\n queries: markets.map((market) => ({\n queryKey: priceHistoryV2QueryKey(market.slug, market.source, apiRange),\n queryFn: () =>\n client.getPriceHistory(market.slug, market.source, apiRange),\n staleTime: 60_000,\n enabled: Boolean(market.slug),\n })),\n });\n\n const isLoading = queries.some((q) => q.isLoading);\n\n const series = useMemo<MarketHistorySeries[]>(() => {\n return markets.map((market, idx) => {\n const result = queries[idx];\n const points = result?.data?.points ?? [];\n\n if (points.length > 0) {\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: points.map((pt) => ({\n timestamp: pt.t * 1000,\n price: pt.p,\n })),\n };\n }\n\n // Fallback: generate a flat line from current outcome price when API\n // returns no data (not yet indexed, upstream error, mock slugs, etc.)\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const currentPrice = yesOutcome?.price ?? 0.5;\n const now = Date.now();\n const dayMs = 86_400_000;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price: currentPrice },\n { timestamp: now, price: currentPrice },\n ],\n };\n });\n }, [markets, queries]);\n\n return { series, isLoading };\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2Orderbook, V2ProviderSource } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function orderbookV2QueryKey(\n slug: string,\n source: V2ProviderSource,\n): unknown[] {\n return [\"predict-v2\", \"orderbook\", slug, source];\n}\n\nexport interface UseOrderbookV2QueryParams {\n slug: string;\n source: V2ProviderSource;\n}\n\nexport function useOrderbookV2Query(\n params: UseOrderbookV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Orderbook, Error, V2Orderbook, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: orderbookV2QueryKey(params.slug, params.source),\n queryFn: () => client.getOrderbook(params.slug, params.source),\n enabled: Boolean(params.slug),\n refetchInterval: 5000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2ListMarketTradesParams,\n V2Page,\n V2ProviderSource,\n V2Trade,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function marketTradesV2QueryKey(\n slug: string,\n params: V2ListMarketTradesParams,\n): unknown[] {\n return [\"predict-v2\", \"market-trades\", slug, params];\n}\n\nexport interface UseMarketTradesV2QueryParams {\n slug: string;\n source: V2ProviderSource;\n limit?: number;\n cursor?: string;\n side?: string;\n}\n\nexport function useMarketTradesV2Query(\n params: UseMarketTradesV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Page<V2Trade>, Error, V2Page<V2Trade>, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const apiParams: V2ListMarketTradesParams = {\n source: params.source,\n limit: params.limit,\n cursor: params.cursor,\n side: params.side,\n };\n return useQuery({\n queryKey: marketTradesV2QueryKey(params.slug, apiParams),\n queryFn: () => client.listMarketTrades(params.slug, apiParams),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2Candlestick, V2ListCandlesticksParams } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function candlesticksV2QueryKey(\n slug: string,\n params?: V2ListCandlesticksParams,\n): unknown[] {\n return [\"predict-v2\", \"candlesticks\", slug, params];\n}\n\nexport interface UseCandlesticksV2QueryParams {\n slug: string;\n interval?: string;\n limit?: number;\n}\n\nexport function useCandlesticksV2Query(\n params: UseCandlesticksV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Candlestick[], Error, V2Candlestick[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const apiParams: V2ListCandlesticksParams = {\n interval: params.interval,\n limit: params.limit,\n };\n return useQuery({\n queryKey: candlesticksV2QueryKey(params.slug, apiParams),\n queryFn: () => client.listCandlesticks(params.slug, apiParams),\n enabled: Boolean(params.slug),\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2PositionsResponse, V2ProviderSource } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function positionsV2QueryKey(\n source: V2ProviderSource,\n user: string,\n): unknown[] {\n return [\"predict-v2\", \"positions\", source, user];\n}\n\nexport interface UsePositionsV2QueryParams {\n source: V2ProviderSource;\n user: string;\n}\n\nexport function usePositionsV2Query(\n params: UsePositionsV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2PositionsResponse, Error, V2PositionsResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: positionsV2QueryKey(params.source, params.user),\n queryFn: () => client.getPositions(params.source, params.user),\n enabled: Boolean(params.user),\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2ListOrdersParams, V2Page, V2UserOrder } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function ordersV2QueryKey(params: V2ListOrdersParams): unknown[] {\n return [\"predict-v2\", \"orders\", params];\n}\n\nexport function useOrdersV2Query(\n params: V2ListOrdersParams,\n queryOptions: Omit<\n UseQueryOptions<V2Page<V2UserOrder>, Error, V2Page<V2UserOrder>, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: ordersV2QueryKey(params),\n queryFn: () => client.listOrders(params),\n enabled: Boolean(params.wallet_address),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2ProviderSource, V2UserOrder } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function orderV2QueryKey(\n id: string,\n source: V2ProviderSource,\n): unknown[] {\n return [\"predict-v2\", \"order\", id, source];\n}\n\nexport interface UseOrderV2QueryParams {\n id: string;\n source: V2ProviderSource;\n}\n\n/**\n * Query a single order by ID with optional polling.\n * Automatically polls every 1 s while enabled.\n */\nexport function useOrderV2Query(\n params: UseOrderV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2UserOrder, Error, V2UserOrder, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: orderV2QueryKey(params.id, params.source),\n queryFn: () => client.getOrder(params.id, params.source),\n enabled: Boolean(params.id),\n refetchInterval: 1000,\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type { V2CancelOrderResult, V2ProviderSource } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport interface CancelOrderV2Variables {\n id: string;\n source: V2ProviderSource;\n}\n\nexport function useCancelOrderV2Mutation(\n mutationOptions: Omit<\n UseMutationOptions<V2CancelOrderResult, Error, CancelOrderV2Variables>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (vars: CancelOrderV2Variables) =>\n client.cancelOrder(vars.id, vars.source),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict-v2\", \"orders\"] });\n },\n ...mutationOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2DFlowQuoteRequest,\n V2DFlowQuoteResponse,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function dflowQuoteV2QueryKey(params: V2DFlowQuoteRequest): unknown[] {\n return [\"predict-v2\", \"dflow-quote\", params];\n}\n\n/**\n * Fetch a DFlow quote. The query is only enabled when all required\n * fields are present and amount > 0.\n */\nexport function useDFlowQuoteV2(\n params: V2DFlowQuoteRequest,\n queryOptions: Omit<\n UseQueryOptions<\n V2DFlowQuoteResponse,\n Error,\n V2DFlowQuoteResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const enabled =\n Boolean(params.inputMint) &&\n Boolean(params.outputMint) &&\n Boolean(params.userPublicKey) &&\n params.amount !== \"0\" &&\n params.amount !== \"\";\n\n return useQuery({\n queryKey: dflowQuoteV2QueryKey(params),\n queryFn: () => client.createDFlowQuote(params),\n enabled,\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n V2DFlowSubmitRequest,\n V2DFlowSubmitResponse,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function useDFlowSubmitV2(\n mutationOptions: Omit<\n UseMutationOptions<V2DFlowSubmitResponse, Error, V2DFlowSubmitRequest>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: V2DFlowSubmitRequest) =>\n client.submitDFlowTransaction(body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict-v2\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict-v2\", \"positions\"] });\n },\n ...mutationOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2ListTradesByWalletParams,\n V2Page,\n V2Trade,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function tradesByWalletV2QueryKey(\n params: V2ListTradesByWalletParams,\n): unknown[] {\n return [\"predict-v2\", \"trades-by-wallet\", params];\n}\n\nexport function useTradesByWalletV2Query(\n params: V2ListTradesByWalletParams,\n queryOptions: Omit<\n UseQueryOptions<V2Page<V2Trade>, Error, V2Page<V2Trade>, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: tradesByWalletV2QueryKey(params),\n queryFn: () => client.listTradesByWallet(params),\n enabled: Boolean(params.wallet),\n ...queryOptions,\n });\n}\n","import { createContext } from \"react\";\nimport type { IPredictClient, IPredictWsClient } from \"../types\";\n\nexport interface PredictContextValue {\n /** The predict API client instance */\n client: IPredictClient;\n\n /** The WebSocket client instance for real-time data */\n wsClient: IPredictWsClient | null;\n}\n\nexport const PredictContext = createContext<PredictContextValue>(\n {} as PredictContextValue,\n);\n","import { createContext } from \"react\";\nimport type { WalletPositionItem } from \"../types\";\n\nexport interface UserPredictContextValue {\n /** User's wallet positions */\n positions: WalletPositionItem[];\n /** USDC balance (UI amount) */\n usdcBalance: number;\n /** Whether positions are currently loading for the first time */\n isLoading: boolean;\n /** Error from the latest fetch, null if none */\n error: Error | null;\n /** Manually trigger a refetch */\n refetch: () => void;\n}\n\nexport const UserPredictContext = createContext<UserPredictContextValue | null>(\n null,\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, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n StandardEvent,\n EventQueryParams,\n IPredictClient,\n StandardEventsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventsQueryKey(params?: EventQueryParams): unknown[] {\n return [\"predict\", \"events\", params ?? {}];\n}\n\nexport async function fetchEvents(\n client: IPredictClient,\n params?: EventQueryParams,\n): Promise<StandardEventsResponse> {\n return await client.getEvents(params);\n}\n\nexport function useEventsQuery(\n params?: EventQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n StandardEventsResponse,\n Error,\n StandardEventsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventsQueryKey(params),\n queryFn: async () => fetchEvents(client, params),\n ...queryOptions,\n });\n}\n\n// Re-export types for convenience\nexport type { StandardEvent, EventQueryParams, StandardEventsResponse };\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { EventQueryParams, StandardEventsResponse } from \"../types\";\nimport { fetchEvents } from \"./useEventsQuery\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventsInfiniteQueryKey(\n params?: Omit<EventQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"events\", \"infinite\", params ?? {}];\n}\n\nexport function useEventsInfiniteQuery(\n params: Omit<EventQueryParams, \"cursor\"> = {},\n options: Omit<\n UseInfiniteQueryOptions<\n StandardEventsResponse,\n Error,\n InfiniteData<StandardEventsResponse>,\n unknown[],\n number | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"getNextPageParam\" | \"initialPageParam\"\n > = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: eventsInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchEvents(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as number | undefined,\n getNextPageParam: (lastPage) => {\n // If API returns a non-null cursor, use it as the next page param\n return lastPage.cursor ?? undefined;\n },\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { StandardEvent, IPredictClient } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseEventByIdQueryParams {\n /** Event ticker ID */\n id: string;\n /** Include nested markets in response */\n withNestedMarkets?: boolean;\n}\n\nexport function eventByIdQueryKey(params: UseEventByIdQueryParams): unknown[] {\n return [\"predict\", \"event\", \"byId\", params.id, params.withNestedMarkets];\n}\n\nexport async function fetchEventById(\n client: IPredictClient,\n params: UseEventByIdQueryParams,\n): Promise<StandardEvent> {\n return await client.getEventById(params.id, params.withNestedMarkets);\n}\n\nexport function useEventByIdQuery(\n params: UseEventByIdQueryParams,\n options: Omit<\n UseQueryOptions<StandardEvent, Error, StandardEvent, 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, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n StandardMarket,\n MarketQueryParams,\n StandardMarketsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function marketsQueryKey(params?: MarketQueryParams): unknown[] {\n return [\"predict\", \"markets\", params ?? {}];\n}\n\nexport async function fetchMarkets(\n client: IPredictClient,\n params?: MarketQueryParams,\n): Promise<StandardMarketsResponse> {\n return await client.getMarkets(params);\n}\n\nexport function useMarketsQuery(\n params?: MarketQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n StandardMarketsResponse,\n Error,\n StandardMarketsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketsQueryKey(params),\n queryFn: async () => fetchMarkets(client, params),\n ...queryOptions,\n });\n}\n\n// Re-export types for convenience\nexport type { StandardMarket, MarketQueryParams, StandardMarketsResponse };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, StandardMarket } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseMarketByIdQueryParams {\n /** Market ticker ID */\n id: string;\n}\n\nexport function marketByIdQueryKey(\n params: UseMarketByIdQueryParams,\n): unknown[] {\n return [\"predict\", \"market\", \"byId\", params.id];\n}\n\nexport async function fetchMarketById(\n client: IPredictClient,\n params: UseMarketByIdQueryParams,\n): Promise<StandardMarket> {\n return await client.getMarketById(params.id);\n}\n\nexport function useMarketByIdQuery(\n params: UseMarketByIdQueryParams,\n options: Omit<\n UseQueryOptions<StandardMarket, Error, StandardMarket, 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, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, StandardMarket } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Market by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function marketByMintQueryKey(mintAddress: string): unknown[] {\n return [\"predict\", \"market\", \"byMint\", mintAddress];\n}\n\nexport async function fetchMarketByMint(\n client: IPredictClient,\n mintAddress: string,\n): Promise<StandardMarket> {\n return await client.getMarketByMint(mintAddress);\n}\n\nexport function useMarketByMintQuery(\n mintAddress: string,\n options: Omit<\n UseQueryOptions<StandardMarket, Error, StandardMarket, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketByMintQueryKey(mintAddress),\n queryFn: async () => fetchMarketByMint(client, mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MarketsBatchRequest,\n StandardMarketsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Markets Batch Query\n// -----------------------------------------------------------------------------\n\nexport function marketsBatchQueryKey(request: MarketsBatchRequest): unknown[] {\n return [\"predict\", \"markets\", \"batch\", request];\n}\n\nexport async function fetchMarketsBatch(\n client: IPredictClient,\n request: MarketsBatchRequest,\n): Promise<StandardMarketsResponse> {\n return await client.getMarketsBatch(request);\n}\n\nexport function useMarketsBatchQuery(\n request: MarketsBatchRequest,\n options: Omit<\n UseQueryOptions<\n StandardMarketsResponse,\n Error,\n StandardMarketsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketsBatchQueryKey(request),\n queryFn: async () => fetchMarketsBatch(client, request),\n enabled: Boolean(request.tickers?.length || request.mints?.length),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, OrderbookResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function orderBookQueryKey(marketTicker: string): unknown[] {\n return [\"predict\", \"orderBook\", marketTicker];\n}\n\nexport async function fetchOrderBook(\n client: IPredictClient,\n marketTicker: string,\n): Promise<OrderbookResponse> {\n return await client.getOrderbook(marketTicker);\n}\n\nexport function useOrderBookQuery(\n marketTicker: string,\n options: Omit<\n UseQueryOptions<OrderbookResponse, Error, OrderbookResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderBookQueryKey(marketTicker),\n queryFn: async () => fetchOrderBook(client, marketTicker),\n ...options,\n });\n}\n\n// Also export a hook for getting orderbook by mint address\nexport function orderBookByMintQueryKey(mintAddress: string): unknown[] {\n return [\"predict\", \"orderBook\", \"byMint\", mintAddress];\n}\n\nexport async function fetchOrderBookByMint(\n client: IPredictClient,\n mintAddress: string,\n): Promise<OrderbookResponse> {\n return await client.getOrderbookByMint(mintAddress);\n}\n\nexport function useOrderBookByMintQuery(\n mintAddress: string,\n options: Omit<\n UseQueryOptions<OrderbookResponse, Error, OrderbookResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderBookByMintQueryKey(mintAddress),\n queryFn: async () => fetchOrderBookByMint(client, mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MultiTradeResponse,\n TradesQueryParams,\n TradesByMintQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function tradesQueryKey(params?: TradesQueryParams): unknown[] {\n return [\"predict\", \"trades\", params ?? {}];\n}\n\nexport async function fetchTrades(\n client: IPredictClient,\n params?: TradesQueryParams,\n): Promise<MultiTradeResponse> {\n return await client.getTrades(params);\n}\n\nexport function useTradesQuery(\n params?: TradesQueryParams,\n queryOptions: Omit<\n UseQueryOptions<MultiTradeResponse, Error, MultiTradeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesQueryKey(params),\n queryFn: async () => fetchTrades(client, params),\n ...queryOptions,\n });\n}\n\n// Also export a hook for getting trades by mint address\nexport function tradesByMintQueryKey(\n params: TradesByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"trades\", \"byMint\", params];\n}\n\nexport async function fetchTradesByMint(\n client: IPredictClient,\n params: TradesByMintQueryParams,\n): Promise<MultiTradeResponse> {\n return await client.getTradesByMint(params);\n}\n\nexport function useTradesByMintQuery(\n params: TradesByMintQueryParams,\n queryOptions: Omit<\n UseQueryOptions<MultiTradeResponse, Error, MultiTradeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesByMintQueryKey(params),\n queryFn: async () => fetchTradesByMint(client, params),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MultiOnchainTradeResponse,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -- By Wallet ---------------------------------------------------------------\n\nexport function onchainTradesByWalletQueryKey(\n params: OnchainTradesByWalletQueryParams,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byWallet\", params];\n}\n\nexport async function fetchOnchainTradesByWallet(\n client: IPredictClient,\n params: OnchainTradesByWalletQueryParams,\n): Promise<MultiOnchainTradeResponse> {\n return await client.getOnchainTradesByWallet(params);\n}\n\nexport function useOnchainTradesByWalletQuery(\n params: OnchainTradesByWalletQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n MultiOnchainTradeResponse,\n Error,\n MultiOnchainTradeResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: onchainTradesByWalletQueryKey(params),\n queryFn: async () => fetchOnchainTradesByWallet(client, params),\n ...queryOptions,\n });\n}\n\n// -- By Event ----------------------------------------------------------------\n\nexport function onchainTradesByEventQueryKey(\n params: OnchainTradesByEventQueryParams,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byEvent\", params];\n}\n\nexport async function fetchOnchainTradesByEvent(\n client: IPredictClient,\n params: OnchainTradesByEventQueryParams,\n): Promise<MultiOnchainTradeResponse> {\n return await client.getOnchainTradesByEvent(params);\n}\n\nexport function useOnchainTradesByEventQuery(\n params: OnchainTradesByEventQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n MultiOnchainTradeResponse,\n Error,\n MultiOnchainTradeResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: onchainTradesByEventQueryKey(params),\n queryFn: async () => fetchOnchainTradesByEvent(client, params),\n ...queryOptions,\n });\n}\n\n// -- By Market ---------------------------------------------------------------\n\nexport function onchainTradesByMarketQueryKey(\n params: OnchainTradesByMarketQueryParams,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byMarket\", params];\n}\n\nexport async function fetchOnchainTradesByMarket(\n client: IPredictClient,\n params: OnchainTradesByMarketQueryParams,\n): Promise<MultiOnchainTradeResponse> {\n return await client.getOnchainTradesByMarket(params);\n}\n\nexport function useOnchainTradesByMarketQuery(\n params: OnchainTradesByMarketQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n MultiOnchainTradeResponse,\n Error,\n MultiOnchainTradeResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: onchainTradesByMarketQueryKey(params),\n queryFn: async () => fetchOnchainTradesByMarket(client, params),\n ...queryOptions,\n });\n}\n\nexport type {\n MultiOnchainTradeResponse,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n};\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type {\n MultiOnchainTradeResponse,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n} from \"../types\";\nimport {\n fetchOnchainTradesByWallet,\n fetchOnchainTradesByEvent,\n fetchOnchainTradesByMarket,\n} from \"./useOnchainTradesQuery\";\nimport { usePredictClient } from \"./usePredictClient\";\n\ntype OnchainTradesInfiniteOptions = Omit<\n UseInfiniteQueryOptions<\n MultiOnchainTradeResponse,\n Error,\n InfiniteData<MultiOnchainTradeResponse>,\n unknown[],\n string | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"getNextPageParam\" | \"initialPageParam\"\n>;\n\nfunction getNextPageParam(lastPage: MultiOnchainTradeResponse) {\n return lastPage.cursor ?? undefined;\n}\n\n// -- By Wallet ---------------------------------------------------------------\n\nexport function onchainTradesByWalletInfiniteQueryKey(\n params: Omit<OnchainTradesByWalletQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byWallet\", \"infinite\", params];\n}\n\nexport function useOnchainTradesByWalletInfiniteQuery(\n params: Omit<OnchainTradesByWalletQueryParams, \"cursor\">,\n options: OnchainTradesInfiniteOptions = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: onchainTradesByWalletInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchOnchainTradesByWallet(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam,\n ...options,\n });\n}\n\n// -- By Event ----------------------------------------------------------------\n\nexport function onchainTradesByEventInfiniteQueryKey(\n params: Omit<OnchainTradesByEventQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byEvent\", \"infinite\", params];\n}\n\nexport function useOnchainTradesByEventInfiniteQuery(\n params: Omit<OnchainTradesByEventQueryParams, \"cursor\">,\n options: OnchainTradesInfiniteOptions = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: onchainTradesByEventInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchOnchainTradesByEvent(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam,\n ...options,\n });\n}\n\n// -- By Market ---------------------------------------------------------------\n\nexport function onchainTradesByMarketInfiniteQueryKey(\n params: Omit<OnchainTradesByMarketQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byMarket\", \"infinite\", params];\n}\n\nexport function useOnchainTradesByMarketInfiniteQuery(\n params: Omit<OnchainTradesByMarketQueryParams, \"cursor\">,\n options: OnchainTradesInfiniteOptions = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: onchainTradesByMarketInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchOnchainTradesByMarket(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam,\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n CandlesticksResponse,\n CandlesticksQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Event Candlesticks Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseEventCandlesticksParams extends CandlesticksQueryParams {\n /** Event ticker */\n ticker: string;\n}\n\nexport function eventCandlesticksQueryKey(\n params: UseEventCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"event\", params];\n}\n\nexport async function fetchEventCandlesticks(\n client: IPredictClient,\n params: UseEventCandlesticksParams,\n): Promise<CandlesticksResponse> {\n const { ticker, ...rest } = params;\n return await client.getEventCandlesticks(ticker, rest);\n}\n\nexport function useEventCandlesticksQuery(\n params: UseEventCandlesticksParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventCandlesticksQueryKey(params),\n queryFn: async () => fetchEventCandlesticks(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Market Candlesticks Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseMarketCandlesticksParams extends CandlesticksQueryParams {\n /** Market ticker */\n ticker: string;\n}\n\nexport function marketCandlesticksQueryKey(\n params: UseMarketCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"market\", params];\n}\n\nexport async function fetchMarketCandlesticks(\n client: IPredictClient,\n params: UseMarketCandlesticksParams,\n): Promise<CandlesticksResponse> {\n const { ticker, ...rest } = params;\n return await client.getMarketCandlesticks(ticker, rest);\n}\n\nexport function useMarketCandlesticksQuery(\n params: UseMarketCandlesticksParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketCandlesticksQueryKey(params),\n queryFn: async () => fetchMarketCandlesticks(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Market Candlesticks by Mint Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseMarketCandlesticksByMintParams\n extends CandlesticksQueryParams {\n /** Mint address */\n mintAddress: string;\n}\n\nexport function marketCandlesticksByMintQueryKey(\n params: UseMarketCandlesticksByMintParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"market\", \"byMint\", params];\n}\n\nexport async function fetchMarketCandlesticksByMint(\n client: IPredictClient,\n params: UseMarketCandlesticksByMintParams,\n): Promise<CandlesticksResponse> {\n const { mintAddress, ...rest } = params;\n return await client.getMarketCandlesticksByMint(mintAddress, rest);\n}\n\nexport function useMarketCandlesticksByMintQuery(\n params: UseMarketCandlesticksByMintParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketCandlesticksByMintQueryKey(params),\n queryFn: async () => fetchMarketCandlesticksByMint(client, params),\n ...options,\n });\n}\n\n// Legacy aliases for backward compatibility\n/** @deprecated Use useEventCandlesticksQuery or useMarketCandlesticksQuery instead */\nexport const usePriceHistoryQuery = useMarketCandlesticksQuery;\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n ForecastPercentileHistoryResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Event Forecast Percentile History Query\n// -----------------------------------------------------------------------------\n\nexport function forecastPercentileHistoryQueryKey(\n params: ForecastPercentileHistoryQueryParams,\n): unknown[] {\n return [\"predict\", \"forecast\", \"percentileHistory\", params];\n}\n\nexport async function fetchForecastPercentileHistory(\n client: IPredictClient,\n params: ForecastPercentileHistoryQueryParams,\n): Promise<ForecastPercentileHistoryResponse> {\n return await client.getEventForecastPercentileHistory(params);\n}\n\nexport function useForecastPercentileHistoryQuery(\n params: ForecastPercentileHistoryQueryParams,\n options: Omit<\n UseQueryOptions<\n ForecastPercentileHistoryResponse,\n Error,\n ForecastPercentileHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: forecastPercentileHistoryQueryKey(params),\n queryFn: async () => fetchForecastPercentileHistory(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Event Forecast Percentile History by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function forecastPercentileHistoryByMintQueryKey(\n params: ForecastPercentileHistoryByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"forecast\", \"percentileHistory\", \"byMint\", params];\n}\n\nexport async function fetchForecastPercentileHistoryByMint(\n client: IPredictClient,\n params: ForecastPercentileHistoryByMintQueryParams,\n): Promise<ForecastPercentileHistoryResponse> {\n return await client.getEventForecastPercentileHistoryByMint(params);\n}\n\nexport function useForecastPercentileHistoryByMintQuery(\n params: ForecastPercentileHistoryByMintQueryParams,\n options: Omit<\n UseQueryOptions<\n ForecastPercentileHistoryResponse,\n Error,\n ForecastPercentileHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: forecastPercentileHistoryByMintQueryKey(params),\n queryFn: async () => fetchForecastPercentileHistoryByMint(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n LiveDataResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Live Data Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataQueryKey(params: LiveDataQueryParams): unknown[] {\n return [\"predict\", \"liveData\", params];\n}\n\nexport async function fetchLiveData(\n client: IPredictClient,\n params: LiveDataQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveData(params);\n}\n\nexport function useLiveDataQuery(\n params: LiveDataQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataQueryKey(params),\n queryFn: async () => fetchLiveData(client, params),\n enabled: params.milestoneIds.length > 0,\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Live Data by Event Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataByEventQueryKey(\n params: LiveDataByEventQueryParams,\n): unknown[] {\n return [\"predict\", \"liveData\", \"byEvent\", params];\n}\n\nexport async function fetchLiveDataByEvent(\n client: IPredictClient,\n params: LiveDataByEventQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveDataByEvent(params);\n}\n\nexport function useLiveDataByEventQuery(\n params: LiveDataByEventQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataByEventQueryKey(params),\n queryFn: async () => fetchLiveDataByEvent(client, params),\n enabled: Boolean(params.eventTicker),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Live Data by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataByMintQueryKey(\n params: LiveDataByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"liveData\", \"byMint\", params];\n}\n\nexport async function fetchLiveDataByMint(\n client: IPredictClient,\n params: LiveDataByMintQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveDataByMint(params);\n}\n\nexport function useLiveDataByMintQuery(\n params: LiveDataByMintQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataByMintQueryKey(params),\n queryFn: async () => fetchLiveDataByMint(client, params),\n enabled: Boolean(params.mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SeriesListResponse,\n SeriesResponse,\n SeriesQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Series List Hook\n// -----------------------------------------------------------------------------\n\nexport function seriesQueryKey(params?: SeriesQueryParams): unknown[] {\n return [\"predict\", \"series\", params ?? {}];\n}\n\nexport async function fetchSeries(\n client: IPredictClient,\n params?: SeriesQueryParams,\n): Promise<SeriesListResponse> {\n return await client.getSeries(params);\n}\n\nexport function useSeriesQuery(\n params?: SeriesQueryParams,\n queryOptions: Omit<\n UseQueryOptions<SeriesListResponse, Error, SeriesListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: seriesQueryKey(params),\n queryFn: async () => fetchSeries(client, params),\n ...queryOptions,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Series by Ticker Hook\n// -----------------------------------------------------------------------------\n\nexport function seriesByTickerQueryKey(seriesTicker: string): unknown[] {\n return [\"predict\", \"series\", \"byTicker\", seriesTicker];\n}\n\nexport async function fetchSeriesByTicker(\n client: IPredictClient,\n seriesTicker: string,\n): Promise<SeriesResponse> {\n return await client.getSeriesByTicker(seriesTicker);\n}\n\nexport function useSeriesByTickerQuery(\n seriesTicker: string,\n options: Omit<\n UseQueryOptions<SeriesResponse, Error, SeriesResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: seriesByTickerQueryKey(seriesTicker),\n queryFn: async () => fetchSeriesByTicker(client, seriesTicker),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Tags by Categories Hook\n// -----------------------------------------------------------------------------\n\nexport function tagsByCategoriesQueryKey(): unknown[] {\n return [\"predict\", \"tags\", \"byCategories\"];\n}\n\nexport async function fetchTagsByCategories(\n client: IPredictClient,\n): Promise<TagsByCategoriesResponse> {\n return await client.getTagsByCategories();\n}\n\nexport function useTagsByCategoriesQuery(\n options: Omit<\n UseQueryOptions<\n TagsByCategoriesResponse,\n Error,\n TagsByCategoriesResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tagsByCategoriesQueryKey(),\n queryFn: async () => fetchTagsByCategories(client),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Filters by Sports Hook\n// -----------------------------------------------------------------------------\n\nexport function filtersBySportsQueryKey(): unknown[] {\n return [\"predict\", \"filters\", \"bySports\"];\n}\n\nexport async function fetchFiltersBySports(\n client: IPredictClient,\n): Promise<FiltersBySportsResponse> {\n return await client.getFiltersBySports();\n}\n\nexport function useFiltersBySportsQuery(\n options: Omit<\n UseQueryOptions<\n FiltersBySportsResponse,\n Error,\n FiltersBySportsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: filtersBySportsQueryKey(),\n queryFn: async () => fetchFiltersBySports(client),\n ...options,\n });\n}\n\n// Legacy alias for backward compatibility\n/** @deprecated Use useTagsByCategoriesQuery instead */\nexport const useCategoriesQuery = useTagsByCategoriesQuery;\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SearchQueryParams,\n SearchResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function searchQueryKey(params: SearchQueryParams): unknown[] {\n return [\"predict\", \"search\", params];\n}\n\nexport async function fetchSearch(\n client: IPredictClient,\n params: SearchQueryParams,\n): Promise<SearchResponse> {\n return await client.search(params);\n}\n\nexport function useSearchQuery(\n params: SearchQueryParams,\n queryOptions: Omit<\n UseQueryOptions<SearchResponse, Error, SearchResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: searchQueryKey(params),\n queryFn: async () => fetchSearch(client, params),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n WalletPositionsResponse,\n PositionsByWalletQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function positionsByWalletQueryKey(\n params: PositionsByWalletQueryParams,\n): unknown[] {\n return [\"predict\", \"positions\", \"byWallet\", params];\n}\n\nexport async function fetchPositionsByWallet(\n client: IPredictClient,\n params: PositionsByWalletQueryParams,\n): Promise<WalletPositionsResponse> {\n return await client.getPositionsByWallet(params);\n}\n\nexport function usePositionsByWalletQuery(\n params: PositionsByWalletQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n WalletPositionsResponse,\n Error,\n WalletPositionsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: positionsByWalletQueryKey(params),\n queryFn: async () => fetchPositionsByWallet(client, params),\n ...queryOptions,\n });\n}\n\nexport type { WalletPositionsResponse, PositionsByWalletQueryParams };\n","import { useContext } from \"react\";\nimport { UserPredictContext } from \"../contexts/UserPredictContext\";\n\nexport function useUserPredictContext() {\n const context = useContext(UserPredictContext);\n if (!context) {\n throw new Error(\n \"useUserPredictContext must be used within a UserPredictProvider\",\n );\n }\n return context;\n}\n","import { useContext, useMemo } from \"react\";\nimport { UserPredictContext } from \"../contexts/UserPredictContext\";\nimport type { StandardMarket, WalletPositionItem } from \"../types\";\n\nexport interface MarketPositionsResult {\n /** Positions matching the given market */\n positions: WalletPositionItem[];\n /** Whether the positions query is loading */\n isLoading: boolean;\n /** Whether UserPredictProvider is available in the tree */\n isAvailable: boolean;\n}\n\n/**\n * Returns the current user's positions filtered to a specific market.\n * Safe to call without UserPredictProvider — returns empty positions\n * with `isAvailable: false`.\n */\nexport function useMarketPositions(\n market: StandardMarket,\n): MarketPositionsResult {\n const ctx = useContext(UserPredictContext);\n\n return useMemo(() => {\n if (!ctx) {\n return { positions: [], isLoading: false, isAvailable: false };\n }\n\n const filtered = ctx.positions.filter(\n (p) => p.market?.ticker === market.ticker,\n );\n\n return {\n positions: filtered,\n isLoading: ctx.isLoading,\n isAvailable: true,\n };\n }, [ctx, market.ticker]);\n}\n","import {\n useQuery,\n useMutation,\n type UseQueryOptions,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n OutcomeMintsQueryParams,\n OutcomeMintsResponse,\n FilterOutcomeMintsRequest,\n FilterOutcomeMintsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Outcome Mints Query\n// -----------------------------------------------------------------------------\n\nexport function outcomeMintsQueryKey(\n params?: OutcomeMintsQueryParams,\n): unknown[] {\n return [\"predict\", \"outcomeMints\", params ?? {}];\n}\n\nexport async function fetchOutcomeMints(\n client: IPredictClient,\n params?: OutcomeMintsQueryParams,\n): Promise<OutcomeMintsResponse> {\n return await client.getOutcomeMints(params);\n}\n\nexport function useOutcomeMintsQuery(\n params?: OutcomeMintsQueryParams,\n options: Omit<\n UseQueryOptions<\n OutcomeMintsResponse,\n Error,\n OutcomeMintsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: outcomeMintsQueryKey(params),\n queryFn: async () => fetchOutcomeMints(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Filter Outcome Mints Mutation\n// -----------------------------------------------------------------------------\n\nexport async function filterOutcomeMints(\n client: IPredictClient,\n request: FilterOutcomeMintsRequest,\n): Promise<FilterOutcomeMintsResponse> {\n return await client.filterOutcomeMints(request);\n}\n\nexport function useFilterOutcomeMintsMutation(\n options: Omit<\n UseMutationOptions<\n FilterOutcomeMintsResponse,\n Error,\n FilterOutcomeMintsRequest\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: FilterOutcomeMintsRequest) =>\n filterOutcomeMints(client, request),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, QuoteQueryParams, QuoteResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Quote Query\n// -----------------------------------------------------------------------------\n\nexport function quoteQueryKey(params: QuoteQueryParams): unknown[] {\n return [\"predict\", \"quote\", params];\n}\n\nexport async function fetchQuote(\n client: IPredictClient,\n params: QuoteQueryParams,\n): Promise<QuoteResponse> {\n return await client.getQuote(params);\n}\n\nexport function useQuoteQuery(\n params: QuoteQueryParams,\n options: Omit<\n UseQueryOptions<QuoteResponse, Error, QuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: quoteQueryKey(params),\n queryFn: async () => fetchQuote(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Quotes are time-sensitive, don't cache for long\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds (formerly cacheTime)\n ...options,\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SwapRequestBody,\n SwapResponse,\n SwapInstructionsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Create Swap Mutation\n// -----------------------------------------------------------------------------\n\nexport async function createSwap(\n client: IPredictClient,\n request: SwapRequestBody,\n): Promise<SwapResponse> {\n return await client.createSwap(request);\n}\n\nexport function useCreateSwapMutation(\n options: Omit<\n UseMutationOptions<SwapResponse, Error, SwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: SwapRequestBody) => createSwap(client, request),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Create Swap Instructions Mutation\n// -----------------------------------------------------------------------------\n\nexport async function createSwapInstructions(\n client: IPredictClient,\n request: SwapRequestBody,\n): Promise<SwapInstructionsResponse> {\n return await client.createSwapInstructions(request);\n}\n\nexport function useCreateSwapInstructionsMutation(\n options: Omit<\n UseMutationOptions<SwapInstructionsResponse, Error, SwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: SwapRequestBody) =>\n createSwapInstructions(client, request),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n OrderQueryParams,\n OrderResponse,\n OrderStatusQueryParams,\n OrderStatusResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Order Query (Get quote and optionally transaction)\n// -----------------------------------------------------------------------------\n\nexport function orderQueryKey(params: OrderQueryParams): unknown[] {\n return [\"predict\", \"order\", params];\n}\n\nexport async function fetchOrder(\n client: IPredictClient,\n params: OrderQueryParams,\n): Promise<OrderResponse> {\n return await client.getOrder(params);\n}\n\nexport function useOrderQuery(\n params: OrderQueryParams,\n options: Omit<\n UseQueryOptions<OrderResponse, Error, OrderResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderQueryKey(params),\n queryFn: async () => fetchOrder(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Orders are time-sensitive, don't cache for long\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Order Status Query\n// -----------------------------------------------------------------------------\n\nexport function orderStatusQueryKey(params: OrderStatusQueryParams): unknown[] {\n return [\"predict\", \"order\", \"status\", params.signature];\n}\n\nexport async function fetchOrderStatus(\n client: IPredictClient,\n params: OrderStatusQueryParams,\n): Promise<OrderStatusResponse> {\n return await client.getOrderStatus(params);\n}\n\nexport function useOrderStatusQuery(\n params: OrderStatusQueryParams,\n options: Omit<\n UseQueryOptions<OrderStatusResponse, Error, OrderStatusResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderStatusQueryKey(params),\n queryFn: async () => fetchOrderStatus(client, params),\n enabled: Boolean(params.signature),\n // Poll for status updates; no retry — refetchInterval handles re-polling\n refetchInterval: options.refetchInterval ?? 3000,\n retry: false,\n ...options,\n });\n}\n","import {\n useQuery,\n useMutation,\n type UseQueryOptions,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n IntentQuoteQueryParams,\n IntentQuoteResponse,\n IntentSwapRequestBody,\n IntentSwapResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Intent Quote Query (Declarative Swap)\n// -----------------------------------------------------------------------------\n\nexport function intentQuoteQueryKey(params: IntentQuoteQueryParams): unknown[] {\n return [\"predict\", \"intent\", \"quote\", params];\n}\n\nexport async function fetchIntentQuote(\n client: IPredictClient,\n params: IntentQuoteQueryParams,\n): Promise<IntentQuoteResponse> {\n return await client.getIntentQuote(params);\n}\n\nexport function useIntentQuoteQuery(\n params: IntentQuoteQueryParams,\n options: Omit<\n UseQueryOptions<IntentQuoteResponse, Error, IntentQuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: intentQuoteQueryKey(params),\n queryFn: async () => fetchIntentQuote(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Intent quotes are time-sensitive\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Submit Intent Swap Mutation\n// -----------------------------------------------------------------------------\n\nexport async function submitIntentSwap(\n client: IPredictClient,\n request: IntentSwapRequestBody,\n): Promise<IntentSwapResponse> {\n return await client.submitIntentSwap(request);\n}\n\nexport function useSubmitIntentSwapMutation(\n options: Omit<\n UseMutationOptions<IntentSwapResponse, Error, IntentSwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: IntentSwapRequestBody) =>\n submitIntentSwap(client, request),\n ...options,\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n PredictionMarketInitQueryParams,\n PredictionMarketInitResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Initialize Prediction Market Mutation\n// -----------------------------------------------------------------------------\n\nexport async function initPredictionMarket(\n client: IPredictClient,\n params: PredictionMarketInitQueryParams,\n): Promise<PredictionMarketInitResponse> {\n return await client.initPredictionMarket(params);\n}\n\nexport function useInitPredictionMarketMutation(\n options: Omit<\n UseMutationOptions<\n PredictionMarketInitResponse,\n Error,\n PredictionMarketInitQueryParams\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (params: PredictionMarketInitQueryParams) =>\n initPredictionMarket(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Tokens Query\n// -----------------------------------------------------------------------------\n\nexport function tokensQueryKey(): unknown[] {\n return [\"predict\", \"tokens\"];\n}\n\nexport async function fetchTokens(\n client: IPredictClient,\n): Promise<TokenListResponse> {\n return await client.getTokens();\n}\n\nexport function useTokensQuery(\n options: Omit<\n UseQueryOptions<TokenListResponse, Error, TokenListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tokensQueryKey(),\n queryFn: async () => fetchTokens(client),\n // Token list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Tokens With Decimals Query\n// -----------------------------------------------------------------------------\n\nexport function tokensWithDecimalsQueryKey(): unknown[] {\n return [\"predict\", \"tokens\", \"decimals\"];\n}\n\nexport async function fetchTokensWithDecimals(\n client: IPredictClient,\n): Promise<TokenListWithDecimalsResponse> {\n return await client.getTokensWithDecimals();\n}\n\nexport function useTokensWithDecimalsQuery(\n options: Omit<\n UseQueryOptions<\n TokenListWithDecimalsResponse,\n Error,\n TokenListWithDecimalsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tokensWithDecimalsQueryKey(),\n queryFn: async () => fetchTokensWithDecimals(client),\n // Token list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, VenueListResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Venues Query\n// -----------------------------------------------------------------------------\n\nexport function venuesQueryKey(): unknown[] {\n return [\"predict\", \"venues\"];\n}\n\nexport async function fetchVenues(\n client: IPredictClient,\n): Promise<VenueListResponse> {\n return await client.getVenues();\n}\n\nexport function useVenuesQuery(\n options: Omit<\n UseQueryOptions<VenueListResponse, Error, VenueListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: venuesQueryKey(),\n queryFn: async () => fetchVenues(client),\n // Venue list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n","/**\n * DflowPredictWsClient - WebSocket client for real-time prediction market data\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat (ping/pong) for connection health\n * - Subscription management for prices, trades, orderbook channels\n * - Event emitter pattern for message handling\n */\nimport type {\n WsConnectionStatus,\n WsSubscribeOptions,\n WsPriceUpdate,\n WsTradeUpdate,\n WsOrderbookUpdate,\n IPredictWsClient,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Internal WebSocket Protocol Types\n// ---------------------------------------------------------------------------\n\n/** WebSocket channel types */\ntype WsChannel = \"prices\" | \"trades\" | \"orderbook\";\n\n/** Subscribe/Unsubscribe message */\ninterface WsSubscribeMessage {\n type: \"subscribe\" | \"unsubscribe\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n}\n\n/** Ping message */\ninterface WsPingMessage {\n type: \"ping\";\n}\n\n/** Pong response */\ninterface WsPongMessage {\n type: \"pong\";\n timestamp: number;\n}\n\n/** Status request message */\ninterface WsStatusRequestMessage {\n type: \"status\";\n}\n\n/** Status response message */\ninterface WsStatusMessage {\n type: \"status\";\n status: WsConnectionStatus;\n message?: string;\n connected?: boolean;\n clientCount?: number;\n subscriptions?: {\n prices: { all: boolean; tickers: string[] };\n trades: { all: boolean; tickers: string[] };\n orderbook: { all: boolean; tickers: string[] };\n };\n}\n\n/** Subscription confirmation message */\ninterface WsSubscriptionConfirmation {\n type: \"subscribed\" | \"unsubscribed\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n success: boolean;\n}\n\n/** Error message from server */\ninterface WsErrorMessage {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/** Union type for all data messages from server */\ntype WsDataMessage = WsPriceUpdate | WsTradeUpdate | WsOrderbookUpdate;\n\n/** Union type for all server messages */\ntype WsServerMessage =\n | WsDataMessage\n | WsStatusMessage\n | WsSubscriptionConfirmation\n | WsErrorMessage\n | WsPongMessage;\n\n/** Union type for all client messages */\ntype WsClientMessage =\n | WsSubscribeMessage\n | WsPingMessage\n | WsStatusRequestMessage;\n\n/** WebSocket event types for event emitter */\ntype WsEventType =\n | \"connect\"\n | \"disconnect\"\n | \"reconnecting\"\n | \"error\"\n | \"price\"\n | \"trade\"\n | \"orderbook\"\n | \"status\"\n | \"subscribed\"\n | \"unsubscribed\";\n\n/** WebSocket client configuration */\nexport interface WsClientConfig {\n /** WebSocket endpoint URL */\n wsUrl: string;\n /** Auto-connect on instantiation */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect interval base in ms (default: 1000) */\n reconnectIntervalBase?: number;\n /** Max reconnect interval in ms (default: 30000) */\n reconnectMaxInterval?: number;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_INTERVAL_BASE = 1000; // 1 second\nconst DEFAULT_RECONNECT_MAX_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_PING_INTERVAL = 30000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// Event Emitter Types\n// ---------------------------------------------------------------------------\n\ntype EventCallback<T = unknown> = (data: T) => void;\n\ninterface EventListeners {\n connect: EventCallback<void>[];\n disconnect: EventCallback<{ code?: number; reason?: string }>[];\n reconnecting: EventCallback<{ attempt: number; delay: number }>[];\n error: EventCallback<Error>[];\n price: EventCallback<WsPriceUpdate>[];\n trade: EventCallback<WsTradeUpdate>[];\n orderbook: EventCallback<WsOrderbookUpdate>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n unsubscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n}\n\n// ---------------------------------------------------------------------------\n// Subscription State\n// ---------------------------------------------------------------------------\n\ninterface ChannelSubscription {\n all: boolean;\n tickers: Set<string>;\n}\n\ninterface SubscriptionState {\n prices: ChannelSubscription;\n trades: ChannelSubscription;\n orderbook: ChannelSubscription;\n}\n\n// ---------------------------------------------------------------------------\n// DflowPredictWsClient Class\n// ---------------------------------------------------------------------------\n\nexport class DflowPredictWsClient implements IPredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectIntervalBase: number;\n private readonly reconnectMaxInterval: number;\n private readonly pingInterval: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private shouldReconnect = true;\n\n // Event listeners\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n price: [],\n trade: [],\n orderbook: [],\n status: [],\n subscribed: [],\n unsubscribed: [],\n };\n\n // Track current subscriptions for reconnection recovery\n private subscriptions: SubscriptionState = {\n prices: { all: false, tickers: new Set() },\n trades: { all: false, tickers: new Set() },\n orderbook: { all: false, tickers: new Set() },\n };\n\n constructor(config: WsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectIntervalBase =\n config.reconnectIntervalBase ?? DEFAULT_RECONNECT_INTERVAL_BASE;\n this.reconnectMaxInterval =\n config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX_INTERVAL;\n this.pingInterval = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Connection Management\n // ---------------------------------------------------------------------------\n\n /**\n * Connect to the WebSocket server\n */\n connect(): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n this.shouldReconnect = true;\n this.setStatus(\"connecting\");\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.setStatus(\"connected\");\n this.emit(\"connect\", undefined);\n\n // Restore subscriptions after reconnection\n this.restoreSubscriptions();\n\n // Start ping interval\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n const error = new Error(\"WebSocket error\");\n console.error(\"[DflowPredictWsClient] WebSocket error:\", event);\n this.emit(\"error\", error);\n };\n\n this.ws.onclose = (event) => {\n this.stopPingInterval();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n\n // Attempt reconnection\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch (error) {\n console.error(\n \"[DflowPredictWsClient] Failed to create WebSocket:\",\n error,\n );\n this.emit(\n \"error\",\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPingInterval();\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus(\"disconnected\");\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get current connection status\n */\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n // ---------------------------------------------------------------------------\n // Business Subscription Methods (IPredictWsClient interface)\n // ---------------------------------------------------------------------------\n\n /** Subscribe to price updates, returns unsubscribe function */\n subscribePrices(\n options: WsSubscribeOptions,\n onUpdate: (update: WsPriceUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"prices\", options);\n const removeListener = this.on(\"price\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"prices\", options);\n };\n }\n\n /** Subscribe to trade updates, returns unsubscribe function */\n subscribeTrades(\n options: WsSubscribeOptions,\n onUpdate: (update: WsTradeUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"trades\", options);\n const removeListener = this.on(\"trade\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"trades\", options);\n };\n }\n\n /** Subscribe to orderbook updates, returns unsubscribe function */\n subscribeOrderbook(\n options: WsSubscribeOptions,\n onUpdate: (update: WsOrderbookUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"orderbook\", options);\n const removeListener = this.on(\"orderbook\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"orderbook\", options);\n };\n }\n\n /** Subscribe to status changes, returns unsubscribe function */\n onStatusChange(callback: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", callback);\n }\n\n // ---------------------------------------------------------------------------\n // Event Emitter\n // ---------------------------------------------------------------------------\n\n /**\n * Add event listener\n */\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n listeners.push(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Remove event listener\n */\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n const index = listeners.indexOf(callback as EventCallback<unknown>);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * Remove all listeners for an event (or all events)\n */\n removeAllListeners(event?: WsEventType): void {\n if (event) {\n (this.listeners[event] as unknown[]).length = 0;\n } else {\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods\n // ---------------------------------------------------------------------------\n\n private subscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = true;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n subscription.all = false;\n for (const ticker of options.tickers) {\n subscription.tickers.add(ticker);\n }\n }\n\n this.sendSubscription(\"subscribe\", channel, options);\n }\n\n private unsubscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = false;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n for (const ticker of options.tickers) {\n subscription.tickers.delete(ticker);\n }\n }\n\n this.sendSubscription(\"unsubscribe\", channel, options);\n }\n\n private setStatus(status: WsConnectionStatus): void {\n if (this.status !== status) {\n this.status = status;\n this.emit(\"status\", status);\n }\n }\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const listeners = this.listeners[event] as EventCallback<typeof data>[];\n for (const listener of listeners) {\n try {\n listener(data);\n } catch (error) {\n console.error(\n `[DflowPredictWsClient] Error in ${event} listener:`,\n error,\n );\n }\n }\n }\n\n private send(message: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn(\n \"[DflowPredictWsClient] Cannot send message, WebSocket not connected\",\n );\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to send message:\", error);\n return false;\n }\n }\n\n private sendSubscription(\n type: \"subscribe\" | \"unsubscribe\",\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n this.send({\n type,\n channel,\n all: options.all,\n tickers: options.tickers,\n });\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as WsServerMessage;\n\n switch (message.type) {\n case \"ticker\":\n this.emit(\"price\", message as WsPriceUpdate);\n break;\n case \"trade\":\n this.emit(\"trade\", message as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", message as WsOrderbookUpdate);\n break;\n case \"status\":\n // Status message from server (different from connection status)\n break;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"unsubscribed\":\n this.emit(\"unsubscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"pong\":\n // Pong received, connection is alive\n break;\n case \"error\":\n console.error(\n \"[DflowPredictWsClient] Server error:\",\n message.message,\n );\n this.emit(\"error\", new Error(message.message));\n break;\n default:\n // Handle data messages without explicit type\n if (\"channel\" in message) {\n const dataMsg = message as WsDataMessage;\n switch (dataMsg.channel) {\n case \"prices\":\n this.emit(\"price\", dataMsg as WsPriceUpdate);\n break;\n case \"trades\":\n this.emit(\"trade\", dataMsg as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsOrderbookUpdate);\n break;\n }\n }\n }\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to parse message:\", error);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n this.reconnectIntervalBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMaxInterval,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private restoreSubscriptions(): void {\n for (const channel of [\"prices\", \"trades\", \"orderbook\"] as WsChannel[]) {\n const subscription = this.subscriptions[channel];\n\n if (subscription.all) {\n this.sendSubscription(\"subscribe\", channel, { all: true });\n } else if (subscription.tickers.size > 0) {\n this.sendSubscription(\"subscribe\", channel, {\n tickers: Array.from(subscription.tickers),\n });\n }\n }\n }\n\n private startPingInterval(): void {\n this.stopPingInterval();\n\n this.pingIntervalId = setInterval(() => {\n this.send({ type: \"ping\" });\n }, this.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new DflowPredictWsClient instance\n */\nexport function createDflowPredictWsClient(\n config: WsClientConfig,\n): DflowPredictWsClient {\n return new DflowPredictWsClient(config);\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport { DflowPredictWsClient, createDflowPredictWsClient } from \"../client/ws\";\nimport type { WsClientConfig } from \"../client/ws\";\nimport type { IPredictWsClient, WsConnectionStatus } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseWsConnectionParams {\n /** WebSocket endpoint URL */\n wsEndpoint: string;\n /** Auto-connect on mount (default: true) */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Enable connection (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseWsConnectionResult {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Current connection status */\n status: WsConnectionStatus;\n /** Whether currently connected */\n isConnected: boolean;\n /** Connect to WebSocket */\n connect: () => void;\n /** Disconnect from WebSocket */\n disconnect: () => void;\n /** Last error */\n error: Error | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for managing WebSocket connection lifecycle\n */\nexport function useWsConnection({\n wsEndpoint,\n autoConnect = true,\n autoReconnect = true,\n enabled = true,\n}: UseWsConnectionParams): UseWsConnectionResult {\n const [status, setStatus] = useState<WsConnectionStatus>(\"disconnected\");\n const [error, setError] = useState<Error | null>(null);\n const clientRef = useRef<DflowPredictWsClient | null>(null);\n\n // Initialize client\n useEffect(() => {\n if (!enabled) {\n if (clientRef.current) {\n clientRef.current.disconnect();\n clientRef.current = null;\n }\n setStatus(\"disconnected\");\n return;\n }\n\n const config: WsClientConfig = {\n wsUrl: wsEndpoint,\n autoConnect,\n autoReconnect,\n };\n\n const client = createDflowPredictWsClient(config);\n clientRef.current = client;\n\n // Listen for status changes\n const unsubStatus = client.on(\"status\", (newStatus) => {\n setStatus(newStatus);\n });\n\n // Listen for errors\n const unsubError = client.on(\"error\", (err) => {\n setError(err);\n });\n\n // Listen for successful connection to clear error\n const unsubConnect = client.on(\"connect\", () => {\n setError(null);\n });\n\n // Cleanup on unmount\n return () => {\n unsubStatus();\n unsubError();\n unsubConnect();\n client.disconnect();\n clientRef.current = null;\n };\n }, [wsEndpoint, autoConnect, autoReconnect, enabled]);\n\n const connect = useCallback(() => {\n clientRef.current?.connect();\n }, []);\n\n const disconnect = useCallback(() => {\n clientRef.current?.disconnect();\n }, []);\n\n return {\n client: clientRef.current,\n status,\n isConnected: status === \"connected\",\n connect,\n disconnect,\n error,\n };\n}\n","import { useContext, useEffect, useState } from \"react\";\nimport { PredictContext } from \"../contexts/PredictContext\";\nimport type { IPredictWsClient, WsConnectionStatus } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseWsClientResult {\n /** WebSocket client instance (null if not configured) */\n wsClient: IPredictWsClient | null;\n /** Current connection status */\n wsStatus: WsConnectionStatus;\n /** Whether currently connected */\n isWsConnected: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook to access the WebSocket client from PredictContext.\n * Connection status is derived directly from the wsClient instance.\n */\nexport function useWsClient(): UseWsClientResult {\n const context = useContext(PredictContext);\n\n if (!context) {\n throw new Error(\"useWsClient must be used within a PredictProvider\");\n }\n\n const { wsClient } = context;\n\n const [wsStatus, setWsStatus] = useState<WsConnectionStatus>(\n wsClient?.getStatus() ?? \"disconnected\",\n );\n\n useEffect(() => {\n if (!wsClient) {\n setWsStatus(\"disconnected\");\n return;\n }\n\n // Sync initial status\n setWsStatus(wsClient.getStatus());\n\n // Listen for status changes\n const unsubscribe = wsClient.onStatusChange(setWsStatus);\n return unsubscribe;\n }, [wsClient]);\n\n return {\n wsClient,\n wsStatus,\n isWsConnected: wsStatus === \"connected\",\n };\n}\n","import { useEffect, useState, useRef } from \"react\";\nimport type { IPredictWsClient, WsPriceUpdate } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UsePricesSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Callback when price update received */\n onUpdate?: (update: WsPriceUpdate) => void;\n}\n\nexport interface PriceData {\n yesBid: string | null;\n yesAsk: string | null;\n noBid: string | null;\n noAsk: string | null;\n updatedAt: number;\n}\n\nexport interface UsePricesSubscriptionResult {\n /** Map of market ticker to latest price data */\n prices: Map<string, PriceData>;\n /** Whether subscription is active */\n isSubscribed: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time price updates\n */\nexport function usePricesSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n onUpdate,\n}: UsePricesSubscriptionParams): UsePricesSubscriptionResult {\n const [prices, setPrices] = useState<Map<string, PriceData>>(new Map());\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribePrices(options, (update) => {\n setPrices((prev) => {\n const next = new Map(prev);\n next.set(update.market_ticker, {\n yesBid: update.yes_bid,\n yesAsk: update.yes_ask,\n noBid: update.no_bid,\n noAsk: update.no_ask,\n updatedAt: Date.now(),\n });\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled]);\n\n return {\n prices,\n isSubscribed,\n };\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport type { IPredictWsClient, WsTradeUpdate } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradesSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Maximum number of trades to keep in history (default: 100) */\n maxHistory?: number;\n /** Callback when trade update received */\n onUpdate?: (update: WsTradeUpdate) => void;\n}\n\nexport interface TradeData {\n tradeId: string;\n marketTicker: string;\n price: number;\n count: number;\n yesPrice: number;\n noPrice: number;\n takerSide: \"yes\" | \"no\";\n createdTime: number;\n}\n\nexport interface UseTradesSubscriptionResult {\n /** Recent trades (newest first) */\n trades: TradeData[];\n /** Whether subscription is active */\n isSubscribed: boolean;\n /** Clear trade history */\n clearHistory: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time trade updates\n */\nexport function useTradesSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n maxHistory = 100,\n onUpdate,\n}: UseTradesSubscriptionParams): UseTradesSubscriptionResult {\n const [trades, setTrades] = useState<TradeData[]>([]);\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribeTrades(options, (update) => {\n const trade: TradeData = {\n tradeId: update.trade_id,\n marketTicker: update.market_ticker,\n price: update.price,\n count: update.count,\n yesPrice: update.yes_price,\n noPrice: update.no_price,\n takerSide: update.taker_side,\n createdTime: update.created_time,\n };\n\n setTrades((prev) => {\n const next = [trade, ...prev];\n if (next.length > maxHistory) {\n return next.slice(0, maxHistory);\n }\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled, maxHistory]);\n\n const clearHistory = useCallback(() => {\n setTrades([]);\n }, []);\n\n return {\n trades,\n isSubscribed,\n clearHistory,\n };\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport type {\n IPredictWsClient,\n WsOrderbookUpdate,\n OrderbookLevel,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOrderbookSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Callback when orderbook update received */\n onUpdate?: (update: WsOrderbookUpdate) => void;\n}\n\nexport interface OrderbookData {\n yesBids: OrderbookLevel[];\n yesAsks: OrderbookLevel[];\n noBids: OrderbookLevel[];\n noAsks: OrderbookLevel[];\n updatedAt: number;\n}\n\nexport interface UseOrderbookSubscriptionResult {\n /** Map of market ticker to latest orderbook data */\n orderbooks: Map<string, OrderbookData>;\n /** Whether subscription is active */\n isSubscribed: boolean;\n /** Get orderbook for a specific ticker */\n getOrderbook: (ticker: string) => OrderbookData | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time orderbook updates\n */\nexport function useOrderbookSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n onUpdate,\n}: UseOrderbookSubscriptionParams): UseOrderbookSubscriptionResult {\n const [orderbooks, setOrderbooks] = useState<Map<string, OrderbookData>>(\n new Map(),\n );\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribeOrderbook(options, (update) => {\n setOrderbooks((prev) => {\n const next = new Map(prev);\n next.set(update.market_ticker, {\n yesBids: update.yes_bids,\n yesAsks: update.yes_asks,\n noBids: update.no_bids,\n noAsks: update.no_asks,\n updatedAt: Date.now(),\n });\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled]);\n\n const getOrderbook = useCallback(\n (ticker: string) => orderbooks.get(ticker),\n [orderbooks],\n );\n\n return {\n orderbooks,\n isSubscribed,\n getOrderbook,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTagsByCategoriesQuery } from \"../../hooks\";\n\n// -----------------------------------------------------------------------------\n// Preferred display order\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER: string[] = [\n \"Politics\",\n \"Sports\",\n \"Culture\",\n \"Crypto\",\n \"Climate\",\n \"Economics\",\n \"Mentions\",\n \"Companies\",\n \"Financials\",\n \"Tech & Science\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** A single category with its tags */\nexport interface EventCategory {\n /** Category name (e.g. \"Politics\", \"Economics\") */\n category: string;\n /** Tags associated with this category */\n tags: string[];\n}\n\n/** Return type for the useEventsCategories hook */\nexport interface UseEventsCategoriesResult {\n /** Structured category list */\n data: EventCategory[];\n /** Whether data is still loading */\n isLoading: boolean;\n /** Whether there is an error */\n isError: boolean;\n /** Error information */\n error: Error | null;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * Fetches event categories and their tags.\n *\n * Uses `getTagsByCategories()` to build a sorted list of categories, each\n * containing the tags that belong to it.\n *\n * @example\n * ```tsx\n * const { data: categories, isLoading } = useEventsCategories();\n *\n * // categories = [\n * // { category: \"Politics\", tags: [\"US Elections\", ...] },\n * // { category: \"Sports\", tags: [\"NFL\", \"NBA\", ...] },\n * // ...\n * // ]\n * ```\n */\nexport function useEventsCategories(): UseEventsCategoriesResult {\n const {\n data: tagsData,\n isLoading,\n isError,\n error,\n } = useTagsByCategoriesQuery();\n\n const data = useMemo<EventCategory[]>(() => {\n if (!tagsData?.tagsByCategories) return [];\n\n const orderIndex = (cat: string) => {\n const idx = CATEGORY_ORDER.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER.length : idx;\n };\n\n return Object.entries(tagsData.tagsByCategories)\n .map(([category, tags]) => ({ category, tags }))\n .sort((a, b) => orderIndex(a.category) - orderIndex(b.category));\n }, [tagsData]);\n\n return { data, isLoading, isError, error: error ?? null };\n}\n","import { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface CategoryItem {\n category: string;\n tags: string[];\n /** Optional badge text displayed above the tab (e.g. \"New\", \"Hot\") */\n badge?: string;\n}\n\nexport interface TagItem {\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\nexport interface CategoriesUIProps {\n /** List of categories to display */\n categories: CategoryItem[];\n /** Currently selected category name (null = \"Trending\") */\n selectedCategory: string | null;\n /** Currently selected tag within the category (null = all tags) */\n selectedTag: string | null;\n /** Tags of the currently selected category */\n activeTags: TagItem[];\n /** Callback when a category is selected (null = \"Trending\") */\n onCategorySelect: (category: string | null) => void;\n /** Callback when a tag is selected (null = deselect) */\n onTagSelect: (tag: string | null) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Name of the tab that shows a pulsing dot (default: \"Trending\") */\n pulsingTab?: string;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function CategoriesUI({\n categories,\n selectedCategory,\n selectedTag,\n activeTags,\n onCategorySelect,\n onTagSelect,\n trailing,\n pulsingTab = \"Trending\",\n className,\n}: CategoriesUIProps) {\n const { t } = useTranslation();\n\n const handleSelectAll = useCallback(() => {\n onCategorySelect(null);\n }, [onCategorySelect]);\n\n const trendingLabel = t(\"predict.categories.trending\");\n\n return (\n <div\n className={cn(\n \"sticky top-0 z-30 flex w-full flex-col justify-between gap-2 px-4 py-1 lg:px-2 lg:py-1\",\n className,\n )}\n >\n {/* Primary row: category tabs + trailing controls */}\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"hideScrollbar min-w-0 flex-1 overflow-x-auto overflow-y-hidden\">\n <div className=\"flex min-h-8 items-stretch gap-x-2 lg:min-h-9\">\n {/* Trending tab */}\n <Tab\n label={trendingLabel}\n isSelected={selectedCategory === null}\n onPress={handleSelectAll}\n showPulse={trendingLabel === pulsingTab}\n />\n\n {/* Separator between Trending and categories */}\n <TabSeparator />\n\n {/* Category tabs */}\n {categories.map((cat) => (\n <Tab\n key={cat.category}\n label={cat.category}\n isSelected={selectedCategory === cat.category}\n onPress={() => onCategorySelect(cat.category)}\n badge={cat.badge}\n showPulse={cat.category === pulsingTab}\n />\n ))}\n </div>\n </div>\n {trailing && <div className=\"flex-shrink-0\">{trailing}</div>}\n </div>\n\n {/* Secondary: tag chips (visible when a category is selected) */}\n {selectedCategory && activeTags.length > 0 && (\n <div className=\"hideScrollbar overflow-x-auto overflow-y-hidden flex items-center\">\n <div className=\"flex gap-x-1 pl-2 lg:w-full lg:gap-x-2\">\n <Chip\n label={t(\"predict.categories.allMarkets\")}\n isSelected={selectedTag === null}\n onPress={() => onTagSelect(null)}\n />\n {activeTags.map((tag) => (\n <Chip\n key={tag.label}\n label={tag.label}\n icon={tag.icon}\n isSelected={selectedTag === tag.label}\n onPress={() => onTagSelect(tag.label)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Tab — primary category navigation item\n// -----------------------------------------------------------------------------\n\ninterface TabProps {\n label: string;\n isSelected: boolean;\n onPress: () => void;\n badge?: string;\n showPulse?: boolean;\n}\n\nfunction Tab({ label, isSelected, onPress, badge, showPulse }: TabProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"relative shrink-0 cursor-pointer whitespace-nowrap border-b p-1 text-base font-normal capitalize transition-colors\",\n isSelected\n ? \"border-primary/50 text-primary\"\n : \"border-transparent text-neutral-500 hover:text-neutral-300\",\n )}\n >\n {showPulse ? (\n <span className=\"flex items-center gap-x-1.5\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-[rgb(240,68,56)]\" />\n <span>{label}</span>\n </span>\n ) : (\n label\n )}\n\n {badge && (\n <span className=\"absolute -right-1 top-0 rounded bg-primary px-0.5 py-px text-[0.625rem] font-semibold leading-none text-neutral-950\">\n {badge}\n </span>\n )}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// TabSeparator — vertical divider between tab groups\n// -----------------------------------------------------------------------------\n\nfunction TabSeparator() {\n return (\n <span className=\"flex items-center text-neutral-600\" aria-hidden=\"true\">\n |\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Chip — secondary tag chip (pixel-perfect Jupiter clone)\n// -----------------------------------------------------------------------------\n\ninterface ChipProps {\n label: string;\n icon?: string;\n isSelected: boolean;\n onPress: () => void;\n}\n\nfunction Chip({ label, icon, isSelected, onPress }: ChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"flex shrink-0 items-center justify-center gap-x-1 min-w-14 rounded-2xl border px-2 py-1 text-sm font-medium uppercase transition-colors cursor-pointer\",\n isSelected\n ? \"border-transparent bg-primary text-black\"\n : \"border-border/80 text-neutral-200 hover:bg-primary/10 hover:text-primary\",\n )}\n >\n {icon && <span className={cn(\"iconify size-4\", icon)} />}\n {label}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Skeleton\n// -----------------------------------------------------------------------------\n\nexport function CategoriesSkeleton({ count = 6 }: { count?: number }) {\n return (\n <div className=\"flex items-center gap-x-2\">\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={i} className=\"h-6 w-16 shrink-0 rounded\" />\n ))}\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { useEventsCategories } from \"./categories.script\";\nimport { CategoriesUI, CategoriesSkeleton } from \"./categories.ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Selection state emitted by the categories widget */\nexport interface CategorySelection {\n /** Selected category name, null when \"Trending\" is selected */\n category: string | null;\n /** Tags to filter by, null when no filter is applied */\n tags: string[] | null;\n}\n\nexport interface CategoriesWidgetProps {\n /**\n * Callback when category / tag selection changes.\n * - `category = null, tags = null` → \"Trending\" is selected (no filter)\n * - `category = \"Politics\", tags = [...]` → category selected with its tags\n */\n onSelect?: (selection: CategorySelection) => void;\n /** Optional class name */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidget({\n onSelect,\n className,\n}: CategoriesWidgetProps) {\n const { data: categories, isLoading } = useEventsCategories();\n\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [selectedTag, setSelectedTag] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (category: string | null) => {\n setSelectedCategory(category);\n setSelectedTag(null); // reset tag when category changes\n\n if (!category) {\n // \"Trending\" selected\n onSelect?.({ category: null, tags: null });\n } else {\n // find the category and emit all its tags\n const cat = categories.find((c) => c.category === category);\n onSelect?.({ category, tags: cat?.tags ?? null });\n }\n },\n [categories, onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tag: string | null) => {\n setSelectedTag(tag);\n\n if (!tag) {\n // deselected tag → fall back to full category\n const cat = categories.find((c) => c.category === selectedCategory);\n onSelect?.({ category: selectedCategory, tags: cat?.tags ?? null });\n } else {\n onSelect?.({ category: selectedCategory, tags: [tag] });\n }\n },\n [categories, selectedCategory, onSelect],\n );\n\n // --- render ---\n\n if (isLoading) {\n return <CategoriesSkeleton />;\n }\n\n // Get the tags for the currently selected category\n const rawTags =\n categories.find((c) => c.category === selectedCategory)?.tags ?? [];\n const activeTags = rawTags.map((t) => ({ label: t }));\n\n return (\n <CategoriesUI\n categories={categories}\n selectedCategory={selectedCategory}\n selectedTag={selectedTag}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n className={className}\n />\n );\n}\n","import { useMemo } from \"react\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useEventsInfiniteQuery, useSeriesQuery } from \"../../hooks\";\nimport type { StandardEvent, EventQueryParams } from \"../../types\";\n\n/**\n * useEvents parameters — extends EventQueryParams (without cursor) with\n * optional category / tags filtering.\n */\nexport interface UseEventsParams extends Omit<EventQueryParams, \"cursor\"> {\n /** Filter events by category (scopes the series lookup when tags is set) */\n category?: string | null;\n /**\n * Filter events by tags.\n * Internally converts tags → matching series tickers, then filters events.\n * Takes precedence over `seriesTickers` when provided.\n */\n tags?: string[] | null;\n}\n\n/**\n * useEvents return value\n */\nexport interface UseEventsResult {\n /** All accumulated events data */\n data: StandardEvent[];\n /** Whether *initial* data is still loading (no cache yet) */\n isLoading: boolean;\n /** Whether any fetch is in-flight (includes refetch / param change, excludes fetchNextPage) */\n isFetching: boolean;\n /** Whether more data is being fetched (infinite scroll) */\n isFetchingMore: boolean;\n /** Whether there is an error */\n isError: boolean;\n /** Error information */\n error: Error | null;\n /** Whether there is more data to load */\n hasMore: boolean;\n /** Fetch more results */\n fetchMore: () => void;\n /** Refetch all pages */\n refetch: () => void;\n}\n\n/**\n * Events list hook with infinite scroll support (cursor-based pagination)\n *\n * Supports filtering by `tags` – internally converts tags into matching series\n * tickers via a series query, then filters events by `seriesTickers`.\n *\n * @example\n * ```tsx\n * const {\n * data,\n * isLoading,\n * hasMore,\n * isFetchingMore,\n * fetchMore,\n * } = useEvents({\n * limit: 20,\n * status: 'active',\n * withNestedMarkets: true,\n * category: 'Politics',\n * tags: ['US Elections'],\n * });\n * ```\n */\nexport function useEvents(params: UseEventsParams = {}): UseEventsResult {\n // --- category / tags → seriesTickers conversion ---\n\n const { category, tags, ...restParams } = params;\n const needsSeriesLookup = !!category || (!!tags && tags.length > 0);\n\n const {\n data: seriesData,\n isFetching: isSeriesFetching,\n isError: isSeriesError,\n error: seriesError,\n } = useSeriesQuery(\n {\n ...(category ? { category } : {}),\n ...(tags && tags.length > 0 ? { tags: tags.join(\",\") } : {}),\n isInitialized: true,\n status: \"active\",\n },\n { enabled: needsSeriesLookup },\n );\n\n const derivedSeriesTickers = useMemo(() => {\n if (!needsSeriesLookup || !seriesData?.series) return undefined;\n\n // dflow API limits seriesTickers to 25\n const tickers = seriesData.series.map((s) => s.ticker).slice(0, 25);\n return tickers.length > 0 ? tickers.join(\",\") : undefined;\n }, [needsSeriesLookup, seriesData]);\n\n // --- build final query params ---\n\n const mergedParams = useMemo<Omit<EventQueryParams, \"cursor\">>(\n () => ({\n status: \"active\",\n withNestedMarkets: true,\n sort: \"volume24h\",\n order: \"desc\",\n limit: DEFAULT_PAGE_SIZE,\n ...restParams,\n ...(derivedSeriesTickers !== undefined\n ? { seriesTickers: derivedSeriesTickers }\n : {}),\n }),\n [restParams, derivedSeriesTickers],\n );\n\n const {\n data: infiniteData,\n isLoading: isEventsLoading,\n isFetching: isEventsFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage: fetchMore,\n refetch,\n } = useEventsInfiniteQuery(mergedParams);\n\n // Flatten all pages into a single events array\n const data = useMemo(\n () => infiniteData?.pages.flatMap((page) => page.events) ?? [],\n [infiniteData],\n );\n\n // If series query errors out, stop resolving to avoid stuck state\n const isSeriesResolving = needsSeriesLookup && !seriesData && !isSeriesError;\n\n // isLoading — true only on *initial* load (no cached data at all)\n // isFetching — true whenever any request is in-flight (param change / refetch), excludes fetchNextPage\n // includes isSeriesFetching so that switching tag shows skeleton even when stale series cache exists\n const isLoading = isSeriesResolving || isEventsLoading;\n const isFetching =\n isSeriesFetching ||\n isSeriesResolving ||\n (isEventsFetching && !isFetchingMore);\n\n return {\n data,\n isLoading,\n isFetching,\n isFetchingMore,\n isError: isSeriesError || isError,\n error: seriesError ?? error,\n hasMore,\n fetchMore,\n refetch,\n };\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { CategoriesSkeleton } from \"../categories/categories.ui\";\n\nexport type EventItemSkeletonProps = {\n className?: string;\n};\n\nexport function EventItemSkeleton({ className }: EventItemSkeletonProps) {\n return (\n <Skeleton\n className={cn(\n \"min-h-52 w-full rounded-xl border border-border/80 lg:min-h-72\",\n className,\n )}\n />\n );\n}\n\nexport type EventsSkeletonProps = {\n count?: number;\n};\n\nexport function EventsSkeleton({ count = 12 }: EventsSkeletonProps) {\n return (\n <div className=\"@container w-full h-full\">\n <div className=\"grid w-full grid-cols-1 gap-4 @[768px]:grid-cols-2 @[1024px]:grid-cols-3 @[1280px]:grid-cols-4\">\n {Array.from({ length: count }).map((_, i) => (\n <EventItemSkeleton key={i} />\n ))}\n </div>\n </div>\n );\n}\n\nexport function EventsPageSkeleton() {\n return (\n <div className=\"flex h-full w-full flex-col gap-y-3\">\n <CategoriesSkeleton />\n <div className=\"min-h-0 flex-1\">\n <EventsSkeleton />\n </div>\n </div>\n );\n}\n","export type GaugeChartUIProps = {\n /** Value between 0 and 100 (cents) */\n value: number;\n /** Whether to show percentage label */\n showLabel?: boolean;\n};\n\nexport function GaugeChartUI({ value, showLabel = true }: GaugeChartUIProps) {\n const normalized = 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={`${normalized * 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 {value.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 { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { GaugeChartUI } from \"./gauge-chart.ui\";\n\nexport type EventItemUIProps = {\n event: StandardEvent;\n onSelect?: (event: StandardEvent) => void;\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nexport function EventItemUI({\n event,\n onSelect,\n onSelectOutcome,\n}: EventItemUIProps) {\n const { t } = useTranslation();\n const [manualSelectedMarket, setManualSelectedMarket] =\n useState<StandardMarket | null>(null);\n\n const rawMarkets = event.markets || [];\n const markets =\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n )\n : rawMarkets;\n const openMarkets = markets.filter((market) => market.status === \"active\");\n\n const isSingleMarket = markets.length === 1;\n const selectedMarket = isSingleMarket ? markets[0] : manualSelectedMarket;\n\n const formattedVolume = useMemo(\n () => formatAmountUSDCompact((event.volume ?? 0) / 100),\n [event.volume],\n );\n\n // Get the yes price in cents (0-100) from the market\n // yesAsk / yesBid are in dollars (0~1), multiply by 100 to get cents\n const getYesCents = (market: StandardMarket): number | null => {\n if (market.yesAsk) return parseFloat(market.yesAsk) * 100;\n return null;\n };\n\n const getNoCents = (market: StandardMarket): number | null => {\n if (market.noAsk) return parseFloat(market.noAsk) * 100;\n return null;\n };\n\n const getYesPercent = (market: StandardMarket): string => {\n const yesCents = getYesCents(market);\n const noCents = getNoCents(market);\n if (yesCents != null) {\n if (noCents == null && yesCents <= 1) return \"< 1%\";\n return formatPercent(yesCents);\n }\n if (noCents != null) {\n if (noCents <= 1) return \"> 99%\";\n return formatPercent(100 - noCents);\n }\n return \"0%\";\n };\n\n const getNoPercent = (market: StandardMarket): string => {\n const yesCents = getYesCents(market);\n const noCents = getNoCents(market);\n if (noCents != null) {\n if (yesCents == null && noCents <= 1) return \"< 1%\";\n return formatPercent(noCents);\n }\n if (yesCents != null) {\n if (yesCents <= 1) return \"> 99%\";\n return formatPercent(100 - yesCents);\n }\n return \"0%\";\n };\n\n // Format cents price as percentage string\n const formatPercent = (cents: number | null): string =>\n cents != null ? `${cents.toFixed(0)}%` : \"--\";\n\n // Determine event status based on market statuses\n const eventStatus = useMemo(() => {\n const hasActiveMarket = markets.some((m) => m.status === \"active\");\n const allClosed = markets.every(\n (m) => m.status === \"closed\" || m.status === \"determined\",\n );\n\n if (allClosed)\n return {\n label: t(\"predict.event.status.closed\"),\n color: \"bg-danger-100/50 text-danger\",\n };\n if (hasActiveMarket)\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 }, [markets, t]);\n\n const handleMarketClick = (market: StandardMarket) => {\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 const displayedMarkets = openMarkets.slice(0, 2);\n const hasMoreMarkets = openMarkets.length > 2;\n\n return (\n <div\n className=\"flex h-full 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 @5xl:gap-y-3 @5xl:p-4\"\n onClick={handleSelect}\n >\n <div className=\"flex w-full flex-1 flex-col gap-y-1.5 @5xl:gap-y-3\">\n {/* Header: image, title, status */}\n <div className=\"flex items-center gap-4\">\n <Avatar\n src={event.imageUrl || 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 @5xl:h-12 @5xl:w-12\"\n />\n <StyledTooltip content={event.title} placement=\"bottom\">\n <p className=\"flex-1 min-w-0 h-10 @5xl:h-12 text-sm font-semibold @5xl:text-base line-clamp-2\">\n {event.title}\n </p>\n </StyledTooltip>\n\n {isSingleMarket ? (\n <GaugeChartUI value={getYesCents(markets[0]) ?? 50} />\n ) : (\n eventStatus.label !== t(\"predict.event.status.live\") && (\n <div\n className={`flex-shrink-0 flex items-center gap-x-2 rounded-lg px-2 py-1 text-sm @5xl:px-4 @5xl: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 @5xl:text-sm line-clamp-1\">\n {selectedMarket.yesSubTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-foreground @5xl:text-lg\">\n {getYesPercent(selectedMarket)}\n </span>\n <ChevronUpIcon className=\"w-3 h-3 text-default-500 @5xl:w-4 @5xl: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 @5xl:gap-y-1 @5xl:text-sm\">\n {displayedMarkets.map((market) => (\n <button\n type=\"button\"\n key={market.ticker}\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 @5xl:text-sm line-clamp-1\">\n {market.yesSubTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-xs text-foreground @5xl:text-base\">\n {getYesPercent(market)}\n </span>\n <div className=\"flex h-full items-center gap-x-3 rounded-lg p-1 @5xl: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 {hasMoreMarkets && (\n <span className=\"text-xxs text-default-500 @5xl:text-xs\">\n {t(\"predict.event.moreMarkets\", {\n count: openMarkets.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 @5xl:text-base ${isSingleMarket ? \"mt-3\" : \"\"}`}\n >\n <Button\n color=\"primary\"\n fullWidth\n className=\"group/yes bg-primary-100 text-primary @3xl:!h-12 @3xl:!text-base\"\n size=\"sm\"\n onPress={handleYesClick}\n >\n <span className=\"group-hover/yes:hidden\">\n {t(\"predict.market.yes\")}\n </span>\n <span className=\"hidden group-hover/yes:inline\">\n {getYesPercent(selectedMarket)}\n </span>\n </Button>\n <Button\n color=\"secondary\"\n fullWidth\n className=\"group/no bg-secondary-100 text-secondary @3xl:!h-12 @3xl:!text-base\"\n size=\"sm\"\n onPress={handleNoClick}\n >\n <span className=\"group-hover/no:hidden\">\n {t(\"predict.market.no\")}\n </span>\n <span className=\"hidden group-hover/no:inline\">\n {getNoPercent(selectedMarket)}\n </span>\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 @5xl: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 @5xl:h-4 @5xl:w-4\" />\n </button>\n <span className=\"text-xxs text-default-600 @5xl:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\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 @5xl:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n handleBack();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3 @5xl:h-4 @5xl:w-4\" />\n <span>{t(\"predict.event.back\")}</span>\n </button>\n )}\n </div>\n );\n}\n","import { useCallback, useRef, type CSSProperties } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { EventItemUI } from \"./event-item.ui\";\n\n// Tailwind viewport breakpoints\nconst SM = 640;\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\n/** Gap between cards in px (matches Tailwind gap-4) */\nconst GAP = 16;\n\n/** Row heights per breakpoint (card height + bottom gap) */\nconst ROW_HEIGHT_XS = 192;\nconst ROW_HEIGHT_SM = 228;\nconst ROW_HEIGHT_LG = 244;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= SM) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n if (width >= MD) return ROW_HEIGHT_SM;\n return ROW_HEIGHT_XS;\n}\n\n// ---------------------------------------------------------------------------\n// EventsUI — virtual grid with infinite loading\n// ---------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n /** Events data to render */\n events: StandardEvent[];\n /** Whether there is more data to load */\n hasMore?: boolean;\n /** Callback to fetch more data */\n onFetchMore?: () => void;\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nexport function EventsUI({\n events,\n hasMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n}: EventsUIProps) {\n // --- container dimensions ---\n const containerRef = useRef<HTMLDivElement>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n // --- layout calculations ---\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const totalRowCount = hasMore ? dataRowCount + 1 : dataRowCount;\n\n // --- infinite loader ---\n const isRowLoaded = useCallback(\n (index: number) => index < dataRowCount,\n [dataRowCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount: totalRowCount,\n threshold: 3,\n });\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n {containerHeight > 0 && (\n <List\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventGridRow}\n rowCount={totalRowCount}\n rowHeight={rowHeight}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n gap: GAP,\n onSelect,\n onSelectOutcome,\n }}\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row component — renders a single row of N columns\n// ---------------------------------------------------------------------------\n\ntype EventGridRowData = {\n events: StandardEvent[];\n columnCount: number;\n dataRowCount: number;\n gap: number;\n onSelect?: (event: StandardEvent) => void;\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nfunction EventGridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n gap,\n onSelect,\n onSelectOutcome,\n}: RowComponentProps<EventGridRowData>) {\n // Loading indicator for the sentinel row beyond loaded data\n if (index >= dataRowCount) {\n return (\n <div style={style} className=\"flex justify-center items-start pt-4\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const startIdx = index * columnCount;\n const rowEvents = events.slice(startIdx, startIdx + columnCount);\n const emptySlots = columnCount - rowEvents.length;\n\n const innerStyle: CSSProperties = {\n display: \"flex\",\n gap,\n height: `calc(100% - ${gap}px)`,\n };\n\n return (\n <div style={style}>\n <div style={innerStyle}>\n {rowEvents.map((event) => (\n <div key={event.ticker} style={{ flex: 1, minWidth: 0 }}>\n <EventItemUI\n event={event}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n </div>\n ))}\n {/* Spacers to keep equal-width columns on the last row */}\n {emptySlots > 0 &&\n Array.from({ length: emptySlots }).map((_, i) => (\n <div key={`spacer-${i}`} style={{ flex: 1, minWidth: 0 }} />\n ))}\n </div>\n </div>\n );\n}\n","import { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { useEvents, type UseEventsParams } from \"./events.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { EventsUI } from \"./events.ui\";\n\nexport interface EventsWidgetProps extends UseEventsParams {\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}\n\nexport function EventsWidget({\n onSelect,\n onSelectOutcome,\n ...queryParams\n}: EventsWidgetProps) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n } = useEvents({ limit: DEFAULT_PAGE_SIZE, ...queryParams });\n\n if (isFetching) {\n return <EventsSkeleton count={DEFAULT_PAGE_SIZE} />;\n }\n\n return (\n <EventsUI\n events={events}\n hasMore={hasMore}\n onFetchMore={fetchMore}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n );\n}\n","import { useState, useCallback } from \"react\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport {\n CategoriesWidget,\n type CategorySelection,\n} from \"../categories/categories.widget\";\nimport { EventsWidget } from \"./events.widget\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageProps {\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({ onSelect, onSelectOutcome }: EventsPageProps) {\n const [selection, setSelection] = useState<CategorySelection>({\n category: null,\n tags: null,\n });\n\n const handleSelect = useCallback((s: CategorySelection) => {\n setSelection(s);\n }, []);\n\n return (\n <div className=\"flex h-full w-full flex-col gap-y-3\">\n {/* Category + tag filter bar */}\n <CategoriesWidget onSelect={handleSelect} />\n\n {/* Events grid */}\n <div className=\"min-h-0 flex-1\">\n <EventsWidget\n category={selection.category}\n tags={selection.tags}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n </div>\n </div>\n );\n}\n","// =============================================================================\n// Categories V2 Script\n//\n// Static data source. Tags are hardcoded from:\n// GET https://dev-prediction-markets-api.dflow.net/api/v1/tags_by_categories\n//\n// Slug logic mirrors mapTag() in prediction-server/internal/strategy/dflow/mapper.go:\n// slug = label (the original label string is used as the slug verbatim)\n//\n// This module is intentionally isolated from the v1 categories.script.ts so\n// the two implementations can coexist while v2 is progressively rolled out.\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// Static data — sourced from DFlow API (2025-03-22)\n// -----------------------------------------------------------------------------\n\n/**\n * Raw API shape from GET /api/v1/tags_by_categories.\n * Category keys map to tag arrays (null when the category has no sub-tags).\n */\nconst RAW_TAGS_BY_CATEGORIES: Record<string, string[] | null> = {\n Weather: [\n \"Daily temperature\",\n \"Snow and rain\",\n \"Climate change\",\n \"Natural disasters\",\n \"Hurricanes\",\n ],\n Companies: [\n \"IPOs\",\n \"Product launches\",\n \"KPIs\",\n \"Elon Musk\",\n \"CEOs\",\n \"Layoffs\",\n ],\n Crypto: [\n \"BTC\",\n \"15 min\",\n \"Hourly\",\n \"ETH\",\n \"SOL\",\n \"DOGE\",\n \"Pre-Market\",\n \"XRP\",\n \"BNB\",\n \"HYPE\",\n ],\n Economics: [\n \"Growth\",\n \"Fed\",\n \"Inflation\",\n \"Oil and energy\",\n \"Employment\",\n \"Housing\",\n \"Jobs & Economy\",\n \"Bankruptcy & Defaults\",\n \"GDP\",\n \"Global Central Banks\",\n ],\n Elections: [\"Primaries\", \"International elections\"],\n Entertainment: [\n \"Music\",\n \"Movies\",\n \"Music charts\",\n \"Television\",\n \"Awards\",\n \"Video games\",\n \"Oscars\",\n \"Rotten Tomatoes\",\n ],\n Financials: [\n \"S&P\",\n \"Nasdaq\",\n \"Daily\",\n \"Metals\",\n \"Treasuries\",\n \"Oil\",\n \"EUR/USD\",\n \"USD/JPY\",\n \"WTI\",\n ],\n Mentions: [\"Politicians\", \"Earnings\", \"Entertainment\"],\n Politics: [\n \"Trump\",\n \"Congress\",\n \"International\",\n \"SCOTUS & courts\",\n \"Local\",\n \"Recurring\",\n \"Iran\",\n \"House\",\n ],\n Science: [\"AI\", \"Energy\", \"Space\"],\n Social: null,\n Sports: [\n \"Soccer\",\n \"Basketball\",\n \"Baseball\",\n \"Football\",\n \"Hockey\",\n \"Golf\",\n \"Tennis\",\n \"Motorsport\",\n \"Esports\",\n \"Boxing\",\n \"MMA\",\n \"Rugby\",\n \"Lacrosse\",\n \"Mentions\",\n \"Chess\",\n \"Cricket\",\n \"Aussie Rules\",\n \"Darts\",\n ],\n World: null,\n};\n\n// -----------------------------------------------------------------------------\n// Preferred display order (matches the DFlow category taxonomy)\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER_V2: string[] = [\n \"Politics\",\n \"Sports\",\n \"Crypto\",\n \"Economics\",\n \"Financials\",\n \"Elections\",\n \"Entertainment\",\n \"Companies\",\n \"Science and Technology\",\n \"Climate and Weather\",\n \"Mentions\",\n \"Social\",\n \"World\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * A single category entry in the v2 navigation model.\n *\n * Slug logic: slug === label (verbatim), matching mapTag() in the prediction\n * server's DFlow strategy. Pass the slug directly to DFlow API filters.\n */\nexport interface CategoryItemV2 {\n /** Category slug — equals the label; use directly as DFlow `category` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Tag entries for this category (empty array when the category has no sub-tags) */\n tags: TagItemV2[];\n}\n\n/** A single tag entry in the v2 navigation model */\nexport interface TagItemV2 {\n /** Tag slug — equals the label; use directly as DFlow `tags` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Derived static data\n// -----------------------------------------------------------------------------\n\n/**\n * Sorted category list derived from the static DFlow API snapshot.\n * Memoised at module level — computed once, never re-created.\n */\nexport const CATEGORIES_V2: CategoryItemV2[] = (() => {\n const orderIndex = (cat: string): number => {\n const idx = CATEGORY_ORDER_V2.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER_V2.length : idx;\n };\n\n return Object.entries(RAW_TAGS_BY_CATEGORIES)\n .map(\n ([label, rawTags]): CategoryItemV2 => ({\n slug: label, // mapTag: slug = label\n label,\n tags: (rawTags ?? []).map((t): TagItemV2 => ({ slug: t, label: t })),\n }),\n )\n .sort((a, b) => orderIndex(a.slug) - orderIndex(b.slug));\n})();\n\n// -----------------------------------------------------------------------------\n// Selection type\n// -----------------------------------------------------------------------------\n\n/**\n * Selection emitted by CategoriesWidgetV2.\n *\n * - `categorySlug = null, tagSlug = null` → \"Trending\" (no filter)\n * - `categorySlug = \"Politics\", tagSlug = null` → category selected, all its tags\n * - `categorySlug = \"Politics\", tagSlug = \"Trump\"` → specific tag selected\n */\nexport interface TagSlugSelection {\n /** Selected category slug (null = Trending / no filter) */\n categorySlug: string | null;\n /** Selected tag slug within the category (null = all tags in the category) */\n tagSlug: string | null;\n}\n","// =============================================================================\n// CategoriesWidgetV2\n//\n// V2 version of the categories navigation widget. Key differences from v1:\n//\n// - Data comes from a static hardcoded snapshot (categories.v2.script.ts)\n// instead of a live API call. This removes the query dependency and makes\n// the widget usable without a backend during the transition period.\n//\n// - Callbacks emit `TagSlugSelection` (categorySlug / tagSlug) instead of\n// the v1 `CategorySelection` (category / tags[]). The slug values follow\n// the DFlow mapTag() convention: slug === label verbatim.\n//\n// - UI layer is shared with v1 (CategoriesUI / CategoriesSkeleton) so visual\n// appearance stays consistent.\n//\n// This file is intentionally isolated from v1 (categories.widget.tsx) to allow\n// both to coexist while v2 is progressively rolled out.\n// =============================================================================\nimport { useState, useCallback } from \"react\";\nimport { CategoriesUI, type CategoryItem, type TagItem } from \"./categories.ui\";\nimport {\n CATEGORIES_V2,\n type CategoryItemV2,\n type TagSlugSelection,\n} from \"./categories.v2.script\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type { TagSlugSelection } from \"./categories.v2.script\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface CategoriesWidgetV2Props {\n /**\n * Callback fired when the category / tag selection changes.\n *\n * Slug values follow the DFlow `mapTag()` convention (slug === label):\n * - `{ categorySlug: null, tagSlug: null }` → \"Trending\" (no filter)\n * - `{ categorySlug: \"Crypto\", tagSlug: null }` → category selected\n * - `{ categorySlug: \"Crypto\", tagSlug: \"BTC\" }` → specific tag selected\n */\n onSelect?: (selection: TagSlugSelection) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Optional class name applied to the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Adapter helpers\n// -----------------------------------------------------------------------------\n\n/** Convert v2 CategoryItemV2[] to the shape expected by CategoriesUI */\nfunction toUICategories(items: CategoryItemV2[]): CategoryItem[] {\n return items.map((c) => ({\n category: c.label,\n tags: c.tags.map((t) => t.label),\n }));\n}\n\nfunction toUITags(cat: CategoryItemV2 | undefined): TagItem[] {\n if (!cat) return [];\n return cat.tags.map((t) => ({\n label: t.label,\n icon: t.icon,\n }));\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidgetV2({\n onSelect,\n trailing,\n className,\n}: CategoriesWidgetV2Props) {\n const [selectedCategorySlug, setSelectedCategorySlug] = useState<\n string | null\n >(null);\n const [selectedTagSlug, setSelectedTagSlug] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (categoryLabel: string | null) => {\n setSelectedCategorySlug(categoryLabel); // slug === label in v2\n setSelectedTagSlug(null);\n\n onSelect?.({\n categorySlug: categoryLabel, // null → \"Trending\"\n tagSlug: null,\n });\n },\n [onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tagLabel: string | null) => {\n setSelectedTagSlug(tagLabel); // slug === label in v2\n\n onSelect?.({\n categorySlug: selectedCategorySlug,\n tagSlug: tagLabel,\n });\n },\n [selectedCategorySlug, onSelect],\n );\n\n // --- derive UI data ---\n\n const uiCategories = toUICategories(CATEGORIES_V2);\n\n const activeCat = CATEGORIES_V2.find((c) => c.slug === selectedCategorySlug);\n const activeTags = toUITags(activeCat);\n\n return (\n <CategoriesUI\n categories={uiCategories}\n selectedCategory={selectedCategorySlug}\n selectedTag={selectedTagSlug}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n trailing={trailing}\n className={className}\n />\n );\n}\n","// =============================================================================\n// EventsFilterV2UI\n//\n// Filter modal for the events list. Contains chip-based filter sections:\n// - Platform (source provider)\n// - Sort By (mirrors the toolbar sort dropdown)\n// - Time Remaining\n// - Min Volume\n// - Min Liquidity\n//\n// Pure presentational component — state is managed by the parent page via\n// a draft-and-apply pattern: the modal works on a draft copy of the filter\n// state, and only commits changes when \"Show Results\" is pressed.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n cn,\n StyledModal,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n RefreshIcon,\n} from \"@liberfi.io/ui\";\nimport type { V2ProviderSource } from \"../../client/v2\";\nimport type { SortPreset } from \"./events-toolbar.v2.ui\";\n\n// -----------------------------------------------------------------------------\n// Filter state type\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterState {\n sortPreset: SortPreset;\n sortAsc: boolean;\n source?: V2ProviderSource;\n timeRemaining?: string;\n minVolume?: string;\n minLiquidity?: string;\n}\n\nexport const DEFAULT_FILTER_STATE: EventsFilterState = {\n sortPreset: \"volume\",\n sortAsc: false,\n source: \"dflow\",\n timeRemaining: undefined,\n minVolume: undefined,\n minLiquidity: undefined,\n};\n\n/** Count how many non-default filters are active (excluding sortPreset) */\nexport function countActiveFilters(state: EventsFilterState): number {\n let count = 0;\n if (state.source) count++;\n if (state.timeRemaining) count++;\n if (state.minVolume) count++;\n if (state.minLiquidity) count++;\n return count;\n}\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterV2UIProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback to close the modal */\n onClose: () => void;\n /** Current committed filter state */\n value: EventsFilterState;\n /** Callback when \"Show Results\" is pressed with the new filter state */\n onChange: (state: EventsFilterState) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsFilterV2UI({\n isOpen,\n onClose,\n value,\n onChange,\n}: EventsFilterV2UIProps) {\n const { t } = useTranslation();\n\n // Draft state — local copy modified by user, committed on \"Show Results\"\n const [draft, setDraft] = useState<EventsFilterState>(value);\n\n // Sync draft when the modal opens with new value\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n setDraft(value);\n } else {\n onClose();\n }\n },\n [value, onClose],\n );\n\n const handleReset = useCallback(() => {\n setDraft(DEFAULT_FILTER_STATE);\n }, []);\n\n const handleApply = useCallback(() => {\n onChange(draft);\n onClose();\n }, [draft, onChange, onClose]);\n\n const updateDraft = useCallback(\n <K extends keyof EventsFilterState>(key: K, val: EventsFilterState[K]) => {\n setDraft((prev) => ({ ...prev, [key]: val }));\n },\n [],\n );\n\n const activeCount = useMemo(() => countActiveFilters(draft), [draft]);\n\n // Pre-translate chip labels so the child component receives plain strings\n const platformOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"polymarket\" as const, label: t(\"predict.platform.polymarket\") },\n { value: \"dflow\" as const, label: t(\"predict.platform.dflow\") },\n ],\n [t],\n );\n\n const timeRemainingOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1d\", label: t(\"predict.filter.lessThanDay\") },\n { value: \"7d\", label: t(\"predict.filter.lessThanWeek\") },\n { value: \"30d\", label: t(\"predict.filter.lessThanMonth\") },\n ],\n [t],\n );\n\n const volumeOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n const liquidityOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n size=\"md\"\n scrollBehavior=\"inside\"\n >\n <ModalContent>\n {/* Header */}\n <ModalHeader className=\"px-4 py-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.filter.title\")}\n </span>\n </ModalHeader>\n\n {/* Body */}\n <ModalBody className=\"flex flex-col gap-5\">\n {/* Platform */}\n <FilterSection label={t(\"predict.filter.platform\")}>\n <FilterChipGroup\n options={platformOptions}\n selected={draft.source}\n onSelect={(v) =>\n updateDraft(\"source\", v as V2ProviderSource | undefined)\n }\n />\n </FilterSection>\n\n {/* Time Remaining */}\n <FilterSection label={t(\"predict.filter.timeRemaining\")}>\n <FilterChipGroup\n options={timeRemainingOptions}\n selected={draft.timeRemaining}\n onSelect={(v) => updateDraft(\"timeRemaining\", v)}\n />\n </FilterSection>\n\n {/* Min Volume */}\n <FilterSection label={t(\"predict.filter.minVolume\")}>\n <FilterChipGroup\n options={volumeOptions}\n selected={draft.minVolume}\n onSelect={(v) => updateDraft(\"minVolume\", v)}\n />\n </FilterSection>\n\n {/* Min Liquidity */}\n <FilterSection label={t(\"predict.filter.minLiquidity\")}>\n <FilterChipGroup\n options={liquidityOptions}\n selected={draft.minLiquidity}\n onSelect={(v) => updateDraft(\"minLiquidity\", v)}\n />\n </FilterSection>\n </ModalBody>\n\n {/* Footer */}\n <ModalFooter className=\"px-4\">\n <div className=\"w-full flex justify-between items-center\">\n <Button\n variant=\"light\"\n color=\"default\"\n size=\"sm\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"predict.filter.reset\")}\n </Button>\n <Button\n color=\"primary\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"predict.filter.showResults\")}\n {activeCount > 0 && (\n <span className=\"ml-1 text-xs opacity-80\">({activeCount})</span>\n )}\n </Button>\n </div>\n </ModalFooter>\n </ModalContent>\n </StyledModal>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Filter section wrapper\n// -----------------------------------------------------------------------------\n\nfunction FilterSection({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"flex flex-col gap-2.5\">\n <span className=\"text-sm font-semibold text-foreground\">{label}</span>\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\ninterface ChipOption {\n value: string | undefined;\n label: string;\n}\n\ninterface FilterChipGroupProps {\n options: ChipOption[];\n selected: string | undefined;\n onSelect: (value: string | undefined) => void;\n allowDeselect?: boolean;\n}\n\nfunction FilterChipGroup({\n options,\n selected,\n onSelect,\n allowDeselect = true,\n}: FilterChipGroupProps) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {options.map((opt) => {\n const isActive = selected === opt.value;\n return (\n <button\n key={opt.value ?? \"__all\"}\n type=\"button\"\n onClick={() => {\n if (isActive && allowDeselect) {\n onSelect(undefined);\n } else {\n onSelect(opt.value);\n }\n }}\n className={cn(\n \"shrink-0 rounded-lg px-3 py-1.5 text-xs font-medium transition-colors duration-150 cursor-pointer border\",\n isActive\n ? \"bg-primary/15 text-primary border-primary/40\"\n : \"bg-content2 text-foreground/60 border-default-100 hover:bg-default-100 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","// =============================================================================\n// EventsToolbarV2UI\n//\n// Toolbar bar between categories and the events grid. Contains:\n// - Sort pill: sort-field dropdown + ascending/descending toggle\n// - Filter button with active-filter badge\n//\n// Pixel-level replica of Jupiter's prediction toolbar.\n// Pure presentational component — state is managed by the parent page.\n// =============================================================================\nimport { useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n CalendarIcon,\n ChartLineIcon,\n cn,\n DropletIcon,\n FilterIcon,\n StyledBadge,\n TimerIcon,\n} from \"@liberfi.io/ui\";\nimport type { V2EventSortField } from \"../../client/v2\";\n\n// -----------------------------------------------------------------------------\n// Sort presets\n// -----------------------------------------------------------------------------\n\nexport type SortPreset = \"start_time\" | \"volume\" | \"liquidity\" | \"ending_soon\";\n\nexport const SORT_PRESETS: Record<SortPreset, { sort_by: V2EventSortField }> = {\n start_time: { sort_by: \"created_at\" },\n volume: { sort_by: \"volume\" },\n liquidity: { sort_by: \"liquidity\" },\n ending_soon: { sort_by: \"end_at\" },\n};\n\nconst SORT_LABEL_KEYS = {\n start_time: \"predict.sort.startTime\",\n volume: \"predict.sort.volume\",\n liquidity: \"predict.sort.liquidity\",\n ending_soon: \"predict.sort.endingSoon\",\n} as const;\n\nconst SORT_ORDER: SortPreset[] = [\n \"start_time\",\n \"volume\",\n \"liquidity\",\n \"ending_soon\",\n];\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsToolbarV2UIProps {\n /** Currently active sort preset */\n sortPreset: SortPreset;\n /** Callback when the user picks a different sort preset */\n onSortChange: (preset: SortPreset) => void;\n /** Current sort direction: true = ascending, false = descending */\n sortAsc: boolean;\n /** Callback when the user toggles the sort direction */\n onSortAscChange: (asc: boolean) => void;\n /** Callback when the filter button is pressed */\n onFilterPress: () => void;\n /** Number of currently active filters (shown as badge count) */\n filterCount?: number;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsToolbarV2UI({\n sortPreset,\n onSortChange,\n sortAsc,\n onSortAscChange,\n onFilterPress,\n filterCount = 0,\n className,\n}: EventsToolbarV2UIProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n const onClickOutside = (e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"mousedown\", onClickOutside);\n document.addEventListener(\"keydown\", onEscape);\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutside);\n document.removeEventListener(\"keydown\", onEscape);\n };\n }, [isOpen]);\n\n const ActiveIcon = SORT_ICONS[sortPreset];\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n {/* Sort pill — dropdown + direction toggle */}\n <div\n ref={dropdownRef}\n className=\"relative flex shrink-0 items-center rounded-full border border-border\"\n >\n {/* Sort field selector */}\n <button\n type=\"button\"\n onClick={() => setIsOpen((v) => !v)}\n className=\"flex shrink-0 items-center gap-2 px-3 py-1.5 text-xs font-medium text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n <ActiveIcon className=\"size-[18px] shrink-0\" />\n <span className=\"whitespace-nowrap\">\n {t(SORT_LABEL_KEYS[sortPreset])}\n </span>\n </button>\n\n {/* Divider */}\n <div className=\"h-6 w-px bg-border\" />\n\n {/* Sort direction toggle */}\n <button\n type=\"button\"\n onClick={() => onSortAscChange(!sortAsc)}\n className=\"px-2.5 py-1.5 text-xs text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n {sortAsc ? \"↑\" : \"↓\"}\n </button>\n\n {/* Dropdown menu */}\n {isOpen && (\n <div className=\"absolute left-0 top-full z-20 mt-1 flex min-w-max flex-col gap-0.5 rounded-lg border border-border bg-content1 p-1 shadow-lg\">\n {SORT_ORDER.map((key) => {\n const Icon = SORT_ICONS[key];\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => {\n onSortChange(key);\n setIsOpen(false);\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded px-2.5 py-1.5 text-xs font-medium transition-colors cursor-pointer\",\n key === sortPreset\n ? \"bg-primary/10 text-primary\"\n : \"text-neutral hover:bg-content2 hover:text-foreground\",\n )}\n >\n <Icon className=\"size-4 shrink-0\" />\n <span>{t(SORT_LABEL_KEYS[key])}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Filter button */}\n <StyledBadge\n content={filterCount > 0 ? filterCount : undefined}\n color=\"primary\"\n size=\"sm\"\n isInvisible={filterCount === 0}\n >\n <button\n type=\"button\"\n onClick={onFilterPress}\n className=\"flex shrink-0 items-center gap-2 rounded-full border border-border px-3 py-1.5 text-xs font-medium text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n <FilterIcon className=\"size-[18px]\" />\n <span className=\"whitespace-nowrap\">{t(\"predict.filter.title\")}</span>\n </button>\n </StyledBadge>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Sort option icon map\n// -----------------------------------------------------------------------------\n\nconst SORT_ICONS: Record<SortPreset, React.FC<{ className?: string }>> = {\n start_time: CalendarIcon,\n volume: ChartLineIcon,\n liquidity: DropletIcon,\n ending_soon: TimerIcon,\n};\n","// =============================================================================\n// Events V2 Script\n//\n// V2 version of the events data hook. Composes:\n//\n// - resolveEventsV2Params() — builds clean API params from user inputs\n// - useEventsV2InfiniteQuery() — cursor-based infinite query (from hooks/v2)\n//\n// This file owns:\n// - UseEventsV2Params interface (accepts TagSlugSelection + UI-facing options)\n// - UseEventsV2Result interface (flat result with fetchMore / hasMore helpers)\n// - Page flattening + null filtering\n//\n// Data fetching and query key logic live in hooks/v2/useEventsV2InfiniteQuery.ts\n// so they can be reused for SSR prefetching.\n// =============================================================================\nimport { useMemo, useCallback } from \"react\";\nimport type {\n V2Event,\n V2ListEventsParams,\n V2Page,\n V2EventSortField,\n V2EventStatus,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport {\n resolveEventsV2Params,\n useEventsV2InfiniteQuery,\n} from \"../../hooks/v2/useEventsV2InfiniteQuery\";\nimport type { TagSlugSelection } from \"../categories/categories.v2.script\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type {\n V2Event,\n V2ListEventsParams,\n V2Page,\n V2EventSortField,\n V2EventStatus,\n V2ProviderSource,\n};\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Parameters for useEventsV2 */\nexport interface UseEventsV2Params {\n /**\n * Category / tag selection from CategoriesWidgetV2.\n *\n * Mapped to `V2ListEventsParams.tag_slug`:\n * - tagSlug is set → use tagSlug\n * - only categorySlug is set → use categorySlug\n * - both null → no filter (Trending)\n */\n tagSlugSelection?: TagSlugSelection | null;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n limit?: number;\n /** Event lifecycle status filter (default: \"open\") */\n status?: V2EventStatus;\n /** Sort field */\n sort_by?: V2EventSortField;\n /** Ascending sort (default: false → descending) */\n sort_asc?: boolean;\n /** Filter by upstream provider (undefined = all providers) */\n source?: V2ProviderSource;\n /** Include nested markets (default: true) */\n with_markets?: boolean;\n}\n\n/** Return value of useEventsV2 — mirrors the UseEventsResult interface from v1 */\nexport interface UseEventsV2Result {\n /** All accumulated V2 events from all loaded pages */\n data: V2Event[];\n /** True only on initial load (no cache yet) */\n isLoading: boolean;\n /** True whenever a request is in-flight (param change / refetch), excludes fetchMore */\n isFetching: boolean;\n /** True while loading additional pages via fetchMore */\n isFetchingMore: boolean;\n /** True when any query errored */\n isError: boolean;\n /** Error instance, or null */\n error: Error | null;\n /** True when more pages are available */\n hasMore: boolean;\n /** Load the next page */\n fetchMore: () => void;\n /** Refetch all pages from the first */\n refetch: () => void;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * V2 events list hook with cursor-based infinite scroll.\n *\n * Uses the prediction-server v2 client (PredictClientV2) directly, avoiding\n * the legacy DFlow series-lookup path that the v1 `useEvents` hook requires.\n *\n * @example\n * ```tsx\n * const { data, isLoading, hasMore, fetchMore } = useEventsV2({\n * tagSlugSelection: { categorySlug: \"Crypto\", tagSlug: \"BTC\" },\n * limit: 20,\n * });\n * ```\n */\nexport function useEventsV2(params: UseEventsV2Params = {}): UseEventsV2Result {\n const baseParams = useMemo<V2ListEventsParams>(\n () => resolveEventsV2Params(params),\n [\n params.tagSlugSelection,\n params.limit,\n params.status,\n params.sort_by,\n params.sort_asc,\n params.source,\n params.with_markets,\n ],\n );\n\n const {\n data: infiniteData,\n isLoading,\n isFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage,\n refetch,\n } = useEventsV2InfiniteQuery(baseParams);\n\n // Flatten all pages into a single events array, filtering out any null items\n // that the server may include (e.g. deleted or not-yet-indexed events).\n const data = useMemo(\n () =>\n infiniteData?.pages\n .flatMap((page) => page.items)\n .filter((item): item is V2Event => item != null) ?? [],\n [infiniteData],\n );\n\n const fetchMore = useCallback(() => {\n void fetchNextPage();\n }, [fetchNextPage]);\n\n const refetchAll = useCallback(() => {\n void refetch();\n }, [refetch]);\n\n return {\n data,\n isLoading,\n isFetching: isFetching && !isFetchingMore,\n isFetchingMore,\n isError,\n error: error ?? null,\n hasMore: hasMore ?? false,\n fetchMore,\n refetch: refetchAll,\n };\n}\n","// =============================================================================\n// EventItemV2UI\n//\n// V2 event card with three modes:\n// 1. **List view** — header + up to 3 outcome rows with a compact Yes/No\n// pill + footer (Show More / volume).\n// 2. **Single view** — header + single market with large Yes/No buy\n// buttons + View Event link.\n// 3. **Expanded view** — header + single market with large Yes/No buy\n// buttons + Back link.\n//\n// Pixel-perfect clone of the Jupiter Prediction Market card design.\n// =============================================================================\nimport { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Avatar,\n ChevronUpIcon,\n cn,\n KalshiIcon,\n Linkable,\n PolymarketIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market, V2ProviderSource } from \"../../client/v2\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport type EventItemV2UIProps = {\n event: V2Event;\n /** URL for the detail page. When set, header / Show More render as links. */\n href?: string;\n /** Custom link component (e.g. next/link). Passed to Linkable. */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: V2Event) => void;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n /** Called when the card is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n};\n\n// -----------------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------------\n\nconst MAX_DISPLAYED_OUTCOMES = 3;\n\n// -----------------------------------------------------------------------------\n// Outcome color scheme — 8-color palette with deterministic hash selection\n// -----------------------------------------------------------------------------\n\ntype OutcomeColor = { bg: string; text: string; shadow: string };\n\nconst C_PRIMARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-primary) / 0.14)\",\n text: \"hsl(var(--heroui-primary))\",\n shadow: \"hsl(var(--heroui-primary) / 0.18)\",\n};\n\nconst C_SECONDARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-secondary) / 0.14)\",\n text: \"hsl(var(--heroui-secondary))\",\n shadow: \"hsl(var(--heroui-secondary) / 0.18)\",\n};\n\nconst C_RED: OutcomeColor = {\n bg: \"rgba(239, 68, 68, 0.14)\",\n text: \"rgb(239, 68, 68)\",\n shadow: \"rgba(239, 68, 68, 0.18)\",\n};\n\nconst TEAM_PALETTE: OutcomeColor[] = [\n {\n bg: \"rgba(139,92,246,0.14)\",\n text: \"rgb(139,92,246)\",\n shadow: \"rgba(139,92,246,0.18)\",\n },\n {\n bg: \"rgba(34,197,94,0.14)\",\n text: \"rgb(34,197,94)\",\n shadow: \"rgba(34,197,94,0.18)\",\n },\n {\n bg: \"rgba(0,166,212,0.14)\",\n text: \"rgb(0,166,212)\",\n shadow: \"rgba(0,166,212,0.18)\",\n },\n {\n bg: \"rgba(194,120,32,0.14)\",\n text: \"rgb(194,120,32)\",\n shadow: \"rgba(194,120,32,0.18)\",\n },\n {\n bg: \"rgba(202,138,4,0.14)\",\n text: \"rgb(202,138,4)\",\n shadow: \"rgba(202,138,4,0.18)\",\n },\n {\n bg: \"rgba(236,72,153,0.14)\",\n text: \"rgb(236,72,153)\",\n shadow: \"rgba(236,72,153,0.18)\",\n },\n {\n bg: \"rgba(99,102,241,0.14)\",\n text: \"rgb(99,102,241)\",\n shadow: \"rgba(99,102,241,0.18)\",\n },\n {\n bg: \"rgba(244,114,82,0.14)\",\n text: \"rgb(244,114,82)\",\n shadow: \"rgba(244,114,82,0.18)\",\n },\n];\n\nfunction hashString(s: string): number {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = ((hash << 5) - hash + s.charCodeAt(i)) | 0;\n }\n return Math.abs(hash);\n}\n\nfunction getOutcomeColors(market: V2Market): [OutcomeColor, OutcomeColor] {\n const labels =\n market.outcomes?.map((o) => o.label?.toLowerCase().trim() ?? \"\") ?? [];\n\n if (labels.some((l) => l === \"up\") && labels.some((l) => l === \"down\")) {\n return [C_PRIMARY, C_RED];\n }\n\n if (labels.some((l) => l === \"yes\") && labels.some((l) => l === \"no\")) {\n return [C_PRIMARY, C_SECONDARY];\n }\n\n const label0 = labels[0] ?? \"\";\n const label1 = labels[1] ?? \"\";\n const idx0 = hashString(label0) % TEAM_PALETTE.length;\n let idx1 = hashString(label1) % TEAM_PALETTE.length;\n if (idx1 === idx0) idx1 = (idx1 + 1) % TEAM_PALETTE.length;\n\n return [TEAM_PALETTE[idx0], TEAM_PALETTE[idx1]];\n}\n\n// -----------------------------------------------------------------------------\n// Price helpers\n// -----------------------------------------------------------------------------\n\nfunction getYesAsk(market: V2Market): number | null {\n const yes = market.outcomes?.[0];\n if (!yes) return null;\n return yes.best_ask ?? yes.price ?? null;\n}\n\nfunction getYesPercent(market: V2Market): number {\n const price = getYesAsk(market);\n return price != null ? Math.round(price * 100) : 0;\n}\n\nfunction formatPercent(value: number): string {\n if (value <= 1 && value > 0) return \"< 1%\";\n if (value >= 99 && value < 100) return \"> 99%\";\n return `${value}%`;\n}\n\nfunction getYesCents(market: V2Market): string {\n const yes = market.outcomes?.[0];\n const price = yes?.best_ask ?? yes?.price ?? 0;\n return (price * 100).toFixed(1);\n}\n\nfunction getNoCents(market: V2Market): string {\n const no = market.outcomes?.[1];\n if (no) {\n const price = no.best_ask ?? no.price ?? 0;\n return Math.round(price * 100).toString();\n }\n const yes = market.outcomes?.[0];\n const yesPrice = yes?.best_ask ?? yes?.price ?? 0;\n return Math.round((1 - yesPrice) * 100).toString();\n}\n\n// -----------------------------------------------------------------------------\n// Countdown helpers\n// -----------------------------------------------------------------------------\n\nfunction formatCountdown(isoDate: string): string | null {\n const diff = new Date(isoDate).getTime() - Date.now();\n if (diff <= 0) return null;\n\n const d = Math.floor(diff / 86_400_000);\n const h = Math.floor((diff % 86_400_000) / 3_600_000);\n const m = Math.floor((diff % 3_600_000) / 60_000);\n\n const parts: string[] = [];\n if (d > 0) parts.push(`${d}d`);\n if (h > 0) parts.push(`${h}h`);\n parts.push(`${m}m`);\n\n return parts.join(\" \");\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nconst injectedCSS = `\n.badge-shine { position: relative; overflow: hidden; }\n.badge-shine::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(120deg,\n transparent 0%, transparent 30%,\n rgba(255,255,255,0.15) 45%, rgba(255,255,255,0.25) 50%,\n rgba(255,255,255,0.15) 55%, transparent 70%, transparent 100%);\n transform: translate(-200%);\n animation: badge-shine-sweep 6s ease-in-out infinite;\n}\n@keyframes badge-shine-sweep {\n 0% { transform: translate(-200%); }\n 60% { transform: translate(200%); }\n 100% { transform: translate(200%); }\n}\n`;\n\nexport function EventItemV2UI({\n event,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n onHover,\n}: EventItemV2UIProps) {\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const rawMarkets = event.markets ?? [];\n const markets = useMemo(\n () =>\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) =>\n (b.outcomes?.[0]?.price ?? 0) - (a.outcomes?.[0]?.price ?? 0),\n )\n : rawMarkets,\n [rawMarkets],\n );\n\n const openMarkets = markets.filter((m) => m.status === \"open\");\n const singleMarket = openMarkets.length === 1;\n const displayedMarkets = openMarkets.slice(0, MAX_DISPLAYED_OUTCOMES);\n const moreCount = openMarkets.length - MAX_DISPLAYED_OUTCOMES;\n\n const formattedVolume = useMemo(() => {\n const vol = Math.round(event.volume ?? 0);\n return `$${vol.toLocaleString(\"en-US\")}`;\n }, [event.volume]);\n\n const expandedMarket = expandedSlug\n ? (openMarkets.find((m) => m.slug === expandedSlug) ?? null)\n : null;\n\n const isExpanded = !!expandedMarket || singleMarket;\n\n // -- handlers --\n\n const handleCardClick = () => {\n if (!isExpanded) {\n onSelect?.(event);\n }\n };\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (expandedMarket) {\n e.preventDefault();\n setExpandedSlug(null);\n }\n };\n\n const handleShowMore = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n return (\n <div\n className={cn(\n \"group flex h-full w-full flex-col rounded-xl\",\n \"min-h-52 border border-border/90 bg-background p-3\",\n \"lg:min-h-72 lg:max-w-md lg:p-4\",\n \"gap-y-1.5 lg:gap-y-4\",\n \"transition duration-300\",\n \"hover:border-primary/40 hover:shadow-card-glow\",\n \"focus-within:border-primary/40 focus-within:shadow-card-glow\",\n !isExpanded && \"cursor-pointer\",\n )}\n onMouseEnter={() => onHover?.(event)}\n onClick={handleCardClick}\n >\n <style>{injectedCSS}</style>\n {/* ---- Header ---- */}\n <CardHeader\n event={event}\n href={href}\n LinkComponent={LinkComponent}\n onClick={handleHeaderClick}\n isExpanded={isExpanded}\n />\n\n {/* ---- Body ---- */}\n <div className=\"flex flex-1 flex-col\">\n {singleMarket ? (\n <SingleMarketView\n market={openMarkets[0]}\n event={event}\n formattedVolume={formattedVolume}\n href={href}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n ) : expandedMarket ? (\n <ExpandedMarketView\n market={expandedMarket}\n event={event}\n onCollapse={() => setExpandedSlug(null)}\n onSelectOutcome={onSelectOutcome}\n />\n ) : (\n <MarketListView\n displayedMarkets={displayedMarkets}\n moreCount={moreCount}\n formattedVolume={formattedVolume}\n source={event.source}\n href={href}\n LinkComponent={LinkComponent}\n onMarketClick={(m) => setExpandedSlug(m.slug)}\n onShowMore={handleShowMore}\n />\n )}\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card header (avatar + title + badges)\n// -----------------------------------------------------------------------------\n\nfunction CardHeader({\n event,\n href,\n LinkComponent,\n onClick,\n isExpanded,\n}: {\n event: V2Event;\n href?: string;\n LinkComponent?: LinkComponentType;\n onClick: React.MouseEventHandler;\n isExpanded: boolean;\n}) {\n const countdown = event.start_at ? formatCountdown(event.start_at) : null;\n\n const cls =\n \"group/header flex items-center gap-x-2 lg:gap-x-4 w-full text-left cursor-pointer\";\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className={cls}\n onClick={onClick}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className=\"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover/header:scale-110 lg:h-12 lg:w-12\"\n classNames={{ base: \"bg-transparent\" }}\n />\n <div className=\"flex min-w-0 flex-1 flex-col justify-center gap-y-0.5\">\n <p\n className={cn(\n \"min-w-0 text-sm font-semibold leading-snug text-slate-200 line-clamp-2 lg:text-base\",\n isExpanded && \"group-hover/header:text-neutral-400\",\n )}\n >\n {event.title}\n </p>\n {countdown && (\n <span className=\"text-[10px] leading-4 text-neutral-500\">\n Live in {countdown}\n </span>\n )}\n </div>\n <EventIndicators event={event} />\n </Linkable>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Event indicator badges (Live / Crypto Countdown / Closed)\n// -----------------------------------------------------------------------------\n\ntype BadgeType =\n | { kind: \"live\" }\n | { kind: \"crypto-short\"; label: string; color: string }\n | { kind: \"closed\" };\n\nfunction getEventBadges(event: V2Event): BadgeType[] {\n const badges: BadgeType[] = [];\n\n if (event.status === \"closed\") {\n badges.push({ kind: \"closed\" });\n return badges.slice(0, 2);\n }\n\n const isCrypto = event.tags?.some((t) => t.label?.toLowerCase() === \"crypto\");\n const isLive = event.tags?.some((t) => t.label?.toLowerCase() === \"live\");\n\n if (isCrypto && event.end_at) {\n const remaining = new Date(event.end_at).getTime() - Date.now();\n const fiveMin = 5 * 60 * 1000;\n const fifteenMin = 15 * 60 * 1000;\n\n if (remaining > 0 && remaining <= fifteenMin) {\n const cryptoColor = remaining <= fiveMin ? \"#ef4444\" : \"#f59e0b\";\n badges.push({\n kind: \"crypto-short\",\n label: remaining <= fiveMin ? \"5m\" : \"15m\",\n color: cryptoColor,\n });\n }\n }\n\n if (isLive) {\n badges.push({ kind: \"live\" });\n }\n\n return badges.slice(0, 2);\n}\n\nfunction EventIndicators({ event }: { event: V2Event }) {\n const badges = useMemo(() => getEventBadges(event), [event]);\n\n if (badges.length === 0) return null;\n\n return (\n <div className=\"flex flex-shrink-0 flex-col items-end gap-1\">\n {badges.map((badge, i) => {\n switch (badge.kind) {\n case \"live\":\n return <LiveBadge key={i} />;\n case \"crypto-short\":\n return (\n <CryptoCountdownBadge\n key={i}\n label={badge.label}\n color={badge.color}\n />\n );\n case \"closed\":\n return <ClosedBadge key={i} />;\n }\n })}\n </div>\n );\n}\n\nfunction LiveBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md bg-[rgb(240,68,56)]/10 px-1.5 py-0.5 text-xs font-semibold text-[rgb(240,68,56)]\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-current\" />\n {t(\"predict.event.status.live\")}\n </span>\n );\n}\n\nfunction CryptoCountdownBadge({\n label,\n color,\n}: {\n label: string;\n color: string;\n}) {\n return (\n <span\n className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md px-1.5 py-0.5 text-xs font-semibold\"\n style={{\n backgroundColor: `${color}26`,\n color,\n }}\n >\n <TimerIcon className=\"size-3 shrink-0\" />\n {label}\n </span>\n );\n}\n\nfunction ClosedBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"inline-flex items-center rounded-md bg-neutral-800/80 px-1.5 py-0.5 text-xs font-semibold text-neutral-400\">\n {t(\"predict.event.status.closed\")}\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Market list view (normal card body)\n// -----------------------------------------------------------------------------\n\nfunction MarketListView({\n displayedMarkets,\n moreCount,\n formattedVolume,\n source,\n href,\n LinkComponent,\n onMarketClick,\n onShowMore,\n}: {\n displayedMarkets: V2Market[];\n moreCount: number;\n formattedVolume: string;\n source: V2ProviderSource;\n href?: string;\n LinkComponent?: LinkComponentType;\n onMarketClick: (market: V2Market) => void;\n onShowMore: React.MouseEventHandler;\n}) {\n const { t } = useTranslation();\n\n return (\n <>\n {displayedMarkets.length > 0 && (\n <div className=\"flex w-full flex-1 flex-col gap-y-0.5 lg:gap-y-2\">\n {displayedMarkets.map((market) => {\n const pct = getYesPercent(market);\n return (\n <button\n type=\"button\"\n key={market.slug}\n className=\"flex 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 onMarketClick(market);\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 line-clamp-1 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <YesNoPill />\n </div>\n </button>\n );\n })}\n </div>\n )}\n\n {/* Footer */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n {moreCount > 0 ? (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-neutral-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={onShowMore}\n >\n {t(\"predict.event.showMore\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n ) : (\n <div />\n )}\n <span className=\"inline-flex items-center gap-x-1.5 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={source} />\n </span>\n </div>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Elevated button (matches Jupiter design exactly)\n// -----------------------------------------------------------------------------\n\nfunction ElevatedButton({\n bgColor,\n textColor,\n shadowColor,\n onClick,\n children,\n}: {\n bgColor: string;\n textColor: string;\n shadowColor: string;\n onClick: React.MouseEventHandler;\n children: React.ReactNode;\n}) {\n const handleEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"2px\");\n el.style.transform = \"translateY(2px)\";\n };\n\n const handleLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"4px\");\n el.style.transform = \"translateY(0px)\";\n };\n\n return (\n <button\n type=\"button\"\n className=\"flex h-12 flex-1 w-full items-center justify-center gap-x-1 overflow-hidden rounded-lg p-3 text-base font-normal hover:cursor-pointer will-change-transform [-webkit-tap-highlight-color:transparent]\"\n style={\n {\n backgroundColor: bgColor,\n color: textColor,\n \"--shadow-color\": shadowColor,\n \"--shadow-offset\": \"4px\",\n boxShadow:\n \"inset 0 -1px 0 rgba(255,255,255,0.08), 0 var(--shadow-offset, 4px) 0 var(--shadow-color, rgba(0,0,0,0.22))\",\n transition: \"transform .12s, box-shadow .12s, opacity .14s\",\n } as React.CSSProperties\n }\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Outcome buy buttons (shared by SingleMarketView & ExpandedMarketView)\n// -----------------------------------------------------------------------------\n\nfunction OutcomeButtons({\n market,\n event,\n onSelectOutcome,\n dynamicColors = false,\n labelFormat = \"action\",\n}: {\n market: V2Market;\n event: V2Event;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n dynamicColors?: boolean;\n /** \"action\" → \"Yes XX.X¢\" / \"No XX¢\", \"label\" → \"Label XX¢\" */\n labelFormat?: \"action\" | \"label\";\n}) {\n const { t } = useTranslation();\n const [c0, c1] = dynamicColors\n ? getOutcomeColors(market)\n : [C_PRIMARY, C_SECONDARY];\n\n const yesLabel =\n labelFormat === \"label\"\n ? `${market.outcomes?.[0]?.label ?? \"Yes\"} ${getYesCents(market)}¢`\n : t(\"predict.market.action.yes\", { price: getYesCents(market) });\n\n const noLabel =\n labelFormat === \"label\"\n ? `${market.outcomes?.[1]?.label ?? \"No\"} ${getNoCents(market)}¢`\n : t(\"predict.market.action.no\", { price: getNoCents(market) });\n\n return (\n <div className=\"flex gap-2\">\n <ElevatedButton\n bgColor={c0.bg}\n textColor={c0.text}\n shadowColor={c0.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"yes\");\n }}\n >\n {yesLabel}\n </ElevatedButton>\n <ElevatedButton\n bgColor={c1.bg}\n textColor={c1.text}\n shadowColor={c1.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"no\");\n }}\n >\n {noLabel}\n </ElevatedButton>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Yes / No pill (compact, used in list rows)\n// -----------------------------------------------------------------------------\n\nfunction YesNoPill() {\n const { t } = useTranslation();\n\n return (\n <span className=\"inline-flex h-7 w-[85px] items-center justify-center gap-x-3 rounded-lg p-1.5 text-xs font-semibold flex-shrink-0 bg-gradient-to-r from-primary/15 to-secondary/15 lg:h-9 lg:w-24 lg:gap-x-4 lg:p-2 lg:text-sm\">\n <span className=\"text-primary\">{t(\"predict.market.yes\")}</span>\n <span className=\"text-neutral-400\">/</span>\n <span className=\"text-secondary\">{t(\"predict.market.no\")}</span>\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market view (only 1 open market — show buttons directly + View Event)\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketView({\n market,\n event,\n formattedVolume,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n}: {\n market: V2Market;\n event: V2Event;\n formattedVolume: string;\n href?: string;\n LinkComponent?: LinkComponentType;\n onSelect?: (event: V2Event) => void;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n const { t } = useTranslation();\n\n const handleViewEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n return (\n <>\n <div className=\"flex-1\">\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n dynamicColors\n labelFormat=\"label\"\n />\n </div>\n\n {/* Footer: View Event + Volume */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-neutral-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={handleViewEvent}\n >\n {t(\"predict.event.viewEvent\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n <span className=\"inline-flex items-center gap-x-1.5 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </div>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market view (single market with large Yes/No buttons)\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketView({\n market,\n event,\n onCollapse,\n onSelectOutcome,\n}: {\n market: V2Market;\n event: V2Event;\n onCollapse: () => void;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n const { t } = useTranslation();\n const pct = getYesPercent(market);\n\n return (\n <>\n <div className=\"flex-1\">\n {/* Market header with collapse toggle */}\n <button\n type=\"button\"\n className=\"flex h-9 w-full items-center justify-between cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-1 flex-shrink-0\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <ChevronUpIcon className=\"h-4 w-4 text-neutral-400\" />\n </div>\n </button>\n\n {/* Yes / No buy buttons */}\n <div className=\"mt-3\">\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n labelFormat=\"action\"\n />\n </div>\n </div>\n\n {/* Back */}\n <button\n type=\"button\"\n className=\"mt-auto flex items-center gap-x-1 pt-4 text-[10px] font-normal text-neutral-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3\" />\n {t(\"predict.event.back\")}\n </button>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Inline icons\n// -----------------------------------------------------------------------------\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M4.5 2.5L8 6l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Source (platform) icons\n// -----------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: V2ProviderSource }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","// =============================================================================\n// EventsV2UI\n//\n// V2 version of the events virtual grid. Accepts `V2Event[]` instead of the\n// legacy `StandardEvent[]`, and delegates card rendering to `EventItemV2UI`.\n//\n// Layout: responsive 1-4 column grid with react-window virtualisation and\n// infinite-scroll sentinel row. Pixel-perfect Jupiter Prediction Market clone.\n// =============================================================================\nimport { useCallback, useRef } from \"react\";\nimport {\n List,\n type ListImperativeAPI,\n type RowComponentProps,\n} from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport { EventItemV2UI } from \"./event-item.v2.ui\";\n\n// Tailwind viewport breakpoints (px)\n// const SM = 640;\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\n/** Extra inset in each card cell so the hover glow shadow is not clipped. */\nconst GLOW_INSET = 8;\n\n/** Row heights per breakpoint: card min-height + gap (16px) */\nconst ROW_HEIGHT_SM = 224; // mobile: 208 + 16\nconst ROW_HEIGHT_LG = 304; // desktop: 288 + 16\n\n/** Height of the end-of-list footer row */\nconst END_ROW_HEIGHT = 114;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= MD) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n return ROW_HEIGHT_SM;\n}\n\n// -----------------------------------------------------------------------------\n// EventsV2UI\n// -----------------------------------------------------------------------------\n\nexport type EventsV2UIProps = {\n /** V2 events to render */\n events: V2Event[];\n /** Whether more data is available */\n hasMore?: boolean;\n /** Callback to request the next page */\n onFetchMore?: () => void;\n /** Callback when a card is selected */\n onSelect?: (event: V2Event) => void;\n /** Callback when an outcome button (yes/no) is pressed */\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n};\n\nexport function EventsV2UI({\n events,\n hasMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsV2UIProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<ListImperativeAPI>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const showEndOfList = !hasMore && events.length > 0;\n const totalRowCount =\n dataRowCount + (hasMore ? 1 : 0) + (showEndOfList ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < dataRowCount,\n [dataRowCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount: totalRowCount,\n threshold: 3,\n });\n\n const handleScrollToTop = useCallback(() => {\n listRef.current?.scrollToRow({ index: 0, behavior: \"smooth\" });\n }, []);\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n {containerHeight > 0 && (\n <List\n listRef={listRef}\n className=\"no-scrollbar\"\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventV2GridRow}\n rowCount={totalRowCount}\n rowHeight={(index) => {\n if (showEndOfList && index === totalRowCount - 1)\n return END_ROW_HEIGHT;\n if (hasMore && index >= dataRowCount) return rowHeight;\n return rowHeight;\n }}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop: handleScrollToTop,\n }}\n />\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Row component\n// -----------------------------------------------------------------------------\n\ntype EventV2GridRowData = {\n events: V2Event[];\n columnCount: number;\n dataRowCount: number;\n showEndOfList: boolean;\n totalRowCount: number;\n onSelect?: (event: V2Event) => void;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n getEventHref?: (event: V2Event) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: V2Event) => void;\n onScrollToTop?: () => void;\n};\n\nfunction EventV2GridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop,\n}: RowComponentProps<EventV2GridRowData>) {\n // End-of-list footer row\n if (showEndOfList && index === totalRowCount - 1) {\n return (\n <div style={style}>\n <EndOfListRow onScrollToTop={onScrollToTop} />\n </div>\n );\n }\n\n // Sentinel row — show spinner while the next page loads\n if (index >= dataRowCount) {\n return (\n <div style={style} className=\"flex justify-center items-start pt-4\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const startIdx = index * columnCount;\n const rowEvents = events.slice(startIdx, startIdx + columnCount);\n const emptySlots = columnCount - rowEvents.length;\n\n return (\n <div style={style}>\n <div className=\"flex w-full h-full\">\n {rowEvents.map((event) =>\n event == null ? null : (\n <div\n className=\"flex-1 min-w-0 flex\"\n key={event.slug}\n style={{ padding: GLOW_INSET }}\n >\n <EventItemV2UI\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n onHover={onHover}\n />\n </div>\n ),\n )}\n {/* Spacers to maintain equal column widths on the last row */}\n {emptySlots > 0 &&\n Array.from({ length: emptySlots }).map((_, i) => (\n <div key={`spacer-${i}`} style={{ flex: 1, minWidth: 0 }} />\n ))}\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// End of list + Back to top\n// -----------------------------------------------------------------------------\n\nfunction EndOfListRow({ onScrollToTop }: { onScrollToTop?: () => void }) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex w-full flex-col items-center justify-center gap-y-4 py-6\">\n {/* Divider line with text */}\n <div className=\"flex w-full items-center justify-center gap-x-4\">\n <div className=\"h-px w-16 bg-neutral-700\" />\n <span className=\"text-xs font-medium text-neutral-500\">\n {t(\"predict.event.endOfList\")}\n </span>\n <div className=\"h-px w-16 bg-neutral-700\" />\n </div>\n\n {/* Back to top button */}\n <button\n type=\"button\"\n className=\"flex cursor-pointer items-center gap-x-1 text-xs font-medium text-neutral-400\"\n onClick={onScrollToTop}\n >\n <span className=\"iconify size-4 ph--arrow-up-bold\" />\n <span>{t(\"predict.event.backToTop\")}</span>\n </button>\n </div>\n );\n}\n","// =============================================================================\n// EventsWidgetV2\n//\n// Container widget that wires useEventsV2 (data) to EventsV2UI (presentation).\n// Replaces EventsWidget (v1) for components that have already migrated to the\n// prediction-server v2 client and CategoriesWidgetV2 slug-based selection.\n//\n// Accepts `tagSlugSelection` (TagSlugSelection from CategoriesWidgetV2) instead\n// of the v1 `category` / `tags[]` pair, keeping the API consistent with the\n// rest of the v2 surface.\n// =============================================================================\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type {\n V2Event,\n V2Market,\n V2EventStatus,\n V2EventSortField,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport type { TagSlugSelection } from \"../categories/categories.v2.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { useEventsV2 } from \"./events.v2.script\";\nimport { EventsV2UI } from \"./events.v2.ui\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type { TagSlugSelection } from \"../categories/categories.v2.script\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsWidgetV2Props {\n /**\n * Category / tag selection from CategoriesWidgetV2.\n * Passed through directly to useEventsV2.\n */\n tagSlugSelection?: TagSlugSelection | null;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n limit?: number;\n /** Event lifecycle status filter (default: \"open\") */\n status?: V2EventStatus;\n /** Sort field */\n sort_by?: V2EventSortField;\n /** Ascending sort order (default: false → descending) */\n sort_asc?: boolean;\n /** Filter by upstream provider (undefined = all providers) */\n source?: V2ProviderSource;\n /** Include nested markets in the response (default: true) */\n with_markets?: boolean;\n /** Callback when an event card is selected */\n onSelect?: (event: V2Event) => void;\n /** Callback when an outcome button (yes/no) is pressed */\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function EventsWidgetV2({\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsWidgetV2Props) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n } = useEventsV2({\n tagSlugSelection,\n limit,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n });\n\n if (isFetching) {\n return <EventsSkeleton count={DEFAULT_PAGE_SIZE} />;\n }\n\n return (\n <EventsV2UI\n events={events}\n hasMore={hasMore}\n onFetchMore={fetchMore}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n );\n}\n","// =============================================================================\n// EventsPageV2\n//\n// V2 version of the events page. Composes:\n// - CategoriesWidgetV2 — category / tag navigation (static data, slug-based)\n// - EventsToolbarV2UI — sort dropdown + filter button\n// - EventsFilterV2UI — filter modal (platform, sort, time, volume, liquidity)\n// - EventsWidgetV2 — events grid backed by the prediction-server v2 client\n//\n// Owns the sort/filter state and converts it to API params for the widget.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport type { TagSlugSelection } from \"../categories/categories.v2.script\";\nimport { CategoriesWidgetV2 } from \"../categories/categories.v2.widget\";\nimport {\n EventsFilterV2UI,\n countActiveFilters,\n DEFAULT_FILTER_STATE,\n type EventsFilterState,\n} from \"./events-filter.v2.ui\";\nimport {\n EventsToolbarV2UI,\n SORT_PRESETS,\n type SortPreset,\n} from \"./events-toolbar.v2.ui\";\nimport { EventsWidgetV2 } from \"./events.v2.widget\";\n\n// Re-export types so page consumers have a single import point.\nexport type { TagSlugSelection } from \"../categories/categories.v2.script\";\nexport type { SortPreset } from \"./events-toolbar.v2.ui\";\nexport type { EventsFilterState } from \"./events-filter.v2.ui\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageV2Props {\n /** Callback when an event card is selected */\n onSelect?: (event: V2Event) => void;\n /** Callback when an outcome button (yes / no) is pressed */\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPageV2({\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsPageV2Props) {\n // Category / tag selection\n const [tagSlugSelection, setTagSlugSelection] = useState<TagSlugSelection>({\n categorySlug: null,\n tagSlug: null,\n });\n\n // Sort / filter state\n const [filterState, setFilterState] =\n useState<EventsFilterState>(DEFAULT_FILTER_STATE);\n\n // Filter modal disclosure\n const {\n isOpen: isFilterOpen,\n onOpen: openFilter,\n onClose: closeFilter,\n } = useDisclosure();\n\n // Handlers\n const handleCategorySelect = useCallback((selection: TagSlugSelection) => {\n setTagSlugSelection(selection);\n }, []);\n\n const handleSortChange = useCallback((preset: SortPreset) => {\n setFilterState((prev) => ({ ...prev, sortPreset: preset }));\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setFilterState((prev) => ({ ...prev, sortAsc: asc }));\n }, []);\n\n const handleFilterChange = useCallback((state: EventsFilterState) => {\n setFilterState(state);\n }, []);\n\n // Derive API sort_by from filter state\n const sortBy = useMemo(\n () => SORT_PRESETS[filterState.sortPreset].sort_by,\n [filterState.sortPreset],\n );\n\n const filterCount = useMemo(\n () => countActiveFilters(filterState),\n [filterState],\n );\n\n const toolbar = (\n <EventsToolbarV2UI\n sortPreset={filterState.sortPreset}\n onSortChange={handleSortChange}\n sortAsc={filterState.sortAsc}\n onSortAscChange={handleSortAscChange}\n onFilterPress={openFilter}\n filterCount={filterCount}\n />\n );\n\n return (\n <div className=\"flex h-full w-full max-w-[1680px] mx-auto flex-col gap-y-3\">\n {/* Navigation: categories + tags (with toolbar trailing the primary row) */}\n <CategoriesWidgetV2 onSelect={handleCategorySelect} trailing={toolbar} />\n\n {/* Filter modal */}\n <EventsFilterV2UI\n isOpen={isFilterOpen}\n onClose={closeFilter}\n value={filterState}\n onChange={handleFilterChange}\n />\n\n {/* Events grid */}\n <div className=\"min-h-0 flex-1\">\n <EventsWidgetV2\n tagSlugSelection={tagSlugSelection}\n sort_by={sortBy}\n sort_asc={filterState.sortAsc}\n source={filterState.source}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useCallback, useEffect, useContext } from \"react\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport { ORDER_MIN_QUANTITY } from \"../../consts\";\nimport { UserPredictContext } from \"../../contexts/UserPredictContext\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport { useOrderQuery, useOrderStatusQuery } from \"../../hooks/useOrderQuery\";\nimport type {\n StandardMarket,\n OrderResponse,\n OrderStatusResponse,\n MarketAccountInfo,\n} from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Trade outcome - yes or no */\nexport type TradeOutcome = \"yes\" | \"no\";\n\n/** Trade side - buy or sell */\nexport type TradeSide = \"buy\" | \"sell\";\n\nexport interface UseTradeFormParams {\n /** Market to trade in */\n market: StandardMarket;\n /** Chain network to use (default: 'solana') */\n chain?: string;\n /** Initial trade outcome */\n initialOutcome?: TradeOutcome;\n /** Initial trade side */\n initialSide?: TradeSide;\n}\n\nexport interface TradeFormValidation {\n isValid: boolean;\n errors: string[];\n}\n\nexport interface UseTradeFormResult {\n // -- State ------------------------------------------------------------------\n /** Current outcome (yes/no) */\n outcome: TradeOutcome;\n /** Current side (buy/sell) */\n side: TradeSide;\n /** Number of contracts */\n quantity: number;\n\n // -- Derived ----------------------------------------------------------------\n /** Number of shares (buy: amount / price, sell: quantity) */\n shares: number;\n /** Estimated cost in dollars */\n estimatedCost: number;\n /** Potential payout in dollars */\n potentialPayout: number;\n /** Potential profit in dollars */\n potentialProfit: number;\n /** Whether the user is authenticated */\n isAuthenticated: boolean;\n /** Best bid price from order book (cents) */\n bestBid: number | null;\n /** Best ask price from order book (cents) */\n bestAsk: number | null;\n /** Current order response from the API (includes quote + transaction) */\n order: OrderResponse | null;\n /** Price impact percentage */\n priceImpact: number | null;\n\n // -- Balances ---------------------------------------------------------------\n /** USDC balance in dollars (for buy side) */\n usdcBalance: number | null;\n /** Outcome token balance in token units (for sell side) */\n outcomeTokenBalance: number | null;\n /** Yes token balance (shares held) */\n yesTokenBalance: number | null;\n /** No token balance (shares held) */\n noTokenBalance: number | null;\n /** Whether balance is being fetched */\n isBalanceLoading: boolean;\n\n // -- Status -----------------------------------------------------------------\n /** Whether order/quote is being fetched */\n isQuoteLoading: boolean;\n /** Whether a transaction is being signed/sent or order is pending */\n isSubmitting: boolean;\n /** Order/quote fetch error (if any) */\n quoteError: Error | null;\n /** Transaction hash after successful send */\n txHash: string | null;\n /** Order status polling result (null before submit or after reset) */\n orderStatus: OrderStatusResponse | null;\n /** Form validation result */\n validation: TradeFormValidation;\n\n // -- Actions ----------------------------------------------------------------\n /** Set outcome */\n setOutcome: (outcome: TradeOutcome) => void;\n /** Set side */\n setSide: (side: TradeSide) => void;\n /** Set quantity (minimum ORDER_MIN_QUANTITY) */\n setQuantity: (quantity: number) => void;\n /** Submit the swap */\n submit: () => void;\n /** Reset form to initial values */\n reset: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get mint address for the specified outcome from market accounts.\n * `accounts` is keyed by collateral token mint (e.g. USDC mint), not by chain.\n */\nfunction getMintAddress(\n accounts: Record<string, MarketAccountInfo>,\n collateralMint: string,\n outcome: TradeOutcome,\n): string | null {\n const accountInfo = accounts[collateralMint];\n if (!accountInfo) return null;\n return outcome === \"yes\" ? accountInfo.yesMint : accountInfo.noMint;\n}\n\nconst USDC_MINT = SOLANA_TOKENS.stablecoins.USDC.address;\n\n/** Fire a celebration confetti burst 🎉 */\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n\n // Center burst\n confetti({\n ...defaults,\n particleCount: 80,\n origin: { x: 0.5, y: 0.4 },\n });\n\n // Left side\n setTimeout(() => {\n confetti({\n ...defaults,\n particleCount: 40,\n origin: { x: 0.3, y: 0.6 },\n });\n }, 150);\n\n // Right side\n setTimeout(() => {\n confetti({\n ...defaults,\n particleCount: 40,\n origin: { x: 0.7, y: 0.6 },\n });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeForm({\n market,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chain: _chain = \"solana\",\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormParams): UseTradeFormResult {\n const { t } = useTranslation();\n\n // USDC balance from predict context (populated by UserPredictProvider)\n const userPredictCtx = useContext(UserPredictContext);\n\n // Auth & wallet from wallet-connector\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n\n // Form state\n const [outcome, setOutcome] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n\n // Get the outcome mint address (accounts are keyed by collateral mint, e.g. USDC)\n const outcomeMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, outcome),\n [market.accounts, outcome],\n );\n\n // Determine input/output mints based on side\n const { inputMint, outputMint } = useMemo(() => {\n if (side === \"buy\") {\n // Buying outcome tokens: USDC -> Outcome Mint\n return { inputMint: USDC_MINT, outputMint: outcomeMint };\n }\n // Selling outcome tokens: Outcome Mint -> USDC\n return { inputMint: outcomeMint, outputMint: USDC_MINT };\n }, [side, outcomeMint]);\n\n // Quote query (enabled only when we have valid mints and quantity)\n const quoteEnabled =\n Boolean(inputMint) && Boolean(outputMint) && quantity > 0;\n\n // Current price per share (0–1, in dollars)\n const pricePerShare = useMemo(() => {\n if (outcome === \"yes\") {\n return Number(market.yesAsk ?? 0.5);\n }\n return Number(market.noAsk ?? 0.5);\n }, [outcome, market.yesAsk, market.noAsk]);\n\n // For buy: quantity = dollar amount → convert to shares\n // For sell: quantity = number of shares\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n return pricePerShare > 0 ? quantity / pricePerShare : 0;\n }\n return quantity;\n }, [side, quantity, pricePerShare]);\n\n // Amount in smallest unit (6 decimals) for the inputMint\n // Buy: inputMint = USDC → amount = dollar amount × 10^6\n // Sell: inputMint = outcome token → amount = shares × 10^6\n const amount = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return Math.round(quantity * 1_000_000);\n }, [quantity]);\n\n // Order query – returns quote data + base64 transaction when userPublicKey is provided\n const {\n data: order,\n isLoading: isQuoteLoading,\n error: quoteError,\n refetch: refetchOrder,\n } = useOrderQuery(\n {\n userPublicKey: userPublicKey ?? undefined,\n inputMint: inputMint ?? \"\",\n outputMint: outputMint ?? \"\",\n amount,\n slippageBps: 100, // 1% slippage\n },\n {\n enabled: quoteEnabled,\n },\n );\n\n // Balances from UserPredictContext (predict-service positions API)\n const usdcBalance = userPredictCtx?.usdcBalance ?? null;\n const isBalanceLoading = userPredictCtx?.isLoading ?? false;\n const refetchBalance = userPredictCtx?.refetch;\n\n // Positions for this market from UserPredictContext\n const positions = userPredictCtx?.positions;\n\n // Outcome token balance (shares the user holds for selected outcome)\n const outcomeTokenBalance = useMemo(() => {\n if (!positions || !outcomeMint) return null;\n const pos = positions.find((p) => p.mint === outcomeMint);\n return pos ? pos.balance : 0;\n }, [positions, outcomeMint]);\n\n // Yes / No token balances (for displaying under each button on sell side)\n const yesMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, \"yes\"),\n [market.accounts],\n );\n const noMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, \"no\"),\n [market.accounts],\n );\n\n const yesTokenBalance = useMemo(() => {\n if (!positions || !yesMint) return null;\n const pos = positions.find((p) => p.mint === yesMint);\n return pos ? pos.balance : 0;\n }, [positions, yesMint]);\n\n const noTokenBalance = useMemo(() => {\n if (!positions || !noMint) return null;\n const pos = positions.find((p) => p.mint === noMint);\n return pos ? pos.balance : 0;\n }, [positions, noMint]);\n\n // Order book query for best bid/ask\n const { data: orderBook } = useOrderBookQuery(market.ticker, {\n refetchInterval: 5000,\n });\n\n // Best bid/ask from order book\n const bestBid = useMemo(() => {\n const bids = outcome === \"yes\" ? orderBook?.yesBids : orderBook?.noBids;\n return bids?.[0]?.price ?? null;\n }, [orderBook, outcome]);\n\n const bestAsk = useMemo(() => {\n const asks = outcome === \"yes\" ? orderBook?.yesAsks : orderBook?.noAsks;\n return asks?.[0]?.price ?? null;\n }, [orderBook, outcome]);\n\n // Price impact from order\n const priceImpact = useMemo(() => {\n if (!order?.priceImpactPct) return null;\n return parseFloat(order.priceImpactPct);\n }, [order]);\n\n // Cost calculation (in dollars)\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (order) {\n // Order inAmount is in lamports (6 decimals), convert to dollars\n return parseInt(order.inAmount) / 1_000_000;\n }\n // Fallback estimate\n if (side === \"buy\") {\n // Buy: user inputs dollar amount, that IS the cost\n return quantity;\n }\n // Sell: shares × bid price\n const bidPrice =\n outcome === \"yes\"\n ? Number(market.yesBid ?? 0)\n : Number(market.noBid ?? 0);\n return quantity * bidPrice;\n }, [order, side, outcome, quantity, market.yesBid, market.noBid]);\n\n // Potential payout (in dollars) if prediction is correct\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n // Each share pays $1 if correct; shares = amount / pricePerShare\n return shares * 1; // shares × $1\n }\n // Selling: receive the premium upfront (estimatedCost is what you get)\n return estimatedCost;\n }, [side, shares, estimatedCost, quantity]);\n\n // Profit = payout - cost (in dollars)\n const potentialProfit = potentialPayout - estimatedCost;\n\n // Side setter – clears quantity on switch\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\n // Quantity setter – allows NaN (empty input)\n const setQuantity = useCallback(\n (v: number) => {\n if (isNaN(v)) {\n setQuantityRaw(NaN);\n return;\n }\n const clamped = Math.max(0, v);\n // Buy side: keep up to 2 decimal places (dollar amount)\n // Sell side: integer only (contracts)\n const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n // Refetch order when quantity changes\n useEffect(() => {\n if (quoteEnabled) {\n refetchOrder();\n }\n }, [quantity, outcome, side, quoteEnabled, refetchOrder]);\n\n // Validation – form-level checks including balance, auth is handled by useAuthCallback\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n\n if (market.status !== \"active\") {\n errors.push(\"Market is not active\");\n }\n\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(\"Insufficient USDC balance\");\n }\n\n // Balance check: sell side requires enough shares\n if (\n side === \"sell\" &&\n outcomeTokenBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > outcomeTokenBalance\n ) {\n errors.push(\"Insufficient shares\");\n }\n\n return { isValid: errors.length === 0, errors };\n }, [quantity, market.status, side, usdcBalance, outcomeTokenBalance]);\n\n // Transaction hash after successful send\n const [txHash, setTxHash] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n // Signature currently being polled for order status (cleared on terminal state)\n const [pendingTxSignature, setPendingTxSignature] = useState<string | null>(\n null,\n );\n\n // Poll order status until terminal state\n const { data: orderStatusData } = useOrderStatusQuery(\n { signature: pendingTxSignature ?? \"\" },\n { enabled: !!pendingTxSignature },\n );\n\n // React to terminal order status\n useEffect(() => {\n if (!orderStatusData || !pendingTxSignature) return;\n\n const { status } = orderStatusData;\n\n if (status === \"closed\") {\n setIsSubmitting(false);\n setPendingTxSignature(null);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n setQuantityRaw(NaN);\n refetchBalance?.();\n } else if (status === \"failed\" || status === \"expired\") {\n setIsSubmitting(false);\n setPendingTxSignature(null);\n toast.error(t(\"predict.trade.submitError\"));\n }\n }, [orderStatusData, pendingTxSignature, refetchBalance, t]);\n\n // Submit: get order (with transaction) → sign → send → poll status\n const submit = useCallback(async () => {\n if (\n !validation.isValid ||\n !isAuthenticated ||\n !userPublicKey ||\n !solanaWallet ||\n isBalanceLoading\n ) {\n console.warn(\"[TradeForm] submit blocked by guard:\", {\n validationFailed: !validation.isValid,\n notAuthenticated: !isAuthenticated,\n noPublicKey: !userPublicKey,\n noWallet: !solanaWallet,\n balanceLoading: isBalanceLoading,\n });\n return;\n }\n\n setTxHash(null);\n setPendingTxSignature(null);\n setIsSubmitting(true);\n\n try {\n // Use cached order or fetch a fresh one\n let currentOrder = order;\n if (!currentOrder?.transaction) {\n console.warn(\"[TradeForm] no cached order with tx, refetching…\");\n const result = await refetchOrder();\n currentOrder = result.data;\n }\n\n if (!currentOrder?.transaction) {\n console.error(\n \"[TradeForm] unable to obtain order transaction, aborting\",\n );\n setIsSubmitting(false);\n return;\n }\n\n // Decode the base64-encoded transaction\n const txBytes = Uint8Array.from(atob(currentOrder.transaction), (c) =>\n c.charCodeAt(0),\n );\n\n // Sign and send — returns base58-encoded transaction signature\n const signature = await solanaWallet.sendTransaction(txBytes);\n console.warn(\"[TradeForm] transaction sent:\", signature);\n setTxHash(signature);\n\n // Poll order status with the signature until terminal state\n setPendingTxSignature(signature);\n } catch (err) {\n console.error(\"[TradeForm] submit failed:\", err);\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n userPublicKey,\n solanaWallet,\n order,\n isBalanceLoading,\n refetchOrder,\n t,\n ]);\n\n // Reset\n const reset = useCallback(() => {\n setOutcome(initialOutcome);\n setSideRaw(initialSide);\n setQuantityRaw(NaN);\n setTxHash(null);\n setPendingTxSignature(null);\n setIsSubmitting(false);\n }, [initialOutcome, initialSide]);\n\n return {\n outcome,\n side,\n quantity,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n isAuthenticated,\n bestBid,\n bestAsk,\n order: order ?? null,\n priceImpact,\n usdcBalance,\n outcomeTokenBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isQuoteLoading,\n isSubmitting,\n quoteError: quoteError ?? null,\n txHash,\n orderStatus: orderStatusData ?? null,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n reset,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, Tabs, Tab, StyledNumberInput } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport type { TradeSide, TradeOutcome } from \"./trade-form.script\";\n\nconst USDC_LOGO = `https://s1.chainstream.io/chains/sol/tokens/${SOLANA_TOKENS.stablecoins.USDC.address}/image.png`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeFormUIProps {\n /** Event data */\n event?: StandardEvent;\n /** Market data */\n market: StandardMarket;\n /** Current outcome */\n outcome: TradeOutcome;\n /** Current side */\n side: TradeSide;\n /** Number of contracts */\n quantity: number;\n /** Estimated cost in cents */\n estimatedCost: number;\n /** Potential payout in cents */\n potentialPayout: number;\n /** Potential profit in cents */\n potentialProfit: number;\n /** Whether swap is being submitted */\n isSubmitting: boolean;\n /** USDC balance in dollars (null if not loaded) */\n usdcBalance: number | null;\n /** Yes token balance (shares held, for sell side) */\n yesTokenBalance: number | null;\n /** No token balance (shares held, for sell side) */\n noTokenBalance: number | null;\n /** Whether balance is loading */\n isBalanceLoading: boolean;\n /** Whether the form is valid */\n isValid: boolean;\n /** Validation error messages */\n validationErrors: string[];\n /** Set outcome */\n onOutcomeChange: (outcome: TradeOutcome) => void;\n /** Set side */\n onSideChange: (side: TradeSide) => void;\n /** Set quantity */\n onQuantityChange: (quantity: number) => void;\n /** Submit swap */\n onSubmit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeFormUI({\n event,\n market,\n outcome,\n side,\n quantity,\n potentialProfit,\n estimatedCost,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n isValid,\n onOutcomeChange,\n onSideChange,\n onQuantityChange,\n onSubmit,\n}: TradeFormUIProps) {\n const { t } = useTranslation();\n\n // Button label\n const submitLabel = useMemo(() => {\n if (isSubmitting) return t(\"predict.trade.submitting\");\n const sideLabel =\n side === \"buy\" ? t(\"predict.trade.buy\") : t(\"predict.trade.sell\");\n const outcomeLabel =\n outcome === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\");\n return `${sideLabel} ${outcomeLabel}`;\n }, [isSubmitting, side, outcome, t]);\n\n // Button color\n const submitColor = useMemo(() => {\n return outcome === \"yes\" ? \"primary\" : \"secondary\";\n }, [outcome]);\n\n return (\n <div className=\"flex w-full flex-col gap-y-4 rounded-xl border border-default-200 bg-content1 p-4\">\n {/* Event title bar */}\n {event && (\n <div className=\"flex items-center gap-x-3\">\n {event.imageUrl && (\n <img\n src={event.imageUrl}\n alt={event.title}\n className=\"h-10 w-10 shrink-0 rounded-lg object-cover\"\n />\n )}\n <div className=\"flex min-w-0 flex-col gap-y-0.5\">\n <span className=\"text-sm text-neutral-500 leading-tight line-clamp-1\">\n {event.title}\n </span>\n <span className=\"text-base font-semibold leading-tight line-clamp-1\">\n <span\n className={outcome === \"yes\" ? \"text-bullish\" : \"text-bearish\"}\n >\n {side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}{\" \"}\n {outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n <span className=\"text-foreground\">\n {\" · \"}\n {outcome === \"yes\" ? market.yesSubTitle : market.noSubTitle}\n </span>\n </span>\n </div>\n </div>\n )}\n\n {/* Side tabs: Buy / Sell */}\n <Tabs\n variant=\"underlined\"\n selectedKey={side}\n onSelectionChange={(key) => onSideChange(key as TradeSide)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"buy\" title={t(\"predict.trade.buy\")} />\n <Tab key=\"sell\" title={t(\"predict.trade.sell\")} />\n </Tabs>\n\n {/* Outcome: Yes / No */}\n <div className=\"flex gap-x-2\">\n {([\"yes\", \"no\"] as TradeOutcome[]).map((o) => {\n const holdingBalance = o === \"yes\" ? yesTokenBalance : noTokenBalance;\n return (\n <div key={o} className=\"flex flex-1 flex-col gap-y-1\">\n <button\n type=\"button\"\n onClick={() => onOutcomeChange(o)}\n className={`w-full rounded-lg border py-2 text-sm font-medium transition-colors cursor-pointer ${\n outcome === o\n ? o === \"yes\"\n ? \"border-primary bg-primary-50 text-primary\"\n : \"border-secondary bg-secondary-50 text-secondary\"\n : \"border-default-400 text-foreground hover:border-default-500\"\n }`}\n >\n <span>\n {o === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\")}\n </span>\n {(() => {\n const price =\n side === \"buy\"\n ? o === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : o === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? (\n <span className=\"ml-1 opacity-70\">\n {Math.round(Number(price) * 100)}¢\n </span>\n ) : null;\n })()}\n </button>\n {/* Holdings display (sell side, selected outcome only) */}\n {side === \"sell\" && outcome === o && (\n <span className=\"text-center text-xs text-foreground\">\n {isBalanceLoading ? \"–\" : `${holdingBalance ?? 0} shares`}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {side === \"buy\" && (\n <div className=\"flex items-center justify-end gap-x-1 text-xs text-default-500\">\n <img\n src={USDC_LOGO}\n alt=\"USDC\"\n className=\"h-4 w-4 rounded-full object-cover\"\n />\n <span>{t(\"predict.trade.balance\")}:</span>\n <span className=\"font-medium text-foreground\">\n {usdcBalance != null ? `$${usdcBalance.toFixed(2)}` : \"–\"}\n </span>\n </div>\n )}\n\n {/* Amount / Shares input */}\n <div className=\"flex flex-col gap-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.amount\")\n : t(\"predict.trade.contracts\")}\n </span>\n <StyledNumberInput\n key={side}\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n value={isNaN(quantity) ? undefined : quantity}\n onValueChange={(v) => {\n onQuantityChange(v);\n }}\n minValue={0}\n step={side === \"buy\" ? 0.01 : 1}\n formatOptions={\n side === \"buy\"\n ? { maximumFractionDigits: 2 }\n : { maximumFractionDigits: 0 }\n }\n startContent={\n side === \"buy\" ? (\n <span className=\"text-default-600 text-xl\">$</span>\n ) : undefined\n }\n classNames={{\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 h-14 min-h-14\",\n input: \"text-lg\",\n }}\n />\n\n {/* Quick amount buttons */}\n <div className=\"flex gap-x-2 justify-end\">\n {side === \"buy\" ? (\n <>\n {[1, 5, 10, 100].map((amt) => (\n <button\n key={amt}\n type=\"button\"\n onClick={() =>\n onQuantityChange(\n Math.round(\n ((isNaN(quantity) ? 0 : quantity) + amt) * 100,\n ) / 100,\n )\n }\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n +{amt}$\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n /* TODO: set to max balance */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </>\n ) : (\n <>\n {[25, 50].map((pct) => (\n <button\n key={pct}\n type=\"button\"\n onClick={() => {\n /* TODO: set to pct% of holdings */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {pct}%\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n /* TODO: set to max holdings */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Payout / Receive display */}\n {!isNaN(quantity) && quantity > 0 && (\n <div className=\"flex flex-col items-end gap-y-0.5\">\n <span className=\"text-sm text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.potentialWin\")\n : t(\"predict.trade.estimatedReceive\")}\n </span>\n <span className=\"text-xl font-semibold text-bullish\">\n ${(side === \"buy\" ? potentialProfit : estimatedCost).toFixed(2)}\n </span>\n </div>\n )}\n\n {/* Submit button */}\n <Button\n color={submitColor as \"primary\" | \"secondary\" | \"default\"}\n fullWidth\n radius=\"lg\"\n size=\"lg\"\n isDisabled={!isValid || isSubmitting}\n isLoading={isSubmitting}\n onPress={onSubmit}\n >\n {submitLabel}\n </Button>\n </div>\n );\n}\n","import { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport {\n useTradeForm,\n type TradeSide,\n type TradeOutcome,\n} from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormWidgetProps {\n /** Event data */\n event?: StandardEvent;\n /** Market to trade */\n market: StandardMarket;\n /** Initial trade side */\n initialSide?: TradeSide;\n /** Initial trade outcome */\n initialOutcome?: TradeOutcome;\n /** Chain network (default: 'solana') */\n chain?: string;\n}\n\nexport function TradeFormWidget({\n event,\n market,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormWidgetProps) {\n const {\n outcome,\n side,\n quantity,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n } = useTradeForm({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n // Wrap submit with auth check — triggers sign-in if not authenticated\n const authenticatedSubmit = useAuthCallback(submit);\n\n return (\n <TradeFormUI\n event={event}\n market={market}\n outcome={outcome}\n side={side}\n quantity={quantity}\n estimatedCost={estimatedCost}\n potentialPayout={potentialPayout}\n potentialProfit={potentialProfit}\n usdcBalance={usdcBalance}\n yesTokenBalance={yesTokenBalance}\n noTokenBalance={noTokenBalance}\n isBalanceLoading={isBalanceLoading}\n isSubmitting={isSubmitting}\n isValid={validation.isValid}\n validationErrors={validation.errors}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onQuantityChange={setQuantity}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\n/** Repeatable skeleton row for market list */\nfunction MarketRow() {\n return (\n <div className=\"flex items-center gap-x-3 px-2 py-3 lg:gap-x-4\">\n <Skeleton className=\"h-4 flex-1 rounded-md\" />\n <Skeleton className=\"h-5 w-10 shrink-0 rounded-md\" />\n <div className=\"flex gap-x-2\">\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n </div>\n </div>\n );\n}\n\nexport interface EventDetailSkeletonProps {\n /** Number of market rows */\n marketCount?: number;\n}\n\nexport function EventDetailSkeleton({\n marketCount = 4,\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 animate-pulse\">\n {/* Header: avatar + title */}\n <div className=\"flex items-center gap-x-3 lg:gap-x-4\">\n <Skeleton className=\"h-14 w-14 shrink-0 rounded-lg lg:h-18 lg:w-18\" />\n <div className=\"flex flex-col gap-y-1.5 min-w-0 flex-1\">\n <Skeleton className=\"h-3 w-24 rounded-md lg:w-32\" />\n <Skeleton className=\"h-5 w-48 rounded-md lg:h-6 lg:w-72\" />\n </div>\n </div>\n\n {/* Chart placeholder */}\n <Skeleton className=\"h-[200px] w-full rounded-xl lg:h-[280px]\" />\n\n {/* Volume + range bar */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-3 w-32 rounded-md\" />\n <div className=\"flex gap-x-1\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton key={i} className=\"h-7 w-10 rounded-md\" />\n ))}\n </div>\n </div>\n\n {/* Market rows */}\n <div className=\"flex flex-col divide-y divide-default-200\">\n {Array.from({ length: marketCount }).map((_, i) => (\n <MarketRow key={i} />\n ))}\n </div>\n </div>\n );\n}\n\n/** Compact skeleton for the sidebar trade form area */\nexport function TradeFormSkeleton() {\n return (\n <div className=\"flex w-full flex-col gap-y-4 rounded-xl border border-default-200 bg-content1 p-4 animate-pulse\">\n {/* Header */}\n <div className=\"flex items-center gap-x-3\">\n <Skeleton className=\"h-10 w-10 shrink-0 rounded-lg\" />\n <div className=\"flex flex-col gap-y-1 flex-1\">\n <Skeleton className=\"h-3 w-28 rounded-md\" />\n <Skeleton className=\"h-4 w-40 rounded-md\" />\n </div>\n </div>\n {/* Tabs */}\n <div className=\"flex gap-x-4\">\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n </div>\n {/* Outcome buttons */}\n <div className=\"flex gap-x-2\">\n <Skeleton className=\"h-10 flex-1 rounded-lg\" />\n <Skeleton className=\"h-10 flex-1 rounded-lg\" />\n </div>\n {/* Input */}\n <Skeleton className=\"h-14 w-full rounded-lg\" />\n {/* Submit */}\n <Skeleton className=\"h-12 w-full rounded-lg\" />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n DEFAULT_CHART_RANGE,\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n type ChartRangeType,\n} from \"../../consts\";\nimport { useEventByIdQuery } from \"../../hooks/useEventByIdQuery\";\nimport { usePredictClient } from \"../../hooks/usePredictClient\";\nimport {\n marketCandlesticksQueryKey,\n fetchMarketCandlesticks,\n} from \"../../hooks/usePriceHistoryQuery\";\nimport { useSeriesByTickerQuery } from \"../../hooks/useSeriesQuery\";\nimport type { CandlesticksResponse } from \"../../types\";\n\nexport interface UseEventDetailParams {\n eventId: string;\n /** Market tickers to query candlesticks for. Default is first 4 markets of the event, max is 4. */\n candlestickMarketTickers?: string[];\n /** Chart time range (1d / 1w / 1m / all). Determines both the query window and candlestick granularity. */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetail = (params: UseEventDetailParams) => {\n const { candlestickMarketTickers, chartRange = DEFAULT_CHART_RANGE } = params;\n\n // Derive candlestick granularity and query time window from chart range\n const candlestickPeriodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n // Stabilise endTs so it doesn't change on every render; recompute when range changes\n const candlestickEndTs = useMemo(\n () => Math.floor(Date.now() / 1000),\n [chartRange],\n );\n\n const client = usePredictClient();\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEventByIdQuery({ id: params.eventId, withNestedMarkets: true });\n\n // For ALL range, start from the earliest market openTime; otherwise use duration offset\n const candlestickStartTs = useMemo(() => {\n if (rangeDuration != null) return candlestickEndTs - rangeDuration;\n // Find the earliest openTime across all markets\n const markets = event?.markets;\n if (!markets?.length) return candlestickEndTs;\n return Math.min(...markets.map((m) => m.openTime));\n }, [candlestickEndTs, rangeDuration, event?.markets]);\n\n const {\n data: series,\n isLoading: isSeriesLoading,\n error: seriesError,\n } = useSeriesByTickerQuery(event?.seriesTicker ?? \"\", {\n enabled: !!event?.seriesTicker,\n });\n\n // Build a list of market tickers to fetch candlesticks for\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n const markets =\n candlestickMarketTickers && candlestickMarketTickers.length > 0\n ? candlestickMarketTickers\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((ticker) => event.markets!.find((m) => m.ticker === ticker))\n .filter((m) => m !== undefined)\n : [...event.markets]\n .sort((a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.ticker);\n }, [candlestickMarketTickers, event?.markets]);\n\n // Query candlesticks for each market in parallel\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((ticker) => ({\n queryKey: marketCandlesticksQueryKey({\n ticker,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n queryFn: () =>\n fetchMarketCandlesticks(client, {\n ticker,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n enabled: marketsToQuery.length > 0,\n })),\n });\n\n const isCandlesticksLoading = candlestickQueries.some((q) => q.isLoading);\n\n const candlestickErrors = useMemo(() => {\n const errors = new Map<string, Error>();\n marketsToQuery.forEach((ticker, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) {\n errors.set(ticker, error);\n }\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n // Build a map of ticker -> candlesticks\n const candlesticks = useMemo(() => {\n const map = new Map<string, CandlesticksResponse>();\n marketsToQuery.forEach((ticker, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) {\n map.set(ticker, data);\n }\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n series,\n isSeriesLoading,\n seriesError,\n /** Derived candlestick granularity (for chart formatting) */\n periodInterval: candlestickPeriodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n","import { useMemo } from \"react\";\nimport { useWalletPortfoliosQuery } from \"@liberfi.io/react\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport type { StandardMarket } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MarketHolding {\n /** Number of Yes outcome shares held */\n yesShares: number;\n /** Number of No outcome shares held */\n noShares: number;\n}\n\n/** Map of market ticker → holdings */\nexport type MarketsHoldingsMap = Map<string, MarketHolding>;\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nconst USDC_MINT = SOLANA_TOKENS.stablecoins.USDC.address;\n\n/**\n * Fetches wallet portfolio and computes Yes / No token holdings\n * for each market. React Query deduplicates the wallet query\n * automatically.\n */\nexport function useMarketsHoldings(markets: StandardMarket[]): {\n holdings: MarketsHoldingsMap;\n isLoading: boolean;\n} {\n const { status } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = status === \"authenticated\";\n const address = solanaWallet?.address;\n\n const { data: walletPortfolios, isLoading } = useWalletPortfoliosQuery(\n { chain: Chain.SOLANA, address: address ?? \"\" },\n {\n enabled: isAuthenticated && Boolean(address),\n refetchInterval: 10_000,\n },\n );\n\n const holdings = useMemo<MarketsHoldingsMap>(() => {\n const map = new Map<string, MarketHolding>();\n if (!walletPortfolios?.portfolios || markets.length === 0) return map;\n\n // Build a lookup: mint address → token amount\n const balanceByMint = new Map<string, number>();\n for (const p of walletPortfolios.portfolios) {\n balanceByMint.set(p.address, parseFloat(p.amount));\n }\n\n for (const market of markets) {\n const accountInfo = market.accounts[USDC_MINT];\n if (!accountInfo) continue;\n\n const yesShares = balanceByMint.get(accountInfo.yesMint) ?? 0;\n const noShares = balanceByMint.get(accountInfo.noMint) ?? 0;\n\n if (yesShares > 0 || noShares > 0) {\n map.set(market.ticker, { yesShares, noShares });\n }\n }\n\n return map;\n }, [walletPortfolios, markets]);\n\n return { holdings, isLoading };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n CHART_RANGE_SAMPLE_INTERVAL,\n ChartRange,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { StandardMarket, CandlesticksResponse } from \"../../types\";\n\n// Breathing dot rendered at the last data point of each line\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction BreathingDot(props: any) {\n const { cx, cy, index, dataLength, stroke } = props;\n if (index !== dataLength - 1 || cx == null || cy == null) return null;\n\n return (\n <g>\n {/* Pulsing outer ring */}\n <circle cx={cx} cy={cy} r={6} fill={stroke} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;8;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.1;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n {/* Solid inner dot */}\n <circle cx={cx} cy={cy} r={3} fill={stroke} />\n </g>\n );\n}\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 chart range\nfunction formatTimestamp(\n timestamp: number,\n chartRange: ChartRangeType,\n): string {\n const date = new Date(timestamp * 1000);\n\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n // Show time: \"14:30\"\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ONE_WEEK:\n case ChartRange.ONE_MONTH:\n // Show date with time: \"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 ChartRange.ALL:\n default:\n // Show date only: \"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 EventCandlesticksProps {\n /** Map of market ticker to candlestick data */\n candlesticks?: Map<string, CandlesticksResponse>;\n /** Markets to display (used for labels) */\n markets?: StandardMarket[];\n /** Loading state */\n isLoading?: boolean;\n /** Chart time range (determines X-axis formatting) */\n chartRange?: ChartRangeType;\n /** Callback when hovered data changes */\n onDataChange?: (data: CurrentMarketData | null) => void;\n}\n\n// Transform candlesticks into chart data with sampling\nfunction transformCandlesticks(\n candlesticks: Map<string, CandlesticksResponse>,\n marketTickers: string[],\n chartRange: ChartRangeType,\n): MarketDataPoint[] {\n const sampleInterval = CHART_RANGE_SAMPLE_INTERVAL[chartRange];\n\n // Build per-market timestamp → value maps (using end_period_ts directly)\n const perMarketMaps: Map<string, Map<number, number>> = new Map();\n\n candlesticks.forEach((response, marketTicker) => {\n const map = new Map<number, number>();\n const points = response.candlesticks ?? [];\n points.forEach((point) => {\n // Align to sample interval boundary, keep the last value per bucket\n const bucket =\n point.end_period_ts - (point.end_period_ts % sampleInterval);\n map.set(bucket, point.yes_ask.close);\n });\n perMarketMaps.set(marketTicker, map);\n });\n\n // Collect all unique sampled timestamps (union across all markets)\n const allTimestamps = new Set<number>();\n for (const map of perMarketMaps.values()) {\n for (const ts of map.keys()) {\n allTimestamps.add(ts);\n }\n }\n\n // Sort timestamps\n const sortedTimestamps = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Create data points for all timestamps, forward-filling missing values\n const lastValues = new Map<string, number>();\n\n return sortedTimestamps.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 marketTickers.forEach((marketTicker) => {\n const value = perMarketMaps.get(marketTicker)?.get(timestamp);\n if (value !== undefined) {\n dataPoint[marketTicker] = Math.round(value * 100) / 100;\n lastValues.set(marketTicker, dataPoint[marketTicker] as number);\n } else {\n // Use the most recent previous value if available, otherwise leave empty\n const lastValue = lastValues.get(marketTicker);\n if (lastValue !== undefined) {\n dataPoint[marketTicker] = lastValue;\n }\n }\n });\n\n return dataPoint;\n });\n}\n\nexport function EventCandlesticks({\n candlesticks,\n markets = [],\n isLoading,\n chartRange = ChartRange.ALL,\n onDataChange,\n}: EventCandlesticksProps) {\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 tickers that have candlestick data\n const marketTickers = useMemo(() => {\n if (!candlesticks) return [];\n return Array.from(candlesticks.keys()).slice(0, 4); // Max 4 markets\n }, [candlesticks]);\n\n // Transform data for chart\n const chartData = useMemo(() => {\n if (!candlesticks || candlesticks.size === 0) return [];\n return transformCandlesticks(candlesticks, marketTickers, chartRange);\n }, [candlesticks, marketTickers, chartRange]);\n\n // Calculate Y-axis domain based on actual data values\n const yAxisDomain = useMemo(() => {\n if (chartData.length === 0 || marketTickers.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 marketTickers.forEach((marketTicker) => {\n const value = dataPoint[marketTicker] 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, marketTickers]);\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: marketTickers.map((marketTicker, idx) => {\n const market = markets.find((m) => m.ticker === marketTicker);\n return {\n id: marketTicker,\n label: market?.yesSubTitle || `Market ${idx + 1}`,\n value: (dataPoint[marketTicker] as number) ?? 0,\n color: CHART_COLORS[idx % CHART_COLORS.length].stroke,\n };\n }),\n };\n },\n [chartData, marketTickers, 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 sampleIntervalX = 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 % sampleIntervalX === 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, chartRange)}\n </text>\n );\n }}\n tickLine={false}\n axisLine={false}\n interval={0}\n />\n <CartesianGrid\n horizontal={true}\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--heroui-default-200))\"\n />\n <YAxis\n domain={yAxisDomain}\n tickLine={false}\n axisLine={false}\n tick={{ fontSize: 10, fill: \"hsl(var(--heroui-default-500))\" }}\n tickFormatter={(value: number) => `${value}%`}\n width={40}\n />\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 formatTimestamp(value, chartRange)\n }\n formatter={(value: number, name: string) => {\n const market = markets.find((m) => m.ticker === name);\n const label = market?.yesSubTitle || name;\n return [`${value.toFixed(2)}%`, label];\n }}\n />\n {marketTickers.map((marketTicker, index) => (\n <Line\n key={marketTicker}\n type=\"monotone\"\n dataKey={marketTicker}\n stroke={CHART_COLORS[index % CHART_COLORS.length].stroke}\n strokeWidth={2}\n isAnimationActive={false}\n dot={(dotProps) => (\n <BreathingDot\n key={`dot-${marketTicker}-${dotProps.index}`}\n {...dotProps}\n dataLength={chartData.length}\n />\n )}\n activeDot={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 { useMemo } from \"react\";\nimport {\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n DEFAULT_CHART_RANGE,\n type ChartRangeType,\n} from \"../../consts\";\nimport { useMarketCandlesticksQuery } from \"../../hooks/usePriceHistoryQuery\";\n\nexport interface UseMarketCandlesticksParams {\n /** Market ticker */\n marketTicker: string;\n /** Market open time (unix timestamp), used as start for \"ALL\" range */\n openTime?: number;\n /** Selected chart range */\n chartRange?: ChartRangeType;\n}\n\nexport function useMarketCandlesticks({\n marketTicker,\n openTime,\n chartRange = DEFAULT_CHART_RANGE,\n}: UseMarketCandlesticksParams) {\n const periodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n // Stabilise endTs per range change\n const endTs = useMemo(() => Math.floor(Date.now() / 1000), [chartRange]);\n\n const startTs = useMemo(() => {\n if (rangeDuration != null) return endTs - rangeDuration;\n // ALL: start from market open time\n return openTime ?? endTs;\n }, [endTs, rangeDuration, openTime]);\n\n const {\n data: candlesticks,\n isLoading,\n isFetching,\n error,\n } = useMarketCandlesticksQuery(\n {\n ticker: marketTicker,\n startTs,\n endTs,\n periodInterval,\n },\n { enabled: !!marketTicker },\n );\n\n return {\n candlesticks,\n /** true on initial load (no cached data) */\n isLoading,\n /** true whenever a request is in-flight (including range switches with stale data) */\n isFetching,\n error,\n periodInterval,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n ChartRange,\n CHART_RANGE_SAMPLE_INTERVAL,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { CandlesticksResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst CHART_COLOR = \"hsl(var(--heroui-primary))\";\n\nconst RANGE_OPTIONS = [\n { value: ChartRange.ONE_DAY, label: \"1D\" },\n { value: ChartRange.ONE_WEEK, label: \"1W\" },\n { value: ChartRange.ONE_MONTH, label: \"1M\" },\n { value: ChartRange.ALL, label: \"ALL\" },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface DataPoint {\n timestamp: number;\n date: string;\n value: number;\n volume: number;\n}\n\nexport interface EventMarketCandlesticksUIProps {\n /** Candlestick data for the market */\n candlesticks?: CandlesticksResponse;\n /** Whether data is loading */\n isLoading?: boolean;\n /** Current chart range */\n chartRange: ChartRangeType;\n /** Callback when range changes */\n onRangeChange?: (range: ChartRangeType) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Breathing dot at the last data point\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction BreathingDot(props: any) {\n const { cx, cy, index, dataLength, stroke } = props;\n if (index !== dataLength - 1 || cx == null || cy == null) return null;\n\n return (\n <g>\n <circle cx={cx} cy={cy} r={6} fill={stroke} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;8;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.1;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={cx} cy={cy} r={3} fill={stroke} />\n </g>\n );\n}\n\nfunction formatTimestamp(\n timestamp: number,\n chartRange: ChartRangeType,\n): string {\n const date = new Date(timestamp * 1000);\n\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ONE_WEEK:\n case ChartRange.ONE_MONTH:\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 ChartRange.ALL:\n default:\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n\nfunction formatCompact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(0);\n}\n\nfunction transformCandlesticks(\n candlesticks: CandlesticksResponse,\n chartRange: ChartRangeType,\n): DataPoint[] {\n const sampleInterval = CHART_RANGE_SAMPLE_INTERVAL[chartRange];\n const points = candlesticks.candlesticks ?? [];\n\n // Bucket by sample interval, keep last close & sum volume per bucket\n const bucketMap = new Map<number, { close: number; volume: number }>();\n for (const point of points) {\n const bucket = point.end_period_ts - (point.end_period_ts % sampleInterval);\n const existing = bucketMap.get(bucket);\n bucketMap.set(bucket, {\n close: point.yes_ask.close,\n volume: (existing?.volume ?? 0) + (point.volume ?? 0),\n });\n }\n\n // Sort by timestamp\n const sorted = Array.from(bucketMap.entries()).sort((a, b) => a[0] - b[0]);\n\n return sorted.map(([timestamp, { close, volume }]) => ({\n timestamp,\n date: new Date(timestamp * 1000).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n value: Math.round(close * 100) / 100,\n volume,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketCandlesticksUI({\n candlesticks,\n isLoading,\n chartRange,\n onRangeChange,\n}: EventMarketCandlesticksUIProps) {\n const chartData = useMemo(() => {\n if (!candlesticks) return [];\n return transformCandlesticks(candlesticks, chartRange);\n }, [candlesticks, chartRange]);\n\n const yAxisDomain = useMemo(() => {\n if (chartData.length === 0) return [0, 100] as [number, number];\n\n let minValue = Infinity;\n let maxValue = -Infinity;\n\n for (const dp of chartData) {\n if (dp.value < minValue) minValue = dp.value;\n if (dp.value > maxValue) maxValue = dp.value;\n }\n\n if (minValue === Infinity || maxValue === -Infinity) {\n return [0, 100] as [number, number];\n }\n\n const range = maxValue - minValue;\n const padding = Math.max(range * 0.2, 5);\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]);\n\n // ---------- Loading ----------\n if (isLoading) {\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full flex items-center justify-center\">\n <div className=\"text-neutral text-sm\">Loading chart...</div>\n </div>\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n }\n\n // ---------- Empty ----------\n if (chartData.length === 0) {\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full flex items-center justify-center\">\n <div className=\"text-neutral text-sm\">No price history data</div>\n </div>\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n }\n\n // ---------- Chart ----------\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 10, right: 16, left: 16, bottom: 0 }}\n >\n <XAxis\n dataKey=\"timestamp\"\n tick={(props) => {\n const { x, y, payload, index } = props;\n const totalPoints = chartData.length;\n const maxLabels = 6;\n const sampleIntervalX = Math.max(\n 1,\n Math.ceil(totalPoints / maxLabels),\n );\n const isFirst = index === 0;\n const isLast = index === totalPoints - 1;\n const isSampled = index % sampleIntervalX === 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, chartRange)}\n </text>\n );\n }}\n tickLine={false}\n axisLine={false}\n interval={0}\n />\n <CartesianGrid\n horizontal={true}\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--heroui-default-200))\"\n />\n <YAxis\n domain={yAxisDomain}\n tickLine={false}\n axisLine={false}\n tick={{\n fontSize: 10,\n fill: \"hsl(var(--heroui-default-500))\",\n }}\n tickFormatter={(value: number) => `${value}%`}\n width={40}\n />\n <Tooltip\n cursor={{ stroke: \"hsl(var(--heroui-default-300))\" }}\n content={({ active, payload }) => {\n if (!active || !payload?.length) return null;\n const dp = payload[0].payload as DataPoint;\n const cents = Math.round(dp.value);\n return (\n <div className=\"rounded-lg border border-default-200 bg-content1 px-3 py-2 shadow-md\">\n <div className=\"text-lg font-semibold text-primary\">\n Yes {cents}¢\n </div>\n <div className=\"text-sm text-neutral\">\n Vol {formatCompact(dp.volume)} ·{\" \"}\n {formatTimestamp(dp.timestamp, chartRange)}\n </div>\n </div>\n );\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"value\"\n stroke={CHART_COLOR}\n strokeWidth={2}\n isAnimationActive={false}\n dot={(dotProps) => (\n <BreathingDot\n key={`dot-${dotProps.index}`}\n {...dotProps}\n dataLength={chartData.length}\n />\n )}\n activeDot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Range selector\n// ---------------------------------------------------------------------------\n\nfunction RangeSelector({\n chartRange,\n onRangeChange,\n}: {\n chartRange: ChartRangeType;\n onRangeChange?: (range: ChartRangeType) => void;\n}) {\n return (\n <div className=\"flex items-center justify-end gap-x-1\">\n {RANGE_OPTIONS.map((opt) => {\n const isActive = chartRange === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n className={`px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"bg-default-100 text-default-600 hover:bg-default-200\"\n }`}\n onClick={() => onRangeChange?.(opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderbookLevel } from \"../../types\";\n\nexport interface UseMarketOrderbookParams {\n /** Market ticker to fetch orderbook for */\n marketTicker: string;\n}\n\nexport interface ProcessedOrderbook {\n /** Yes side bids (sorted descending by price) */\n yesBids: OrderbookLevel[];\n /** Yes side asks (sorted ascending by price) */\n yesAsks: OrderbookLevel[];\n /** No side bids (sorted descending by price) */\n noBids: OrderbookLevel[];\n /** No side asks (sorted ascending by price) */\n noAsks: OrderbookLevel[];\n /** Best yes bid price */\n bestYesBid: number | null;\n /** Best yes ask price */\n bestYesAsk: number | null;\n /** Best no bid price */\n bestNoBid: number | null;\n /** Best no ask price */\n bestNoAsk: number | null;\n /** Orderbook sequence number */\n sequence: number | null;\n}\n\nexport function useMarketOrderbook({ marketTicker }: UseMarketOrderbookParams) {\n const {\n data: orderbook,\n isLoading: isOrderbookLoading,\n error: orderbookError,\n } = useOrderBookQuery(marketTicker, {\n enabled: !!marketTicker,\n });\n\n const processedOrderbook = useMemo<ProcessedOrderbook | null>(() => {\n if (!orderbook) return null;\n\n const { yesBids, yesAsks, noBids, noAsks } = orderbook;\n\n return {\n yesBids,\n yesAsks,\n noBids,\n noAsks,\n bestYesBid: yesBids.length > 0 ? yesBids[0].price : null,\n bestYesAsk: yesAsks.length > 0 ? yesAsks[0].price : null,\n bestNoBid: noBids.length > 0 ? noBids[0].price : null,\n bestNoAsk: noAsks.length > 0 ? noAsks[0].price : null,\n sequence: orderbook.sequence ?? null,\n };\n }, [orderbook]);\n\n return {\n orderbook: processedOrderbook,\n isOrderbookLoading,\n orderbookError,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { OrderbookLevel } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventMarketOrderbookUIProps {\n /** Bid levels (sorted descending by price) */\n bids: OrderbookLevel[];\n /** Ask levels (sorted ascending by price) */\n asks: OrderbookLevel[];\n /** Whether data is loading */\n isLoading?: boolean;\n /** Max number of levels per side to display */\n maxLevels?: number;\n /** Callback when a price level row is clicked */\n onPriceClick?: (price: number, side: \"bid\" | \"ask\") => void;\n}\n\ninterface OrderbookRow extends OrderbookLevel {\n /** Cumulative quantity up to this level */\n cumulative: number;\n /** Depth ratio 0–1 relative to the max cumulative across both sides */\n depth: number;\n /** Total value = price × quantity */\n total: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRows(\n levels: OrderbookLevel[],\n maxLevels: number,\n): OrderbookRow[] {\n const sliced = levels.slice(0, maxLevels);\n let cumulative = 0;\n return sliced.map((level) => {\n cumulative += level.quantity;\n return {\n ...level,\n cumulative,\n depth: 0,\n total: level.price * level.quantity,\n };\n });\n}\n\nfunction applyDepth(rows: OrderbookRow[], maxCum: number) {\n for (const row of rows) {\n row.depth = maxCum > 0 ? row.cumulative / maxCum : 0;\n }\n}\n\n/** Format price as percentage (0.94 → \"94¢\") */\nfunction formatPrice(price: number): string {\n const cents = Math.round(price * 100);\n return `${cents}¢`;\n}\n\n/** Format quantity with compact notation */\nfunction formatQty(qty: number): string {\n if (qty >= 1_000_000) return `${(qty / 1_000_000).toFixed(1)}M`;\n if (qty >= 1_000) return `${(qty / 1_000).toFixed(1)}K`;\n return qty.toLocaleString();\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\n/** Format total value (price × quantity, as USD-like value) */\nfunction formatTotal(total: number): string {\n if (total >= 1_000_000) return `$${(total / 1_000_000).toFixed(2)}M`;\n if (total >= 1_000) return `$${(total / 1_000).toFixed(2)}K`;\n if (total >= 1) return `$${total.toFixed(2)}`;\n return `$${total.toFixed(4)}`;\n}\n\nfunction RowItem({\n row,\n side,\n showType = false,\n onClick,\n}: {\n row: OrderbookRow;\n side: \"bid\" | \"ask\";\n /** Only show the type label on designated rows */\n showType?: boolean;\n onClick?: (price: number, side: \"bid\" | \"ask\") => void;\n}) {\n const { t } = useTranslation();\n const isAsk = side === \"ask\";\n const barColor = isAsk ? \"bg-bullish/10\" : \"bg-bearish/10\";\n const typeColor = isAsk ? \"text-bullish\" : \"text-bearish\";\n\n return (\n <button\n type=\"button\"\n className=\"relative grid w-full grid-cols-4 px-2 py-2.5 text-xs cursor-pointer hover:bg-default-100 transition-colors\"\n onClick={() => onClick?.(row.price, side)}\n >\n {/* Depth bar */}\n <div\n className={`absolute inset-y-0 left-0 ${barColor} transition-[width] duration-200`}\n style={{ width: `${row.depth * 100}%` }}\n />\n {/* Type – only shown on the row nearest the spread */}\n <span\n className={`relative z-10 font-mono font-medium ${typeColor} text-left`}\n >\n {showType\n ? isAsk\n ? t(\"predict.trade.bestAsk\")\n : t(\"predict.trade.bestBid\")\n : \"\"}\n </span>\n {/* Price */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatPrice(row.price)}\n </span>\n {/* Contracts */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatQty(row.quantity)}\n </span>\n {/* Total */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatTotal(row.total)}\n </span>\n </button>\n );\n}\n\nfunction SkeletonRow({ index }: { index: number }) {\n // Stagger widths for a more natural look\n const widths = [\"60%\", \"45%\", \"75%\", \"55%\", \"65%\", \"50%\", \"70%\", \"40%\"];\n return (\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div\n className=\"h-4 animate-pulse rounded bg-default-100\"\n style={{ width: widths[index % widths.length] }}\n />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n </div>\n );\n}\n\nfunction Skeleton() {\n return (\n <div className=\"flex flex-col\">\n {/* Header skeleton */}\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n </div>\n {/* Ask rows */}\n {Array.from({ length: DEFAULT_MAX_LEVELS }).map((_, i) => (\n <SkeletonRow key={`ask-${i}`} index={i} />\n ))}\n {/* Spread */}\n <div className=\"flex justify-center border-y border-default-200 px-2 py-2.5\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-default-100\" />\n </div>\n {/* Bid rows */}\n {Array.from({ length: DEFAULT_MAX_LEVELS }).map((_, i) => (\n <SkeletonRow key={`bid-${i}`} index={i + 3} />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_LEVELS = 8;\n\nexport function EventMarketOrderbookUI({\n bids,\n asks,\n isLoading = false,\n maxLevels = DEFAULT_MAX_LEVELS,\n onPriceClick,\n}: EventMarketOrderbookUIProps) {\n const { t } = useTranslation();\n\n const { bidRows, askRows, spread, spreadPercent } = useMemo(() => {\n const bidRows = buildRows(bids, maxLevels);\n const askRows = buildRows(asks, maxLevels);\n\n // Use the same max cumulative across both sides for comparable depth bars\n const maxCum = Math.max(\n bidRows[bidRows.length - 1]?.cumulative ?? 0,\n askRows[askRows.length - 1]?.cumulative ?? 0,\n );\n applyDepth(bidRows, maxCum);\n applyDepth(askRows, maxCum);\n\n const bestBid = bidRows[0]?.price ?? null;\n const bestAsk = askRows[0]?.price ?? null;\n\n let spread: number | null = null;\n let spreadPercent: number | null = null;\n if (bestBid != null && bestAsk != null) {\n spread = bestAsk - bestBid;\n const mid = (bestBid + bestAsk) / 2;\n if (mid > 0) {\n spreadPercent = Math.round((spread / mid) * 10000) / 100;\n }\n }\n\n return { bidRows, askRows, spread, spreadPercent };\n }, [bids, asks, maxLevels]);\n\n if (isLoading) {\n return <Skeleton />;\n }\n\n const isEmpty = bidRows.length === 0 && askRows.length === 0;\n\n if (isEmpty) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.orderBook.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n {/* Column headers */}\n <div className=\"grid grid-cols-4 px-2 py-2.5 text-xs text-neutral\">\n <span />\n <span className=\"text-right\">{t(\"predict.orderBook.price\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.contracts\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.total\")}</span>\n </div>\n\n {/* Asks (reversed so lowest price is nearest the spread) */}\n <div className=\"flex flex-col-reverse\">\n {askRows.map((row, i) => (\n <RowItem\n key={row.price}\n row={row}\n side=\"ask\"\n showType={i === 0}\n onClick={onPriceClick}\n />\n ))}\n </div>\n\n {/* Spread */}\n {spread != null && (\n <div className=\"flex items-center justify-center gap-x-2 border-y border-default-200 px-2 py-2.5 text-xs text-default-500\">\n <span>\n {t(\"predict.orderBook.spread\")}: {formatPrice(spread)}\n </span>\n {spreadPercent != null && (\n <span className=\"text-default-400\">({spreadPercent}%)</span>\n )}\n </div>\n )}\n\n {/* Bids */}\n <div className=\"flex flex-col\">\n {bidRows.map((row, i) => (\n <RowItem\n key={row.price}\n row={row}\n side=\"bid\"\n showType={i === 0}\n onClick={onPriceClick}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { WalletPositionItem } from \"../../types\";\n\nexport interface PositionWithPnL extends WalletPositionItem {\n /** Weighted-average entry price (0–1 scale, same as yesAsk/noAsk) */\n avgCost: number | null;\n /** Current market price for this outcome (0–1 scale) */\n currentPrice: number | null;\n /** Total unrealised P&L in USD: (currentPrice − avgCost) × balance */\n pnl: number | null;\n /** Unrealised P&L as a percentage of avg cost */\n pnlPercent: number | null;\n}\n\nexport interface EventMarketPositionsUIProps {\n positions: PositionWithPnL[];\n isLoading?: boolean;\n}\n\nfunction formatBalance(balance: number): string {\n if (balance >= 1_000_000) return `${(balance / 1_000_000).toFixed(2)}M`;\n if (balance >= 1_000) return `${(balance / 1_000).toFixed(2)}K`;\n return balance.toLocaleString(undefined, { maximumFractionDigits: 2 });\n}\n\nfunction formatPnL(pnl: number): string {\n const abs = Math.abs(pnl);\n const sign = pnl >= 0 ? \"+\" : \"-\";\n if (abs >= 1_000) return `${sign}$${(abs / 1_000).toFixed(1)}K`;\n if (abs >= 1) return `${sign}$${abs.toFixed(2)}`;\n return `${sign}$${abs.toFixed(4)}`;\n}\n\nexport function EventMarketPositionsUI({\n positions,\n isLoading = false,\n}: EventMarketPositionsUIProps) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n if (positions.length === 0) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.positions.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n {/* Header */}\n <div className=\"grid grid-cols-5 px-2 py-2.5 text-xs text-neutral\">\n <span>{t(\"predict.positions.outcome\")}</span>\n <span className=\"text-right\">{t(\"predict.positions.qty\")}</span>\n <span className=\"text-right\">{t(\"predict.positions.avgCost\")}</span>\n <span className=\"text-right\">\n {t(\"predict.positions.currentPrice\")}\n </span>\n <span className=\"text-right\">{t(\"predict.positions.pnl\")}</span>\n </div>\n\n {/* Rows */}\n {positions.map((pos) => {\n const isYes = pos.position === \"YES\";\n const sideColor = isYes ? \"text-bullish\" : \"text-bearish\";\n const sideLabel = isYes\n ? t(\"predict.market.yes\")\n : t(\"predict.market.no\");\n\n const avgCostDisplay =\n pos.avgCost != null ? `${Math.round(pos.avgCost * 100)}¢` : \"—\";\n\n const priceDisplay =\n pos.currentPrice != null\n ? `${Math.round(pos.currentPrice * 100)}¢`\n : \"—\";\n\n const hasPnL = pos.pnl != null && pos.pnlPercent != null;\n const pnlColor =\n hasPnL && pos.pnl! > 0\n ? \"text-bullish\"\n : hasPnL && pos.pnl! < 0\n ? \"text-bearish\"\n : \"text-foreground\";\n\n return (\n <div\n key={pos.mint}\n className=\"grid grid-cols-5 px-2 py-2.5 text-xs hover:bg-default-100 transition-colors\"\n >\n <span className={`font-medium ${sideColor}`}>{sideLabel}</span>\n <span className=\"text-right font-mono text-foreground\">\n {formatBalance(pos.balance)}\n </span>\n <span className=\"text-right font-mono text-foreground\">\n {avgCostDisplay}\n </span>\n <span className=\"text-right font-mono text-foreground\">\n {priceDisplay}\n </span>\n <span className={`text-right font-mono ${pnlColor}`}>\n {hasPnL ? (\n <span className=\"flex flex-col items-end\">\n <span>{formatPnL(pos.pnl!)}</span>\n <span className=\"text-[10px] opacity-70\">\n {pos.pnlPercent! >= 0 ? \"+\" : \"\"}\n {pos.pnlPercent!.toFixed(1)}%\n </span>\n </span>\n ) : (\n \"—\"\n )}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { OnchainTrade } from \"../../types\";\n\nexport interface EventMarketTradesUIProps {\n trades: OnchainTrade[];\n isLoading?: boolean;\n}\n\nfunction formatAmount(amount: number): string {\n const ui = amount / 1_000_000;\n if (ui >= 1_000_000) return `${(ui / 1_000_000).toFixed(2)}M`;\n if (ui >= 1_000) return `${(ui / 1_000).toFixed(2)}K`;\n return ui.toLocaleString(undefined, { maximumFractionDigits: 2 });\n}\n\nfunction formatPrice(price: number | null | undefined): string {\n if (price == null) return \"—\";\n return `${Math.round(price * 100)}¢`;\n}\n\nfunction formatTime(ts: number): string {\n const date = new Date(ts * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day} ${hours}:${minutes}`;\n}\n\nfunction SkeletonRow({ index }: { index: number }) {\n const widths = [\"60%\", \"45%\", \"75%\", \"55%\", \"65%\"];\n return (\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div\n className=\"h-4 animate-pulse rounded bg-default-100\"\n style={{ width: widths[index % widths.length] }}\n />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n </div>\n );\n}\n\nexport function EventMarketTradesUI({\n trades,\n isLoading = false,\n}: EventMarketTradesUIProps) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex flex-col\">\n {Array.from({ length: 6 }).map((_, i) => (\n <SkeletonRow key={i} index={i} />\n ))}\n </div>\n );\n }\n\n if (trades.length === 0) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.tradeHistory.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n {/* Header */}\n <div className=\"grid grid-cols-4 px-2 py-2.5 text-xs text-neutral\">\n <span>{t(\"predict.tradeHistory.side\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.price\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.qty\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.time\")}</span>\n </div>\n\n {/* Rows */}\n {trades.map((trade) => {\n const isYes = trade.side === \"yes\";\n const sideColor = isYes ? \"text-bullish\" : \"text-bearish\";\n const sideLabel = trade.side\n ? isYes\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")\n : \"—\";\n\n return (\n <div\n key={trade.id}\n className=\"grid grid-cols-4 px-2 py-2.5 text-xs hover:bg-default-100 transition-colors\"\n >\n <span className={`font-medium ${sideColor}`}>{sideLabel}</span>\n <span className=\"text-right font-mono text-foreground\">\n {formatPrice(trade.usdPricePerContract)}\n </span>\n <span className=\"text-right font-mono text-foreground\">\n {formatAmount(trade.outputAmount)}\n </span>\n <span className=\"text-right text-default-500\">\n {formatTime(trade.createdAt)}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { Tabs, Tab } from \"@liberfi.io/ui\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport { DEFAULT_CHART_RANGE, type ChartRangeType } from \"../../consts\";\nimport { useMarketPositions } from \"../../hooks/useMarketPositions\";\nimport { useOnchainTradesByWalletQuery } from \"../../hooks/useOnchainTradesQuery\";\nimport type { OnchainTrade, StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { useMarketCandlesticks } from \"./event-market-candlesticks.script\";\nimport { EventMarketCandlesticksUI } from \"./event-market-candlesticks.ui\";\nimport { useMarketOrderbook } from \"./event-market-orderbook.script\";\nimport { EventMarketOrderbookUI } from \"./event-market-orderbook.ui\";\nimport {\n EventMarketPositionsUI,\n type PositionWithPnL,\n} from \"./event-market-positions.ui\";\nimport { EventMarketTradesUI } from \"./event-market-trades.ui\";\n\ntype MarketDetailTab =\n | \"trade-yes\"\n | \"trade-no\"\n | \"graph\"\n | \"positions\"\n | \"trade-history\";\n\nexport interface EventMarketDetailWidgetProps {\n market: StandardMarket;\n /** Callback when an orderbook row is clicked – propagates market, outcome & side */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventMarketDetailWidget({\n market,\n onTradeAction,\n}: EventMarketDetailWidgetProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<MarketDetailTab>(\"trade-yes\");\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n const { orderbook, isOrderbookLoading } = useMarketOrderbook({\n marketTicker: market.ticker,\n });\n\n const { candlesticks, isFetching: isCandlesticksLoading } =\n useMarketCandlesticks({\n marketTicker: market.ticker,\n openTime: market.openTime,\n chartRange,\n });\n\n const { positions, isLoading: isPositionsLoading } =\n useMarketPositions(market);\n\n const { status } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const walletAddress = solanaWallet?.address;\n\n const { data: tradesData, isLoading: isTradesLoading } =\n useOnchainTradesByWalletQuery(\n { walletAddress: walletAddress ?? \"\" },\n {\n enabled:\n (activeTab === \"trade-history\" || activeTab === \"positions\") &&\n status === \"authenticated\" &&\n !!walletAddress,\n },\n );\n\n const marketTrades = (tradesData?.trades ?? []).filter(\n (t) => t.marketTicker === market.ticker,\n );\n\n const positionsWithPnL: PositionWithPnL[] = useMemo(() => {\n return positions.map((pos) => {\n const buyTrades = marketTrades.filter(\n (t) =>\n t.outputMint === pos.mint &&\n t.usdPricePerContract != null &&\n t.contracts != null &&\n t.contracts > 0,\n );\n\n const avgCost = computeAvgCost(buyTrades);\n\n const currentPrice =\n pos.position === \"YES\"\n ? parseNullablePrice(pos.market?.yesAsk)\n : parseNullablePrice(pos.market?.noAsk);\n\n let pnl: number | null = null;\n let pnlPercent: number | null = null;\n if (avgCost != null && currentPrice != null) {\n pnl = (currentPrice - avgCost) * pos.balance;\n pnlPercent =\n avgCost > 0 ? ((currentPrice - avgCost) / avgCost) * 100 : null;\n }\n\n return { ...pos, avgCost, currentPrice, pnl, pnlPercent };\n });\n }, [positions, marketTrades]);\n\n const handleYesPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"yes\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n const handleNoPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"no\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n <Tabs\n variant=\"underlined\"\n selectedKey={activeTab}\n onSelectionChange={(key) => setActiveTab(key as MarketDetailTab)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"trade-yes\" title={t(\"predict.market.tradeYes\")} />\n <Tab key=\"trade-no\" title={t(\"predict.market.tradeNo\")} />\n <Tab key=\"graph\" title={t(\"predict.market.graph\")} />\n <Tab key=\"positions\" title={t(\"predict.positions.title\")} />\n <Tab key=\"trade-history\" title={t(\"predict.tradeHistory.title\")} />\n </Tabs>\n\n <div className=\"min-h-[120px]\">\n {activeTab === \"trade-yes\" && (\n <EventMarketOrderbookUI\n bids={orderbook?.yesBids ?? []}\n asks={orderbook?.yesAsks ?? []}\n isLoading={isOrderbookLoading}\n onPriceClick={handleYesPriceClick}\n />\n )}\n\n {activeTab === \"trade-no\" && (\n <EventMarketOrderbookUI\n bids={orderbook?.noBids ?? []}\n asks={orderbook?.noAsks ?? []}\n isLoading={isOrderbookLoading}\n onPriceClick={handleNoPriceClick}\n />\n )}\n\n {activeTab === \"graph\" && (\n <EventMarketCandlesticksUI\n candlesticks={candlesticks}\n isLoading={isCandlesticksLoading}\n chartRange={chartRange}\n onRangeChange={setChartRange}\n />\n )}\n\n {activeTab === \"positions\" && (\n <EventMarketPositionsUI\n positions={positionsWithPnL}\n isLoading={isPositionsLoading}\n />\n )}\n\n {activeTab === \"trade-history\" && (\n <EventMarketTradesUI\n trades={marketTrades}\n isLoading={isTradesLoading}\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction computeAvgCost(\n buyTrades: Pick<OnchainTrade, \"usdPricePerContract\" | \"contracts\">[],\n): number | null {\n if (buyTrades.length === 0) return null;\n let totalContracts = 0;\n let totalCost = 0;\n for (const t of buyTrades) {\n totalContracts += t.contracts!;\n totalCost += t.usdPricePerContract! * t.contracts!;\n }\n return totalContracts > 0 ? totalCost / totalContracts : null;\n}\n\nfunction parseNullablePrice(price: string | null | undefined): number | null {\n if (price == null) return null;\n const n = Number(price);\n return Number.isFinite(n) ? n : null;\n}\n","import { useState, type ReactNode } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, Chip, ChevronDownIcon, ChevronUpIcon } from \"@liberfi.io/ui\";\nimport type { MarketsHoldingsMap } from \"../../hooks/useMarketsHoldings\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\n\nconst DEFAULT_VISIBLE_COUNT = 4;\n\nexport interface EventMarketsUIProps {\n /** Markets list (should already be sorted) */\n markets: StandardMarket[];\n /** Render expanded detail content for a market */\n renderMarketDetail?: (market: StandardMarket) => ReactNode;\n /** Callback when a market Yes/No button is clicked */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n /** Per-market token holdings for the current user */\n marketHoldings?: MarketsHoldingsMap;\n}\n\n/** Parse ask price in dollars (0–1) → cents (0–100), null if absent */\nfunction getMarketPrices(market: StandardMarket) {\n const yesCents = market.yesAsk\n ? Math.round(parseFloat(market.yesAsk) * 100)\n : null;\n const noCents = market.noAsk\n ? Math.round(parseFloat(market.noAsk) * 100)\n : null;\n return { yesCents, noCents };\n}\n\nexport function EventMarketsUI({\n markets,\n renderMarketDetail,\n onTradeAction,\n marketHoldings,\n}: EventMarketsUIProps) {\n const { t } = useTranslation();\n const [showAll, setShowAll] = useState(false);\n const [expandedTicker, setExpandedTicker] = useState<string | null>(null);\n\n if (markets.length === 0) return null;\n\n const hasMore = markets.length > DEFAULT_VISIBLE_COUNT;\n const visibleMarkets = showAll\n ? markets\n : markets.slice(0, DEFAULT_VISIBLE_COUNT);\n\n const toggleExpand = (ticker: string) => {\n setExpandedTicker((prev) => (prev === ticker ? null : ticker));\n };\n\n return (\n <div className=\"flex flex-col divide-y divide-default-200\">\n {visibleMarkets.map((market) => {\n const { yesCents, noCents } = getMarketPrices(market);\n const isExpanded = expandedTicker === market.ticker;\n\n return (\n <div key={market.ticker} className=\"flex flex-col\">\n <div\n className=\"flex items-center gap-x-3 px-2 py-3 transition-colors hover:bg-content2 lg:gap-x-4 cursor-pointer\"\n onClick={() => toggleExpand(market.ticker)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleExpand(market.ticker);\n }\n }}\n >\n {/* Col 1: Title + Holdings tags */}\n <div className=\"flex flex-col gap-y-1 min-w-0 flex-1\">\n <span className=\"text-sm font-medium truncate lg:text-base\">\n {market.yesSubTitle}\n </span>\n {(() => {\n const holding = marketHoldings?.get(market.ticker);\n if (!holding) return null;\n const { yesShares, noShares } = holding;\n if (yesShares <= 0 && noShares <= 0) return null;\n return (\n <div className=\"flex items-center gap-x-1.5\">\n {yesShares > 0 && (\n <Chip\n size=\"sm\"\n variant=\"flat\"\n color=\"primary\"\n classNames={{\n base: \"h-5\",\n content: \"text-[10px] font-medium px-1\",\n }}\n >\n {t(\"predict.market.sharesYes\", {\n shares:\n yesShares % 1 === 0\n ? yesShares\n : yesShares.toFixed(2),\n })}\n </Chip>\n )}\n {noShares > 0 && (\n <Chip\n size=\"sm\"\n variant=\"flat\"\n color=\"secondary\"\n classNames={{\n base: \"h-5\",\n content: \"text-[10px] font-medium px-1\",\n }}\n >\n {t(\"predict.market.sharesNo\", {\n shares:\n noShares % 1 === 0\n ? noShares\n : noShares.toFixed(2),\n })}\n </Chip>\n )}\n </div>\n );\n })()}\n </div>\n\n {/* Col 2: Yes Percentage */}\n {(() => {\n const hasYes = yesCents != null;\n const hasNo = noCents != null;\n\n if (hasYes && !hasNo && yesCents <= 1) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n {\"< 1%\"}\n </span>\n );\n }\n if (hasNo && !hasYes && noCents <= 1) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n {\"> 99%\"}\n </span>\n );\n }\n if (!hasYes && !hasNo) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n 0%\n </span>\n );\n }\n return (\n <span className=\"text-lg font-bold shrink-0 text-center lg:text-xl\">\n {`${yesCents}%`}\n </span>\n );\n })()}\n\n {/* Col 3: Yes / No Buttons */}\n <div className=\"flex items-center gap-x-2 flex-1 justify-end\">\n <Button\n size=\"sm\"\n color=\"primary\"\n className=\"w-20 bg-primary-100 text-primary\"\n onPress={() => onTradeAction?.(market, \"yes\", \"buy\")}\n >\n {yesCents != null\n ? t(\"predict.market.action.yes\", { price: yesCents })\n : t(\"predict.market.yes\")}\n </Button>\n <Button\n size=\"sm\"\n color=\"secondary\"\n className=\"w-20 bg-secondary-100 text-secondary\"\n onPress={() => onTradeAction?.(market, \"no\", \"buy\")}\n >\n {noCents != null\n ? t(\"predict.market.action.no\", { price: noCents })\n : t(\"predict.market.no\")}\n </Button>\n </div>\n\n {/* Expand/Collapse indicator */}\n {isExpanded ? (\n <ChevronUpIcon className=\"h-4 w-4 shrink-0 text-default-400\" />\n ) : (\n <ChevronDownIcon className=\"h-4 w-4 shrink-0 text-default-400\" />\n )}\n </div>\n\n {/* Expanded detail content */}\n {isExpanded && renderMarketDetail && (\n <div className=\"max-h-100 overflow-y-auto px-2 pb-3\">\n {renderMarketDetail(market)}\n </div>\n )}\n </div>\n );\n })}\n\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex items-center justify-center gap-x-1.5 px-2 py-2.5 text-sm text-default-500 transition-colors cursor-pointer hover:text-primary\"\n >\n {showAll ? (\n <>\n <span>{t(\"predict.event.rules.collapse\")}</span>\n <ChevronUpIcon className=\"h-4 w-4\" />\n </>\n ) : (\n <>\n <span>\n {t(\"predict.event.moreMarkets\", {\n count: markets.length - DEFAULT_VISIBLE_COUNT,\n })}\n </span>\n <ChevronDownIcon className=\"h-4 w-4\" />\n </>\n )}\n </button>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Select, SelectItem } from \"@liberfi.io/ui\";\nimport type {\n StandardEvent,\n StandardMarket,\n SeriesResponse,\n} from \"../../types\";\n\nexport interface EventRulesUIProps {\n /** Markets list (should already be sorted) */\n markets: StandardMarket[];\n /** Event data */\n event: StandardEvent;\n /** Series data */\n series?: SeriesResponse;\n}\n\nconst CLOSED_STATUSES = new Set([\"closed\", \"determined\", \"finalized\"]);\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n\ninterface TimelineItem {\n label: string;\n value: string;\n isActive: boolean;\n}\n\nfunction EventTimeline({ market }: { market: StandardMarket }) {\n const isClosed = CLOSED_STATUSES.has(market.status);\n\n const items: TimelineItem[] = useMemo(() => {\n const openItem: TimelineItem = {\n label: \"Market Open\",\n value: formatTimestamp(market.openTime),\n isActive: true,\n };\n\n const closeItem: TimelineItem = {\n label: \"Market Closes\",\n value: isClosed\n ? formatTimestamp(market.closeTime)\n : \"After the outcome occurs\",\n isActive: isClosed,\n };\n\n const payoutItem: TimelineItem = {\n label: \"Projected Payout\",\n value: \"30 minutes after closing\",\n isActive: market.status === \"finalized\",\n };\n\n return [openItem, closeItem, payoutItem];\n }, [market.openTime, market.closeTime, market.status, isClosed]);\n\n const closeDescription = useMemo(() => {\n if (isClosed) return null;\n\n if (market.canCloseEarly && market.earlyCloseCondition) {\n return `${market.earlyCloseCondition} Otherwise, it closes by ${formatTimestamp(market.expirationTime)}.`;\n }\n\n return `This market closes by ${formatTimestamp(market.expirationTime)}.`;\n }, [\n isClosed,\n market.canCloseEarly,\n market.earlyCloseCondition,\n market.expirationTime,\n ]);\n\n return (\n <div className=\"flex flex-col\">\n {items.map((item, index) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\n {/* Timeline indicator */}\n <div className=\"flex flex-col items-center w-3\">\n <div\n className={`h-3 w-3 shrink-0 rounded-full border-2 mt-0.5 ${\n item.isActive\n ? \"border-primary bg-primary\"\n : \"border-default-300 bg-transparent\"\n }`}\n />\n {index < items.length - 1 && (\n <div className=\"w-px flex-1 bg-default-200\" />\n )}\n </div>\n {/* Content */}\n <div\n className={`flex flex-col ${index < items.length - 1 ? \"pb-4\" : \"\"}`}\n >\n <span className=\"text-xs font-medium text-foreground lg:text-sm\">\n {item.label}\n </span>\n <span className=\"text-xs text-default-500 lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n {closeDescription && (\n <p className=\"text-xs text-default-500 mt-3 lg:text-sm\">\n {closeDescription}\n </p>\n )}\n </div>\n );\n}\n\nexport function EventRulesUI({ markets, event, series }: EventRulesUIProps) {\n const { t } = useTranslation();\n const [selectedMarketTicker, setSelectedMarketTicker] = useState<\n string | null\n >(null);\n\n const marketsWithRules = markets.filter((m) => m.rulesPrimary);\n if (marketsWithRules.length === 0) return null;\n\n const selectedMarket =\n marketsWithRules.find((m) => m.ticker === selectedMarketTicker) ??\n marketsWithRules[0];\n if (!selectedMarket?.rulesPrimary) return null;\n\n return (\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 {marketsWithRules.length > 1 && (\n <Select\n size=\"sm\"\n aria-label=\"Select market rules\"\n className=\"max-w-48\"\n classNames={{\n trigger: \"min-h-8 h-8\",\n value: \"text-xs\",\n }}\n selectedKeys={new Set([selectedMarket.ticker])}\n onSelectionChange={(keys) => {\n if (keys === \"all\") return;\n const selected = Array.from(keys) as string[];\n if (selected.length > 0) {\n setSelectedMarketTicker(selected[0]);\n }\n }}\n >\n {marketsWithRules.map((market) => (\n <SelectItem key={market.ticker} textValue={market.yesSubTitle}>\n <span className=\"text-xs truncate\">{market.yesSubTitle}</span>\n </SelectItem>\n ))}\n </Select>\n )}\n <div className=\"text-xs text-foreground lg:text-sm\">\n {selectedMarket.rulesPrimary}\n </div>\n\n {/* Timeline and payout */}\n <span className=\"text-xs font-medium text-default-500 mt-2 lg:text-sm\">\n Timeline and payout\n </span>\n <EventTimeline market={selectedMarket} />\n\n {/* Tickers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-default-400 mt-2 lg:text-xs\">\n {series?.ticker && (\n <span>\n <span className=\"text-default-500\">Series:</span>{\" \"}\n <span className=\"text-foreground\">{series.ticker}</span>\n </span>\n )}\n {event.ticker && (\n <span>\n <span className=\"text-default-500\">Event:</span>{\" \"}\n <span className=\"text-foreground\">{event.ticker}</span>\n </span>\n )}\n <span>\n <span className=\"text-default-500\">Market:</span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.ticker}</span>\n </span>\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Avatar, Select, SelectItem, SelectSection } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n ChartRange,\n type ChartRangeType,\n type CandlestickPeriodType,\n} from \"../../consts\";\nimport { useMarketsHoldings } from \"../../hooks/useMarketsHoldings\";\nimport type {\n StandardEvent,\n StandardMarket,\n CandlesticksResponse,\n SeriesResponse,\n} from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport {\n EventCandlesticks,\n getLatestEventData,\n type CurrentMarketData,\n} from \"./event-candlesticks.ui\";\nimport { EventMarketDetailWidget } from \"./event-market-detail.widget\";\nimport { EventMarketsUI } from \"./event-markets.ui\";\nimport { EventRulesUI } from \"./event-rules.ui\";\n\nconst RANGE_OPTIONS = [\n { value: ChartRange.ONE_DAY, label: \"1D\" },\n { value: ChartRange.ONE_WEEK, label: \"1W\" },\n { value: ChartRange.ONE_MONTH, label: \"1M\" },\n { value: ChartRange.ALL, label: \"ALL\" },\n];\n\nexport interface EventDetailUIProps {\n event: StandardEvent;\n /** Series data for the event */\n series?: SeriesResponse;\n /** Map of market ticker to candlestick data */\n candlesticks?: Map<string, CandlesticksResponse>;\n /** Currently selected chart range */\n chartRange?: ChartRangeType;\n /** Derived candlestick period interval (for chart formatting) */\n periodInterval?: CandlestickPeriodType;\n /** Whether candlesticks are loading */\n isCandlesticksLoading?: boolean;\n /** Map of market ticker to candlestick error */\n candlestickErrors?: Map<string, Error>;\n /** Callback when chart range changes */\n onRangeChange?: (range: ChartRangeType) => void;\n /** Selected market tickers for candlestick chart */\n selectedMarketTickers?: string[];\n /** Callback when selected markets change */\n onMarketSelectionChange?: (marketTickers: string[]) => void;\n /** Callback when a trade action is triggered (market button / orderbook click) */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventDetailUI({\n event,\n series,\n candlesticks,\n chartRange = ChartRange.ONE_DAY,\n periodInterval,\n isCandlesticksLoading,\n onRangeChange,\n selectedMarketTickers,\n onMarketSelectionChange,\n onTradeAction,\n}: EventDetailUIProps) {\n const { t } = useTranslation();\n const [currentData, setCurrentData] = useState<CurrentMarketData | null>(\n getLatestEventData(),\n );\n const [isCompact, setIsCompact] = useState(false);\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel) return;\n\n let compact = false;\n let rafId = 0;\n\n const update = () => {\n const { bottom } = sentinel.getBoundingClientRect();\n // Hysteresis: require scrolling 20px past sentinel to enter compact,\n // but exit compact as soon as sentinel is back in viewport.\n // This breaks the feedback loop where header height change\n // could toggle the sentinel's visibility back and forth.\n const shouldBeCompact = compact ? bottom < 0 : bottom < -20;\n\n if (shouldBeCompact !== compact) {\n compact = shouldBeCompact;\n setIsCompact(shouldBeCompact);\n }\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n // Use capture to also detect scroll events from non-window scroll containers\n window.addEventListener(\"scroll\", onScroll, {\n passive: true,\n capture: true,\n });\n update();\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n };\n }, []);\n\n const markets = useMemo(\n () =>\n [...(event.markets || [])].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n ),\n [event.markets],\n );\n\n // Fetch per-market yes/no token holdings for the connected wallet\n const { holdings: marketHoldings } = useMarketsHoldings(markets);\n\n const formattedVolume = useMemo(\n () => formatAmountUSDCompact((event.volume ?? 0) / 100),\n [event.volume],\n );\n\n const formattedEndDate = useMemo(() => {\n if (!event.strikeDate) return null;\n const date = new Date(event.strikeDate * 1000);\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.strikeDate]);\n\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 pb-8 lg:px-4 lg:pb-12 lg:max-w-3xl\">\n {/* Sentinel element to detect scroll */}\n <div ref={sentinelRef} className=\"h-0 w-0\" />\n\n {/* Event header - sticky with compact transition */}\n <div\n className={`sticky top-0 z-30 flex items-center bg-background/80 backdrop-blur-md transition-all duration-300 ${\n isCompact\n ? \"gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.imageUrl || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className={`flex-shrink-0 transition-all duration-300 ${\n isCompact\n ? \"!h-8 !w-8 lg:!h-10 lg:!w-10\"\n : \"!h-14 !w-14 lg:!h-18 lg:!w-18\"\n }`}\n />\n <div className=\"flex flex-col min-w-0\">\n {!isCompact &&\n (series?.category || (series?.tags && series.tags.length > 0)) && (\n <span className=\"text-xs text-default-500 lg:text-sm truncate\">\n {series.category}\n {series.category && series.tags?.length > 0 && \" · \"}\n {series.tags?.join(\", \")}\n </span>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCompact ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\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 <EventCandlesticks\n candlesticks={candlesticks}\n chartRange={chartRange}\n markets={markets}\n isLoading={isCandlesticksLoading}\n onDataChange={(data) => setCurrentData(data)}\n />\n\n {/* Volume, period selector and market selector */}\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 mt-2\">\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 <div className=\"flex items-center gap-x-1\">\n {RANGE_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => onRangeChange?.(option.value)}\n className={`px-2 lg:px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${\n chartRange === 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 {markets.length > 1 && (\n <Select\n size=\"sm\"\n selectionMode=\"multiple\"\n placeholder=\"Markets\"\n aria-label=\"Select markets\"\n className=\"min-w-28 max-w-48\"\n classNames={{\n trigger: \"min-h-8 h-8\",\n value: \"text-xs\",\n }}\n selectedKeys={\n selectedMarketTickers\n ? new Set(selectedMarketTickers)\n : undefined\n }\n onSelectionChange={(keys) => {\n if (keys === \"all\") return;\n const selected = Array.from(keys) as string[];\n if (selected.length <= MAX_PRICE_HISTORY_MARKETS) {\n onMarketSelectionChange?.(selected);\n }\n }}\n >\n <SelectSection\n title={`Pick up to ${MAX_PRICE_HISTORY_MARKETS} markets`}\n classNames={{\n heading: \"text-xs text-default-400 px-2 py-1\",\n }}\n >\n {markets.map((market) => (\n <SelectItem\n key={market.ticker}\n textValue={market.yesSubTitle}\n >\n <span className=\"text-xs truncate\">\n {market.yesSubTitle}\n </span>\n </SelectItem>\n ))}\n </SelectSection>\n </Select>\n )}\n </div>\n </div>\n </div>\n\n {/* Markets */}\n <EventMarketsUI\n markets={markets}\n onTradeAction={onTradeAction}\n marketHoldings={marketHoldings}\n renderMarketDetail={(market) => (\n <EventMarketDetailWidget\n market={market}\n onTradeAction={onTradeAction}\n />\n )}\n />\n\n {/* Rules section */}\n <EventRulesUI markets={markets} event={event} series={series} />\n </div>\n );\n}\n","import { useState, useEffect, useRef, useMemo } from \"react\";\nimport {\n DEFAULT_CHART_RANGE,\n ChartRange,\n MAX_PRICE_HISTORY_MARKETS,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport { useEventDetail } from \"./event-detail.scripts\";\nimport { EventDetailUI } from \"./event-detail.ui\";\n\n// ------------------------------------------------------------\nexport interface EventDetailWidgetProps {\n eventId: string;\n /** Initial market tickers to query candlesticks for. Default is first 4 markets of the event, max is 4. */\n initialMarketTickers?: string[];\n /** Initial chart range. Default is \"1d\" (1 day). */\n initialChartRange?: ChartRangeType;\n /** Callback when a trade action is triggered (market button / orderbook click) */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventDetailWidget({\n eventId,\n initialMarketTickers,\n initialChartRange = DEFAULT_CHART_RANGE,\n onTradeAction,\n}: EventDetailWidgetProps) {\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(initialChartRange);\n const [selectedMarketTickers, setSelectedMarketTickers] = useState<\n string[] | undefined\n >(initialMarketTickers);\n\n const {\n event,\n isEventLoading,\n eventError,\n series,\n isSeriesLoading,\n periodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n } = useEventDetail({\n eventId,\n candlestickMarketTickers: selectedMarketTickers,\n chartRange,\n });\n\n // Set default selected markets once when event first loads\n const marketsInitializedRef = useRef(!!initialMarketTickers);\n useEffect(() => {\n if (event?.markets && !marketsInitializedRef.current) {\n marketsInitializedRef.current = true;\n const defaultMarketTickers = [...event.markets]\n .sort((a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0))\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((m) => m.ticker);\n setSelectedMarketTickers(defaultMarketTickers);\n }\n }, [event?.markets]);\n\n // Memoize handlers\n const handleRangeChange = useMemo(\n () => (newRange: ChartRangeType) => {\n setChartRange(newRange);\n },\n [],\n );\n\n const handleMarketSelectionChange = useMemo(\n () => (marketTickers: string[]) => {\n setSelectedMarketTickers(marketTickers);\n },\n [],\n );\n\n if (isEventLoading || isSeriesLoading) {\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 series={series}\n candlesticks={candlesticks}\n chartRange={chartRange}\n periodInterval={periodInterval}\n isCandlesticksLoading={isCandlesticksLoading}\n candlestickErrors={candlestickErrors}\n onRangeChange={handleRangeChange}\n selectedMarketTickers={selectedMarketTickers}\n onMarketSelectionChange={handleMarketSelectionChange}\n onTradeAction={onTradeAction}\n />\n );\n}\n\n// Re-export for convenience\nexport { ChartRange, type ChartRangeType };\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Drawer,\n DrawerContent,\n DrawerBody,\n useDisclosure,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport { useEventByIdQuery } from \"../../hooks/useEventByIdQuery\";\nimport type { StandardMarket } from \"../../types\";\nimport {\n type TradeOutcome,\n type TradeSide,\n} from \"../trade-form/trade-form.script\";\nimport { TradeFormWidget } from \"../trade-form/trade-form.widget\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport {\n EventDetailWidget,\n type EventDetailWidgetProps,\n} from \"./event-detail.widget\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventDetailPageProps\n extends Omit<EventDetailWidgetProps, \"eventId\" | \"onTradeAction\"> {\n /** Event ticker ID */\n eventId: string;\n /** Chain network for trading (default: 'solana') */\n chain?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventDetailPage({\n eventId,\n chain,\n ...widgetProps\n}: EventDetailPageProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n // Fetch event to get the list of markets (react-query deduplicates with EventDetailWidget)\n const { data: event, isLoading: isEventLoading } = useEventByIdQuery({\n id: eventId,\n withNestedMarkets: true,\n });\n\n // Sort markets by yesAsk descending (same order as EventDetailUI)\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n ),\n [event?.markets],\n );\n\n // Trade action state – tracks which market / outcome / side were selected\n const [tradeSelection, setTradeSelection] = useState<{\n market: StandardMarket;\n outcome: TradeOutcome;\n side: TradeSide;\n /** Monotonic counter so we can key-remount the form on each action */\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: StandardMarket, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n // On mobile, also open the trade drawer\n if (isMobile) onOpen();\n },\n [isMobile, onOpen],\n );\n\n // Selected market for the trade form — prefer trade-action selection, fallback to top market\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -------------------------------------------------------------------------\n // Loading skeleton\n // -------------------------------------------------------------------------\n if (isEventLoading) {\n if (isMobile) {\n return <EventDetailSkeleton />;\n }\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailSkeleton />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n // -------------------------------------------------------------------------\n // Mobile layout: full-width detail + floating trade button + drawer\n // -------------------------------------------------------------------------\n // Common key to force TradeFormWidget remount when trade action changes\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.ticker}-${tradeSelection.version}`\n : (selectedMarket?.ticker ?? \"default\");\n\n if (isMobile) {\n return (\n <>\n <div className=\"w-full pb-20\">\n <EventDetailWidget\n eventId={eventId}\n onTradeAction={handleTradeAction}\n {...widgetProps}\n />\n </div>\n\n {/* Floating trade button */}\n {selectedMarket && (\n <div className=\"fixed inset-x-0 bottom-0 z-40 flex justify-center p-3 bg-gradient-to-t from-background via-background/90 to-transparent\">\n <Button\n color=\"primary\"\n size=\"lg\"\n className=\"w-full max-w-md font-semibold\"\n onPress={onOpen}\n >\n {t(\"predict.trade.action\")}\n </Button>\n </div>\n )}\n\n {/* Trade form drawer */}\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n placement=\"bottom\"\n size=\"lg\"\n hideCloseButton\n classNames={{\n base: \"max-h-[85dvh] rounded-t-2xl\",\n body: \"p-0\",\n }}\n >\n <DrawerContent>\n <DrawerBody>\n {selectedMarket && (\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n }\n\n // -------------------------------------------------------------------------\n // Desktop layout: detail on the left + trade form fixed on the right\n // -------------------------------------------------------------------------\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n {/* Main content */}\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailWidget\n eventId={eventId}\n onTradeAction={handleTradeAction}\n {...widgetProps}\n />\n </div>\n\n {/* Sidebar – sticky trade form */}\n {selectedMarket && (\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 flex flex-col gap-y-4\">\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n </div>\n </aside>\n )}\n </div>\n );\n}\n","/**\n * Narrow adapter for converting V2 types to Standard types.\n *\n * Used exclusively at the boundary where V2 data meets legacy components\n * that still require StandardEvent / StandardMarket (e.g. TradeFormWidget,\n * EventMarketDetailWidget). V2 UI components should use V2 types directly.\n */\nimport type { V2Event, V2Market, V2MarketStatus } from \"../client/v2\";\nimport type { MarketStatus, StandardEvent, StandardMarket } from \"../types\";\n\nfunction isoToUnix(iso: string | undefined): number {\n if (!iso) return 0;\n const ms = new Date(iso).getTime();\n return Number.isFinite(ms) ? Math.floor(ms / 1000) : 0;\n}\n\nfunction priceToString(price: number | undefined): string | null {\n if (price == null) return null;\n return String(Math.round(price * 100));\n}\n\nconst STATUS_MAP: Record<V2MarketStatus, MarketStatus> = {\n pending: \"initialized\",\n open: \"active\",\n closed: \"determined\",\n voided: \"finalized\",\n};\n\n/**\n * Convert a V2Market to the legacy StandardMarket shape.\n * DFlow-specific fields that don't exist in V2 get safe defaults.\n */\nexport function v2MarketToStandard(v2: V2Market): StandardMarket {\n const yes = v2.outcomes[0];\n const no = v2.outcomes[1];\n\n return {\n ticker: v2.slug,\n eventTicker: v2.event_slug,\n marketType: \"binary\",\n title: yes?.label ?? v2.question,\n subtitle: v2.description ?? v2.question,\n yesSubTitle: yes?.label ?? \"Yes\",\n noSubTitle: no?.label ?? \"No\",\n openTime: isoToUnix(v2.start_at),\n closeTime: isoToUnix(v2.end_at),\n expirationTime: isoToUnix(v2.expires_at ?? v2.end_at),\n status: STATUS_MAP[v2.status] ?? \"active\",\n volume: v2.volume ?? 0,\n result: v2.result ?? \"\",\n openInterest: v2.open_interest ?? 0,\n canCloseEarly: false,\n rulesPrimary: v2.rules?.[0] ?? \"\",\n accounts: {},\n yesAsk: priceToString(yes?.best_ask ?? yes?.price),\n yesBid: priceToString(yes?.best_bid),\n noAsk: priceToString(no?.best_ask ?? no?.price),\n noBid: priceToString(no?.best_bid),\n rulesSecondary: v2.rules?.slice(1).join(\"\\n\") ?? null,\n };\n}\n\n/**\n * Convert a V2Event to the legacy StandardEvent shape.\n * Used when passing event data to TradeFormWidget.\n */\nexport function v2EventToStandard(v2: V2Event): StandardEvent {\n return {\n ticker: v2.slug,\n seriesTicker: \"\",\n title: v2.title,\n subtitle: v2.subtitle ?? \"\",\n imageUrl: v2.image_url,\n liquidity: v2.liquidity,\n openInterest: v2.open_interest,\n volume: v2.volume != null ? Math.round(v2.volume * 100) : null,\n volume24h: v2.volume_24h != null ? Math.round(v2.volume_24h * 100) : null,\n strikeDate: isoToUnix(v2.end_at),\n settlementSources: v2.settlement_sources?.map((s) => ({\n name: s.name ?? \"\",\n url: s.url,\n })),\n markets: v2.markets?.map(v2MarketToStandard),\n };\n}\n","import { useState, useMemo, useCallback, useEffect } from \"react\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport type { V2Market, V2ProviderSource } from \"../../client/v2\";\nimport { ORDER_MIN_QUANTITY } from \"../../consts\";\nimport { useDFlowQuoteV2 } from \"../../hooks/v2/useDFlowQuoteV2\";\nimport { useDFlowSubmitV2 } from \"../../hooks/v2/useDFlowSubmitV2\";\nimport { useOrderV2Query } from \"../../hooks/v2/useOrderV2Query\";\nimport { useOrderbookV2Query } from \"../../hooks/v2/useOrderbookV2Query\";\nimport { usePositionsV2Query } from \"../../hooks/v2/usePositionsV2Query\";\nimport type {\n TradeOutcome,\n TradeSide,\n TradeFormValidation,\n} from \"./trade-form.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeFormV2Params {\n market: V2Market;\n chain?: string;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n}\n\nexport interface UseTradeFormV2Result {\n outcome: TradeOutcome;\n side: TradeSide;\n quantity: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isSubmitting: boolean;\n validation: TradeFormValidation;\n setOutcome: (outcome: TradeOutcome) => void;\n setSide: (side: TradeSide) => void;\n setQuantity: (quantity: number) => void;\n submit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n confetti({ ...defaults, particleCount: 80, origin: { x: 0.5, y: 0.4 } });\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.3, y: 0.6 } });\n }, 150);\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.7, y: 0.6 } });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeFormV2({\n market,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chain: _chain = \"solana\",\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormV2Params): UseTradeFormV2Result {\n const { t } = useTranslation();\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n const source: V2ProviderSource = market.source;\n\n const [outcome, setOutcome] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [pendingSignature, setPendingSignature] = useState<string | null>(null);\n\n // Price per share from market outcomes\n const pricePerShare = useMemo(() => {\n const idx = outcome === \"yes\" ? 0 : 1;\n const o = market.outcomes[idx];\n return side === \"buy\"\n ? (o?.best_ask ?? o?.price ?? 0.5)\n : (o?.best_bid ?? o?.price ?? 0.5);\n }, [market.outcomes, outcome, side]);\n\n // Shares calculation\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return side === \"buy\"\n ? pricePerShare > 0\n ? quantity / pricePerShare\n : 0\n : quantity;\n }, [side, quantity, pricePerShare]);\n\n // Amount in smallest unit for quote\n const amountStr = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return \"0\";\n return String(Math.round(quantity * 1_000_000));\n }, [quantity]);\n\n // Determine input/output mints from provider_meta\n const yesMint = (market.provider_meta?.[\"dflow.yesMint\"] as string) ?? \"\";\n const noMint = (market.provider_meta?.[\"dflow.noMint\"] as string) ?? \"\";\n const usdcMint =\n (market.provider_meta?.[\"dflow.collateralMint\"] as string) ?? \"\";\n const outcomeMint = outcome === \"yes\" ? yesMint : noMint;\n\n const inputMint = side === \"buy\" ? usdcMint : outcomeMint;\n const outputMint = side === \"buy\" ? outcomeMint : usdcMint;\n\n // DFlow quote\n const quoteEnabled =\n Boolean(inputMint) &&\n Boolean(outputMint) &&\n Boolean(userPublicKey) &&\n amountStr !== \"0\";\n\n const { data: quoteData, refetch: refetchQuote } = useDFlowQuoteV2(\n {\n inputMint,\n outputMint,\n amount: amountStr,\n userPublicKey: userPublicKey ?? \"\",\n slippageBps: 100,\n },\n { enabled: quoteEnabled },\n );\n\n // Positions for balance\n const { data: positionsData, isLoading: isBalanceLoading } =\n usePositionsV2Query(\n { source, user: userPublicKey ?? \"\" },\n { enabled: Boolean(userPublicKey) },\n );\n\n const usdcBalance = useMemo(() => {\n if (!positionsData) return null;\n const total = positionsData.positions.reduce((sum, p) => {\n if (p.side === \"USDC\" || p.side === \"collateral\")\n return sum + p.current_value;\n return sum;\n }, 0);\n return total || null;\n }, [positionsData]);\n\n const yesTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"yes\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n const noTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"no\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n // Cost / payout\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") return quantity;\n const bidPrice =\n outcome === \"yes\"\n ? (market.outcomes[0]?.best_bid ?? 0)\n : (market.outcomes[1]?.best_bid ?? 0);\n return quantity * bidPrice;\n }, [side, outcome, quantity, market.outcomes]);\n\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") return shares * 1;\n return estimatedCost;\n }, [side, shares, estimatedCost, quantity]);\n\n const potentialProfit = potentialPayout - estimatedCost;\n\n // Side setter\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\n const setQuantity = useCallback(\n (v: number) => {\n if (isNaN(v)) {\n setQuantityRaw(NaN);\n return;\n }\n const clamped = Math.max(0, v);\n const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n // Validation\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n if (market.status !== \"open\") {\n errors.push(\"Market is not active\");\n }\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(\"Insufficient USDC balance\");\n }\n const holdingBalance = outcome === \"yes\" ? yesTokenBalance : noTokenBalance;\n if (\n side === \"sell\" &&\n holdingBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > holdingBalance\n ) {\n errors.push(\"Insufficient shares\");\n }\n return { isValid: errors.length === 0, errors };\n }, [\n quantity,\n market.status,\n side,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n outcome,\n ]);\n\n // DFlow submit mutation\n const { mutateAsync: submitDFlow } = useDFlowSubmitV2();\n\n // Poll order status for pending signature\n const { data: orderStatus } = useOrderV2Query(\n { id: pendingSignature ?? \"\", source },\n { enabled: Boolean(pendingSignature) },\n );\n\n // React to terminal order status\n useEffect(() => {\n if (!orderStatus || !pendingSignature) return;\n const { status } = orderStatus;\n if (status === \"closed\") {\n setIsSubmitting(false);\n setPendingSignature(null);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n setQuantityRaw(NaN);\n } else if (status === \"failed\" || status === \"expired\") {\n setIsSubmitting(false);\n setPendingSignature(null);\n toast.error(t(\"predict.trade.submitError\"));\n }\n }, [orderStatus, pendingSignature, t]);\n\n // Submit\n const submit = useCallback(async () => {\n if (\n !validation.isValid ||\n !isAuthenticated ||\n !userPublicKey ||\n !solanaWallet\n ) {\n return;\n }\n\n setIsSubmitting(true);\n setPendingSignature(null);\n\n try {\n // Get fresh quote with transaction\n const quoteResult = await refetchQuote();\n const quote = quoteResult.data;\n const transaction = (quote as Record<string, unknown>)?.transaction as\n | string\n | undefined;\n\n if (!transaction) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n // Sign and send\n const txBytes = Uint8Array.from(atob(transaction), (c) =>\n c.charCodeAt(0),\n );\n const signature = await solanaWallet.sendTransaction(txBytes);\n\n // Submit to prediction-server for tracking\n await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...txBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: inputMint,\n output_mint: outputMint,\n amount: amountStr,\n price: String(pricePerShare),\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n outcome: outcome === \"yes\" ? \"YES\" : \"NO\",\n market_slug: market.slug,\n slippage_bps: 100,\n },\n });\n\n setPendingSignature(signature);\n } catch (err) {\n console.error(\"[TradeFormV2] submit failed:\", err);\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n userPublicKey,\n solanaWallet,\n refetchQuote,\n submitDFlow,\n inputMint,\n outputMint,\n amountStr,\n pricePerShare,\n side,\n outcome,\n market.slug,\n t,\n ]);\n\n return {\n outcome,\n side,\n quantity,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n };\n}\n","import { useMemo } from \"react\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport {\n v2EventToStandard,\n v2MarketToStandard,\n} from \"../../utils/v2-market-adapter\";\nimport { useTradeFormV2 } from \"./trade-form-v2.script\";\nimport type { TradeSide, TradeOutcome } from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormV2WidgetProps {\n event?: V2Event;\n market: V2Market;\n initialSide?: TradeSide;\n initialOutcome?: TradeOutcome;\n chain?: string;\n}\n\nexport function TradeFormV2Widget({\n event,\n market,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormV2WidgetProps) {\n const {\n outcome,\n side,\n quantity,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n } = useTradeFormV2({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n const authenticatedSubmit = useAuthCallback(submit);\n\n const adaptedEvent = useMemo(\n () => (event ? v2EventToStandard(event) : undefined),\n [event],\n );\n const adaptedMarket = useMemo(() => v2MarketToStandard(market), [market]);\n\n return (\n <TradeFormUI\n event={adaptedEvent}\n market={adaptedMarket}\n outcome={outcome}\n side={side}\n quantity={quantity}\n estimatedCost={estimatedCost}\n potentialPayout={potentialPayout}\n potentialProfit={potentialProfit}\n usdcBalance={usdcBalance}\n yesTokenBalance={yesTokenBalance}\n noTokenBalance={noTokenBalance}\n isBalanceLoading={isBalanceLoading}\n isSubmitting={isSubmitting}\n isValid={validation.isValid}\n validationErrors={validation.errors}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onQuantityChange={setQuantity}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\nimport type {\n V2Event,\n V2Position,\n V2Trade,\n V2UserOrder,\n} from \"../../client/v2\";\nimport { useCancelOrderV2Mutation } from \"../../hooks/v2/useCancelOrderV2Mutation\";\nimport { useOrdersV2Query } from \"../../hooks/v2/useOrdersV2Query\";\nimport { usePositionsV2Query } from \"../../hooks/v2/usePositionsV2Query\";\nimport { useTradesByWalletV2Query } from \"../../hooks/v2/useTradesByWalletV2Query\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UserActivityV2SectionProps {\n event: V2Event;\n /** Connected wallet address. When empty the section shows a connect prompt. */\n walletAddress?: string;\n /** Callback to cancel an open order. */\n onCancelOrder?: (orderId: string) => void;\n}\n\ntype ActivityTab = \"positions\" | \"orders\" | \"trades\";\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function UserActivityV2Section({\n event,\n walletAddress,\n onCancelOrder,\n}: UserActivityV2SectionProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ActivityTab>(\"positions\");\n\n const marketSlugs = useMemo(\n () => event.markets?.map((m) => m.slug) ?? [],\n [event.markets],\n );\n\n const tabs: { key: ActivityTab; label: string }[] = [\n { key: \"positions\", label: t(\"predict.positions.title\") },\n { key: \"orders\", label: t(\"predict.openOrders.title\") },\n { key: \"trades\", label: t(\"predict.tradeHistory.title\") },\n ];\n\n return (\n <div className=\"flex flex-col gap-y-2 mt-6 px-1 lg:px-4\">\n {/* Tab bar */}\n <div className=\"flex items-center gap-x-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-2 text-sm font-medium transition-colors cursor-pointer\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-primary\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n {!walletAddress ? (\n <div className=\"flex items-center justify-center py-12 text-sm text-neutral\">\n {t(\"predict.trade.connectWallet\")}\n </div>\n ) : (\n <div className=\"min-h-[120px]\">\n {activeTab === \"positions\" && (\n <PositionsTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n />\n )}\n {activeTab === \"orders\" && (\n <OrdersTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n onCancelOrder={onCancelOrder}\n />\n )}\n {activeTab === \"trades\" && (\n <TradesTab source={event.source} walletAddress={walletAddress} />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Positions Tab\n// ---------------------------------------------------------------------------\n\nfunction PositionsTab({\n source,\n walletAddress,\n marketSlugs,\n}: {\n source: V2Event[\"source\"];\n walletAddress: string;\n marketSlugs: string[];\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = usePositionsV2Query({\n source,\n user: walletAddress,\n });\n\n const positions = useMemo(() => {\n if (!data?.positions) return [];\n if (marketSlugs.length === 0) return data.positions;\n return data.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n );\n }, [data?.positions, marketSlugs]);\n\n if (isLoading) return <TabSkeleton rows={3} />;\n\n if (positions.length === 0) {\n return <EmptyState message={t(\"predict.positions.empty\")} />;\n }\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs lg:text-sm\">\n <thead>\n <tr className=\"text-neutral text-left\">\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.positions.market\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.positions.side\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.positions.size\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.positions.avgCost\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.positions.currentPrice\")}\n </th>\n <th className=\"py-2 font-normal text-right\">\n {t(\"predict.positions.pnl\")}\n </th>\n </tr>\n </thead>\n <tbody>\n {positions.map((pos, idx) => (\n <PositionRow\n key={`${pos.market?.slug ?? idx}-${pos.side}`}\n position={pos}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction PositionRow({ position }: { position: V2Position }) {\n const pnlColor =\n position.pnl > 0\n ? \"text-success\"\n : position.pnl < 0\n ? \"text-danger\"\n : \"text-foreground\";\n const pnlSign = position.pnl > 0 ? \"+\" : \"\";\n\n return (\n <tr className=\"border-b border-border/50 last:border-b-0\">\n <td className=\"py-2 pr-2 text-foreground max-w-[180px] truncate\">\n {position.market?.outcomes?.[0]?.label ??\n position.market?.question ??\n \"—\"}\n </td>\n <td className=\"py-2 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium uppercase\",\n position.side.toLowerCase() === \"yes\"\n ? \"bg-primary/10 text-primary\"\n : \"bg-secondary/10 text-secondary\",\n )}\n >\n {position.side}\n </span>\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {position.size}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {formatPrice(position.avg_price)}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {formatPrice(position.current_price)}\n </td>\n <td className={cn(\"py-2 text-right font-mono\", pnlColor)}>\n {pnlSign}${Math.abs(position.pnl).toFixed(2)}\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {position.pnl_percent.toFixed(1)}%)\n </span>\n </td>\n </tr>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Orders Tab\n// ---------------------------------------------------------------------------\n\nfunction OrdersTab({\n source,\n walletAddress,\n marketSlugs,\n onCancelOrder,\n}: {\n source: V2Event[\"source\"];\n walletAddress: string;\n marketSlugs: string[];\n onCancelOrder?: (orderId: string) => void;\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = useOrdersV2Query({\n source,\n wallet_address: walletAddress,\n });\n\n const cancelMutation = useCancelOrderV2Mutation();\n\n const orders = useMemo(() => {\n if (!data?.items) return [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n let filtered = data.items.filter((o) => openStatuses.has(o.status));\n if (marketSlugs.length > 0) {\n filtered = filtered.filter(\n (o) => o.market_id && marketSlugs.includes(o.market_id),\n );\n }\n return filtered;\n }, [data?.items, marketSlugs]);\n\n const handleCancel = (orderId: string) => {\n if (onCancelOrder) {\n onCancelOrder(orderId);\n } else {\n cancelMutation.mutate({ source, id: orderId });\n }\n };\n\n if (isLoading) return <TabSkeleton rows={3} />;\n\n if (orders.length === 0) {\n return <EmptyState message={t(\"predict.openOrders.empty\")} />;\n }\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs lg:text-sm\">\n <thead>\n <tr className=\"text-neutral text-left\">\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.openOrders.side\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.openOrders.outcome\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.openOrders.type\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.openOrders.price\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.openOrders.filled\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.openOrders.status\")}\n </th>\n <th className=\"py-2 font-normal\" />\n </tr>\n </thead>\n <tbody>\n {orders.map((order) => (\n <OrderRow\n key={order.id}\n order={order}\n onCancel={() => handleCancel(order.id)}\n isCancelling={cancelMutation.isPending}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction OrderRow({\n order,\n onCancel,\n isCancelling,\n}: {\n order: V2UserOrder;\n onCancel: () => void;\n isCancelling: boolean;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n\n return (\n <tr className=\"border-b border-border/50 last:border-b-0\">\n <td className=\"py-2 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n </td>\n <td className=\"py-2 pr-2 text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </td>\n <td className=\"py-2 pr-2 text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {order.price ? formatPrice(parseFloat(order.price)) : \"—\"}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {order.size_matched ?? \"0\"}/{order.original_size ?? \"—\"}\n </td>\n <td className=\"py-2 pr-2\">\n <OrderStatusBadge status={order.status} />\n </td>\n <td className=\"py-2 text-right\">\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isCancelling}\n className=\"text-[10px] text-danger hover:text-danger/80 cursor-pointer disabled:opacity-50 transition-colors\"\n >\n {isCancelling ? (\n <Spinner size=\"sm\" />\n ) : (\n t(\"predict.openOrders.cancel\")\n )}\n </button>\n </td>\n </tr>\n );\n}\n\nfunction OrderStatusBadge({ status }: { status: string }) {\n const colorMap: Record<string, string> = {\n live: \"bg-success/10 text-success\",\n open: \"bg-success/10 text-success\",\n submitted: \"bg-warning/10 text-warning\",\n pending: \"bg-warning/10 text-warning\",\n matched: \"bg-primary/10 text-primary\",\n cancelled: \"bg-neutral/10 text-neutral\",\n failed: \"bg-danger/10 text-danger\",\n expired: \"bg-neutral/10 text-neutral\",\n };\n\n return (\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium capitalize\",\n colorMap[status] ?? \"bg-neutral/10 text-neutral\",\n )}\n >\n {status}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Trades Tab\n// ---------------------------------------------------------------------------\n\nfunction TradesTab({\n source,\n walletAddress,\n}: {\n source: V2Event[\"source\"];\n walletAddress: string;\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = useTradesByWalletV2Query({\n source,\n wallet: walletAddress,\n limit: 50,\n });\n\n const trades = data?.items ?? [];\n\n if (isLoading) return <TabSkeleton rows={3} />;\n\n if (trades.length === 0) {\n return <EmptyState message={t(\"predict.tradeHistory.empty\")} />;\n }\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs lg:text-sm\">\n <thead>\n <tr className=\"text-neutral text-left\">\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.tradeHistory.side\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.tradeHistory.outcome\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.tradeHistory.price\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.tradeHistory.qty\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.tradeHistory.total\")}\n </th>\n <th className=\"py-2 font-normal text-right\">\n {t(\"predict.tradeHistory.time\")}\n </th>\n </tr>\n </thead>\n <tbody>\n {trades.map((trade) => (\n <TradeRow key={trade.id} trade={trade} />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction TradeRow({ trade }: { trade: V2Trade }) {\n const isBuy = trade.side.toUpperCase() === \"BUY\";\n const timeStr = formatTimestamp(trade.timestamp);\n\n return (\n <tr className=\"border-b border-border/50 last:border-b-0\">\n <td className=\"py-2 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {trade.side}\n </span>\n </td>\n <td className=\"py-2 pr-2 text-foreground capitalize\">\n {trade.outcome ?? \"—\"}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {formatPrice(trade.price)}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {trade.size}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n ${trade.usd_size.toFixed(2)}\n </td>\n <td className=\"py-2 text-right text-neutral whitespace-nowrap\">\n {timeStr}\n </td>\n </tr>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ message }: { message: string }) {\n return (\n <div className=\"flex items-center justify-center py-12 text-sm text-neutral\">\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ rows }: { rows: number }) {\n return (\n <div className=\"flex flex-col gap-y-2 py-3 animate-pulse\">\n {Array.from({ length: rows }).map((_, i) => (\n <Skeleton key={i} className=\"h-8 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatPrice(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n return `${month}/${day} ${hours}:${mins}`;\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Tabs, Tab, Spinner } from \"@liberfi.io/ui\";\nimport type { V2Market, V2ProviderSource } from \"../../client/v2\";\nimport { useCandlesticksV2Query } from \"../../hooks/v2/useCandlesticksV2Query\";\nimport { useMarketTradesV2Query } from \"../../hooks/v2/useMarketTradesV2Query\";\nimport { useOrderbookV2Query } from \"../../hooks/v2/useOrderbookV2Query\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventMarketOrderbookUI } from \"./event-market-orderbook.ui\";\n\ntype MarketDetailTab = \"trade-yes\" | \"trade-no\" | \"activity\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatPrice(price: number): string {\n return `${Math.round(price * 100)}¢`;\n}\n\nfunction formatQty(qty: number): string {\n if (qty >= 1_000_000) return `${(qty / 1_000_000).toFixed(1)}M`;\n if (qty >= 1_000) return `${(qty / 1_000).toFixed(1)}K`;\n return qty.toLocaleString();\n}\n\nfunction formatTime(ts: number): string {\n const date = new Date(ts * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day} ${hours}:${minutes}`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventMarketDetailV2WidgetProps {\n market: V2Market;\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDetailV2Widget({\n market,\n onTradeAction,\n}: EventMarketDetailV2WidgetProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<MarketDetailTab>(\"trade-yes\");\n\n const source = market.source;\n\n const { data: orderbook, isLoading: isOrderbookLoading } =\n useOrderbookV2Query(\n { slug: market.slug, source },\n { enabled: activeTab === \"trade-yes\" || activeTab === \"trade-no\" },\n );\n\n const { data: tradesData, isLoading: isTradesLoading } =\n useMarketTradesV2Query(\n { slug: market.slug, source, limit: 20 },\n { enabled: activeTab === \"activity\" },\n );\n\n const handleYesPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"yes\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n const handleNoPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"no\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n const yesBids = useMemo(\n () =>\n (orderbook?.bids ?? []).map((o) => ({\n price: o.price,\n quantity: o.size,\n })),\n [orderbook?.bids],\n );\n const yesAsks = useMemo(\n () =>\n (orderbook?.asks ?? []).map((o) => ({\n price: o.price,\n quantity: o.size,\n })),\n [orderbook?.asks],\n );\n\n const trades = tradesData?.items ?? [];\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n <Tabs\n variant=\"underlined\"\n selectedKey={activeTab}\n onSelectionChange={(key) => setActiveTab(key as MarketDetailTab)}\n classNames={{ tabList: \"gap-x-4\", tab: \"px-0\" }}\n >\n <Tab key=\"trade-yes\" title={t(\"predict.market.tradeYes\")} />\n <Tab key=\"trade-no\" title={t(\"predict.market.tradeNo\")} />\n <Tab key=\"activity\" title={t(\"predict.activity.title\")} />\n </Tabs>\n\n <div className=\"min-h-[120px]\">\n {activeTab === \"trade-yes\" && (\n <EventMarketOrderbookUI\n bids={yesBids}\n asks={yesAsks}\n isLoading={isOrderbookLoading}\n onPriceClick={handleYesPriceClick}\n />\n )}\n\n {activeTab === \"trade-no\" && (\n <EventMarketOrderbookUI\n bids={yesBids}\n asks={yesAsks}\n isLoading={isOrderbookLoading}\n onPriceClick={handleNoPriceClick}\n />\n )}\n\n {activeTab === \"activity\" && (\n <V2TradesTable trades={trades} isLoading={isTradesLoading} />\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// V2 Trades table (uses V2Trade directly, no legacy adapter)\n// ---------------------------------------------------------------------------\n\nfunction V2TradesTable({\n trades,\n isLoading,\n}: {\n trades: import(\"../../client/v2\").V2Trade[];\n isLoading: boolean;\n}) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n if (trades.length === 0) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.tradeHistory.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"grid grid-cols-4 px-2 py-2.5 text-xs text-neutral\">\n <span>{t(\"predict.tradeHistory.side\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.price\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.qty\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.time\")}</span>\n </div>\n\n {trades.map((trade) => {\n const isYes = trade.outcome?.toLowerCase() === \"yes\";\n const sideColor = isYes ? \"text-bullish\" : \"text-bearish\";\n const sideLabel = isYes\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\");\n\n return (\n <div\n key={trade.id}\n className=\"grid grid-cols-4 px-2 py-2.5 text-xs hover:bg-default-100 transition-colors\"\n >\n <span className={`font-medium ${sideColor}`}>{sideLabel}</span>\n <span className=\"text-right font-mono text-foreground\">\n {formatPrice(trade.price)}\n </span>\n <span className=\"text-right font-mono text-foreground\">\n {formatQty(trade.size)}\n </span>\n <span className=\"text-right text-default-500\">\n {formatTime(trade.timestamp)}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","// =============================================================================\n// EventPriceChartV2\n//\n// Pixel-accurate clone of the Jupiter Prediction Market price chart.\n// Uses Recharts LineChart with 7 visual effects:\n// 1. Top legend (dot + label + live %)\n// 2. Real-time tooltip on hover\n// 3. Active cursor dot on each line\n// 4. Breathing pulsing dot at the last data point\n// 5. Left/right opacity overlay that follows the cursor\n// 6. Custom X/Y axis styling\n// 7. Horizontal dashed grid lines\n//\n// Accepts a V2Event and selects up to 4 markets to display via a chip selector.\n// =============================================================================\nimport {\n Component,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ErrorInfo,\n type ReactNode,\n} from \"react\";\nimport {\n CartesianGrid,\n Customized,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport {\n ChartRange,\n DEFAULT_CHART_RANGE,\n type ChartRangeType,\n} from \"../../consts\";\nimport {\n useMarketHistoryV2,\n type MarketHistorySeries,\n} from \"../../hooks/v2/useMarketHistoryV2\";\n\n// ---------------------------------------------------------------------------\n// Error boundary — prevents chart crashes from taking down the page\n// ---------------------------------------------------------------------------\n\ninterface ChartErrorBoundaryState {\n error: Error | null;\n}\n\nclass ChartErrorBoundary extends Component<\n { children: ReactNode; fallbackHeight?: number },\n ChartErrorBoundaryState\n> {\n state: ChartErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\"[EventPriceChartV2] render error:\", error, info);\n }\n\n render() {\n if (this.state.error) {\n return (\n <div\n style={{\n height: this.props.fallbackHeight ?? 320,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n <span>Chart unavailable</span>\n <span style={{ fontSize: 11, opacity: 0.7 }}>\n {this.state.error.message}\n </span>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MAX_SELECTED = 4;\n\n/** Jupiter-aligned chart colors */\nconst CHART_COLORS = [\n \"#22d3ee\", // cyan\n \"#a3e635\", // lime\n \"#f97316\", // orange\n \"#f472b6\", // pink\n \"#a78bfa\", // violet\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n // e.g. \"14:30\"\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n // e.g. \"Mar 18\"\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(2)}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Interval labels\n// ---------------------------------------------------------------------------\n\nconst INTERVAL_OPTIONS: { range: ChartRangeType; label: string }[] = [\n { range: ChartRange.ONE_DAY, label: \"1D\" },\n { range: ChartRange.ONE_WEEK, label: \"1W\" },\n { range: ChartRange.ONE_MONTH, label: \"1M\" },\n { range: ChartRange.ALL, label: \"ALL\" },\n];\n\n// ---------------------------------------------------------------------------\n// IntervalSwitcher — plain text buttons, Jupiter-style\n// ---------------------------------------------------------------------------\n\ninterface IntervalSwitcherProps {\n value: ChartRangeType;\n onChange: (range: ChartRangeType) => void;\n}\n\nfunction IntervalSwitcher({ value, onChange }: IntervalSwitcherProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\n {INTERVAL_OPTIONS.map(({ range, label }) => {\n const isActive = range === value;\n return (\n <button\n key={range}\n onClick={() => onChange(range)}\n style={{\n padding: \"2px 8px\",\n border: \"none\",\n background: \"transparent\",\n color: isActive ? \"#f9fafb\" : \"#6b7280\",\n fontWeight: isActive ? 700 : 400,\n fontSize: 12,\n cursor: \"pointer\",\n borderRadius: 4,\n letterSpacing: \"0.02em\",\n transition: \"color 0.15s\",\n userSelect: \"none\",\n }}\n >\n {label}\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// BreathingDotsLayer — renders ONE breathing dot per series at its last point.\n// Injected via <Customized> so it runs once, not once-per-data-point.\n// ---------------------------------------------------------------------------\n\ninterface BreathingDotsLayerProps {\n /** Pairs of [cx, cy, color] for each series' last point. */\n dots: Array<{ cx: number; cy: number; color: string }>;\n // Recharts passes extra layout props — accept and ignore them.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nfunction BreathingDotsLayer({ dots }: BreathingDotsLayerProps) {\n return (\n <>\n {dots.map(({ cx, cy, color }, i) => (\n <g key={i}>\n <circle cx={cx} cy={cy} r={6} fill={color} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;9;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.05;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={cx} cy={cy} r={3.5} fill={color} />\n </g>\n ))}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// useCursorOverlay\n//\n// Returns refs for the chart wrapper div and the overlay div.\n// Mouse position tracking is done at the div level (not via Recharts internals)\n// so the approach works regardless of Recharts version or SVG structure.\n// DOM style is updated imperatively — zero React re-renders on mousemove.\n// ---------------------------------------------------------------------------\n\nfunction useCursorOverlay() {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n\n const onMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const wrapper = wrapperRef.current;\n const overlay = overlayRef.current;\n if (!wrapper || !overlay) return;\n\n const rect = wrapper.getBoundingClientRect();\n // Cursor offset as percentage of the wrapper — this is exactly where the\n // cursor is visually, so the gradient cutoff aligns perfectly with it.\n const xPct = ((e.clientX - rect.left) / rect.width) * 100;\n\n // Left of cursor: transparent (lines at full brightness).\n // Right of cursor: ~38% dark overlay, matching Jupiter's visual where\n // lines to the right appear ~30% dimmer than lines to the left.\n overlay.style.background = `linear-gradient(to right, transparent ${xPct}%, rgba(0,0,0,0.38) ${xPct}%)`;\n overlay.style.opacity = \"1\";\n }, []);\n\n const onMouseLeave = useCallback(() => {\n if (overlayRef.current) overlayRef.current.style.opacity = \"0\";\n }, []);\n\n return { wrapperRef, overlayRef, onMouseMove, onMouseLeave };\n}\n\n// ---------------------------------------------------------------------------\n// CustomTooltip\n// ---------------------------------------------------------------------------\n\ninterface CustomTooltipPayloadItem {\n dataKey: string;\n value: number | undefined;\n stroke: string;\n color: string;\n}\n\ninterface CustomTooltipProps {\n active?: boolean;\n payload?: CustomTooltipPayloadItem[];\n label?: number | string;\n labelMap: Map<string, string>;\n}\n\nfunction CustomTooltip({\n active,\n payload,\n label,\n labelMap,\n}: CustomTooltipProps) {\n if (!active || !payload?.length) return null;\n\n const sorted = [...(payload as CustomTooltipPayloadItem[])]\n .filter((p) => p.value != null)\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n return (\n <div\n style={{\n background: \"rgba(10,10,10,0.92)\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n minWidth: 180,\n backdropFilter: \"blur(8px)\",\n fontSize: 12,\n }}\n >\n <div style={{ color: \"#9ca3af\", marginBottom: 6, fontWeight: 500 }}>\n {typeof label === \"number\" ? formatTimestamp(label) : label}\n </div>\n {sorted.map((p) => (\n <div\n key={p.dataKey}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 3,\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n width: 3,\n height: 14,\n borderRadius: 2,\n background: p.stroke ?? p.color,\n flexShrink: 0,\n }}\n />\n <span\n style={{\n color: \"#e5e7eb\",\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: 120,\n }}\n >\n {labelMap.get(p.dataKey) ?? p.dataKey}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {p.value != null ? formatPercent(p.value) : \"-\"}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// MarketSelector — dropdown multi-select, max MAX_SELECTED markets\n// ---------------------------------------------------------------------------\n\ninterface MarketSelectorProps {\n markets: V2Market[];\n selectedSlugs: string[];\n colorMap: Map<string, string>;\n onToggle: (slug: string) => void;\n}\n\nfunction MarketSelector({\n markets,\n selectedSlugs,\n colorMap,\n onToggle,\n}: MarketSelectorProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleClick(e: MouseEvent) {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const atMax = selectedSlugs.length >= MAX_SELECTED;\n\n // Trigger label: show colored dots + count summary\n const triggerContent = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n flex: 1,\n minWidth: 0,\n }}\n >\n {/* Color dots for selected markets */}\n <div style={{ display: \"flex\", gap: 3, flexShrink: 0 }}>\n {selectedSlugs.map((slug) => (\n <span\n key={slug}\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: colorMap.get(slug) ?? \"#6b7280\",\n display: \"inline-block\",\n }}\n />\n ))}\n </div>\n {/* Label */}\n <span\n style={{\n color: \"#e5e7eb\",\n fontSize: 12,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {selectedSlugs.length === 1\n ? (markets.find((m) => m.slug === selectedSlugs[0])?.question ??\n \"1 market\")\n : `${selectedSlugs.length} / ${markets.length} markets`}\n </span>\n </div>\n );\n\n return (\n <div\n ref={rootRef}\n style={{ position: \"relative\", display: \"inline-block\", maxWidth: 320 }}\n >\n {/* Trigger button */}\n <button\n onClick={() => setOpen((v) => !v)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 10px\",\n borderRadius: 8,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"rgba(255,255,255,0.05)\",\n cursor: \"pointer\",\n minWidth: 160,\n maxWidth: 320,\n userSelect: \"none\",\n }}\n >\n {triggerContent}\n {/* Chevron */}\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n style={{\n flexShrink: 0,\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.15s\",\n color: \"#6b7280\",\n }}\n >\n <path\n d=\"M2 4l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Dropdown panel */}\n {open && (\n <div\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: 0,\n zIndex: 50,\n background: \"#111827\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 10,\n boxShadow: \"0 8px 24px rgba(0,0,0,0.5)\",\n minWidth: 260,\n maxWidth: 360,\n maxHeight: 320,\n overflowY: \"auto\",\n padding: \"6px 0\",\n }}\n >\n {/* Header hint */}\n <div\n style={{\n padding: \"4px 12px 8px\",\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n marginBottom: 4,\n }}\n >\n Select up to {MAX_SELECTED} markets\n </div>\n\n {markets.map((market) => {\n const isSelected = selectedSlugs.includes(market.slug);\n const isDisabled = !isSelected && atMax;\n const isOnlyOne = isSelected && selectedSlugs.length === 1;\n const color = colorMap.get(market.slug) ?? \"#6b7280\";\n const yesOutcome =\n market.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes[0];\n const pct =\n yesOutcome?.price != null\n ? `${Math.round(yesOutcome.price * 100)}%`\n : null;\n\n return (\n <button\n key={market.slug}\n onClick={() => {\n if (isOnlyOne || isDisabled) return;\n onToggle(market.slug);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n width: \"100%\",\n padding: \"7px 12px\",\n border: \"none\",\n background: isSelected\n ? \"rgba(255,255,255,0.05)\"\n : \"transparent\",\n cursor: isDisabled || isOnlyOne ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.35 : 1,\n textAlign: \"left\",\n transition: \"background 0.1s\",\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isOnlyOne)\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.07)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n isSelected ? \"rgba(255,255,255,0.05)\" : \"transparent\";\n }}\n >\n {/* Checkbox */}\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: 4,\n border: isSelected\n ? `2px solid ${color}`\n : \"2px solid rgba(255,255,255,0.2)\",\n background: isSelected ? `${color}30` : \"transparent\",\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {isSelected && (\n <svg width=\"9\" height=\"7\" viewBox=\"0 0 9 7\" fill=\"none\">\n <path\n d=\"M1 3.5L3.5 6L8 1\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n\n {/* Color dot */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n }}\n />\n\n {/* Question text */}\n <span\n style={{\n color: isSelected ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 12,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n\n {/* Odds */}\n {pct && (\n <span\n style={{\n color,\n fontWeight: 700,\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n {pct}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Legend\n// ---------------------------------------------------------------------------\n\ninterface LegendBarProps {\n series: MarketHistorySeries[];\n colorMap: Map<string, string>;\n currentValues: Map<string, number>;\n}\n\nfunction LegendBar({ series, colorMap, currentValues }: LegendBarProps) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"4px 16px\",\n padding: \"0 2px\",\n }}\n >\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n const value = currentValues.get(s.marketSlug);\n return (\n <div\n key={s.marketSlug}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n }}\n >\n <span\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n }}\n />\n <span style={{ color: \"#9ca3af\" }}>{s.label}</span>\n {value != null && (\n <span style={{ color: \"#f9fafb\", fontWeight: 700 }}>\n {formatPercent(value)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Chart data transformation (timestamp union + forward fill)\n// ---------------------------------------------------------------------------\n\ntype ChartRow = Record<string, number>;\n\nfunction buildChartData(series: MarketHistorySeries[]): ChartRow[] {\n if (series.length === 0) return [];\n\n const allTimestamps = new Set<number>();\n series.forEach((s) => s.data.forEach((p) => allTimestamps.add(p.timestamp)));\n\n const sorted = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Build per-series lookup map\n const lookups = series.map((s) => {\n const m = new Map<number, number>();\n s.data.forEach((p) => m.set(p.timestamp, p.price));\n return { slug: s.marketSlug, map: m };\n });\n\n const lastValues = new Map<string, number>();\n\n return sorted.map((ts) => {\n const row: ChartRow = { timestamp: ts };\n lookups.forEach(({ slug, map }) => {\n const val = map.get(ts);\n if (val !== undefined) {\n lastValues.set(slug, val);\n row[slug] = val;\n } else {\n const last = lastValues.get(slug);\n if (last !== undefined) row[slug] = last;\n }\n });\n return row;\n });\n}\n\n// ---------------------------------------------------------------------------\n// EventPriceChartV2\n// ---------------------------------------------------------------------------\n\nexport interface EventPriceChartV2Props {\n event: V2Event;\n isLoading?: boolean;\n /** Optional CSS class for the outer container */\n className?: string;\n}\n\nexport function EventPriceChartV2(props: EventPriceChartV2Props) {\n return (\n <ChartErrorBoundary>\n <EventPriceChartV2Inner {...props} />\n </ChartErrorBoundary>\n );\n}\n\nfunction EventPriceChartV2Inner({\n event,\n isLoading: externalLoading,\n className,\n}: EventPriceChartV2Props) {\n const allMarkets = useMemo(() => event.markets ?? [], [event.markets]);\n\n // Default: first MAX_SELECTED markets selected\n const [selectedSlugs, setSelectedSlugs] = useState<string[]>(() =>\n allMarkets.slice(0, MAX_SELECTED).map((m) => m.slug),\n );\n\n // Chart time range (interval selector)\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n // Stable color mapping: market slug → color\n const colorMap = useMemo(() => {\n const map = new Map<string, string>();\n allMarkets.forEach((m, idx) => {\n map.set(m.slug, CHART_COLORS[idx % CHART_COLORS.length]);\n });\n return map;\n }, [allMarkets]);\n\n const selectedMarkets = useMemo(\n () => allMarkets.filter((m) => selectedSlugs.includes(m.slug)),\n [allMarkets, selectedSlugs],\n );\n\n const { series: hookSeries, isLoading: hookLoading } = useMarketHistoryV2(\n selectedMarkets,\n chartRange,\n );\n const isLoading = externalLoading || hookLoading;\n\n // Belt-and-suspenders: if hook returns no renderable data, generate\n // synthetic flat lines from current outcome prices so the chart is never empty.\n const series = useMemo<MarketHistorySeries[]>(() => {\n if (hookSeries.length > 0 && hookSeries.some((s) => s.data.length > 0)) {\n return hookSeries;\n }\n const now = Date.now();\n const dayMs = 86_400_000;\n return selectedMarkets.map((market) => {\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const price = yesOutcome?.price ?? 0.5;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price },\n { timestamp: now, price },\n ],\n };\n });\n }, [hookSeries, selectedMarkets]);\n\n const chartData = useMemo(() => buildChartData(series), [series]);\n\n // Y-axis domain: padded range of all values\n const yDomain = useMemo((): [number, number] => {\n if (chartData.length === 0) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n selectedSlugs.forEach((slug) => {\n chartData.forEach((row) => {\n const v = row[slug];\n if (v != null) {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n });\n });\n if (!isFinite(min)) return [0, 1];\n const pad = Math.max((max - min) * 0.15, 0.05);\n return [Math.max(0, min - pad), Math.min(1, max + pad)];\n }, [chartData, selectedSlugs]);\n\n // Current values for legend (latest point)\n const currentValues = useMemo(() => {\n const map = new Map<string, number>();\n series.forEach((s) => {\n if (s.data.length > 0) {\n map.set(s.marketSlug, s.data[s.data.length - 1].price);\n }\n });\n return map;\n }, [series]);\n\n // Tooltip label map\n const labelMap = useMemo(() => {\n const map = new Map<string, string>();\n series.forEach((s) => map.set(s.marketSlug, s.label));\n return map;\n }, [series]);\n\n // Effect 5: cursor overlay (left transparent / right dimmed)\n const {\n wrapperRef: chartWrapperRef,\n overlayRef: overlayDivRef,\n onMouseMove: handleWrapperMouseMove,\n onMouseLeave: handleWrapperMouseLeave,\n } = useCursorOverlay();\n\n // Market selector toggle handler\n const handleToggle = useCallback((slug: string) => {\n setSelectedSlugs((prev) => {\n if (prev.includes(slug)) {\n if (prev.length <= 1) return prev;\n return prev.filter((s) => s !== slug);\n }\n if (prev.length >= MAX_SELECTED) return prev;\n return [...prev, slug];\n });\n }, []);\n\n // ---------------------------------------------------------------------------\n // Loading / empty states\n // ---------------------------------------------------------------------------\n\n if (isLoading) {\n return (\n <div\n style={{\n height: 320,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n border: \"2.5px solid #22d3ee\",\n borderTopColor: \"transparent\",\n animation: \"spin 0.7s linear infinite\",\n }}\n />\n </div>\n );\n }\n\n if (chartData.length === 0) {\n return (\n <div\n style={{\n height: 320,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n No price history data\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}\n >\n {/* Market selector chips */}\n {allMarkets.length > 1 && (\n <MarketSelector\n markets={allMarkets}\n selectedSlugs={selectedSlugs}\n colorMap={colorMap}\n onToggle={handleToggle}\n />\n )}\n\n {/* Legend */}\n <LegendBar\n series={series}\n colorMap={colorMap}\n currentValues={currentValues}\n />\n\n {/* Chart */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 0 }}>\n <div\n ref={chartWrapperRef}\n style={{\n height: 300,\n width: \"100%\",\n userSelect: \"none\",\n position: \"relative\",\n }}\n onMouseMove={handleWrapperMouseMove}\n onMouseLeave={handleWrapperMouseLeave}\n >\n {/* Effect 5: left transparent / right dimmed overlay div */}\n <div\n ref={overlayDivRef}\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n />\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 8, right: 16, left: 0, bottom: 0 }}\n >\n {/* Effect 7: horizontal dashed grid */}\n <CartesianGrid\n horizontal\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"#374151\"\n opacity={0.5}\n />\n\n {/* Effect 6: X axis */}\n <XAxis\n dataKey=\"timestamp\"\n type=\"number\"\n scale=\"time\"\n domain={[\"dataMin\", \"dataMax\"]}\n tickFormatter={(ms: number) => formatTimestamp(ms, chartRange)}\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n minTickGap={70}\n />\n\n {/* Effect 6: Y axis */}\n <YAxis\n domain={yDomain}\n tickFormatter={(v: number) => `${Math.round(v * 100)}%`}\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n width={40}\n tickCount={6}\n />\n\n {/* Effect 2: real-time tooltip */}\n <Tooltip\n content={(props) => (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <CustomTooltip {...(props as any)} labelMap={labelMap} />\n )}\n cursor={{\n stroke: \"#4b5563\",\n strokeWidth: 1,\n strokeDasharray: \"4 4\",\n }}\n isAnimationActive={false}\n />\n\n {/* Lines — dot={false} to skip per-point React calls */}\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <Line\n key={s.marketSlug}\n type=\"stepAfter\"\n dataKey={s.marketSlug}\n stroke={color}\n strokeWidth={2}\n dot={false}\n // Effect 3: active cursor dot\n activeDot={{\n r: 4.5,\n strokeWidth: 2,\n stroke: \"rgba(10,10,10,0.8)\",\n fill: color,\n }}\n connectNulls\n isAnimationActive={false}\n />\n );\n })}\n\n {/*\n * Effect 4: breathing dots at each series' last data point.\n * Injected via <Customized> to access xScale/yScale once per render,\n * instead of rendering a React component for every single data point.\n */}\n <Customized\n component={(props: Record<string, unknown>) => {\n const xScale = props.xAxisMap\n ? (Object.values(props.xAxisMap as any)[0] as any)?.scale\n : null;\n\n const yScale = props.yAxisMap\n ? (Object.values(props.yAxisMap as any)[0] as any)?.scale\n : null;\n\n const dots: Array<{ cx: number; cy: number; color: string }> =\n [];\n\n if (xScale && yScale && chartData.length > 0) {\n const lastRow = chartData[chartData.length - 1];\n series.forEach((s) => {\n const yVal = lastRow[s.marketSlug];\n if (yVal == null) return;\n const cx = xScale(lastRow.timestamp);\n const cy = yScale(yVal);\n if (cx == null || cy == null) return;\n dots.push({\n cx,\n cy,\n color: colorMap.get(s.marketSlug) ?? \"#6b7280\",\n });\n });\n }\n\n return <BreathingDotsLayer dots={dots} />;\n }}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n\n {/* Bottom bar: interval switcher (Jupiter-style: right-aligned text buttons) */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n paddingRight: 4,\n marginTop: 2,\n }}\n >\n <IntervalSwitcher value={chartRange} onChange={setChartRange} />\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventMarketDetailV2Widget } from \"./event-market-detail-v2.widget\";\nimport { EventPriceChartV2 } from \"./event-price-chart-v2.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(market: V2Market): number {\n return market.outcomes[0]?.best_ask ?? market.outcomes[0]?.price ?? 0;\n}\n\nfunction formatPercent(value: number): string {\n return `${Math.round(value * 100)}%`;\n}\n\nfunction formatCents(value: number): string {\n const cents = value * 100;\n if (cents < 1 && cents > 0) return `< 1`;\n if (Number.isInteger(cents)) return `${cents}`;\n return cents.toFixed(1);\n}\n\n/** Display label for a market row — prefer first outcome label, fall back to question. */\nfunction getMarketLabel(market: V2Market): string {\n return market.outcomes?.[0]?.label ?? market.question;\n}\n\nfunction getPlatformLabel(source: string): string {\n switch (source) {\n case \"polymarket\":\n return \"Polymarket\";\n case \"dflow\":\n return \"Kalshi\";\n default:\n return source;\n }\n}\n\nfunction formatISOTimestamp(iso: string | undefined): string {\n if (!iso) return \"—\";\n const date = new Date(iso);\n if (isNaN(date.getTime())) return \"—\";\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n\n// ---------------------------------------------------------------------------\n// Countdown hook\n// ---------------------------------------------------------------------------\n\nfunction useCountdown(targetIso: string | undefined): string | null {\n const [now, setNow] = useState(Date.now());\n\n useEffect(() => {\n if (!targetIso) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [targetIso]);\n\n if (!targetIso) return null;\n const target = new Date(targetIso).getTime();\n if (isNaN(target)) return null;\n\n const diff = target - now;\n if (diff <= 0) return null;\n\n const days = Math.floor(diff / 86400000);\n const hours = Math.floor((diff % 86400000) / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n parts.push(`${String(hours).padStart(2, \"0\")}h`);\n parts.push(`${String(mins).padStart(2, \"0\")}m`);\n parts.push(`${String(secs).padStart(2, \"0\")}s`);\n return parts.join(\" \");\n}\n\nfunction formatCountdownDate(iso: string | undefined): string | null {\n if (!iso) return null;\n const d = new Date(iso);\n if (isNaN(d.getTime())) return null;\n const hours = d.getHours().toString().padStart(2, \"0\");\n const mins = d.getMinutes().toString().padStart(2, \"0\");\n const month = (d.getMonth() + 1).toString().padStart(2, \"0\");\n const day = d.getDate().toString().padStart(2, \"0\");\n const year = d.getFullYear();\n const offset = -d.getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(offset / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${month}/${day}/${year} (${sign}${tzHours})`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailV2UIProps {\n event: V2Event;\n /** Callback when a trade action is triggered */\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailV2UI({\n event,\n onTradeAction,\n}: EventDetailV2UIProps) {\n const { t } = useTranslation();\n const [isCompact, setIsCompact] = useState(false);\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel) return;\n\n let compact = false;\n let rafId = 0;\n\n const update = () => {\n const { bottom } = sentinel.getBoundingClientRect();\n const shouldBeCompact = compact ? bottom < 0 : bottom < -20;\n if (shouldBeCompact !== compact) {\n compact = shouldBeCompact;\n setIsCompact(shouldBeCompact);\n }\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n window.addEventListener(\"scroll\", onScroll, {\n passive: true,\n capture: true,\n });\n update();\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n };\n }, []);\n\n const markets = useMemo(\n () =>\n [...(event.markets || [])].sort((a, b) => getYesAsk(b) - getYesAsk(a)),\n [event.markets],\n );\n\n const formattedVolume = useMemo(\n () => `$${Math.round(event.volume ?? 0).toLocaleString(\"en-US\")}`,\n [event.volume],\n );\n\n // Countdown: show \"Begins in\" if event hasn't started, \"Ends in\" if active\n const startCountdown = useCountdown(event.start_at);\n const endCountdown = useCountdown(event.end_at);\n const startDateFormatted = formatCountdownDate(event.start_at);\n const endDateFormatted = formatCountdownDate(event.end_at);\n\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 pb-8 lg:px-4 lg:pb-12 lg:max-w-3xl\">\n {/* Sentinel */}\n <div ref={sentinelRef} className=\"h-0 w-0\" />\n\n {/* Header – sticky with compact transition */}\n <div\n className={`sticky top-0 z-30 flex items-center bg-background/80 backdrop-blur-md transition-all duration-300 ${\n isCompact\n ? \"gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className={`flex-shrink-0 transition-all duration-300 ${\n isCompact\n ? \"!h-8 !w-8 lg:!h-10 lg:!w-10\"\n : \"!h-14 !w-14 lg:!h-18 lg:!w-18\"\n }`}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n {!isCompact && (\n <div className=\"flex items-center gap-1.5\">\n <PlatformBadge source={event.source} />\n {event.tags?.slice(0, 3).map((tag) => (\n <span key={tag.slug} className=\"text-xs text-neutral truncate\">\n {tag.label}\n </span>\n ))}\n </div>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCompact ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\n </div>\n\n {/* Countdown timer */}\n {(startCountdown || endCountdown) && (\n <div className=\"flex items-center gap-x-2 text-xs text-neutral lg:text-sm font-mono\">\n {startCountdown ? (\n <>\n <span>\n {t(\"predict.event.beginsIn\", { time: startCountdown })}\n </span>\n {startDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span>{startDateFormatted}</span>\n </>\n )}\n </>\n ) : endCountdown ? (\n <>\n <span>{t(\"predict.event.endsIn\", { time: endCountdown })}</span>\n {endDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span>{endDateFormatted}</span>\n </>\n )}\n </>\n ) : null}\n </div>\n )}\n\n {/* Chart section — self-contained Jupiter-style chart */}\n <EventPriceChartV2 event={event} />\n\n {/* Volume */}\n <div className=\"text-sm text-neutral\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </div>\n\n {/* Markets list */}\n <EventMarketsV2UI markets={markets} onTradeAction={onTradeAction} />\n\n {/* Rules section */}\n <EventRulesV2UI markets={markets} event={event} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Markets list (Jupiter-style table layout)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VISIBLE_COUNT = 5;\n\ninterface EventMarketsV2UIProps {\n markets: V2Market[];\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction EventMarketsV2UI({ markets, onTradeAction }: EventMarketsV2UIProps) {\n const { t } = useTranslation();\n const [showAll, setShowAll] = useState(false);\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n if (markets.length === 0) return null;\n\n const hasMore = markets.length > DEFAULT_VISIBLE_COUNT;\n const visibleMarkets = showAll\n ? markets\n : markets.slice(0, DEFAULT_VISIBLE_COUNT);\n\n const toggleExpand = (slug: string) => {\n setExpandedSlug((prev) => (prev === slug ? null : slug));\n };\n\n return (\n <div className=\"flex flex-col\">\n {/* Table */}\n <table className=\"w-full border-collapse\">\n {/* Column header */}\n <thead>\n <tr>\n <th />\n <th className=\"py-2 text-left text-xs text-neutral font-normal lg:text-center lg:text-sm\">\n {t(\"predict.market.table.chance\")}\n </th>\n <th />\n </tr>\n </thead>\n <tbody>\n {visibleMarkets.map((market, idx) => {\n const yesPrice = getYesAsk(market);\n const noPrice =\n market.outcomes[1]?.best_ask ?? market.outcomes[1]?.price;\n const isTopMarket = idx === 0;\n const isExpanded = expandedSlug === market.slug;\n\n return (\n <MarketRow\n key={market.slug}\n market={market}\n yesPrice={yesPrice}\n noPrice={noPrice ?? undefined}\n isTopMarket={isTopMarket}\n isExpanded={isExpanded}\n onToggleExpand={() => toggleExpand(market.slug)}\n onTradeAction={onTradeAction}\n />\n );\n })}\n </tbody>\n </table>\n\n {/* More Markets button */}\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex w-full items-center justify-start gap-x-2 py-2 pl-1 text-xs text-neutral lg:pl-2 lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>\n {showAll\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.moreMarketsLabel\")}\n </span>\n <svg\n className={cn(\n \"h-4 w-4 transition-transform\",\n showAll && \"rotate-180\",\n )}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Market Row (Jupiter-style <tr>)\n// ---------------------------------------------------------------------------\n\ninterface MarketRowProps {\n market: V2Market;\n yesPrice: number;\n noPrice?: number;\n isTopMarket: boolean;\n isExpanded: boolean;\n onToggleExpand: () => void;\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction MarketRow({\n market,\n yesPrice,\n noPrice,\n isTopMarket,\n isExpanded,\n onToggleExpand,\n onTradeAction,\n}: MarketRowProps) {\n const { t } = useTranslation();\n const volumeFormatted = market.volume\n ? `$${Math.round(market.volume).toLocaleString(\"en-US\")} vol`\n : undefined;\n\n return (\n <>\n <tr\n className=\"cursor-pointer border-b border-border text-xs hover:bg-content2 lg:text-base\"\n onClick={onToggleExpand}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggleExpand();\n }\n }}\n >\n {/* TD1: Avatar + Name + Volume */}\n <td className=\"py-2 pl-1 lg:pl-2\">\n <div className=\"flex items-center gap-x-1 lg:gap-x-2\">\n <Avatar\n src={market.image_url || undefined}\n name={getMarketLabel(market)?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-5 shrink-0 lg:size-8\"\n imgProps={{ className: \"object-cover\" }}\n />\n <div className=\"flex flex-col\">\n <span className=\"text-foreground truncate max-w-[200px] lg:max-w-[300px]\">\n {getMarketLabel(market)}\n </span>\n {volumeFormatted && (\n <span className=\"text-[8px] text-neutral lg:text-xxs\">\n {volumeFormatted}\n </span>\n )}\n </div>\n </div>\n </td>\n\n {/* TD2: Chance % */}\n <td className=\"py-2 text-left text-foreground lg:text-center\">\n {formatPercent(yesPrice)}\n </td>\n\n {/* TD3: Yes / No buttons */}\n <td className=\"py-2 pr-1 lg:pr-2\">\n <div className=\"flex items-center justify-end gap-x-2\">\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-opacity\",\n isTopMarket\n ? \"bg-primary text-primary-foreground\"\n : \"bg-primary/10 text-primary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"yes\", \"buy\");\n }}\n >\n {t(\"predict.market.action.yes\", {\n price: formatCents(yesPrice),\n })}\n </button>\n <button\n type=\"button\"\n className=\"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 bg-secondary/10 text-secondary cursor-pointer hover:opacity-80 transition-opacity\"\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"no\", \"buy\");\n }}\n >\n {noPrice != null\n ? t(\"predict.market.action.no\", {\n price: formatCents(noPrice),\n })\n : t(\"predict.market.no\")}\n </button>\n </div>\n </td>\n </tr>\n\n {/* Expanded detail row */}\n {isExpanded && (\n <tr>\n <td colSpan={3} className=\"px-2 pb-3\">\n <div className=\"max-h-100 overflow-y-auto\">\n <EventMarketDetailV2Widget\n market={market}\n onTradeAction={onTradeAction}\n />\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Rules (V2-native)\n// ---------------------------------------------------------------------------\n\ninterface EventRulesV2UIProps {\n markets: V2Market[];\n event: V2Event;\n}\n\nfunction EventRulesV2UI({ markets, event }: EventRulesV2UIProps) {\n const { t } = useTranslation();\n const [selectedSlug, setSelectedSlug] = useState<string | null>(null);\n const [showFullRules, setShowFullRules] = useState(false);\n\n const marketsWithRules = markets.filter((m) => m.rules && m.rules.length > 0);\n if (marketsWithRules.length === 0) return null;\n\n const selectedMarket =\n marketsWithRules.find((m) => m.slug === selectedSlug) ??\n marketsWithRules[0];\n if (!selectedMarket?.rules?.length) return null;\n\n const rulesText = selectedMarket.rules.join(\"\\n\\n\");\n const truncatedRules =\n rulesText.length > 200 && !showFullRules\n ? rulesText.slice(0, 200) + \"...\"\n : rulesText;\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n {/* Rules summary heading */}\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.event.rules\")}\n </span>\n\n {/* Market selector (only if multiple markets have rules) */}\n {marketsWithRules.length > 1 && (\n <div className=\"flex gap-x-2 overflow-x-auto\">\n {marketsWithRules.map((market) => (\n <button\n key={market.slug}\n type=\"button\"\n onClick={() => {\n setSelectedSlug(market.slug);\n setShowFullRules(false);\n }}\n className={cn(\n \"shrink-0 rounded-lg px-3 py-1.5 text-xs transition-colors cursor-pointer\",\n selectedMarket.slug === market.slug\n ? \"bg-content2 text-foreground\"\n : \"text-neutral hover:bg-content2\",\n )}\n >\n {getMarketLabel(market)}\n </button>\n ))}\n </div>\n )}\n\n {/* Rules text */}\n <div className=\"text-xs text-foreground/80 lg:text-sm whitespace-pre-wrap\">\n {truncatedRules}\n </div>\n\n {rulesText.length > 200 && (\n <button\n type=\"button\"\n onClick={() => setShowFullRules((v) => !v)}\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors self-start\"\n >\n {showFullRules\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.showMore\")}\n </button>\n )}\n\n {/* Timeline */}\n <span className=\"text-xs font-medium text-neutral mt-2 lg:text-sm\">\n Timeline\n </span>\n <div className=\"flex flex-col\">\n {[\n {\n label: \"Market Open\",\n value: formatISOTimestamp(selectedMarket.start_at),\n isActive: true,\n },\n {\n label: \"Market Closes\",\n value: formatISOTimestamp(selectedMarket.end_at),\n isActive:\n selectedMarket.status === \"closed\" ||\n selectedMarket.status === \"voided\",\n },\n ].map((item, index, arr) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\n <div className=\"flex flex-col items-center w-3\">\n <div\n className={`h-3 w-3 shrink-0 rounded-full border-2 mt-0.5 ${\n item.isActive\n ? \"border-primary bg-primary\"\n : \"border-border bg-transparent\"\n }`}\n />\n {index < arr.length - 1 && (\n <div className=\"w-px flex-1 bg-border\" />\n )}\n </div>\n <div\n className={`flex flex-col ${index < arr.length - 1 ? \"pb-4\" : \"\"}`}\n >\n <span className=\"text-xs font-medium text-foreground lg:text-sm\">\n {item.label}\n </span>\n <span className=\"text-xs text-neutral lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* Identifiers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-neutral mt-2 lg:text-xs\">\n <span>\n <span className=\"text-neutral\">Event:</span>{\" \"}\n <span className=\"text-foreground\">{event.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">Market:</span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">Source:</span>{\" \"}\n <span className=\"text-foreground\">\n {getPlatformLabel(selectedMarket.source)}\n </span>\n </span>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Platform badge\n// ---------------------------------------------------------------------------\n\nfunction PlatformBadge({ source }: { source: string }) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-x-1 rounded px-1.5 py-0.5\",\n \"text-[10px] font-medium leading-none\",\n source === \"polymarket\"\n ? \"bg-blue-500/15 text-blue-400\"\n : \"bg-primary-500/15 text-primary\",\n )}\n >\n <span\n className={cn(\n \"h-1.5 w-1.5 rounded-sm\",\n source === \"polymarket\" ? \"bg-blue-400\" : \"bg-primary\",\n )}\n />\n {getPlatformLabel(source)}\n </span>\n );\n}\n","import type { V2Market, V2ProviderSource } from \"../../client/v2\";\nimport { useEventV2Query } from \"../../hooks/v2/useEventV2Query\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport {\n EventDetailV2UI,\n type EventDetailV2UIProps,\n} from \"./event-detail.v2.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailWidgetV2Props {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"dflow\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: V2ProviderSource;\n /** Callback when a trade action is triggered (market button / orderbook click). */\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailWidgetV2({\n eventSlug,\n source,\n onTradeAction,\n}: EventDetailWidgetV2Props) {\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEventV2Query({ slug: eventSlug, source });\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 <EventDetailV2UI event={event} onTradeAction={onTradeAction} />;\n}\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Avatar,\n Button,\n Drawer,\n DrawerContent,\n DrawerBody,\n useDisclosure,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market, V2ProviderSource } from \"../../client/v2\";\nimport { useEventV2Query } from \"../../hooks/v2/useEventV2Query\";\nimport { useSimilarEventsV2Query } from \"../../hooks/v2/useSimilarEventsV2Query\";\nimport { TradeFormV2Widget } from \"../trade-form/trade-form-v2.widget\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { UserActivityV2Section } from \"./event-detail-activity-v2.ui\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport { EventDetailWidgetV2 } from \"./event-detail.v2.widget\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: V2Market): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailPageV2Props {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"dflow\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: V2ProviderSource;\n /** Chain network for trading (default: 'solana'). */\n chain?: string;\n /** Connected wallet address for user activity (positions/orders/trades). */\n walletAddress?: string;\n /** Callback when a similar event card is clicked. Receives the clicked event. */\n onSimilarEventClick?: (event: V2Event) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailPageV2({\n eventSlug,\n source,\n chain,\n walletAddress,\n onSimilarEventClick,\n}: EventDetailPageV2Props) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const { data: event, isLoading: isEventLoading } = useEventV2Query({\n slug: eventSlug,\n source,\n });\n\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort((a, b) => getYesAsk(b) - getYesAsk(a)),\n [event?.markets],\n );\n\n const [tradeSelection, setTradeSelection] = useState<{\n market: V2Market;\n outcome: TradeOutcome;\n side: TradeSide;\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: V2Market, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n if (isMobile) onOpen();\n },\n [isMobile, onOpen],\n );\n\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -----------------------------------------------------------------------\n // Loading skeleton\n // -----------------------------------------------------------------------\n if (isEventLoading) {\n if (isMobile) {\n return <EventDetailSkeleton />;\n }\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailSkeleton />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 max-h-[calc(100dvh-2rem)] overflow-y-auto scrollbar-thin\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.slug}-${tradeSelection.version}`\n : (selectedMarket?.slug ?? \"default\");\n\n // -----------------------------------------------------------------------\n // Mobile layout\n // -----------------------------------------------------------------------\n if (isMobile) {\n return (\n <>\n <div className=\"w-full pb-20\">\n <EventDetailWidgetV2\n eventSlug={eventSlug}\n source={source}\n onTradeAction={handleTradeAction}\n />\n\n {event && (\n <UserActivityV2Section\n event={event}\n walletAddress={walletAddress}\n />\n )}\n\n {event && (\n <SimilarEventsSection\n eventSlug={eventSlug}\n source={event.source}\n onEventClick={onSimilarEventClick}\n />\n )}\n </div>\n\n {selectedMarket && (\n <div className=\"fixed inset-x-0 bottom-0 z-40 flex justify-center p-3 bg-gradient-to-t from-background via-background/90 to-transparent\">\n <Button\n color=\"primary\"\n size=\"lg\"\n className=\"w-full max-w-md font-semibold\"\n onPress={onOpen}\n >\n {t(\"predict.trade.action\")}\n </Button>\n </div>\n )}\n\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n placement=\"bottom\"\n size=\"lg\"\n hideCloseButton\n classNames={{\n base: \"max-h-[85dvh] rounded-t-2xl\",\n body: \"p-0\",\n }}\n >\n <DrawerContent>\n <DrawerBody>\n {selectedMarket && (\n <TradeFormV2Widget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n }\n\n // -----------------------------------------------------------------------\n // Desktop layout\n // -----------------------------------------------------------------------\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n {/* Left column: event detail + user activity */}\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailWidgetV2\n eventSlug={eventSlug}\n source={source}\n onTradeAction={handleTradeAction}\n />\n\n {event && (\n <UserActivityV2Section event={event} walletAddress={walletAddress} />\n )}\n </div>\n\n {/* Right sidebar: sticky container with internal scroll (Jupiter-style) */}\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 flex flex-col gap-y-4 max-h-[calc(100dvh-2rem)] overflow-y-auto scrollbar-thin\">\n {selectedMarket && (\n <TradeFormV2Widget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n\n {event && (\n <SimilarEventsSection\n eventSlug={eventSlug}\n source={event.source}\n onEventClick={onSimilarEventClick}\n />\n )}\n </div>\n </aside>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Similar Events\n// ---------------------------------------------------------------------------\n\nfunction SimilarEventsSection({\n eventSlug,\n source,\n onEventClick,\n}: {\n eventSlug: string;\n source: V2ProviderSource;\n onEventClick?: (event: V2Event) => void;\n}) {\n const { t } = useTranslation();\n const { data: similarEvents, isLoading } = useSimilarEventsV2Query({\n slug: eventSlug,\n source,\n limit: 4,\n });\n\n if (isLoading || !similarEvents || similarEvents.length === 0) return null;\n\n return (\n <div className=\"flex flex-col gap-y-3 mt-6 px-1 lg:px-0\">\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.similar.title\")}\n </span>\n <div className=\"grid grid-cols-1 gap-3\">\n {similarEvents.map((ev) => (\n <SimilarEventCard key={ev.slug} event={ev} onClick={onEventClick} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction SimilarEventCard({\n event,\n onClick,\n}: {\n event: V2Event;\n onClick?: (event: V2Event) => void;\n}) {\n const yesPrice = event.markets?.[0]?.outcomes[0]?.price;\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n className=\"flex items-center gap-x-3 rounded-xl border border-border p-3 hover:bg-content2 transition-colors cursor-pointer text-left w-full\"\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-10 shrink-0\"\n imgProps={{ className: \"object-cover\" }}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">\n {event.title}\n </span>\n {yesPrice != null && (\n <span className=\"text-xs text-neutral\">\n {Math.round(yesPrice * 100)}% chance\n </span>\n )}\n </div>\n </button>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { V2Event, V2Market, V2ProviderSource } from \"../../client/v2\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n DEFAULT_CHART_RANGE,\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n type ChartRangeType,\n} from \"../../consts\";\nimport { usePredictClient } from \"../../hooks/usePredictClient\";\nimport {\n marketCandlesticksQueryKey,\n fetchMarketCandlesticks,\n} from \"../../hooks/usePriceHistoryQuery\";\nimport { useEventV2Query } from \"../../hooks/v2/useEventV2Query\";\nimport type { CandlesticksResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: V2Market): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\nfunction isoToUnix(iso: string | undefined): number {\n if (!iso) return 0;\n const ms = new Date(iso).getTime();\n return Number.isFinite(ms) ? Math.floor(ms / 1000) : 0;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport interface UseEventDetailV2Params {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"dflow\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: V2ProviderSource;\n /** Market slugs to query candlesticks for. Default: top 4 by yesAsk. */\n candlestickMarketSlugs?: string[];\n /** Chart time range (1d / 1w / 1m / all). */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetailV2 = (params: UseEventDetailV2Params) => {\n const {\n candlestickMarketSlugs,\n chartRange = DEFAULT_CHART_RANGE,\n source,\n } = params;\n\n const candlestickPeriodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n const candlestickEndTs = useMemo(\n () => Math.floor(Date.now() / 1000),\n\n [chartRange],\n );\n\n const oldClient = usePredictClient();\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEventV2Query({ slug: params.eventSlug, source });\n\n const candlestickStartTs = useMemo(() => {\n if (rangeDuration != null) return candlestickEndTs - rangeDuration;\n const markets = event?.markets;\n if (!markets?.length) return candlestickEndTs;\n return Math.min(...markets.map((m) => isoToUnix(m.start_at)));\n }, [candlestickEndTs, rangeDuration, event?.markets]);\n\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n const markets =\n candlestickMarketSlugs && candlestickMarketSlugs.length > 0\n ? candlestickMarketSlugs\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((slug) => event.markets!.find((m) => m.slug === slug))\n .filter((m): m is V2Market => m !== undefined)\n : [...event.markets]\n .sort((a, b) => getYesAsk(b) - getYesAsk(a))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.slug);\n }, [candlestickMarketSlugs, event?.markets]);\n\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((slug) => ({\n queryKey: marketCandlesticksQueryKey({\n ticker: slug,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n queryFn: () =>\n fetchMarketCandlesticks(oldClient, {\n ticker: slug,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n enabled: marketsToQuery.length > 0,\n })),\n });\n\n const isCandlesticksLoading = candlestickQueries.some((q) => q.isLoading);\n\n const candlestickErrors = useMemo(() => {\n const errors = new Map<string, Error>();\n marketsToQuery.forEach((slug, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) errors.set(slug, error);\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n const candlesticks = useMemo(() => {\n const map = new Map<string, CandlesticksResponse>();\n marketsToQuery.forEach((slug, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) map.set(slug, data);\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n periodInterval: candlestickPeriodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n\nexport type { V2Event, V2Market };\n","import { useMemo } from \"react\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderbookLevel } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOrderBookParams {\n /** Market ticker */\n marketTicker: string;\n /** Maximum number of levels to display per side */\n maxLevels?: number;\n /** Polling interval in milliseconds (0 to disable) */\n refetchInterval?: number;\n /** Which outcome to display (yes or no). Defaults to yes. */\n outcome?: \"yes\" | \"no\";\n}\n\nexport interface OrderBookRow extends OrderbookLevel {\n /** Cumulative quantity up to (and including) this level */\n cumulative: number;\n /** Depth ratio 0–1 relative to the maximum cumulative quantity */\n depth: number;\n}\n\nexport interface UseOrderBookResult {\n /** Bid rows sorted from highest to lowest price */\n bids: OrderBookRow[];\n /** Ask rows sorted from lowest to highest price */\n asks: OrderBookRow[];\n /** Spread in cents */\n spread: number | null;\n /** Spread as percentage of midpoint */\n spreadPercent: number | null;\n /** Midpoint price in cents */\n midpoint: number | null;\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRows(\n levels: OrderbookLevel[] | undefined,\n maxLevels: number,\n): OrderBookRow[] {\n if (!levels) return [];\n const sliced = levels.slice(0, maxLevels);\n let cumulative = 0;\n const rows: OrderBookRow[] = sliced.map((level) => {\n cumulative += level.quantity;\n return { ...level, cumulative, depth: 0 };\n });\n\n // Calculate depth ratio\n const maxCum = rows[rows.length - 1]?.cumulative ?? 1;\n for (const row of rows) {\n row.depth = row.cumulative / maxCum;\n }\n\n return rows;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useOrderBook({\n marketTicker,\n maxLevels = 10,\n refetchInterval = 5000,\n outcome = \"yes\",\n}: UseOrderBookParams): UseOrderBookResult {\n const {\n data: orderBook,\n isLoading,\n isFetching,\n } = useOrderBookQuery(marketTicker, {\n refetchInterval: refetchInterval || undefined,\n });\n\n // Select bids and asks based on outcome\n const rawBids = useMemo(() => {\n return outcome === \"yes\" ? orderBook?.yesBids : orderBook?.noBids;\n }, [orderBook, outcome]);\n\n const rawAsks = useMemo(() => {\n return outcome === \"yes\" ? orderBook?.yesAsks : orderBook?.noAsks;\n }, [orderBook, outcome]);\n\n const bids = useMemo(\n () => buildRows(rawBids, maxLevels),\n [rawBids, maxLevels],\n );\n\n const asks = useMemo(\n () => buildRows(rawAsks, maxLevels),\n [rawAsks, maxLevels],\n );\n\n // Calculate spread\n const spread = useMemo(() => {\n if (bids.length === 0 || asks.length === 0) return null;\n return asks[0].price - bids[0].price;\n }, [bids, asks]);\n\n const midpoint = useMemo(() => {\n if (bids.length === 0 || asks.length === 0) return null;\n return (bids[0].price + asks[0].price) / 2;\n }, [bids, asks]);\n\n const spreadPercent = useMemo(() => {\n if (spread === null || midpoint === null || midpoint === 0) return null;\n return Math.round((spread / midpoint) * 10000) / 100;\n }, [spread, midpoint]);\n\n return {\n bids,\n asks,\n spread,\n spreadPercent,\n midpoint,\n isLoading,\n isFetching,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type { OrderBookRow } from \"./order-book.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OrderBookUIProps {\n /** Bid rows (highest to lowest) */\n bids: OrderBookRow[];\n /** Ask rows (lowest to highest) */\n asks: OrderBookRow[];\n /** Spread in cents */\n spread: number | null;\n /** Spread percentage */\n spreadPercent: number | null;\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Callback when a price level is clicked */\n onPriceClick?: (price: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction OrderBookRowItem({\n row,\n side,\n onClick,\n}: {\n row: OrderBookRow;\n side: \"bid\" | \"ask\";\n onClick?: (price: number) => void;\n}) {\n const isBid = side === \"bid\";\n const barColor = isBid ? \"bg-primary/10\" : \"bg-danger/10\";\n const textColor = isBid ? \"text-primary\" : \"text-danger\";\n\n return (\n <button\n type=\"button\"\n className=\"relative flex w-full items-center justify-between px-3 py-1 text-xs hover:bg-default-100 cursor-pointer\"\n onClick={() => onClick?.(row.price)}\n >\n {/* Depth bar */}\n <div\n className={`absolute inset-y-0 ${isBid ? \"right-0\" : \"left-0\"} ${barColor}`}\n style={{ width: `${row.depth * 100}%` }}\n />\n {/* Content */}\n <span className={`relative z-10 font-medium ${textColor}`}>\n {row.price}¢\n </span>\n <span className=\"relative z-10 text-default-600\">{row.quantity}</span>\n <span className=\"relative z-10 text-default-400\">{row.cumulative}</span>\n </button>\n );\n}\n\nfunction Skeleton() {\n return (\n <div className=\"flex flex-col gap-y-1 py-2\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={i}\n className=\"mx-3 h-4 animate-pulse rounded bg-default-100\"\n />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function OrderBookUI({\n bids,\n asks,\n spread,\n spreadPercent,\n isLoading,\n onPriceClick,\n}: OrderBookUIProps) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.orderBook.title\")}\n </div>\n <Skeleton />\n <Skeleton />\n </div>\n );\n }\n\n const isEmpty = bids.length === 0 && asks.length === 0;\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-default-200 px-3 py-2\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.orderBook.title\")}\n </span>\n </div>\n\n {isEmpty ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.orderBook.empty\")}\n </div>\n ) : (\n <>\n {/* Column headers */}\n <div className=\"flex items-center justify-between px-3 py-1 text-xxs text-default-400\">\n <span>{t(\"predict.orderBook.price\")}</span>\n <span>{t(\"predict.orderBook.qty\")}</span>\n <span>{t(\"predict.orderBook.total\")}</span>\n </div>\n\n {/* Asks (reversed so lowest is at bottom, near spread) */}\n <div className=\"flex flex-col-reverse\">\n {asks.map((row) => (\n <OrderBookRowItem\n key={row.price}\n row={row}\n side=\"ask\"\n onClick={onPriceClick}\n />\n ))}\n </div>\n\n {/* Spread */}\n {spread !== null && (\n <div className=\"flex items-center justify-center gap-x-2 border-y border-default-200 py-1.5 text-xs text-default-500\">\n <span>\n {t(\"predict.orderBook.spread\")}: {spread}¢\n </span>\n {spreadPercent !== null && (\n <span className=\"text-default-400\">({spreadPercent}%)</span>\n )}\n </div>\n )}\n\n {/* Bids */}\n <div className=\"flex flex-col\">\n {bids.map((row) => (\n <OrderBookRowItem\n key={row.price}\n row={row}\n side=\"bid\"\n onClick={onPriceClick}\n />\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { useOrderBook } from \"./order-book.script\";\nimport { OrderBookUI } from \"./order-book.ui\";\n\nexport interface OrderBookWidgetProps {\n /** Market ticker */\n marketTicker: string;\n /** Maximum levels per side (default 10) */\n maxLevels?: number;\n /** Polling interval in ms (default 5000, 0 to disable) */\n refetchInterval?: number;\n /** Callback when a price level is clicked */\n onPriceClick?: (price: number) => void;\n /** Which outcome to display (yes or no). Defaults to yes. */\n outcome?: \"yes\" | \"no\";\n}\n\nexport function OrderBookWidget({\n marketTicker,\n maxLevels,\n refetchInterval,\n onPriceClick,\n outcome,\n}: OrderBookWidgetProps) {\n const { bids, asks, spread, spreadPercent, isLoading } = useOrderBook({\n marketTicker,\n maxLevels,\n refetchInterval,\n outcome,\n });\n\n return (\n <OrderBookUI\n bids={bids}\n asks={asks}\n spread={spread}\n spreadPercent={spreadPercent}\n isLoading={isLoading}\n onPriceClick={onPriceClick}\n />\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books. There are no \"open orders\" in the\n * traditional sense.\n *\n * For tracking swap/order status, use `useOrderStatusQuery` with the order signature\n * returned from `useCreateSwapMutation`.\n */\nimport { useState, useCallback } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOpenOrdersParams {\n /** Polling interval in ms (0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated Order type - new API uses swap model\n */\nexport interface Order {\n id: string;\n marketId: string;\n side: \"buy\" | \"sell\";\n outcome: \"yes\" | \"no\";\n type: \"limit\" | \"market\";\n price: number;\n quantity: number;\n filledQuantity: number;\n status: \"open\" | \"partial\" | \"filled\" | \"cancelled\";\n createdAt: string;\n}\n\nexport interface UseOpenOrdersResult {\n /** List of open orders */\n orders: Order[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** ID of the order currently being cancelled (null if none) */\n cancellingOrderId: string | null;\n /** Cancel an order by id */\n cancelOrder: (orderId: string) => void;\n /** Error from the most recent cancel attempt */\n cancelError: Error | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated This hook is deprecated. The new dflow API uses a swap-based model.\n * Use `useOrderStatusQuery` to track swap status instead.\n */\nexport function useOpenOrders(\n _params: UseOpenOrdersParams = {},\n): UseOpenOrdersResult {\n const [cancellingOrderId, setCancellingOrderId] = useState<string | null>(\n null,\n );\n const [cancelError] = useState<Error | null>(null);\n\n // No-op cancel function - API no longer supports this\n const cancelOrder = useCallback((_orderId: string) => {\n console.warn(\n \"useOpenOrders.cancelOrder is deprecated. Use swap-based order model instead.\",\n );\n setCancellingOrderId(null);\n }, []);\n\n return {\n orders: [],\n isLoading: false,\n isFetching: false,\n cancellingOrderId,\n cancelOrder,\n cancelError,\n };\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books.\n */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n} from \"@liberfi.io/ui\";\nimport type { Order } from \"./open-orders.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OpenOrdersUIProps {\n /** List of open orders */\n orders: Order[];\n /** Whether data is loading */\n isLoading: boolean;\n /** ID of the order currently being cancelled */\n cancellingOrderId: string | null;\n /** Cancel an order */\n onCancel: (orderId: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function OpenOrdersUI({\n orders,\n isLoading,\n cancellingOrderId,\n onCancel,\n}: OpenOrdersUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n orders.map((order) => ({\n key: order.id,\n side: order.side,\n outcome: order.outcome,\n type: order.type,\n price: order.price,\n filled: `${order.filledQuantity}/${order.quantity}`,\n status: order.status,\n createdAt: formatDate(order.createdAt),\n isCancelling: order.id === cancellingOrderId,\n id: order.id,\n })),\n [orders, cancellingOrderId],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.openOrders.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.openOrders.title\")}\n {orders.length > 0 && (\n <span className=\"ml-1 text-default-400\">({orders.length})</span>\n )}\n </div>\n\n {orders.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.openOrders.empty\")}\n </div>\n ) : (\n <div className=\"w-full overflow-x-auto\">\n <StyledTable\n radius=\"none\"\n aria-label=\"Open orders\"\n className=\"min-w-[600px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Side\" width={60}>\n {t(\"predict.openOrders.side\")}\n </TableColumn>\n <TableColumn textValue=\"Outcome\" width={60}>\n {t(\"predict.openOrders.outcome\")}\n </TableColumn>\n <TableColumn textValue=\"Type\" width={60}>\n {t(\"predict.openOrders.type\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={60}>\n {t(\"predict.openOrders.price\")}\n </TableColumn>\n <TableColumn textValue=\"Filled\" width={80}>\n {t(\"predict.openOrders.filled\")}\n </TableColumn>\n <TableColumn textValue=\"Status\" width={70}>\n {t(\"predict.openOrders.status\")}\n </TableColumn>\n <TableColumn textValue=\"Time\" width={120}>\n {t(\"predict.openOrders.time\")}\n </TableColumn>\n <TableColumn textValue=\"Action\" width={80} align=\"end\">\n {\" \"}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.key}>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.side === \"buy\" ? \"text-primary\" : \"text-danger\"\n }`}\n >\n {row.side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}\n </span>\n </TableCell>\n <TableCell>\n <span\n className={`text-xs ${\n row.outcome === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs capitalize\">{row.type}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.price}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.filled}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs capitalize\">{row.status}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-default-500\">\n {row.createdAt}\n </span>\n </TableCell>\n <TableCell className=\"text-right\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n color=\"danger\"\n isLoading={row.isCancelling}\n onPress={() => onCancel(row.id)}\n >\n {t(\"predict.openOrders.cancel\")}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n )}\n </div>\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books. See open-orders.script.tsx for alternatives.\n */\nimport { useOpenOrders } from \"./open-orders.script\";\nimport { OpenOrdersUI } from \"./open-orders.ui\";\n\nexport interface OpenOrdersWidgetProps {\n /** Polling interval in ms (default 10000, 0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated This widget is deprecated. Use swap-based order model instead.\n */\nexport function OpenOrdersWidget({\n refetchInterval,\n}: OpenOrdersWidgetProps = {}) {\n const { orders, isLoading, cancellingOrderId, cancelOrder } = useOpenOrders({\n refetchInterval,\n });\n\n return (\n <OpenOrdersUI\n orders={orders}\n isLoading={isLoading}\n cancellingOrderId={cancellingOrderId}\n onCancel={cancelOrder}\n />\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useTradesQuery } from \"../../hooks/useTradesQuery\";\nimport type {\n SingleTradeResponse,\n TradesQueryParams,\n MultiTradeResponse,\n} from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeHistoryParams {\n /** Optional filter by market ticker */\n ticker?: string;\n /** Page size */\n pageSize?: number;\n}\n\nexport interface UseTradeHistoryResult {\n /** Current page of trades */\n trades: SingleTradeResponse[];\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** Current page (1-based) */\n page: number;\n /** Page size */\n pageSize: number;\n /** Whether more pages exist */\n hasNextPage: boolean;\n /** Whether a previous page exists */\n hasPrevPage: boolean;\n /** Navigate to a specific page */\n goToPage: (page: number) => void;\n /** Go to the next page */\n nextPage: () => void;\n /** Go to the previous page */\n prevPage: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeHistory({\n ticker,\n pageSize = DEFAULT_PAGE_SIZE,\n}: UseTradeHistoryParams = {}): UseTradeHistoryResult {\n const [page, setPage] = useState(1);\n const [cursors, setCursors] = useState<(string | undefined)[]>([undefined]);\n\n const currentCursor = cursors[page - 1];\n\n const queryParams = useMemo<TradesQueryParams>(\n () => ({\n ...(ticker ? { ticker } : {}),\n limit: pageSize,\n ...(currentCursor ? { cursor: currentCursor } : {}),\n }),\n [ticker, pageSize, currentCursor],\n );\n\n const { data, isLoading, isFetching } = useTradesQuery(queryParams);\n\n const response = data as MultiTradeResponse | undefined;\n\n const trades = response?.trades ?? [];\n const hasNextPage = !!response?.cursor;\n const hasPrevPage = page > 1;\n\n const goToPage = useCallback(\n (p: number) => {\n if (p >= 1 && p <= cursors.length) setPage(p);\n },\n [cursors.length],\n );\n\n const nextPage = useCallback(() => {\n if (hasNextPage && response?.cursor) {\n setCursors((prev) => {\n const newCursors = [...prev];\n if (newCursors.length === page) {\n newCursors.push(response.cursor!);\n }\n return newCursors;\n });\n setPage((prev) => prev + 1);\n }\n }, [hasNextPage, response?.cursor, page]);\n\n const prevPage = useCallback(() => {\n if (hasPrevPage) setPage((prev) => prev - 1);\n }, [hasPrevPage]);\n\n return {\n trades,\n isLoading,\n isFetching,\n page,\n pageSize,\n hasNextPage,\n hasPrevPage,\n goToPage,\n nextPage,\n prevPage,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"@liberfi.io/ui\";\nimport type { SingleTradeResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeHistoryUIProps {\n /** List of trades for current page */\n trades: SingleTradeResponse[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether background refetch is in progress */\n isFetching: boolean;\n /** Current page (1-based) */\n page: number;\n /** Whether more pages exist */\n hasNextPage: boolean;\n /** Whether a previous page exists */\n hasPrevPage: boolean;\n /** Go to next page */\n onNextPage: () => void;\n /** Go to previous page */\n onPrevPage: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDate(timestamp: number): string {\n const d = new Date(timestamp * 1000);\n return d.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeHistoryUI({\n trades,\n isLoading,\n isFetching,\n page,\n hasNextPage,\n hasPrevPage,\n onNextPage,\n onPrevPage,\n}: TradeHistoryUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n trades.map((trade) => ({\n key: trade.tradeId,\n ticker: trade.ticker,\n takerSide: trade.takerSide,\n price: trade.price,\n yesPrice: trade.yesPrice,\n noPrice: trade.noPrice,\n count: trade.count,\n createdAt: formatDate(trade.createdTime),\n })),\n [trades],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.tradeHistory.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.tradeHistory.title\")}\n </div>\n\n {trades.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.tradeHistory.empty\")}\n </div>\n ) : (\n <>\n <div\n className={`w-full overflow-x-auto ${isFetching ? \"opacity-60\" : \"\"}`}\n >\n <StyledTable\n radius=\"none\"\n aria-label=\"Trade history\"\n className=\"min-w-[480px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Side\" width={60}>\n {t(\"predict.tradeHistory.side\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={80}>\n {t(\"predict.tradeHistory.price\")}\n </TableColumn>\n <TableColumn textValue=\"Yes\" width={60}>\n {t(\"predict.trade.yes\")}\n </TableColumn>\n <TableColumn textValue=\"No\" width={60}>\n {t(\"predict.trade.no\")}\n </TableColumn>\n <TableColumn textValue=\"Qty\" width={60}>\n {t(\"predict.tradeHistory.qty\")}\n </TableColumn>\n <TableColumn textValue=\"Time\" width={120}>\n {t(\"predict.tradeHistory.time\")}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.key}>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.takerSide === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.takerSide === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.price}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-primary\">\n {row.yesPrice}¢\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-secondary\">\n {row.noPrice}¢\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.count}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-default-500\">\n {row.createdAt}\n </span>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n\n {/* Pagination */}\n {(hasPrevPage || hasNextPage) && (\n <div className=\"flex items-center justify-between border-t border-default-200 px-3 py-2\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n isDisabled={!hasPrevPage}\n onPress={onPrevPage}\n startContent={<ChevronLeftIcon className=\"h-3 w-3\" />}\n >\n {t(\"predict.pagination.prev\")}\n </Button>\n <span className=\"text-xs text-default-500\">\n {t(\"predict.pagination.page\", { page })}\n </span>\n <Button\n size=\"sm\"\n variant=\"flat\"\n isDisabled={!hasNextPage}\n onPress={onNextPage}\n endContent={<ChevronRightIcon className=\"h-3 w-3\" />}\n >\n {t(\"predict.pagination.next\")}\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","import { useTradeHistory } from \"./trade-history.script\";\nimport { TradeHistoryUI } from \"./trade-history.ui\";\n\nexport interface TradeHistoryWidgetProps {\n /** Optional filter by market ticker */\n ticker?: string;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n pageSize?: number;\n}\n\nexport function TradeHistoryWidget({\n ticker,\n pageSize,\n}: TradeHistoryWidgetProps = {}) {\n const {\n trades,\n isLoading,\n isFetching,\n page,\n hasNextPage,\n hasPrevPage,\n nextPage,\n prevPage,\n } = useTradeHistory({ ticker, pageSize });\n\n return (\n <TradeHistoryUI\n trades={trades}\n isLoading={isLoading}\n isFetching={isFetching}\n page={page}\n hasNextPage={hasNextPage}\n hasPrevPage={hasPrevPage}\n onNextPage={nextPage}\n onPrevPage={prevPage}\n />\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly. To track positions, you need to query user's token\n * balances for outcome mint addresses and calculate positions manually.\n *\n * Use `useOutcomeMintsQuery` and `useMarketsBatchQuery` to build positions\n * from on-chain data.\n */\nimport { useMemo } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UsePositionsParams {\n /** Polling interval in ms (0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated Position type - not provided by new API\n */\nexport interface Position {\n id: string;\n marketId: string;\n marketTitle: string;\n outcome: \"yes\" | \"no\";\n quantity: number;\n avgPrice: number;\n avgCostBasis: number;\n currentPrice: number;\n unrealizedPnl: number;\n realizedPnl: number;\n}\n\nexport interface PositionsSummary {\n /** Total market value in cents */\n totalValue: number;\n /** Total unrealised PnL in cents */\n totalUnrealizedPnl: number;\n /** Total realised PnL in cents */\n totalRealizedPnl: number;\n /** Number of positions */\n count: number;\n}\n\nexport interface UsePositionsResult {\n /** Positions list */\n positions: Position[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** Aggregated summary across all positions */\n summary: PositionsSummary;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated This hook is deprecated. The new dflow API does not provide\n * positions data. Use on-chain token balance queries instead.\n */\nexport function usePositions(\n _params: UsePositionsParams = {},\n): UsePositionsResult {\n // Return empty positions - API no longer supports this\n const summary = useMemo<PositionsSummary>(\n () => ({\n totalValue: 0,\n totalUnrealizedPnl: 0,\n totalRealizedPnl: 0,\n count: 0,\n }),\n [],\n );\n\n return {\n positions: [],\n isLoading: false,\n isFetching: false,\n summary,\n };\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly.\n */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n} from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport type { Position, PositionsSummary } from \"./positions.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PositionsUIProps {\n /** List of positions */\n positions: Position[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Aggregated summary */\n summary: PositionsSummary;\n /** Callback when a position's sell button is clicked */\n onSell?: (position: Position) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst fmtCents = (cents: number) => formatAmountUSDCompact(cents / 100);\n\nfunction PnlText({ value }: { value: number }) {\n if (value === 0) {\n return <span className=\"text-default-500\">{fmtCents(0)}</span>;\n }\n const isPositive = value > 0;\n return (\n <span className={isPositive ? \"text-success\" : \"text-danger\"}>\n {isPositive ? \"+\" : \"\"}\n {fmtCents(value)}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PositionsUI({\n positions,\n isLoading,\n summary,\n onSell,\n}: PositionsUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n positions.map((pos) => ({\n key: `${pos.marketId}-${pos.outcome}`,\n marketTitle: pos.marketTitle,\n outcome: pos.outcome,\n quantity: pos.quantity,\n avgCost: pos.avgCostBasis,\n currentPrice: pos.currentPrice,\n value: pos.currentPrice * pos.quantity,\n unrealizedPnl: pos.unrealizedPnl,\n position: pos,\n })),\n [positions],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.positions.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-default-200 px-3 py-2\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.positions.title\")}\n {positions.length > 0 && (\n <span className=\"ml-1 text-default-400\">({positions.length})</span>\n )}\n </span>\n </div>\n\n {positions.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.positions.empty\")}\n </div>\n ) : (\n <>\n <div className=\"w-full overflow-x-auto\">\n <StyledTable\n radius=\"none\"\n aria-label=\"Positions\"\n className=\"min-w-[640px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Market\" width={200}>\n {t(\"predict.positions.market\")}\n </TableColumn>\n <TableColumn textValue=\"Outcome\" width={60}>\n {t(\"predict.positions.outcome\")}\n </TableColumn>\n <TableColumn textValue=\"Qty\" width={50}>\n {t(\"predict.positions.qty\")}\n </TableColumn>\n <TableColumn textValue=\"Avg Cost\" width={70}>\n {t(\"predict.positions.avgCost\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={60}>\n {t(\"predict.positions.currentPrice\")}\n </TableColumn>\n <TableColumn textValue=\"Value\" width={80}>\n {t(\"predict.positions.value\")}\n </TableColumn>\n <TableColumn textValue=\"PnL\" width={80}>\n {t(\"predict.positions.pnl\")}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow\n key={row.key}\n className={\n onSell ? \"cursor-pointer hover:bg-default-50\" : \"\"\n }\n onClick={() => onSell?.(row.position)}\n >\n <TableCell>\n <span className=\"text-xs font-medium line-clamp-1\">\n {row.marketTitle}\n </span>\n </TableCell>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.outcome === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.quantity}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.avgCost}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.currentPrice}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{fmtCents(row.value)}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">\n <PnlText value={row.unrealizedPnl} />\n </span>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n\n {/* Summary footer */}\n <div className=\"flex items-center justify-between border-t border-default-200 px-3 py-2 text-xs\">\n <div className=\"flex items-center gap-x-4\">\n <span className=\"text-default-500\">\n {t(\"predict.positions.totalValue\")}:{\" \"}\n <span className=\"font-medium text-foreground\">\n {fmtCents(summary.totalValue)}\n </span>\n </span>\n </div>\n <div className=\"flex items-center gap-x-4\">\n <span className=\"text-default-500\">\n {t(\"predict.positions.unrealizedPnl\")}:{\" \"}\n <PnlText value={summary.totalUnrealizedPnl} />\n </span>\n <span className=\"text-default-500\">\n {t(\"predict.positions.realizedPnl\")}:{\" \"}\n <PnlText value={summary.totalRealizedPnl} />\n </span>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly. See positions.script.tsx for alternatives.\n */\nimport { usePositions, type Position } from \"./positions.script\";\nimport { PositionsUI } from \"./positions.ui\";\n\nexport interface PositionsWidgetProps {\n /** Polling interval in ms (default 15000, 0 to disable) */\n refetchInterval?: number;\n /** Callback when a position's sell action is triggered */\n onSell?: (position: Position) => void;\n}\n\n/**\n * @deprecated This widget is deprecated. Use on-chain token balance queries instead.\n */\nexport function PositionsWidget({\n refetchInterval,\n onSell,\n}: PositionsWidgetProps = {}) {\n const { positions, isLoading, summary } = usePositions({ refetchInterval });\n\n return (\n <PositionsUI\n positions={positions}\n isLoading={isLoading}\n summary={summary}\n onSell={onSell}\n />\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\n\nconst MAX_HISTORY_SIZE = 10;\n\nconst searchHistoriesAtom = atomWithStorage<string[]>(\n \"liberfi:predict_search_histories\",\n [],\n undefined,\n { getOnInit: true },\n);\n\nexport function usePredictSearchHistory() {\n const [histories, setHistories] = useAtom(searchHistoriesAtom);\n\n const addHistory = useCallback(\n (keyword: string) => {\n const trimmed = keyword.trim();\n if (!trimmed) return;\n\n setHistories((prev) => {\n const filtered = prev.filter((h) => h !== trimmed);\n return [trimmed, ...filtered].slice(0, MAX_HISTORY_SIZE);\n });\n },\n [setHistories],\n );\n\n const clearHistories = useCallback(() => {\n setHistories([]);\n }, [setHistories]);\n\n return { histories, addHistory, clearHistories };\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Chip, TrashIcon, Button } from \"@liberfi.io/ui\";\n\nexport type SearchHistoryUIProps = {\n histories: string[];\n onSelect?: (keyword: string) => void;\n onClear?: () => void;\n className?: string;\n};\n\nexport function SearchHistoryUI({\n histories,\n onSelect,\n onClear,\n className,\n}: SearchHistoryUIProps) {\n const { t } = useTranslation();\n\n if (histories.length === 0) return null;\n\n return (\n <div className={cn(\"px-4 pb-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.search.history\")}\n </span>\n <Button\n isIconOnly\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <TrashIcon width={20} height={20} />\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {histories.map((keyword) => (\n <Chip\n key={keyword}\n size=\"sm\"\n variant=\"bordered\"\n className={cn(\n \"text-neutral\",\n \"border-border border-1\",\n \"cursor-pointer\",\n \"hover:opacity-hover\",\n )}\n onClick={() => onSelect?.(keyword)}\n >\n {keyword}\n </Chip>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"@liberfi.io/ui\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\nimport { SearchHistoryUI } from \"./search-history.ui\";\n\nexport type SearchHistoryWidgetProps = {\n /** Callback when a history keyword is selected */\n onSelect?: (keyword: string) => void;\n className?: string;\n};\n\nexport function SearchHistoryWidget({\n onSelect,\n className,\n}: SearchHistoryWidgetProps) {\n const { histories, clearHistories } = usePredictSearchHistory();\n\n return (\n <SearchHistoryUI\n className={cn(className)}\n histories={histories}\n onSelect={onSelect}\n onClear={clearHistories}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Kbd,\n SearchIcon,\n StyledInput,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\n\nexport type SearchInputUIProps = {\n /** Controlled input value */\n value: string;\n /** Called on every keystroke */\n onValueChange: (value: string) => void;\n /** Called when clear button is pressed */\n onClear?: () => void;\n /** Called when Esc button is pressed */\n onEscape?: () => void;\n className?: string;\n};\n\nexport function SearchInputUI({\n value,\n onValueChange,\n onClear,\n onEscape,\n className,\n}: SearchInputUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={className}>\n <StyledInput\n autoFocus\n variant=\"flat\"\n radius=\"full\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"predict.search.placeholder\")}\n startContent={\n <SearchIcon width={20} height={20} className=\"text-neutral\" />\n }\n endContent={\n value ? (\n <Button\n isIconOnly\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n ) : (\n <Kbd\n className=\"min-w-8 justify-center text-xs text-neutral bg-transparent border border-border rounded-full cursor-pointer select-none\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n onEscape?.();\n }}\n >\n Esc\n </Kbd>\n )\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { Avatar, cn, Linkable } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event } from \"../../client/v2\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type SearchResultItemUIProps = {\n event: V2Event;\n /** URL for the detail page. When set, the row renders as a link via Linkable. */\n href?: string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: V2Event) => void;\n /** Called when the row is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n className?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchResultItemUI({\n event,\n href,\n LinkComponent,\n onSelect,\n onHover,\n className,\n}: SearchResultItemUIProps) {\n const firstTag = event.tags?.[0];\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n className={cn(\n \"w-full h-full px-3 flex items-center gap-3\",\n \"hover:cursor-pointer hover:bg-content2 rounded-lg\",\n \"transition-colors duration-150\",\n className,\n )}\n onClick={(e) => {\n // When href is present, Next.js Link would also navigate client-side.\n // Prevent that so navigation is handled exactly once by the onSelect callback\n // (which closes the modal, then the caller does router.push).\n // Right-click / middle-click \"Open in new tab\" still works via href.\n if (href && onSelect) e.preventDefault();\n onSelect?.(event);\n }}\n onMouseEnter={() => onHover?.(event)}\n >\n {/* Avatar */}\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"full\"\n className=\"h-10 w-10 flex-shrink-0\"\n />\n\n {/* Title + Tag */}\n <div className=\"flex-1 min-w-0 flex items-center gap-2.5\">\n <span className=\"min-w-0 text-sm font-medium truncate\">\n {event.title}\n </span>\n\n {firstTag && (\n <span\n className={cn(\n \"flex-shrink-0 inline-flex items-center\",\n \"rounded-full px-2.5 py-1.5\",\n \"text-[11px] font-semibold leading-none uppercase\",\n \"bg-primary/15 text-primary\",\n )}\n >\n {firstTag.label}\n </span>\n )}\n </div>\n </Linkable>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { V2Event, V2ProviderSource } from \"../../client/v2\";\nimport { useSearchEventsInfiniteQuery } from \"../../hooks/v2/useSearchEventsInfiniteQuery\";\n\nexport interface UseSearchResultListScriptParams {\n keyword?: string;\n limit?: number;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: V2ProviderSource;\n}\n\nexport function useSearchResultListScript({\n keyword = \"\",\n limit,\n source,\n}: UseSearchResultListScriptParams) {\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchEventsInfiniteQuery({ keyword, limit, source }, { enabled: true });\n\n const events = useMemo<V2Event[]>(\n () =>\n data?.pages\n .flatMap((p) => p.items)\n .filter((item): item is V2Event => item != null) ?? [],\n [data],\n );\n\n return {\n events,\n isLoading,\n isFetchingNextPage,\n hasNextPage: hasNextPage ?? false,\n fetchNextPage,\n };\n}\n","\"use client\";\n\nimport { ReactElement, useCallback, useMemo, useRef } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, EmptyIcon, Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event } from \"../../client/v2\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport {\n useSearchResultListScript,\n type UseSearchResultListScriptParams,\n} from \"./search-result-list.script\";\n\nconst ROW_HEIGHT = 56;\n\nexport type SearchResultListWidgetProps = {\n onSelect?: (event: V2Event) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n className?: string;\n} & UseSearchResultListScriptParams;\n\nexport function SearchResultListWidget({\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n className,\n ...scriptParams\n}: SearchResultListWidgetProps) {\n const { events, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchResultListScript(scriptParams);\n\n const ref = useRef<HTMLDivElement>(null);\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => index < events.length,\n [events],\n );\n\n const loadMoreItems = useCallback(async () => {\n if (hasNextPage && !isFetchingNextPage) {\n await fetchNextPage();\n }\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const itemCount = useMemo(\n () => (hasNextPage ? events.length + 1 : events.length),\n [events, hasNextPage],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 5,\n });\n\n if (isLoading) {\n return <LoadingState className={className} />;\n }\n\n if (events.length === 0) {\n return <EmptyState className={className} />;\n }\n\n return (\n <div className={cn(\"w-full h-full flex flex-col\", className)}>\n <div className=\"flex-auto min-h-0\" ref={ref}>\n <List\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={SearchResultRow}\n rowCount={itemCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ events, onSelect, getEventHref, LinkComponent, onHover }}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row renderer\n// ---------------------------------------------------------------------------\n\ninterface SearchResultRowData {\n events: V2Event[];\n onSelect?: (event: V2Event) => void;\n getEventHref?: (event: V2Event) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: V2Event) => void;\n}\n\nfunction SearchResultRow({\n index,\n style,\n events,\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n}: RowComponentProps<SearchResultRowData>): ReactElement {\n const event = events[index];\n\n if (!event) {\n return (\n <div style={style} className=\"flex items-center justify-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n return (\n <div style={style}>\n <SearchResultItemUI\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onHover={onHover}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// States\n// ---------------------------------------------------------------------------\n\nfunction LoadingState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\"flex items-center justify-center gap-2 py-16\", className)}\n >\n <Spinner size=\"sm\" />\n <span className=\"text-sm text-neutral\">\n {t(\"predict.search.loading\")}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-16\",\n className,\n )}\n >\n <EmptyIcon width={28} height={28} className=\"text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral\">\n {t(\"predict.search.noResults\")}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { debounce } from \"@liberfi.io/utils\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\n\nexport interface UseSearchScriptParams {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n}\n\nexport function useSearchScript({ onKeywordChange }: UseSearchScriptParams) {\n const [text, setText] = useState(\"\");\n const [keyword, setKeyword] = useState(\"\");\n const { addHistory } = usePredictSearchHistory();\n\n const onKeywordChangeStable = useCallbackRef(onKeywordChange);\n const addHistoryStable = useCallbackRef(addHistory);\n\n const debouncedSearch = useMemo(\n () =>\n debounce((v: string) => {\n setKeyword(v);\n onKeywordChangeStable(v);\n if (v) addHistoryStable(v);\n }, 500),\n [onKeywordChangeStable, addHistoryStable],\n );\n\n const setText_ = useCallback(\n (v: string) => {\n setText(v);\n debouncedSearch(v);\n },\n [debouncedSearch],\n );\n\n const setKeyword_ = useCallback(\n (value: string) => {\n debouncedSearch.cancel();\n setText(value);\n setKeyword(value);\n onKeywordChangeStable(value);\n if (value) addHistoryStable(value);\n },\n [debouncedSearch, onKeywordChangeStable, addHistoryStable],\n );\n\n const clearKeyword = useCallback(() => setKeyword_(\"\"), [setKeyword_]);\n\n return {\n text,\n keyword,\n setText: setText_,\n setKeyword: setKeyword_,\n clearKeyword,\n };\n}\n","\"use client\";\n\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event, V2ProviderSource } from \"../../client/v2\";\nimport { SearchHistoryWidget } from \"./search-history.widget\";\nimport { SearchInputUI } from \"./search-input.ui\";\nimport { SearchResultListWidget } from \"./search-result-list.widget\";\nimport { useSearchScript } from \"./search.script\";\n\nexport type SearchWidgetProps = {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n /** Callback when an event is selected */\n onSelectEvent?: (event: V2Event) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n /** Called when the Esc button / key is pressed. */\n onEscape?: () => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: V2ProviderSource;\n};\n\nexport function SearchWidget({\n onKeywordChange,\n onSelectEvent,\n getEventHref,\n LinkComponent,\n onHover,\n onEscape,\n source,\n}: SearchWidgetProps) {\n const { text, keyword, setText, setKeyword, clearKeyword } = useSearchScript({\n onKeywordChange,\n });\n\n return (\n <div className=\"w-full h-full flex flex-col gap-3\">\n <SearchInputUI\n value={text}\n onValueChange={setText}\n onClear={clearKeyword}\n onEscape={onEscape}\n />\n {!keyword && <SearchHistoryWidget onSelect={setKeyword} />}\n <SearchResultListWidget\n className=\"flex-auto min-h-0\"\n keyword={keyword}\n onSelect={onSelectEvent}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n source={source}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport {\n Button,\n ModalBody,\n ModalContent,\n ModalHeader,\n StyledModal,\n useScreen,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport type { V2Event, V2ProviderSource } from \"../../client/v2\";\nimport { SearchWidget } from \"./search.widget\";\n\nexport type PredictSearchModalParams = {\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: V2ProviderSource;\n};\n\nexport type PredictSearchModalResult = V2Event;\n\nexport const PREDICT_SEARCH_MODAL_ID = \"predict-search\";\n\nexport function PredictSearchModal({\n id = PREDICT_SEARCH_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictSearchModalParams, PredictSearchModalResult> id={id}>\n {(modalProps) => <PredictSearchModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictSearchModalContent({\n params,\n isOpen,\n onOpenChange,\n onResult,\n}: RenderAsyncModalProps<PredictSearchModalParams, PredictSearchModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const handleSelectEvent = useCallback(\n (event: V2Event) => {\n onResult(event);\n },\n [onResult],\n );\n\n const handleEscape = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"full\" : \"lg\"}\n hideCloseButton\n backdrop=\"blur\"\n radius=\"lg\"\n >\n <ModalContent className=\"w-full h-full\">\n <ModalHeader className=\"sm:hidden flex items-center justify-between pt-4 pb-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.search.title\")}\n </span>\n <Button\n isIconOnly\n onPress={() => onOpenChange(false)}\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6\"\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n </ModalHeader>\n <ModalBody className=\"p-4\">\n <SearchWidget\n getEventHref={params?.getEventHref}\n LinkComponent={params?.LinkComponent}\n onHover={params?.onHover}\n source={params?.source}\n onSelectEvent={handleSelectEvent}\n onEscape={handleEscape}\n />\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, cn, Kbd, SearchIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport type { V2Event } from \"../../client/v2\";\nimport {\n PREDICT_SEARCH_MODAL_ID,\n type PredictSearchModalParams,\n type PredictSearchModalResult,\n} from \"./search.modal\";\n\nexport type SearchEventsButtonProps = {\n /** Callback when an event is selected from the search modal */\n onSelectEvent?: (event: V2Event) => void;\n /** Params forwarded to the search modal (getEventHref, LinkComponent, onHover) */\n modalParams?: Omit<PredictSearchModalParams, never>;\n className?: string;\n};\n\nexport function SearchEventsButton({\n onSelectEvent,\n modalParams,\n className,\n}: SearchEventsButtonProps) {\n const { t } = useTranslation();\n const { isDesktop, isMobile } = useScreen();\n\n const { onOpen, onClose } = useAsyncModal<\n PredictSearchModalParams,\n PredictSearchModalResult\n >(PREDICT_SEARCH_MODAL_ID);\n\n const onSelectEventStable = useCallbackRef(onSelectEvent);\n\n const handleOpen = useCallbackRef(async () => {\n const result = await onOpen({ params: modalParams });\n if (result) {\n onSelectEventStable(result);\n }\n });\n\n const handleClose = useCallbackRef(() => {\n onClose();\n });\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n const isInEditableElement =\n !!activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.getAttribute(\"contenteditable\") === \"true\");\n\n if (event.key === \"/\" && !isInEditableElement) {\n event.preventDefault();\n handleOpen();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleOpen, handleClose]);\n\n return (\n <Button\n size=\"sm\"\n radius=\"full\"\n isIconOnly={!isDesktop}\n onPress={handleOpen}\n variant={isMobile ? \"flat\" : \"bordered\"}\n startContent={\n isDesktop ? <SearchIcon className=\"text-neutral\" /> : undefined\n }\n endContent={\n isDesktop ? (\n <Kbd className=\"ml-auto min-w-6 justify-center text-xs bg-transparent border border-border rounded-full\">\n /\n </Kbd>\n ) : undefined\n }\n className={cn(\n isDesktop && \"min-w-56 justify-start pl-3 pr-1.5 text-neutral\",\n className,\n )}\n >\n {isDesktop ? (\n t(\"predict.search.placeholder\")\n ) : (\n <SearchIcon className=\"text-neutral\" />\n )}\n </Button>\n );\n}\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport { PredictContext } from \"../contexts\";\nimport type { IPredictClient, IPredictWsClient } from \"../types\";\n\nexport type PredictProviderProps = PropsWithChildren<{\n /** The predict API client instance */\n client: IPredictClient;\n /** WebSocket client instance (optional, enables WebSocket features) */\n wsClient?: IPredictWsClient | null;\n}>;\n\nexport function PredictProvider({\n client,\n wsClient = null,\n children,\n}: PredictProviderProps) {\n const value = useMemo(\n () => ({\n client,\n wsClient,\n }),\n [client, wsClient],\n );\n\n return (\n <PredictContext.Provider value={value}>{children}</PredictContext.Provider>\n );\n}\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport { UserPredictContext } from \"../contexts/UserPredictContext\";\nimport { usePositionsByWalletQuery } from \"../hooks/usePositionsByWalletQuery\";\n\nconst DEFAULT_POLLING_INTERVAL = 30_000;\n\nexport type UserPredictProviderProps = PropsWithChildren<{\n /** Wallet address to poll positions for */\n walletAddress: string;\n /** Polling interval in milliseconds (default: 30 000) */\n pollingInterval?: number;\n /** Whether polling is enabled (default: true) */\n enabled?: boolean;\n}>;\n\nexport function UserPredictProvider({\n walletAddress,\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n enabled = true,\n children,\n}: UserPredictProviderProps) {\n const { data, isLoading, error, refetch } = usePositionsByWalletQuery(\n { walletAddress },\n {\n enabled: enabled && !!walletAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n const value = useMemo(\n () => ({\n positions: data?.positions ?? [],\n usdcBalance: data?.usdcBalance ?? 0,\n isLoading,\n error: error ?? null,\n refetch,\n }),\n [data?.positions, data?.usdcBalance, isLoading, error, refetch],\n );\n\n return (\n <UserPredictContext.Provider value={value}>\n {children}\n </UserPredictContext.Provider>\n );\n}\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport type { PredictClientV2 } from \"../../client/v2\";\nimport { PredictV2Context } from \"../../contexts/v2\";\n\nexport type PredictV2ProviderProps = PropsWithChildren<{\n /**\n * A `PredictClientV2` instance pointed at the prediction-server endpoint.\n *\n * @example\n * ```tsx\n * import { createPredictClientV2 } from \"@liberfi.io/ui-predict\";\n *\n * const client = createPredictClientV2(\"https://api.example.com\");\n *\n * <PredictV2Provider client={client}>\n * <App />\n * </PredictV2Provider>\n * ```\n */\n client: PredictClientV2;\n}>;\n\n/**\n * Provides the v2 prediction client via React context.\n *\n * Place this provider at the application root (or any subtree boundary)\n * where v2 prediction hooks are used. It is independent of `PredictProvider`,\n * allowing both to coexist during an incremental migration.\n */\nexport function PredictV2Provider({\n client,\n children,\n}: PredictV2ProviderProps) {\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <PredictV2Context.Provider value={value}>\n {children}\n </PredictV2Context.Provider>\n );\n}\n","import { httpGet, httpPost } from \"@liberfi.io/utils\";\nimport type { ProviderType } from \"../types\";\n\n/**\n * Build a query string from a params object.\n * Skips `undefined` and `null` values.\n */\nexport function buildQuery(\n params: Record<string, unknown>,\n provider?: ProviderType,\n): string {\n const qs = new URLSearchParams();\n\n // Add provider if specified\n if (provider) {\n qs.set(\"provider\", provider);\n }\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n qs.set(key, JSON.stringify(value));\n } else {\n qs.set(key, String(value));\n }\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/** Cast typed params to Record for buildQuery */\nexport function toRecord<T extends object>(params: T): Record<string, unknown> {\n return params as unknown as Record<string, unknown>;\n}\n\n/**\n * Base class for prediction market clients.\n * Provides common HTTP request utilities.\n */\nexport abstract class BasePredictClient {\n constructor(\n protected readonly endpoint: string,\n protected readonly provider: ProviderType,\n ) {}\n\n /**\n * Build URL with query parameters\n */\n protected buildUrl(path: string, params?: Record<string, unknown>): string {\n const query = buildQuery(params ?? {}, this.provider);\n return `${this.endpoint}${path}${query}`;\n }\n\n /**\n * Perform a GET request\n */\n protected async fetch<T>(\n path: string,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpGet<T>(url);\n }\n\n /**\n * Perform a POST request\n */\n protected async postRequest<T, P = unknown>(\n path: string,\n data: P,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpPost<T, P>(url, data);\n }\n}\n","import type {\n IPredictClient,\n StandardEventsResponse,\n StandardEvent,\n StandardMarketsResponse,\n StandardMarket,\n OrderbookResponse,\n OrderbookLevel,\n MultiTradeResponse,\n MultiOnchainTradeResponse,\n CandlesticksResponse,\n ForecastPercentileHistoryResponse,\n SeriesListResponse,\n SeriesResponse,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n SearchResponse,\n OutcomeMintsResponse,\n FilterOutcomeMintsResponse,\n LiveDataResponse,\n QuoteResponse,\n SwapResponse,\n SwapInstructionsResponse,\n OrderResponse,\n OrderStatusResponse,\n IntentQuoteResponse,\n IntentSwapResponse,\n PredictionMarketInitResponse,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n VenueListResponse,\n EventQueryParams,\n MarketQueryParams,\n MarketsBatchRequest,\n TradesQueryParams,\n TradesByMintQueryParams,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n PositionsByWalletQueryParams,\n WalletPositionsResponse,\n OutcomeMintsQueryParams,\n FilterOutcomeMintsRequest,\n QuoteQueryParams,\n SwapRequestBody,\n OrderQueryParams,\n OrderStatusQueryParams,\n IntentQuoteQueryParams,\n IntentSwapRequestBody,\n PredictionMarketInitQueryParams,\n} from \"../types\";\nimport { BasePredictClient, toRecord } from \"./base\";\n\n// ---------------------------------------------------------------------------\n// DFlow-specific raw orderbook types (internal to this client)\n// ---------------------------------------------------------------------------\n\n/** Raw orderbook side as returned by the DFlow API: price string → quantity */\ntype DflowOrderbookSideRaw = Record<string, number>;\n\n/** Raw orderbook response shape from DFlow API */\ninterface DflowRawOrderbookResponse {\n yes_bids?: DflowOrderbookSideRaw;\n yes_asks?: DflowOrderbookSideRaw;\n no_bids?: DflowOrderbookSideRaw;\n no_asks?: DflowOrderbookSideRaw;\n sequence?: number;\n}\n\n/** Parse a raw orderbook side into sorted OrderbookLevel[] */\nfunction parseSide(\n raw: DflowOrderbookSideRaw | undefined,\n sort: \"asc\" | \"desc\",\n): OrderbookLevel[] {\n if (!raw) return [];\n const levels: OrderbookLevel[] = Object.entries(raw).map(\n ([priceStr, quantity]) => ({\n price: parseFloat(priceStr),\n quantity,\n }),\n );\n levels.sort((a, b) =>\n sort === \"desc\" ? b.price - a.price : a.price - b.price,\n );\n return levels;\n}\n\n/** Normalise DFlow raw orderbook response into public OrderbookResponse */\nfunction normalizeOrderbook(raw: DflowRawOrderbookResponse): OrderbookResponse {\n return {\n yesBids: parseSide(raw.yes_bids, \"desc\"),\n yesAsks: parseSide(raw.yes_asks, \"asc\"),\n noBids: parseSide(raw.no_bids, \"desc\"),\n noAsks: parseSide(raw.no_asks, \"asc\"),\n sequence: raw.sequence,\n };\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * DFlow Prediction Market Client.\n * Implements IPredictClient interface using the DFlow API.\n */\nexport class DflowPredictClient\n extends BasePredictClient\n implements IPredictClient\n{\n constructor(endpoint: string) {\n super(endpoint, \"dflow\");\n }\n\n // -- Events ----------------------------------------------------------------\n\n async getEvents(params?: EventQueryParams): Promise<StandardEventsResponse> {\n return await this.fetch<StandardEventsResponse>(\n \"/v2/event\",\n toRecord(params ?? {}),\n );\n }\n\n async getEventById(\n eventId: string,\n withNestedMarkets?: boolean,\n ): Promise<StandardEvent> {\n return await this.fetch<StandardEvent>(`/v2/event/${eventId}`, {\n withNestedMarkets,\n });\n }\n\n async getEventCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/event/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getEventForecastPercentileHistory(\n params: ForecastPercentileHistoryQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { seriesTicker, eventId, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/${seriesTicker}/${eventId}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n async getEventForecastPercentileHistoryByMint(\n params: ForecastPercentileHistoryByMintQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/by-mint/${mintAddress}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n // -- Markets ---------------------------------------------------------------\n\n async getMarkets(\n params?: MarketQueryParams,\n ): Promise<StandardMarketsResponse> {\n return await this.fetch<StandardMarketsResponse>(\n \"/v2/market\",\n toRecord(params ?? {}),\n );\n }\n\n async getMarketById(marketId: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(`/v2/market/${marketId}`);\n }\n\n async getMarketByMint(mintAddress: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(\n `/v2/market/by-mint/${mintAddress}`,\n );\n }\n\n async getMarketsBatch(\n request: MarketsBatchRequest,\n ): Promise<StandardMarketsResponse> {\n return await this.postRequest<StandardMarketsResponse, MarketsBatchRequest>(\n \"/v2/market/batch\",\n request,\n );\n }\n\n async getMarketCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getMarketCandlesticksByMint(\n mintAddress: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/by-mint/${mintAddress}/candlesticks`,\n toRecord(params),\n );\n }\n\n // -- Orderbook -------------------------------------------------------------\n\n async getOrderbook(marketTicker: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/${marketTicker}`,\n );\n return normalizeOrderbook(raw);\n }\n\n async getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/by-mint/${mintAddress}`,\n );\n return normalizeOrderbook(raw);\n }\n\n // -- Trades ----------------------------------------------------------------\n\n async getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse> {\n return await this.fetch<MultiTradeResponse>(\n \"/v2/trades\",\n toRecord(params ?? {}),\n );\n }\n\n async getTradesByMint(\n params: TradesByMintQueryParams,\n ): Promise<MultiTradeResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<MultiTradeResponse>(\n `/v2/trades/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- On-Chain Trades -------------------------------------------------------\n\n async getOnchainTradesByWallet(\n params: OnchainTradesByWalletQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { walletAddress, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-wallet/${walletAddress}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByEvent(\n params: OnchainTradesByEventQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByMarket(\n params: OnchainTradesByMarketQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { marketTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-market/${marketTicker}`,\n toRecord(rest),\n );\n }\n\n // -- Live Data -------------------------------------------------------------\n\n async getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse> {\n return await this.fetch<LiveDataResponse>(\"/v2/live\", {\n milestoneIds: params.milestoneIds.join(\",\"),\n });\n }\n\n async getLiveDataByEvent(\n params: LiveDataByEventQueryParams,\n ): Promise<LiveDataResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getLiveDataByMint(\n params: LiveDataByMintQueryParams,\n ): Promise<LiveDataResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Series ----------------------------------------------------------------\n\n async getSeries(params?: SeriesQueryParams): Promise<SeriesListResponse> {\n return await this.fetch<SeriesListResponse>(\n \"/v2/series\",\n toRecord(params ?? {}),\n );\n }\n\n async getSeriesByTicker(seriesTicker: string): Promise<SeriesResponse> {\n return await this.fetch<SeriesResponse>(`/v2/series/${seriesTicker}`);\n }\n\n // -- Tags & Sports ---------------------------------------------------------\n\n async getTagsByCategories(): Promise<TagsByCategoriesResponse> {\n return await this.fetch<TagsByCategoriesResponse>(\"/v2/tags/by_categories\");\n }\n\n async getFiltersBySports(): Promise<FiltersBySportsResponse> {\n return await this.fetch<FiltersBySportsResponse>(\"/v2/sports/filters\");\n }\n\n // -- Search ----------------------------------------------------------------\n\n async search(params: SearchQueryParams): Promise<SearchResponse> {\n return await this.fetch<SearchResponse>(\"/v2/search\", toRecord(params));\n }\n\n // -- Positions -------------------------------------------------------------\n\n async getPositionsByWallet(\n params: PositionsByWalletQueryParams,\n ): Promise<WalletPositionsResponse> {\n const { walletAddress } = params;\n return await this.fetch<WalletPositionsResponse>(\n `/v2/positions/by-wallet/${walletAddress}`,\n );\n }\n\n // -- Outcome Mints ---------------------------------------------------------\n\n async getOutcomeMints(\n params?: OutcomeMintsQueryParams,\n ): Promise<OutcomeMintsResponse> {\n return await this.fetch<OutcomeMintsResponse>(\n \"/v2/outcome_mints\",\n toRecord(params ?? {}),\n );\n }\n\n async filterOutcomeMints(\n request: FilterOutcomeMintsRequest,\n ): Promise<FilterOutcomeMintsResponse> {\n return await this.postRequest<\n FilterOutcomeMintsResponse,\n FilterOutcomeMintsRequest\n >(\"/v2/filter_outcome_mints\", request);\n }\n\n // -- Quote & Swap (Imperative) ---------------------------------------------\n\n async getQuote(params: QuoteQueryParams): Promise<QuoteResponse> {\n return await this.fetch<QuoteResponse>(\"/v2/swap/quote\", toRecord(params));\n }\n\n async createSwap(request: SwapRequestBody): Promise<SwapResponse> {\n return await this.postRequest<SwapResponse, SwapRequestBody>(\n \"/v2/swap\",\n request,\n );\n }\n\n async createSwapInstructions(\n request: SwapRequestBody,\n ): Promise<SwapInstructionsResponse> {\n return await this.postRequest<SwapInstructionsResponse, SwapRequestBody>(\n \"/v2/swap/instructions\",\n request,\n );\n }\n\n // -- Order API -------------------------------------------------------------\n\n async getOrder(params: OrderQueryParams): Promise<OrderResponse> {\n return await this.fetch<OrderResponse>(\"/v2/order\", toRecord(params));\n }\n\n async getOrderStatus(\n params: OrderStatusQueryParams,\n ): Promise<OrderStatusResponse> {\n try {\n return await this.fetch<OrderStatusResponse>(\n \"/v2/order/status\",\n toRecord(params),\n );\n } catch (err: unknown) {\n // 404 means the order hasn't been indexed yet — return pending so polling continues\n const is404 = err instanceof Error && /\\b404\\b/.test(err.message);\n if (is404) {\n return { status: \"pending\", inAmount: \"0\", outAmount: \"0\" };\n }\n throw err;\n }\n }\n\n // -- Intent (Declarative Swap) ---------------------------------------------\n\n async getIntentQuote(\n params: IntentQuoteQueryParams,\n ): Promise<IntentQuoteResponse> {\n return await this.fetch<IntentQuoteResponse>(\n \"/v2/intent/quote\",\n toRecord(params),\n );\n }\n\n async submitIntentSwap(\n request: IntentSwapRequestBody,\n ): Promise<IntentSwapResponse> {\n return await this.postRequest<IntentSwapResponse, IntentSwapRequestBody>(\n \"/v2/intent/swap\",\n request,\n );\n }\n\n // -- Prediction Market Init ------------------------------------------------\n\n async initPredictionMarket(\n params: PredictionMarketInitQueryParams,\n ): Promise<PredictionMarketInitResponse> {\n return await this.fetch<PredictionMarketInitResponse>(\n \"/v2/prediction-market/init\",\n toRecord(params),\n );\n }\n\n // -- Token & Venue ---------------------------------------------------------\n\n async getTokens(): Promise<TokenListResponse> {\n return await this.fetch<TokenListResponse>(\"/v2/tokens\");\n }\n\n async getTokensWithDecimals(): Promise<TokenListWithDecimalsResponse> {\n return await this.fetch<TokenListWithDecimalsResponse>(\n \"/v2/tokens/decimals\",\n );\n }\n\n async getVenues(): Promise<VenueListResponse> {\n return await this.fetch<VenueListResponse>(\"/v2/venues\");\n }\n}\n","import { httpGet, httpPost, httpDelete } from \"@liberfi.io/utils\";\nimport type {\n V2CancelOrderResult,\n V2Candlestick,\n V2DFlowQuoteRequest,\n V2DFlowQuoteResponse,\n V2DFlowSubmitRequest,\n V2DFlowSubmitResponse,\n V2Event,\n V2ListCandlesticksParams,\n V2ListEventsParams,\n V2ListMarketTradesParams,\n V2ListOrdersParams,\n V2ListTradesByWalletParams,\n V2Market,\n V2Orderbook,\n V2Page,\n V2PositionsResponse,\n V2PriceHistoryRange,\n V2PriceHistoryResponse,\n V2ProviderSource,\n V2SimilarEventsParams,\n V2Trade,\n V2UserOrder,\n} from \"./types\";\n\n/**\n * Build a URL query string from a params object.\n * `undefined` and `null` values are omitted.\n * Boolean values are serialised as \"true\" / \"false\" strings.\n */\nfunction buildV2Query(params: Record<string, unknown>): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/**\n * HTTP client for the prediction-server REST API (v2 / prediction-server backend).\n *\n * Covers `GET /api/v1/events` (listEvents), `GET /api/v1/events/:slug` (getEvent),\n * and `GET /api/v1/markets/:slug` (getMarket).\n *\n * This client is intentionally decoupled from the legacy `DflowPredictClient` so\n * that both can be used in parallel during the incremental migration from the old\n * DFlow-direct integration to the unified prediction-server backend.\n *\n * @example\n * ```ts\n * const client = new PredictClientV2(\"https://api.example.com\");\n * const page = await client.listEvents({ status: \"open\", limit: 20 });\n * const event = await client.getEvent(\"will-trump-win-2024\");\n * const market = await client.getMarket(\"will-trump-win-2024-yes\");\n * ```\n */\nexport class PredictClientV2 {\n constructor(private readonly endpoint: string) {}\n\n /**\n * List prediction events with optional filtering, sorting, and pagination.\n *\n * Maps to `GET /api/v1/events`.\n *\n * @param params - Optional query parameters (filter, sort, pagination).\n * @returns A paginated page of events.\n */\n async listEvents(params?: V2ListEventsParams): Promise<V2Page<V2Event>> {\n const query = buildV2Query((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/events${query}`;\n return await httpGet<V2Page<V2Event>>(url);\n }\n\n /**\n * Fetch a single prediction event by its slug.\n *\n * Maps to `GET /api/v1/events/:slug?source=...`.\n *\n * @param slug - Canonical event slug (e.g. \"will-trump-win-2024\" for Polymarket\n * or \"KXBTCD-25FEB-T68000\" for DFlow).\n * @param source - Upstream provider (`\"dflow\"` or `\"polymarket\"`).\n * @returns The matching event.\n * @throws When the server responds with 404 or any other non-2xx status.\n */\n async getEvent(slug: string, source?: V2ProviderSource): Promise<V2Event> {\n const query = source ? buildV2Query({ source }) : \"\";\n const url = `${this.endpoint}/api/v1/events/${encodeURIComponent(slug)}${query}`;\n return await httpGet<V2Event>(url);\n }\n\n /**\n * Fetch a single prediction market by its slug.\n *\n * Maps to `GET /api/v1/markets/:slug?source=...`.\n *\n * @param slug - Canonical market slug.\n * @param source - Upstream provider (`\"dflow\"` or `\"polymarket\"`).\n * @returns The matching market.\n * @throws When the server responds with 404 or any other non-2xx status.\n */\n async getMarket(slug: string, source?: V2ProviderSource): Promise<V2Market> {\n const query = source ? buildV2Query({ source }) : \"\";\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}${query}`;\n return await httpGet<V2Market>(url);\n }\n\n // -------------------------------------------------------------------------\n // Market sub-resources\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/markets/:slug/orderbook?source=...`. */\n async getOrderbook(\n slug: string,\n source: V2ProviderSource,\n ): Promise<V2Orderbook> {\n const query = buildV2Query({ source });\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/orderbook${query}`;\n return await httpGet<V2Orderbook>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/trades?source=...`. */\n async listMarketTrades(\n slug: string,\n params: V2ListMarketTradesParams,\n ): Promise<V2Page<V2Trade>> {\n const query = buildV2Query(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/trades${query}`;\n return await httpGet<V2Page<V2Trade>>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/price-history?source=...&range=...`. */\n async getPriceHistory(\n slug: string,\n source: V2ProviderSource,\n range?: V2PriceHistoryRange,\n ): Promise<V2PriceHistoryResponse> {\n const query = buildV2Query({ source, range });\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/price-history${query}`;\n return await httpGet<V2PriceHistoryResponse>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/candlesticks?interval=...&limit=...`. */\n async listCandlesticks(\n slug: string,\n params?: V2ListCandlesticksParams,\n ): Promise<V2Candlestick[]> {\n const query = buildV2Query((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/candlesticks${query}`;\n return await httpGet<V2Candlestick[]>(url);\n }\n\n // -------------------------------------------------------------------------\n // Event sub-resources\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/events/:slug/similar?source=...`. */\n async getSimilarEvents(\n slug: string,\n source: V2ProviderSource,\n params?: V2SimilarEventsParams,\n ): Promise<V2Event[]> {\n const query = buildV2Query({ source, ...params });\n const url = `${this.endpoint}/api/v1/events/${encodeURIComponent(slug)}/similar${query}`;\n return await httpGet<V2Event[]>(url);\n }\n\n // -------------------------------------------------------------------------\n // Positions\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/positions?source=...&user=...`. */\n async getPositions(\n source: V2ProviderSource,\n user: string,\n ): Promise<V2PositionsResponse> {\n const query = buildV2Query({ source, user });\n const url = `${this.endpoint}/api/v1/positions${query}`;\n return await httpGet<V2PositionsResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // Orders\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/orders?source=...&wallet_address=...`. */\n async listOrders(params: V2ListOrdersParams): Promise<V2Page<V2UserOrder>> {\n const query = buildV2Query(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/orders${query}`;\n return await httpGet<V2Page<V2UserOrder>>(url);\n }\n\n /** Maps to `GET /api/v1/orders/:id?source=...`. */\n async getOrder(id: string, source: V2ProviderSource): Promise<V2UserOrder> {\n const query = buildV2Query({ source });\n const url = `${this.endpoint}/api/v1/orders/${encodeURIComponent(id)}${query}`;\n return await httpGet<V2UserOrder>(url);\n }\n\n /** Maps to `DELETE /api/v1/orders/:id?source=...`. */\n async cancelOrder(\n id: string,\n source: V2ProviderSource,\n ): Promise<V2CancelOrderResult> {\n const query = buildV2Query({ source });\n const url = `${this.endpoint}/api/v1/orders/${encodeURIComponent(id)}${query}`;\n return await httpDelete<V2CancelOrderResult>(url);\n }\n\n // -------------------------------------------------------------------------\n // DFlow trading\n // -------------------------------------------------------------------------\n\n /** Maps to `POST /api/v1/orders/dflow/quote`. */\n async createDFlowQuote(\n body: V2DFlowQuoteRequest,\n ): Promise<V2DFlowQuoteResponse> {\n const url = `${this.endpoint}/api/v1/orders/dflow/quote`;\n return await httpPost<V2DFlowQuoteResponse>(url, body);\n }\n\n /** Maps to `POST /api/v1/orders/dflow/submit`. */\n async submitDFlowTransaction(\n body: V2DFlowSubmitRequest,\n ): Promise<V2DFlowSubmitResponse> {\n const url = `${this.endpoint}/api/v1/orders/dflow/submit`;\n return await httpPost<V2DFlowSubmitResponse>(url, body);\n }\n\n // -------------------------------------------------------------------------\n // Trades by wallet\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/trades?source=...&wallet=...`. */\n async listTradesByWallet(\n params: V2ListTradesByWalletParams,\n ): Promise<V2Page<V2Trade>> {\n const query = buildV2Query(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/trades${query}`;\n return await httpGet<V2Page<V2Trade>>(url);\n }\n}\n\n/**\n * Factory function for `PredictClientV2`.\n *\n * @param endpoint - Base URL of the prediction-server, without a trailing slash.\n */\nexport function createPredictClientV2(endpoint: string): PredictClientV2 {\n return new PredictClientV2(endpoint);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/contexts/v2/PredictV2Context.tsx","../src/hooks/v2/usePredictV2Context.ts","../src/hooks/v2/usePredictV2Client.ts","../src/hooks/v2/useEventsV2Query.ts","../src/consts/index.ts","../src/hooks/v2/eventsV2.params.ts","../src/hooks/v2/useEventV2Query.ts","../src/hooks/v2/useEventsV2InfiniteQuery.ts","../src/hooks/v2/useSearchEventsInfiniteQuery.ts","../src/hooks/v2/useSimilarEventsV2Query.ts","../src/hooks/v2/useMarketV2Query.ts","../src/hooks/v2/usePriceHistoryV2Query.ts","../src/hooks/v2/useMarketHistoryV2.ts","../src/hooks/v2/useOrderbookV2Query.ts","../src/hooks/v2/useMarketTradesV2Query.ts","../src/hooks/v2/useCandlesticksV2Query.ts","../src/hooks/v2/usePositionsV2Query.ts","../src/hooks/v2/useOrdersV2Query.ts","../src/hooks/v2/useOrderV2Query.ts","../src/hooks/v2/useCancelOrderV2Mutation.ts","../src/hooks/v2/useDFlowQuoteV2.ts","../src/hooks/v2/useDFlowSubmitV2.ts","../src/hooks/v2/useTradesByWalletV2Query.ts","../src/contexts/PredictContext.tsx","../src/contexts/UserPredictContext.tsx","../src/hooks/usePredictContext.ts","../src/hooks/usePredictClient.ts","../src/hooks/useEventsQuery.ts","../src/hooks/useEventsInfiniteQuery.ts","../src/hooks/useEventByIdQuery.ts","../src/hooks/useMarketsQuery.ts","../src/hooks/useMarketByIdQuery.ts","../src/hooks/useMarketByMintQuery.ts","../src/hooks/useMarketsBatchQuery.ts","../src/hooks/useOrderBookQuery.ts","../src/hooks/useTradesQuery.ts","../src/hooks/useOnchainTradesQuery.ts","../src/hooks/useOnchainTradesInfiniteQuery.ts","../src/hooks/usePriceHistoryQuery.ts","../src/hooks/useForecastHistoryQuery.ts","../src/hooks/useLiveDataQuery.ts","../src/hooks/useSeriesQuery.ts","../src/hooks/useCategoriesQuery.ts","../src/hooks/useSearchQuery.ts","../src/hooks/usePositionsByWalletQuery.ts","../src/hooks/useUserPredictContext.ts","../src/hooks/useMarketPositions.ts","../src/hooks/useOutcomeMintsQuery.ts","../src/hooks/useQuoteQuery.ts","../src/hooks/useSwapMutation.ts","../src/hooks/useOrderQuery.ts","../src/hooks/useIntentQuery.ts","../src/hooks/usePredictionMarketMutation.ts","../src/hooks/useTokensQuery.ts","../src/hooks/useVenuesQuery.ts","../src/client/ws.ts","../src/hooks/useWsConnection.ts","../src/hooks/useWsClient.ts","../src/hooks/usePricesSubscription.ts","../src/hooks/useTradesSubscription.ts","../src/hooks/useOrderbookSubscription.ts","../src/components/categories/categories.script.ts","../src/components/categories/categories.ui.tsx","../src/components/categories/categories.widget.tsx","../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/components/events/events.page.tsx","../src/components/categories/categories.v2.script.ts","../src/components/categories/categories.v2.widget.tsx","../src/components/events/events-filter.v2.ui.tsx","../src/components/events/events-toolbar.v2.ui.tsx","../src/components/events/events.v2.script.ts","../src/components/events/event-item.v2.ui.tsx","../src/components/events/events.v2.ui.tsx","../src/components/events/events.v2.widget.tsx","../src/components/events/events.v2.page.tsx","../src/components/trade-form/trade-form.script.tsx","../src/components/trade-form/trade-form.ui.tsx","../src/components/trade-form/trade-form.widget.tsx","../src/components/event-detail/event-detail-skeleton.tsx","../src/components/event-detail/event-detail.scripts.ts","../src/hooks/useMarketsHoldings.ts","../src/components/event-detail/event-candlesticks.ui.tsx","../src/components/event-detail/event-market-candlesticks.script.ts","../src/components/event-detail/event-market-candlesticks.ui.tsx","../src/components/event-detail/event-market-orderbook.script.ts","../src/components/event-detail/event-market-orderbook.ui.tsx","../src/components/event-detail/event-market-positions.ui.tsx","../src/components/event-detail/event-market-trades.ui.tsx","../src/components/event-detail/event-market-detail.widget.tsx","../src/components/event-detail/event-markets.ui.tsx","../src/components/event-detail/event-rules.ui.tsx","../src/components/event-detail/event-detail.ui.tsx","../src/components/event-detail/event-detail.widget.tsx","../src/components/event-detail/event-detail.page.tsx","../src/utils/v2-market-adapter.ts","../src/components/trade-form/trade-form-v2.script.ts","../src/components/trade-form/trade-form-v2.widget.tsx","../src/components/event-detail/event-detail-activity-v2.ui.tsx","../src/components/event-detail/event-market-detail-v2.widget.tsx","../src/components/event-detail/event-price-chart-v2.ui.tsx","../src/components/event-detail/event-detail.v2.ui.tsx","../src/components/event-detail/event-detail.v2.widget.tsx","../src/components/event-detail/event-detail.v2.page.tsx","../src/components/event-detail/event-detail.v2.scripts.ts","../src/components/order-book/order-book.script.tsx","../src/components/order-book/order-book.ui.tsx","../src/components/order-book/order-book.widget.tsx","../src/components/open-orders/open-orders.script.tsx","../src/components/open-orders/open-orders.ui.tsx","../src/components/open-orders/open-orders.widget.tsx","../src/components/trade-history/trade-history.script.tsx","../src/components/trade-history/trade-history.ui.tsx","../src/components/trade-history/trade-history.widget.tsx","../src/components/positions/positions.script.tsx","../src/components/positions/positions.ui.tsx","../src/components/positions/positions.widget.tsx","../src/components/search/search-history.script.ts","../src/components/search/search-history.ui.tsx","../src/components/search/search-history.widget.tsx","../src/components/search/search-input.ui.tsx","../src/components/search/search-result-item.ui.tsx","../src/components/search/search-result-list.script.ts","../src/components/search/search-result-list.widget.tsx","../src/components/search/search.script.ts","../src/components/search/search.widget.tsx","../src/components/search/search.modal.tsx","../src/components/search/search-events-button.tsx","../src/providers/PredictProvider.tsx","../src/providers/UserPredictProvider.tsx","../src/providers/v2/PredictV2Provider.tsx","../src/client/base.ts","../src/client/dflow.ts","../src/client/v2/client.ts"],"names":["version_default","PredictV2Context","createContext","usePredictV2Context","context","useContext","usePredictV2Client","client","eventsV2QueryKey","params","fetchEventsV2","useEventsV2Query","queryOptions","useQuery","DEFAULT_PAGE_SIZE","MAX_PRICE_HISTORY_MARKETS","CandlestickPeriod","ChartRange","DEFAULT_CHART_RANGE","CHART_RANGE_PERIOD","CHART_RANGE_SAMPLE_INTERVAL","CHART_RANGE_DURATION","ORDER_MIN_QUANTITY","ORDER_PRICE_STEP","ORDER_MIN_PRICE","ORDER_MAX_PRICE","PriceHistoryInterval","DEFAULT_PRICE_HISTORY_INTERVAL","PRICE_HISTORY_SAMPLE_INTERVAL","resolveTagSlug","selection","resolveEventsV2Params","input","tagSlugSelection","limit","status","with_markets","source","sort_by","sort_asc","tag_slug","eventsV2InfiniteQueryKey","fetchEventsV2Page","eventV2QueryKey","slug","fetchEventV2","useEventV2Query","useEventsV2InfiniteQuery","useInfiniteQuery","pageParam","lastPage","searchEventsInfiniteQueryKey","useSearchEventsInfiniteQuery","apiParams","useMemo","similarEventsV2QueryKey","useSimilarEventsV2Query","marketV2QueryKey","fetchMarketV2","useMarketV2Query","priceHistoryV2QueryKey","range","usePriceHistoryV2Query","RANGE_MAP","useMarketHistoryV2","markets","apiRange","queries","useQueries","market","isLoading","q","idx","points","pt","currentPrice","o","now","orderbookV2QueryKey","useOrderbookV2Query","marketTradesV2QueryKey","useMarketTradesV2Query","candlesticksV2QueryKey","useCandlesticksV2Query","positionsV2QueryKey","user","usePositionsV2Query","ordersV2QueryKey","useOrdersV2Query","orderV2QueryKey","id","useOrderV2Query","useCancelOrderV2Mutation","mutationOptions","queryClient","useQueryClient","useMutation","vars","dflowQuoteV2QueryKey","useDFlowQuoteV2","enabled","useDFlowSubmitV2","body","tradesByWalletV2QueryKey","useTradesByWalletV2Query","PredictContext","UserPredictContext","usePredictContext","usePredictClient","eventsQueryKey","fetchEvents","useEventsQuery","eventsInfiniteQueryKey","useEventsInfiniteQuery","options","eventByIdQueryKey","fetchEventById","useEventByIdQuery","marketsQueryKey","fetchMarkets","useMarketsQuery","marketByIdQueryKey","fetchMarketById","useMarketByIdQuery","marketByMintQueryKey","mintAddress","fetchMarketByMint","useMarketByMintQuery","marketsBatchQueryKey","request","fetchMarketsBatch","useMarketsBatchQuery","orderBookQueryKey","marketTicker","fetchOrderBook","useOrderBookQuery","orderBookByMintQueryKey","fetchOrderBookByMint","useOrderBookByMintQuery","tradesQueryKey","fetchTrades","useTradesQuery","tradesByMintQueryKey","fetchTradesByMint","useTradesByMintQuery","onchainTradesByWalletQueryKey","fetchOnchainTradesByWallet","useOnchainTradesByWalletQuery","onchainTradesByEventQueryKey","fetchOnchainTradesByEvent","useOnchainTradesByEventQuery","onchainTradesByMarketQueryKey","fetchOnchainTradesByMarket","useOnchainTradesByMarketQuery","getNextPageParam","onchainTradesByWalletInfiniteQueryKey","useOnchainTradesByWalletInfiniteQuery","onchainTradesByEventInfiniteQueryKey","useOnchainTradesByEventInfiniteQuery","onchainTradesByMarketInfiniteQueryKey","useOnchainTradesByMarketInfiniteQuery","eventCandlesticksQueryKey","fetchEventCandlesticks","ticker","rest","useEventCandlesticksQuery","marketCandlesticksQueryKey","fetchMarketCandlesticks","useMarketCandlesticksQuery","marketCandlesticksByMintQueryKey","fetchMarketCandlesticksByMint","useMarketCandlesticksByMintQuery","usePriceHistoryQuery","forecastPercentileHistoryQueryKey","fetchForecastPercentileHistory","useForecastPercentileHistoryQuery","forecastPercentileHistoryByMintQueryKey","fetchForecastPercentileHistoryByMint","useForecastPercentileHistoryByMintQuery","liveDataQueryKey","fetchLiveData","useLiveDataQuery","liveDataByEventQueryKey","fetchLiveDataByEvent","useLiveDataByEventQuery","liveDataByMintQueryKey","fetchLiveDataByMint","useLiveDataByMintQuery","seriesQueryKey","fetchSeries","useSeriesQuery","seriesByTickerQueryKey","seriesTicker","fetchSeriesByTicker","useSeriesByTickerQuery","tagsByCategoriesQueryKey","fetchTagsByCategories","useTagsByCategoriesQuery","filtersBySportsQueryKey","fetchFiltersBySports","useFiltersBySportsQuery","useCategoriesQuery","searchQueryKey","fetchSearch","useSearchQuery","positionsByWalletQueryKey","fetchPositionsByWallet","usePositionsByWalletQuery","useUserPredictContext","useMarketPositions","ctx","p","outcomeMintsQueryKey","fetchOutcomeMints","useOutcomeMintsQuery","filterOutcomeMints","useFilterOutcomeMintsMutation","quoteQueryKey","fetchQuote","useQuoteQuery","createSwap","useCreateSwapMutation","createSwapInstructions","useCreateSwapInstructionsMutation","orderQueryKey","fetchOrder","useOrderQuery","orderStatusQueryKey","fetchOrderStatus","useOrderStatusQuery","intentQuoteQueryKey","fetchIntentQuote","useIntentQuoteQuery","submitIntentSwap","useSubmitIntentSwapMutation","initPredictionMarket","useInitPredictionMarketMutation","tokensQueryKey","fetchTokens","useTokensQuery","tokensWithDecimalsQueryKey","fetchTokensWithDecimals","useTokensWithDecimalsQuery","venuesQueryKey","fetchVenues","useVenuesQuery","DflowPredictWsClient","config","event","error","onUpdate","removeListener","callback","listeners","index","key","channel","subscription","data","listener","message","type","dataMsg","delay","createDflowPredictWsClient","useWsConnection","wsEndpoint","autoConnect","autoReconnect","setStatus","useState","setError","clientRef","useRef","useEffect","unsubStatus","newStatus","unsubError","err","unsubConnect","connect","useCallback","disconnect","useWsClient","wsClient","wsStatus","setWsStatus","usePricesSubscription","all","tickers","prices","setPrices","isSubscribed","setIsSubscribed","onUpdateRef","unsubscribe","update","prev","next","useTradesSubscription","maxHistory","trades","setTrades","trade","clearHistory","useOrderbookSubscription","orderbooks","setOrderbooks","getOrderbook","CATEGORY_ORDER","useEventsCategories","tagsData","isError","orderIndex","cat","category","tags","a","b","CategoriesUI","categories","selectedCategory","selectedTag","activeTags","onCategorySelect","onTagSelect","trailing","pulsingTab","className","t","useTranslation","handleSelectAll","trendingLabel","jsxs","cn","jsx","Tab","TabSeparator","Chip","tag","label","isSelected","onPress","badge","showPulse","icon","CategoriesSkeleton","count","_","i","Skeleton","CategoriesWidget","onSelect","setSelectedCategory","setSelectedTag","handleCategorySelect","c","handleTagSelect","useEvents","restParams","needsSeriesLookup","seriesData","isSeriesFetching","isSeriesError","seriesError","derivedSeriesTickers","s","mergedParams","infiniteData","isEventsLoading","isEventsFetching","isFetchingMore","hasMore","fetchMore","refetch","page","isSeriesResolving","EventItemSkeleton","EventsSkeleton","EventsPageSkeleton","GaugeChartUI","value","showLabel","normalized","EventItemUI","onSelectOutcome","manualSelectedMarket","setManualSelectedMarket","rawMarkets","openMarkets","isSingleMarket","selectedMarket","formattedVolume","formatAmountUSDCompact","getYesCents","getNoCents","getYesPercent","yesCents","noCents","formatPercent","getNoPercent","cents","eventStatus","hasActiveMarket","m","handleMarketClick","handleBack","handleYesClick","handleNoClick","handleSelect","displayedMarkets","hasMoreMarkets","Avatar","StyledTooltip","e","ChevronUpIcon","Button","ChevronRightIcon","ChevronLeftIcon","SM","MD","LG","XL","GAP","ROW_HEIGHT_XS","ROW_HEIGHT_SM","ROW_HEIGHT_LG","getColumnCount","width","getRowHeight","EventsUI","events","onFetchMore","containerRef","containerWidth","containerHeight","useResizeObserver","columnCount","rowHeight","dataRowCount","totalRowCount","isRowLoaded","loadMoreRows","onRowsRendered","useInfiniteLoader","List","EventGridRow","style","gap","Spinner","startIdx","rowEvents","emptySlots","innerStyle","EventsWidget","queryParams","isFetching","EventsPage","setSelection","RAW_TAGS_BY_CATEGORIES","CATEGORY_ORDER_V2","CATEGORIES_V2","rawTags","toUICategories","items","toUITags","CategoriesWidgetV2","selectedCategorySlug","setSelectedCategorySlug","selectedTagSlug","setSelectedTagSlug","categoryLabel","tagLabel","uiCategories","activeCat","DEFAULT_FILTER_STATE","countActiveFilters","state","EventsFilterV2UI","isOpen","onClose","onChange","draft","setDraft","handleOpenChange","open","handleReset","handleApply","updateDraft","val","activeCount","platformOptions","timeRemainingOptions","volumeOptions","liquidityOptions","StyledModal","ModalContent","ModalHeader","ModalBody","FilterSection","FilterChipGroup","v","ModalFooter","RefreshIcon","children","selected","allowDeselect","opt","isActive","SORT_PRESETS","SORT_LABEL_KEYS","SORT_ORDER","EventsToolbarV2UI","sortPreset","onSortChange","sortAsc","onSortAscChange","onFilterPress","filterCount","setIsOpen","dropdownRef","onClickOutside","onEscape","ActiveIcon","SORT_ICONS","Icon","StyledBadge","FilterIcon","CalendarIcon","ChartLineIcon","DropletIcon","TimerIcon","useEventsV2","baseParams","fetchNextPage","item","refetchAll","MAX_DISPLAYED_OUTCOMES","C_PRIMARY","C_SECONDARY","C_RED","TEAM_PALETTE","hashString","hash","getOutcomeColors","labels","l","label0","label1","idx0","idx1","getYesAsk","yes","price","no","yesPrice","formatCountdown","isoDate","diff","d","h","parts","injectedCSS","EventItemV2UI","href","LinkComponent","onHover","expandedSlug","setExpandedSlug","singleMarket","moreCount","expandedMarket","isExpanded","handleCardClick","handleHeaderClick","handleShowMore","CardHeader","SingleMarketView","ExpandedMarketView","MarketListView","onClick","countdown","Linkable","EventIndicators","getEventBadges","badges","isCrypto","isLive","remaining","fiveMin","fifteenMin","cryptoColor","LiveBadge","CryptoCountdownBadge","ClosedBadge","color","onMarketClick","onShowMore","Fragment","pct","YesNoPill","SourceIcon","ElevatedButton","bgColor","textColor","shadowColor","el","OutcomeButtons","dynamicColors","labelFormat","c0","c1","yesLabel","noLabel","onCollapse","PolymarketIcon","KalshiIcon","GLOW_INSET","END_ROW_HEIGHT","EventsV2UI","getEventHref","listRef","showEndOfList","handleScrollToTop","EventV2GridRow","onScrollToTop","EndOfListRow","EventsWidgetV2","EventsPageV2","setTagSlugSelection","filterState","setFilterState","isFilterOpen","openFilter","closeFilter","useDisclosure","handleSortChange","preset","handleSortAscChange","asc","handleFilterChange","sortBy","toolbar","getMintAddress","accounts","collateralMint","outcome","accountInfo","USDC_MINT","SOLANA_TOKENS","fireCelebration","defaults","confetti","useTradeForm","_chain","initialOutcome","initialSide","userPredictCtx","authStatus","useAuth","solanaWallet","useWallets","w","ChainNamespace","isAuthenticated","userPublicKey","setOutcome","side","setSideRaw","quantity","setQuantityRaw","outcomeMint","inputMint","outputMint","quoteEnabled","pricePerShare","shares","amount","order","isQuoteLoading","quoteError","refetchOrder","usdcBalance","isBalanceLoading","refetchBalance","positions","outcomeTokenBalance","pos","yesMint","noMint","yesTokenBalance","noTokenBalance","orderBook","bestBid","bestAsk","priceImpact","estimatedCost","bidPrice","potentialPayout","potentialProfit","setSide","setQuantity","clamped","rounded","validation","errors","txHash","setTxHash","isSubmitting","setIsSubmitting","pendingTxSignature","setPendingTxSignature","orderStatusData","toast","submit","currentOrder","txBytes","signature","reset","USDC_LOGO","TradeFormUI","isValid","onOutcomeChange","onSideChange","onQuantityChange","onSubmit","submitLabel","sideLabel","outcomeLabel","submitColor","Tabs","holdingBalance","StyledNumberInput","amt","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","MarketRow","EventDetailSkeleton","marketCount","TradeFormSkeleton","useEventDetail","candlestickMarketTickers","chartRange","candlestickPeriodInterval","rangeDuration","candlestickEndTs","isEventLoading","eventError","candlestickStartTs","series","isSeriesLoading","marketsToQuery","candlestickQueries","isCandlesticksLoading","candlestickErrors","candlesticks","map","useMarketsHoldings","address","walletPortfolios","useWalletPortfoliosQuery","Chain","balanceByMint","yesShares","noShares","BreathingDot","props","cx","cy","dataLength","stroke","CHART_COLORS","formatTimestamp","timestamp","date","transformCandlesticks","marketTickers","sampleInterval","perMarketMaps","response","point","bucket","allTimestamps","ts","sortedTimestamps","lastValues","dataPoint","lastValue","EventCandlesticks","onDataChange","activeIndex","setActiveIndex","onDataChangeRef","chartData","yAxisDomain","minValue","maxValue","padding","domainMin","domainMax","getDataAtIndex","handleMouseMove","handleMouseLeave","ResponsiveContainer","LineChart","XAxis","x","y","payload","totalPoints","sampleIntervalX","isFirst","isLast","isSampled","CartesianGrid","YAxis","Tooltip","name","Line","dotProps","getLatestEventData","useMarketCandlesticks","openTime","periodInterval","endTs","startTs","CHART_COLOR","RANGE_OPTIONS","formatCompact","n","bucketMap","existing","close","volume","EventMarketCandlesticksUI","onRangeChange","dp","RangeSelector","active","useMarketOrderbook","orderbook","isOrderbookLoading","orderbookError","yesBids","yesAsks","noBids","noAsks","buildRows","levels","maxLevels","sliced","cumulative","level","applyDepth","rows","maxCum","row","formatPrice","formatQty","qty","formatTotal","total","RowItem","showType","isAsk","barColor","typeColor","SkeletonRow","widths","DEFAULT_MAX_LEVELS","EventMarketOrderbookUI","bids","asks","onPriceClick","bidRows","askRows","spread","spreadPercent","mid","formatBalance","balance","formatPnL","pnl","abs","sign","EventMarketPositionsUI","isYes","sideColor","avgCostDisplay","priceDisplay","hasPnL","pnlColor","formatAmount","ui","formatTime","month","day","hours","minutes","EventMarketTradesUI","EventMarketDetailWidget","onTradeAction","activeTab","setActiveTab","setChartRange","isPositionsLoading","walletAddress","tradesData","isTradesLoading","marketTrades","positionsWithPnL","buyTrades","avgCost","computeAvgCost","parseNullablePrice","pnlPercent","handleYesPriceClick","_price","bookSide","handleNoPriceClick","totalContracts","totalCost","DEFAULT_VISIBLE_COUNT","getMarketPrices","EventMarketsUI","renderMarketDetail","marketHoldings","showAll","setShowAll","expandedTicker","setExpandedTicker","visibleMarkets","toggleExpand","holding","hasYes","hasNo","ChevronDownIcon","CLOSED_STATUSES","year","EventTimeline","isClosed","openItem","closeItem","payoutItem","closeDescription","EventRulesUI","selectedMarketTicker","setSelectedMarketTicker","marketsWithRules","Select","keys","SelectItem","EventDetailUI","selectedMarketTickers","onMarketSelectionChange","currentData","setCurrentData","isCompact","setIsCompact","sentinelRef","sentinel","compact","rafId","bottom","shouldBeCompact","onScroll","formattedEndDate","option","SelectSection","EventDetailWidget","eventId","initialMarketTickers","initialChartRange","setSelectedMarketTickers","marketsInitializedRef","defaultMarketTickers","handleRangeChange","newRange","handleMarketSelectionChange","EventDetailPage","widgetProps","isMobile","useScreen","onOpen","tradeSelection","setTradeSelection","handleTradeAction","tradeFormKey","Drawer","DrawerContent","DrawerBody","isoToUnix","iso","ms","priceToString","STATUS_MAP","v2MarketToStandard","v2","v2EventToStandard","useTradeFormV2","pendingSignature","setPendingSignature","amountStr","usdcMint","quoteData","refetchQuote","positionsData","sum","submitDFlow","orderStatus","transaction","TradeFormV2Widget","adaptedEvent","adaptedMarket","UserActivityV2Section","onCancelOrder","marketSlugs","tabs","tab","PositionsTab","OrdersTab","TradesTab","TabSkeleton","EmptyState","PositionRow","position","pnlSign","cancelMutation","orders","openStatuses","filtered","handleCancel","orderId","OrderRow","onCancel","isCancelling","isBuy","OrderStatusBadge","TradeRow","timeStr","unixSeconds","mins","EventMarketDetailV2Widget","V2TradesTable","ChartErrorBoundary","Component","info","MAX_SELECTED","INTERVAL_OPTIONS","IntervalSwitcher","BreathingDotsLayer","dots","useCursorOverlay","wrapperRef","overlayRef","onMouseMove","wrapper","overlay","rect","xPct","onMouseLeave","CustomTooltip","labelMap","sorted","MarketSelector","selectedSlugs","colorMap","onToggle","setOpen","rootRef","handleClick","atMax","triggerContent","isDisabled","isOnlyOne","yesOutcome","LegendBar","currentValues","buildChartData","lookups","last","EventPriceChartV2","EventPriceChartV2Inner","externalLoading","allMarkets","setSelectedSlugs","selectedMarkets","hookSeries","hookLoading","dayMs","yDomain","min","max","pad","chartWrapperRef","overlayDivRef","handleWrapperMouseMove","handleWrapperMouseLeave","handleToggle","Customized","xScale","yScale","lastRow","yVal","formatCents","getMarketLabel","getPlatformLabel","formatISOTimestamp","useCountdown","targetIso","setNow","target","days","secs","formatCountdownDate","offset","tzHours","EventDetailV2UI","startCountdown","endCountdown","startDateFormatted","endDateFormatted","PlatformBadge","EventMarketsV2UI","EventRulesV2UI","noPrice","isTopMarket","onToggleExpand","volumeFormatted","selectedSlug","setSelectedSlug","showFullRules","setShowFullRules","rulesText","truncatedRules","arr","EventDetailWidgetV2","eventSlug","EventDetailPageV2","onSimilarEventClick","SimilarEventsSection","onEventClick","similarEvents","ev","SimilarEventCard","useEventDetailV2","candlestickMarketSlugs","oldClient","useOrderBook","refetchInterval","rawBids","rawAsks","midpoint","OrderBookRowItem","isBid","OrderBookUI","isEmpty","OrderBookWidget","useOpenOrders","_params","cancellingOrderId","setCancellingOrderId","cancelError","cancelOrder","_orderId","formatDate","OpenOrdersUI","StyledTable","TableHeader","TableColumn","TableBody","TableRow","TableCell","OpenOrdersWidget","useTradeHistory","pageSize","setPage","cursors","setCursors","currentCursor","hasNextPage","hasPrevPage","goToPage","nextPage","newCursors","prevPage","TradeHistoryUI","onNextPage","onPrevPage","TradeHistoryWidget","usePositions","summary","fmtCents","PnlText","isPositive","PositionsUI","onSell","PositionsWidget","MAX_HISTORY_SIZE","searchHistoriesAtom","atomWithStorage","usePredictSearchHistory","histories","setHistories","useAtom","addHistory","keyword","trimmed","clearHistories","SearchHistoryUI","onClear","TrashIcon","SearchHistoryWidget","SearchInputUI","onValueChange","StyledInput","SearchIcon","XCloseIcon","Kbd","SearchResultItemUI","firstTag","useSearchResultListScript","isFetchingNextPage","ROW_HEIGHT","SearchResultListWidget","scriptParams","ref","height","isItemLoaded","loadMoreItems","itemCount","onRowsLoaded","LoadingState","SearchResultRow","EmptyIcon","useSearchScript","onKeywordChange","text","setText","setKeyword","onKeywordChangeStable","useCallbackRef","addHistoryStable","debouncedSearch","debounce","setText_","setKeyword_","clearKeyword","SearchWidget","onSelectEvent","PREDICT_SEARCH_MODAL_ID","PredictSearchModal","AsyncModal","modalProps","PredictSearchModalContent","onOpenChange","onResult","handleSelectEvent","handleEscape","SearchEventsButton","modalParams","isDesktop","useAsyncModal","onSelectEventStable","handleOpen","result","handleClose","handleKeyDown","activeElement","isInEditableElement","PredictProvider","DEFAULT_POLLING_INTERVAL","UserPredictProvider","pollingInterval","PredictV2Provider","buildQuery","provider","qs","str","toRecord","BasePredictClient","endpoint","path","query","url","httpGet","httpPost","parseSide","raw","sort","priceStr","normalizeOrderbook","DflowPredictClient","withNestedMarkets","marketId","eventTicker","buildV2Query","PredictClientV2","httpDelete","createPredictClientV2"],"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.72\";\n}\n\nexport default \"0.1.72\";\n","import { createContext } from \"react\";\nimport type { PredictClientV2 } from \"../../client/v2\";\n\nexport interface PredictV2ContextValue {\n /** The prediction-server v2 HTTP client instance. */\n client: PredictClientV2;\n}\n\n/**\n * Context that carries the v2 prediction client (prediction-server backend).\n *\n * Intentionally separate from `PredictContext` so that the legacy DFlow client\n * and the new prediction-server client can coexist in the same application\n * during an incremental migration.\n *\n * Consumers must be wrapped in `PredictV2Provider`.\n */\nexport const PredictV2Context = createContext<PredictV2ContextValue | null>(\n null,\n);\n","import { useContext } from \"react\";\nimport { PredictV2Context } from \"../../contexts/v2\";\n\n/**\n * Returns the v2 prediction context value.\n *\n * Must be called inside a component tree wrapped by `PredictV2Provider`.\n *\n * @throws When used outside of `PredictV2Provider`.\n */\nexport function usePredictV2Context() {\n const context = useContext(PredictV2Context);\n if (!context) {\n throw new Error(\n \"usePredictV2Context must be used within a PredictV2Provider\",\n );\n }\n return context;\n}\n","import { usePredictV2Context } from \"./usePredictV2Context\";\n\n/**\n * Convenience hook that returns the `PredictClientV2` instance from context.\n *\n * Must be called inside a component tree wrapped by `PredictV2Provider`.\n */\nexport function usePredictV2Client() {\n const { client } = usePredictV2Context();\n return client;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2Event, V2ListEventsParams, V2Page } from \"../../client/v2\";\nimport type { PredictClientV2 } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\n/** Stable TanStack Query key for the v2 events list. */\nexport function eventsV2QueryKey(params?: V2ListEventsParams): unknown[] {\n return [\"predict-v2\", \"events\", params ?? {}];\n}\n\n/**\n * Fetch function that can be used outside of React (e.g. in loaders or tests).\n *\n * @param client - A `PredictClientV2` instance.\n * @param params - Optional filter / sort / pagination parameters.\n */\nexport async function fetchEventsV2(\n client: PredictClientV2,\n params?: V2ListEventsParams,\n): Promise<V2Page<V2Event>> {\n return client.listEvents(params);\n}\n\n/**\n * React Query hook for `GET /api/v1/events` via the prediction-server v2 client.\n *\n * @param params - Optional filter / sort / pagination parameters.\n * @param queryOptions - Additional TanStack Query options (e.g. `enabled`, `staleTime`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useEventsV2Query({ status: \"open\", limit: 20 });\n * ```\n */\nexport function useEventsV2Query(\n params?: V2ListEventsParams,\n queryOptions: Omit<\n UseQueryOptions<V2Page<V2Event>, Error, V2Page<V2Event>, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: eventsV2QueryKey(params),\n queryFn: () => fetchEventsV2(client, params),\n ...queryOptions,\n });\n}\n\nexport type { V2Event, V2ListEventsParams, V2Page };\n","/** Default page size for list queries */\nexport const DEFAULT_PAGE_SIZE = 48;\n\n/** Maximum number of markets to display in price history chart */\nexport const MAX_PRICE_HISTORY_MARKETS = 4;\n\n/**\n * Candlestick period intervals in minutes (granularity for API queries)\n */\nexport const CandlestickPeriod = {\n /** 1 minute */\n ONE_MINUTE: 1,\n /** 1 hour (60 minutes) */\n ONE_HOUR: 60,\n /** 1 day (1440 minutes) */\n ONE_DAY: 1440,\n} as const;\n\nexport type CandlestickPeriodType =\n (typeof CandlestickPeriod)[keyof typeof CandlestickPeriod];\n\n/**\n * Chart range options (the user-facing time range selector)\n */\nexport const ChartRange = {\n /** 1 day */\n ONE_DAY: \"1d\",\n /** 1 week */\n ONE_WEEK: \"1w\",\n /** 1 month */\n ONE_MONTH: \"1m\",\n /** All time */\n ALL: \"all\",\n} as const;\n\nexport type ChartRangeType = (typeof ChartRange)[keyof typeof ChartRange];\n\n/** Default chart range */\nexport const DEFAULT_CHART_RANGE = ChartRange.ALL;\n\n/** Candlestick granularity derived from chart range (1D → minute, 1W/1M → hourly, ALL → daily) */\nexport const CHART_RANGE_PERIOD: Record<ChartRangeType, CandlestickPeriodType> =\n {\n [ChartRange.ONE_DAY]: CandlestickPeriod.ONE_MINUTE,\n [ChartRange.ONE_WEEK]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ONE_MONTH]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ALL]: CandlestickPeriod.ONE_DAY,\n };\n\n/** Chart sampling interval in seconds (used to downsample candlestick data for display) */\nexport const CHART_RANGE_SAMPLE_INTERVAL: Record<ChartRangeType, number> = {\n [ChartRange.ONE_DAY]: 5 * 60, // 5 minutes\n [ChartRange.ONE_WEEK]: 60 * 60, // 1 hour\n [ChartRange.ONE_MONTH]: 3 * 60 * 60, // 3 hours\n [ChartRange.ALL]: 24 * 60 * 60, // 1 day\n};\n\n/** Duration in seconds for each chart range (null = all time) */\nexport const CHART_RANGE_DURATION: Record<ChartRangeType, number | null> = {\n [ChartRange.ONE_DAY]: 24 * 60 * 60,\n [ChartRange.ONE_WEEK]: 7 * 24 * 60 * 60,\n [ChartRange.ONE_MONTH]: 30 * 24 * 60 * 60,\n [ChartRange.ALL]: null,\n};\n\n// -- Order-related constants -------------------------------------------------\n\n/** Minimum order quantity (contracts) */\nexport const ORDER_MIN_QUANTITY = 1;\n\n/** Price step size in cents */\nexport const ORDER_PRICE_STEP = 1;\n\n/** Minimum price in cents */\nexport const ORDER_MIN_PRICE = 1;\n\n/** Maximum price in cents */\nexport const ORDER_MAX_PRICE = 99;\n\n// -- Legacy aliases for backward compatibility -------------------------------\n\n/** @deprecated Use ChartRange instead */\nexport const PriceHistoryInterval = {\n ONE_HOUR: \"1h\",\n SIX_HOURS: \"6h\",\n ONE_DAY: \"1d\",\n ONE_WEEK: \"1w\",\n MAX: \"max\",\n} as const;\n\n/** @deprecated Use ChartRangeType instead */\nexport type PriceHistoryIntervalType =\n (typeof PriceHistoryInterval)[keyof typeof PriceHistoryInterval];\n\n/** @deprecated Use DEFAULT_CHART_RANGE instead */\nexport const DEFAULT_PRICE_HISTORY_INTERVAL = PriceHistoryInterval.ONE_WEEK;\n\n/** @deprecated */\nexport const PRICE_HISTORY_SAMPLE_INTERVAL: Record<\n PriceHistoryIntervalType,\n number\n> = {\n [PriceHistoryInterval.ONE_HOUR]: 60,\n [PriceHistoryInterval.SIX_HOURS]: 60,\n [PriceHistoryInterval.ONE_DAY]: 300,\n [PriceHistoryInterval.ONE_WEEK]: 1800,\n [PriceHistoryInterval.MAX]: 1800,\n};\n","/**\n * Server-safe pure functions for v2 events query parameters.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n V2Event,\n V2EventSortField,\n V2EventStatus,\n V2ListEventsParams,\n V2Page,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport type { PredictClientV2 } from \"../../client/v2\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\n\nexport type { V2ProviderSource };\n\n/**\n * Selection emitted by CategoriesWidgetV2.\n *\n * Duplicated from categories.v2.script to avoid pulling in the component\n * barrel (which has React dependencies) into server-only bundles.\n */\nexport interface TagSlugSelection {\n categorySlug: string | null;\n tagSlug: string | null;\n}\n\n/**\n * Resolve a `TagSlugSelection` to a single `tag_slug` string for the v2 API.\n */\nexport function resolveTagSlug(\n selection: TagSlugSelection | null | undefined,\n): string | undefined {\n if (!selection) return undefined;\n return selection.tagSlug ?? selection.categorySlug ?? undefined;\n}\n\n/**\n * Input accepted by {@link resolveEventsV2Params}. All fields optional;\n * defaults match the client-side `useEventsV2` hook's initial state.\n */\nexport interface ResolveEventsV2ParamsInput {\n tagSlugSelection?: TagSlugSelection | null;\n limit?: number;\n status?: V2EventStatus;\n sort_by?: V2EventSortField;\n sort_asc?: boolean;\n source?: V2ProviderSource;\n with_markets?: boolean;\n}\n\n/**\n * Build a clean `V2ListEventsParams` from loose user inputs.\n *\n * Server-side `prefetchInfiniteQuery` and client-side `useEventsV2` must both\n * use this function to guarantee identical query keys.\n */\nexport function resolveEventsV2Params(\n input: ResolveEventsV2ParamsInput = {},\n): V2ListEventsParams {\n const {\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status = \"open\",\n with_markets = true,\n source,\n sort_by,\n sort_asc,\n } = input;\n const tag_slug = resolveTagSlug(tagSlugSelection);\n return {\n limit,\n status,\n with_markets,\n ...(source ? { source } : {}),\n ...(tag_slug ? { tag_slug } : {}),\n ...(sort_by ? { sort_by } : {}),\n ...(sort_asc !== undefined ? { sort_asc } : {}),\n };\n}\n\n/** Stable TanStack Query key for the v2 events infinite query. */\nexport function eventsV2InfiniteQueryKey(\n params: V2ListEventsParams,\n): unknown[] {\n return [\"predict-v2\", \"events-infinite\", params];\n}\n\n/**\n * Fetch a single page of v2 events. Can be used outside of React\n * (e.g. in Server Components, loaders, or tests).\n */\nexport async function fetchEventsV2Page(\n client: PredictClientV2,\n params: V2ListEventsParams,\n): Promise<V2Page<V2Event>> {\n return client.listEvents(params);\n}\n\n// ---------------------------------------------------------------------------\n// Single-event helpers (also server-safe)\n// ---------------------------------------------------------------------------\n\n/** Stable TanStack Query key for a single v2 event. */\nexport function eventV2QueryKey(\n slug: string,\n source?: V2ProviderSource,\n): unknown[] {\n return [\"predict-v2\", \"event\", slug, source];\n}\n\n/**\n * Fetch a single v2 event. Can be used outside of React\n * (e.g. in Server Components, loaders, or tests).\n */\nexport async function fetchEventV2(\n client: PredictClientV2,\n slug: string,\n source?: V2ProviderSource,\n): Promise<V2Event> {\n return client.getEvent(slug, source);\n}\n\nexport type { V2Event, V2ListEventsParams, V2Page };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2Event, V2ProviderSource } from \"../../client/v2\";\nimport { eventV2QueryKey, fetchEventV2 } from \"./eventsV2.params\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport { eventV2QueryKey, fetchEventV2 } from \"./eventsV2.params\";\n\nexport interface UseEventV2QueryParams {\n /** Canonical event slug (e.g. \"will-trump-win-2024\" or \"KXBTCD-25FEB-T68000\"). */\n slug: string;\n /** Upstream provider. Required by prediction-server for single-event fetch. */\n source?: V2ProviderSource;\n}\n\n/**\n * React Query hook for `GET /api/v1/events/:slug` via the prediction-server v2 client.\n *\n * @param params - Object containing the event `slug` and optional `source`.\n * @param queryOptions - Additional TanStack Query options (e.g. `enabled`, `staleTime`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useEventV2Query({ slug: \"CONTROLH-2026\", source: \"dflow\" });\n * ```\n */\nexport function useEventV2Query(\n params: UseEventV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Event, Error, V2Event, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: eventV2QueryKey(params.slug, params.source),\n queryFn: () => fetchEventV2(client, params.slug, params.source),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n\nexport type { V2Event };\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { V2Event, V2ListEventsParams, V2Page } from \"../../client/v2\";\nimport { eventsV2InfiniteQueryKey, fetchEventsV2Page } from \"./eventsV2.params\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport {\n resolveTagSlug,\n resolveEventsV2Params,\n eventsV2InfiniteQueryKey,\n fetchEventsV2Page,\n} from \"./eventsV2.params\";\nexport type { ResolveEventsV2ParamsInput } from \"./eventsV2.params\";\n\n// ---------------------------------------------------------------------------\n// React hook\n// ---------------------------------------------------------------------------\n\ntype InfiniteQueryOptions = Omit<\n UseInfiniteQueryOptions<\n V2Page<V2Event>,\n Error,\n InfiniteData<V2Page<V2Event>>,\n unknown[],\n string | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n>;\n\n/**\n * TanStack Query infinite-query hook for `GET /api/v1/events` with cursor-based\n * pagination via the prediction-server v2 client.\n *\n * @param params - Resolved query parameters (use {@link resolveEventsV2Params}\n * to build from user inputs). Do NOT include `cursor` — it is\n * managed automatically by TanStack Query's `pageParam`.\n * @param queryOptions - Additional TanStack Query options.\n *\n * @example\n * ```tsx\n * const params = resolveEventsV2Params({ status: \"open\", limit: 20 });\n * const { data, hasNextPage, fetchNextPage } = useEventsV2InfiniteQuery(params);\n * ```\n */\nexport function useEventsV2InfiniteQuery(\n params: V2ListEventsParams,\n queryOptions: InfiniteQueryOptions = {},\n) {\n const client = usePredictV2Client();\n return useInfiniteQuery({\n queryKey: eventsV2InfiniteQueryKey(params),\n queryFn: ({ pageParam }) =>\n fetchEventsV2Page(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: V2Page<V2Event>) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n ...queryOptions,\n });\n}\n\nexport type { V2Event, V2ListEventsParams, V2Page };\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type {\n V2Event,\n V2EventStatus,\n V2ListEventsParams,\n V2Page,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseSearchEventsInfiniteQueryParams {\n /** Search keyword */\n keyword: string;\n /** Page size (default: 20) */\n limit?: number;\n /** Event status filter (default: \"open\") */\n status?: V2EventStatus;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: V2ProviderSource;\n /** Include nested markets (default: false for lighter search payloads) */\n with_markets?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Query key factory\n// ---------------------------------------------------------------------------\n\nfunction searchEventsInfiniteQueryKey(params: V2ListEventsParams): unknown[] {\n return [\"predict-v2\", \"search\", params];\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Infinite query hook for searching prediction events via the V2 `listEvents`\n * endpoint with a `search` parameter.\n *\n * Designed to be consumed by component-level scripts that flatten the paginated\n * data for rendering.\n *\n * @example\n * ```tsx\n * const { data, isLoading, hasNextPage, fetchNextPage } =\n * useSearchEventsInfiniteQuery({ keyword: \"trump\" });\n * ```\n */\nexport function useSearchEventsInfiniteQuery(\n params: UseSearchEventsInfiniteQueryParams,\n queryOptions?: { enabled?: boolean },\n) {\n const client = usePredictV2Client();\n\n const apiParams = useMemo<V2ListEventsParams>(\n () => ({\n search: params.keyword,\n limit: params.limit ?? 20,\n status: params.status ?? \"open\",\n source: params.source,\n with_markets: params.with_markets ?? false,\n }),\n [\n params.keyword,\n params.limit,\n params.status,\n params.source,\n params.with_markets,\n ],\n );\n\n return useInfiniteQuery({\n queryKey: searchEventsInfiniteQueryKey(apiParams),\n queryFn: ({ pageParam }) =>\n client.listEvents({\n ...apiParams,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: V2Page<V2Event>) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n enabled: queryOptions?.enabled ?? !!params.keyword,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2Event,\n V2ProviderSource,\n V2SimilarEventsParams,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function similarEventsV2QueryKey(\n slug: string,\n source: V2ProviderSource,\n params?: V2SimilarEventsParams,\n): unknown[] {\n return [\"predict-v2\", \"similar-events\", slug, source, params];\n}\n\nexport interface UseSimilarEventsV2QueryParams {\n slug: string;\n source: V2ProviderSource;\n limit?: number;\n same_source?: boolean;\n}\n\nexport function useSimilarEventsV2Query(\n params: UseSimilarEventsV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Event[], Error, V2Event[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const apiParams: V2SimilarEventsParams = {\n limit: params.limit,\n same_source: params.same_source,\n };\n return useQuery({\n queryKey: similarEventsV2QueryKey(params.slug, params.source, apiParams),\n queryFn: () =>\n client.getSimilarEvents(params.slug, params.source, apiParams),\n enabled: Boolean(params.slug),\n staleTime: 5 * 60_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2Market,\n V2ProviderSource,\n PredictClientV2,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\n/** Stable TanStack Query key for a single v2 market. */\nexport function marketV2QueryKey(\n slug: string,\n source?: V2ProviderSource,\n): unknown[] {\n return [\"predict-v2\", \"market\", slug, source];\n}\n\n/**\n * Fetch function that can be used outside of React (e.g. in loaders or tests).\n *\n * @param client - A `PredictClientV2` instance.\n * @param slug - Canonical market slug.\n * @param source - Upstream provider (`\"dflow\"` or `\"polymarket\"`).\n */\nexport async function fetchMarketV2(\n client: PredictClientV2,\n slug: string,\n source?: V2ProviderSource,\n): Promise<V2Market> {\n return client.getMarket(slug, source);\n}\n\nexport interface UseMarketV2QueryParams {\n /** Canonical market slug. */\n slug: string;\n /** Upstream provider. Required by prediction-server for single-market fetch. */\n source?: V2ProviderSource;\n}\n\n/**\n * React Query hook for `GET /api/v1/markets/:slug` via the prediction-server v2 client.\n *\n * @param params - Object containing the market `slug` and optional `source`.\n * @param queryOptions - Additional TanStack Query options (e.g. `enabled`, `staleTime`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useMarketV2Query({ slug: \"KXBTCD-25FEB-T68000-yes\", source: \"dflow\" });\n * ```\n */\nexport function useMarketV2Query(\n params: UseMarketV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Market, Error, V2Market, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: marketV2QueryKey(params.slug, params.source),\n queryFn: () => fetchMarketV2(client, params.slug, params.source),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n\nexport type { V2Market };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2PriceHistoryRange,\n V2PriceHistoryResponse,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function priceHistoryV2QueryKey(\n slug: string,\n source: V2ProviderSource,\n range?: V2PriceHistoryRange,\n): unknown[] {\n return [\"predict-v2\", \"price-history\", slug, source, range];\n}\n\nexport interface UsePriceHistoryV2QueryParams {\n slug: string;\n source: V2ProviderSource;\n range?: V2PriceHistoryRange;\n}\n\nexport function usePriceHistoryV2Query(\n params: UsePriceHistoryV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n V2PriceHistoryResponse,\n Error,\n V2PriceHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: priceHistoryV2QueryKey(params.slug, params.source, params.range),\n queryFn: () =>\n client.getPriceHistory(params.slug, params.source, params.range),\n enabled: Boolean(params.slug),\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { V2Market, V2PriceHistoryRange } from \"../../client/v2\";\nimport { ChartRange, type ChartRangeType } from \"../../consts\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\nimport { priceHistoryV2QueryKey } from \"./usePriceHistoryV2Query\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MarketHistoryPoint {\n /** Unix timestamp in milliseconds. */\n timestamp: number;\n /** Implied probability [0, 1]. */\n price: number;\n}\n\nexport interface MarketHistorySeries {\n marketSlug: string;\n label: string;\n /** Chronologically ordered price history. */\n data: MarketHistoryPoint[];\n}\n\nexport interface UseMarketHistoryV2Result {\n series: MarketHistorySeries[];\n isLoading: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Range mapping\n// ---------------------------------------------------------------------------\n\nconst RANGE_MAP: Record<ChartRangeType, V2PriceHistoryRange> = {\n [ChartRange.ONE_DAY]: \"1d\",\n [ChartRange.ONE_WEEK]: \"1w\",\n [ChartRange.ONE_MONTH]: \"1m\",\n [ChartRange.ALL]: \"all\",\n};\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Returns price history series for the provided V2Markets using the\n * prediction-server `GET /api/v1/markets/{slug}/price-history` endpoint.\n */\nexport function useMarketHistoryV2(\n markets: V2Market[],\n range: ChartRangeType = ChartRange.ALL,\n): UseMarketHistoryV2Result {\n const client = usePredictV2Client();\n const apiRange = RANGE_MAP[range];\n\n const queries = useQueries({\n queries: markets.map((market) => ({\n queryKey: priceHistoryV2QueryKey(market.slug, market.source, apiRange),\n queryFn: () =>\n client.getPriceHistory(market.slug, market.source, apiRange),\n staleTime: 60_000,\n enabled: Boolean(market.slug),\n })),\n });\n\n const isLoading = queries.some((q) => q.isLoading);\n\n const series = useMemo<MarketHistorySeries[]>(() => {\n return markets.map((market, idx) => {\n const result = queries[idx];\n const points = result?.data?.points ?? [];\n\n if (points.length > 0) {\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: points.map((pt) => ({\n timestamp: pt.t * 1000,\n price: pt.p,\n })),\n };\n }\n\n // Fallback: generate a flat line from current outcome price when API\n // returns no data (not yet indexed, upstream error, mock slugs, etc.)\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const currentPrice = yesOutcome?.price ?? 0.5;\n const now = Date.now();\n const dayMs = 86_400_000;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price: currentPrice },\n { timestamp: now, price: currentPrice },\n ],\n };\n });\n }, [markets, queries]);\n\n return { series, isLoading };\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2Orderbook, V2ProviderSource } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function orderbookV2QueryKey(\n slug: string,\n source: V2ProviderSource,\n): unknown[] {\n return [\"predict-v2\", \"orderbook\", slug, source];\n}\n\nexport interface UseOrderbookV2QueryParams {\n slug: string;\n source: V2ProviderSource;\n}\n\nexport function useOrderbookV2Query(\n params: UseOrderbookV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Orderbook, Error, V2Orderbook, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: orderbookV2QueryKey(params.slug, params.source),\n queryFn: () => client.getOrderbook(params.slug, params.source),\n enabled: Boolean(params.slug),\n refetchInterval: 5000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2ListMarketTradesParams,\n V2Page,\n V2ProviderSource,\n V2Trade,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function marketTradesV2QueryKey(\n slug: string,\n params: V2ListMarketTradesParams,\n): unknown[] {\n return [\"predict-v2\", \"market-trades\", slug, params];\n}\n\nexport interface UseMarketTradesV2QueryParams {\n slug: string;\n source: V2ProviderSource;\n limit?: number;\n cursor?: string;\n side?: string;\n}\n\nexport function useMarketTradesV2Query(\n params: UseMarketTradesV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Page<V2Trade>, Error, V2Page<V2Trade>, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const apiParams: V2ListMarketTradesParams = {\n source: params.source,\n limit: params.limit,\n cursor: params.cursor,\n side: params.side,\n };\n return useQuery({\n queryKey: marketTradesV2QueryKey(params.slug, apiParams),\n queryFn: () => client.listMarketTrades(params.slug, apiParams),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2Candlestick, V2ListCandlesticksParams } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function candlesticksV2QueryKey(\n slug: string,\n params?: V2ListCandlesticksParams,\n): unknown[] {\n return [\"predict-v2\", \"candlesticks\", slug, params];\n}\n\nexport interface UseCandlesticksV2QueryParams {\n slug: string;\n interval?: string;\n limit?: number;\n}\n\nexport function useCandlesticksV2Query(\n params: UseCandlesticksV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2Candlestick[], Error, V2Candlestick[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const apiParams: V2ListCandlesticksParams = {\n interval: params.interval,\n limit: params.limit,\n };\n return useQuery({\n queryKey: candlesticksV2QueryKey(params.slug, apiParams),\n queryFn: () => client.listCandlesticks(params.slug, apiParams),\n enabled: Boolean(params.slug),\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2PositionsResponse, V2ProviderSource } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function positionsV2QueryKey(\n source: V2ProviderSource,\n user: string,\n): unknown[] {\n return [\"predict-v2\", \"positions\", source, user];\n}\n\nexport interface UsePositionsV2QueryParams {\n source: V2ProviderSource;\n user: string;\n}\n\nexport function usePositionsV2Query(\n params: UsePositionsV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2PositionsResponse, Error, V2PositionsResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: positionsV2QueryKey(params.source, params.user),\n queryFn: () => client.getPositions(params.source, params.user),\n enabled: Boolean(params.user),\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2ListOrdersParams, V2Page, V2UserOrder } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function ordersV2QueryKey(params: V2ListOrdersParams): unknown[] {\n return [\"predict-v2\", \"orders\", params];\n}\n\nexport function useOrdersV2Query(\n params: V2ListOrdersParams,\n queryOptions: Omit<\n UseQueryOptions<V2Page<V2UserOrder>, Error, V2Page<V2UserOrder>, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: ordersV2QueryKey(params),\n queryFn: () => client.listOrders(params),\n enabled: Boolean(params.wallet_address),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { V2ProviderSource, V2UserOrder } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function orderV2QueryKey(\n id: string,\n source: V2ProviderSource,\n): unknown[] {\n return [\"predict-v2\", \"order\", id, source];\n}\n\nexport interface UseOrderV2QueryParams {\n id: string;\n source: V2ProviderSource;\n}\n\n/**\n * Query a single order by ID with optional polling.\n * Automatically polls every 1 s while enabled.\n */\nexport function useOrderV2Query(\n params: UseOrderV2QueryParams,\n queryOptions: Omit<\n UseQueryOptions<V2UserOrder, Error, V2UserOrder, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: orderV2QueryKey(params.id, params.source),\n queryFn: () => client.getOrder(params.id, params.source),\n enabled: Boolean(params.id),\n refetchInterval: 1000,\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type { V2CancelOrderResult, V2ProviderSource } from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport interface CancelOrderV2Variables {\n id: string;\n source: V2ProviderSource;\n}\n\nexport function useCancelOrderV2Mutation(\n mutationOptions: Omit<\n UseMutationOptions<V2CancelOrderResult, Error, CancelOrderV2Variables>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (vars: CancelOrderV2Variables) =>\n client.cancelOrder(vars.id, vars.source),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict-v2\", \"orders\"] });\n },\n ...mutationOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2DFlowQuoteRequest,\n V2DFlowQuoteResponse,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function dflowQuoteV2QueryKey(params: V2DFlowQuoteRequest): unknown[] {\n return [\"predict-v2\", \"dflow-quote\", params];\n}\n\n/**\n * Fetch a DFlow quote. The query is only enabled when all required\n * fields are present and amount > 0.\n */\nexport function useDFlowQuoteV2(\n params: V2DFlowQuoteRequest,\n queryOptions: Omit<\n UseQueryOptions<\n V2DFlowQuoteResponse,\n Error,\n V2DFlowQuoteResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const enabled =\n Boolean(params.inputMint) &&\n Boolean(params.outputMint) &&\n Boolean(params.userPublicKey) &&\n params.amount !== \"0\" &&\n params.amount !== \"\";\n\n return useQuery({\n queryKey: dflowQuoteV2QueryKey(params),\n queryFn: () => client.createDFlowQuote(params),\n enabled,\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n V2DFlowSubmitRequest,\n V2DFlowSubmitResponse,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function useDFlowSubmitV2(\n mutationOptions: Omit<\n UseMutationOptions<V2DFlowSubmitResponse, Error, V2DFlowSubmitRequest>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: V2DFlowSubmitRequest) =>\n client.submitDFlowTransaction(body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict-v2\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict-v2\", \"positions\"] });\n },\n ...mutationOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n V2ListTradesByWalletParams,\n V2Page,\n V2Trade,\n} from \"../../client/v2\";\nimport { usePredictV2Client } from \"./usePredictV2Client\";\n\nexport function tradesByWalletV2QueryKey(\n params: V2ListTradesByWalletParams,\n): unknown[] {\n return [\"predict-v2\", \"trades-by-wallet\", params];\n}\n\nexport function useTradesByWalletV2Query(\n params: V2ListTradesByWalletParams,\n queryOptions: Omit<\n UseQueryOptions<V2Page<V2Trade>, Error, V2Page<V2Trade>, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictV2Client();\n return useQuery({\n queryKey: tradesByWalletV2QueryKey(params),\n queryFn: () => client.listTradesByWallet(params),\n enabled: Boolean(params.wallet),\n ...queryOptions,\n });\n}\n","import { createContext } from \"react\";\nimport type { IPredictClient, IPredictWsClient } from \"../types\";\n\nexport interface PredictContextValue {\n /** The predict API client instance */\n client: IPredictClient;\n\n /** The WebSocket client instance for real-time data */\n wsClient: IPredictWsClient | null;\n}\n\nexport const PredictContext = createContext<PredictContextValue>(\n {} as PredictContextValue,\n);\n","import { createContext } from \"react\";\nimport type { WalletPositionItem } from \"../types\";\n\nexport interface UserPredictContextValue {\n /** User's wallet positions */\n positions: WalletPositionItem[];\n /** USDC balance (UI amount) */\n usdcBalance: number;\n /** Whether positions are currently loading for the first time */\n isLoading: boolean;\n /** Error from the latest fetch, null if none */\n error: Error | null;\n /** Manually trigger a refetch */\n refetch: () => void;\n}\n\nexport const UserPredictContext = createContext<UserPredictContextValue | null>(\n null,\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, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n StandardEvent,\n EventQueryParams,\n IPredictClient,\n StandardEventsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventsQueryKey(params?: EventQueryParams): unknown[] {\n return [\"predict\", \"events\", params ?? {}];\n}\n\nexport async function fetchEvents(\n client: IPredictClient,\n params?: EventQueryParams,\n): Promise<StandardEventsResponse> {\n return await client.getEvents(params);\n}\n\nexport function useEventsQuery(\n params?: EventQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n StandardEventsResponse,\n Error,\n StandardEventsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventsQueryKey(params),\n queryFn: async () => fetchEvents(client, params),\n ...queryOptions,\n });\n}\n\n// Re-export types for convenience\nexport type { StandardEvent, EventQueryParams, StandardEventsResponse };\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { EventQueryParams, StandardEventsResponse } from \"../types\";\nimport { fetchEvents } from \"./useEventsQuery\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function eventsInfiniteQueryKey(\n params?: Omit<EventQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"events\", \"infinite\", params ?? {}];\n}\n\nexport function useEventsInfiniteQuery(\n params: Omit<EventQueryParams, \"cursor\"> = {},\n options: Omit<\n UseInfiniteQueryOptions<\n StandardEventsResponse,\n Error,\n InfiniteData<StandardEventsResponse>,\n unknown[],\n number | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"getNextPageParam\" | \"initialPageParam\"\n > = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: eventsInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchEvents(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as number | undefined,\n getNextPageParam: (lastPage) => {\n // If API returns a non-null cursor, use it as the next page param\n return lastPage.cursor ?? undefined;\n },\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { StandardEvent, IPredictClient } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseEventByIdQueryParams {\n /** Event ticker ID */\n id: string;\n /** Include nested markets in response */\n withNestedMarkets?: boolean;\n}\n\nexport function eventByIdQueryKey(params: UseEventByIdQueryParams): unknown[] {\n return [\"predict\", \"event\", \"byId\", params.id, params.withNestedMarkets];\n}\n\nexport async function fetchEventById(\n client: IPredictClient,\n params: UseEventByIdQueryParams,\n): Promise<StandardEvent> {\n return await client.getEventById(params.id, params.withNestedMarkets);\n}\n\nexport function useEventByIdQuery(\n params: UseEventByIdQueryParams,\n options: Omit<\n UseQueryOptions<StandardEvent, Error, StandardEvent, 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, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n StandardMarket,\n MarketQueryParams,\n StandardMarketsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function marketsQueryKey(params?: MarketQueryParams): unknown[] {\n return [\"predict\", \"markets\", params ?? {}];\n}\n\nexport async function fetchMarkets(\n client: IPredictClient,\n params?: MarketQueryParams,\n): Promise<StandardMarketsResponse> {\n return await client.getMarkets(params);\n}\n\nexport function useMarketsQuery(\n params?: MarketQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n StandardMarketsResponse,\n Error,\n StandardMarketsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketsQueryKey(params),\n queryFn: async () => fetchMarkets(client, params),\n ...queryOptions,\n });\n}\n\n// Re-export types for convenience\nexport type { StandardMarket, MarketQueryParams, StandardMarketsResponse };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, StandardMarket } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseMarketByIdQueryParams {\n /** Market ticker ID */\n id: string;\n}\n\nexport function marketByIdQueryKey(\n params: UseMarketByIdQueryParams,\n): unknown[] {\n return [\"predict\", \"market\", \"byId\", params.id];\n}\n\nexport async function fetchMarketById(\n client: IPredictClient,\n params: UseMarketByIdQueryParams,\n): Promise<StandardMarket> {\n return await client.getMarketById(params.id);\n}\n\nexport function useMarketByIdQuery(\n params: UseMarketByIdQueryParams,\n options: Omit<\n UseQueryOptions<StandardMarket, Error, StandardMarket, 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, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, StandardMarket } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Market by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function marketByMintQueryKey(mintAddress: string): unknown[] {\n return [\"predict\", \"market\", \"byMint\", mintAddress];\n}\n\nexport async function fetchMarketByMint(\n client: IPredictClient,\n mintAddress: string,\n): Promise<StandardMarket> {\n return await client.getMarketByMint(mintAddress);\n}\n\nexport function useMarketByMintQuery(\n mintAddress: string,\n options: Omit<\n UseQueryOptions<StandardMarket, Error, StandardMarket, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketByMintQueryKey(mintAddress),\n queryFn: async () => fetchMarketByMint(client, mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MarketsBatchRequest,\n StandardMarketsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Markets Batch Query\n// -----------------------------------------------------------------------------\n\nexport function marketsBatchQueryKey(request: MarketsBatchRequest): unknown[] {\n return [\"predict\", \"markets\", \"batch\", request];\n}\n\nexport async function fetchMarketsBatch(\n client: IPredictClient,\n request: MarketsBatchRequest,\n): Promise<StandardMarketsResponse> {\n return await client.getMarketsBatch(request);\n}\n\nexport function useMarketsBatchQuery(\n request: MarketsBatchRequest,\n options: Omit<\n UseQueryOptions<\n StandardMarketsResponse,\n Error,\n StandardMarketsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketsBatchQueryKey(request),\n queryFn: async () => fetchMarketsBatch(client, request),\n enabled: Boolean(request.tickers?.length || request.mints?.length),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, OrderbookResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function orderBookQueryKey(marketTicker: string): unknown[] {\n return [\"predict\", \"orderBook\", marketTicker];\n}\n\nexport async function fetchOrderBook(\n client: IPredictClient,\n marketTicker: string,\n): Promise<OrderbookResponse> {\n return await client.getOrderbook(marketTicker);\n}\n\nexport function useOrderBookQuery(\n marketTicker: string,\n options: Omit<\n UseQueryOptions<OrderbookResponse, Error, OrderbookResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderBookQueryKey(marketTicker),\n queryFn: async () => fetchOrderBook(client, marketTicker),\n ...options,\n });\n}\n\n// Also export a hook for getting orderbook by mint address\nexport function orderBookByMintQueryKey(mintAddress: string): unknown[] {\n return [\"predict\", \"orderBook\", \"byMint\", mintAddress];\n}\n\nexport async function fetchOrderBookByMint(\n client: IPredictClient,\n mintAddress: string,\n): Promise<OrderbookResponse> {\n return await client.getOrderbookByMint(mintAddress);\n}\n\nexport function useOrderBookByMintQuery(\n mintAddress: string,\n options: Omit<\n UseQueryOptions<OrderbookResponse, Error, OrderbookResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderBookByMintQueryKey(mintAddress),\n queryFn: async () => fetchOrderBookByMint(client, mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MultiTradeResponse,\n TradesQueryParams,\n TradesByMintQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function tradesQueryKey(params?: TradesQueryParams): unknown[] {\n return [\"predict\", \"trades\", params ?? {}];\n}\n\nexport async function fetchTrades(\n client: IPredictClient,\n params?: TradesQueryParams,\n): Promise<MultiTradeResponse> {\n return await client.getTrades(params);\n}\n\nexport function useTradesQuery(\n params?: TradesQueryParams,\n queryOptions: Omit<\n UseQueryOptions<MultiTradeResponse, Error, MultiTradeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesQueryKey(params),\n queryFn: async () => fetchTrades(client, params),\n ...queryOptions,\n });\n}\n\n// Also export a hook for getting trades by mint address\nexport function tradesByMintQueryKey(\n params: TradesByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"trades\", \"byMint\", params];\n}\n\nexport async function fetchTradesByMint(\n client: IPredictClient,\n params: TradesByMintQueryParams,\n): Promise<MultiTradeResponse> {\n return await client.getTradesByMint(params);\n}\n\nexport function useTradesByMintQuery(\n params: TradesByMintQueryParams,\n queryOptions: Omit<\n UseQueryOptions<MultiTradeResponse, Error, MultiTradeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesByMintQueryKey(params),\n queryFn: async () => fetchTradesByMint(client, params),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n MultiOnchainTradeResponse,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -- By Wallet ---------------------------------------------------------------\n\nexport function onchainTradesByWalletQueryKey(\n params: OnchainTradesByWalletQueryParams,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byWallet\", params];\n}\n\nexport async function fetchOnchainTradesByWallet(\n client: IPredictClient,\n params: OnchainTradesByWalletQueryParams,\n): Promise<MultiOnchainTradeResponse> {\n return await client.getOnchainTradesByWallet(params);\n}\n\nexport function useOnchainTradesByWalletQuery(\n params: OnchainTradesByWalletQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n MultiOnchainTradeResponse,\n Error,\n MultiOnchainTradeResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: onchainTradesByWalletQueryKey(params),\n queryFn: async () => fetchOnchainTradesByWallet(client, params),\n ...queryOptions,\n });\n}\n\n// -- By Event ----------------------------------------------------------------\n\nexport function onchainTradesByEventQueryKey(\n params: OnchainTradesByEventQueryParams,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byEvent\", params];\n}\n\nexport async function fetchOnchainTradesByEvent(\n client: IPredictClient,\n params: OnchainTradesByEventQueryParams,\n): Promise<MultiOnchainTradeResponse> {\n return await client.getOnchainTradesByEvent(params);\n}\n\nexport function useOnchainTradesByEventQuery(\n params: OnchainTradesByEventQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n MultiOnchainTradeResponse,\n Error,\n MultiOnchainTradeResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: onchainTradesByEventQueryKey(params),\n queryFn: async () => fetchOnchainTradesByEvent(client, params),\n ...queryOptions,\n });\n}\n\n// -- By Market ---------------------------------------------------------------\n\nexport function onchainTradesByMarketQueryKey(\n params: OnchainTradesByMarketQueryParams,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byMarket\", params];\n}\n\nexport async function fetchOnchainTradesByMarket(\n client: IPredictClient,\n params: OnchainTradesByMarketQueryParams,\n): Promise<MultiOnchainTradeResponse> {\n return await client.getOnchainTradesByMarket(params);\n}\n\nexport function useOnchainTradesByMarketQuery(\n params: OnchainTradesByMarketQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n MultiOnchainTradeResponse,\n Error,\n MultiOnchainTradeResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: onchainTradesByMarketQueryKey(params),\n queryFn: async () => fetchOnchainTradesByMarket(client, params),\n ...queryOptions,\n });\n}\n\nexport type {\n MultiOnchainTradeResponse,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n};\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type {\n MultiOnchainTradeResponse,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n} from \"../types\";\nimport {\n fetchOnchainTradesByWallet,\n fetchOnchainTradesByEvent,\n fetchOnchainTradesByMarket,\n} from \"./useOnchainTradesQuery\";\nimport { usePredictClient } from \"./usePredictClient\";\n\ntype OnchainTradesInfiniteOptions = Omit<\n UseInfiniteQueryOptions<\n MultiOnchainTradeResponse,\n Error,\n InfiniteData<MultiOnchainTradeResponse>,\n unknown[],\n string | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"getNextPageParam\" | \"initialPageParam\"\n>;\n\nfunction getNextPageParam(lastPage: MultiOnchainTradeResponse) {\n return lastPage.cursor ?? undefined;\n}\n\n// -- By Wallet ---------------------------------------------------------------\n\nexport function onchainTradesByWalletInfiniteQueryKey(\n params: Omit<OnchainTradesByWalletQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byWallet\", \"infinite\", params];\n}\n\nexport function useOnchainTradesByWalletInfiniteQuery(\n params: Omit<OnchainTradesByWalletQueryParams, \"cursor\">,\n options: OnchainTradesInfiniteOptions = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: onchainTradesByWalletInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchOnchainTradesByWallet(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam,\n ...options,\n });\n}\n\n// -- By Event ----------------------------------------------------------------\n\nexport function onchainTradesByEventInfiniteQueryKey(\n params: Omit<OnchainTradesByEventQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byEvent\", \"infinite\", params];\n}\n\nexport function useOnchainTradesByEventInfiniteQuery(\n params: Omit<OnchainTradesByEventQueryParams, \"cursor\">,\n options: OnchainTradesInfiniteOptions = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: onchainTradesByEventInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchOnchainTradesByEvent(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam,\n ...options,\n });\n}\n\n// -- By Market ---------------------------------------------------------------\n\nexport function onchainTradesByMarketInfiniteQueryKey(\n params: Omit<OnchainTradesByMarketQueryParams, \"cursor\">,\n): unknown[] {\n return [\"predict\", \"onchainTrades\", \"byMarket\", \"infinite\", params];\n}\n\nexport function useOnchainTradesByMarketInfiniteQuery(\n params: Omit<OnchainTradesByMarketQueryParams, \"cursor\">,\n options: OnchainTradesInfiniteOptions = {},\n) {\n const client = usePredictClient();\n\n return useInfiniteQuery({\n queryKey: onchainTradesByMarketInfiniteQueryKey(params),\n queryFn: async ({ pageParam }) =>\n fetchOnchainTradesByMarket(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam,\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n CandlesticksResponse,\n CandlesticksQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Event Candlesticks Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseEventCandlesticksParams extends CandlesticksQueryParams {\n /** Event ticker */\n ticker: string;\n}\n\nexport function eventCandlesticksQueryKey(\n params: UseEventCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"event\", params];\n}\n\nexport async function fetchEventCandlesticks(\n client: IPredictClient,\n params: UseEventCandlesticksParams,\n): Promise<CandlesticksResponse> {\n const { ticker, ...rest } = params;\n return await client.getEventCandlesticks(ticker, rest);\n}\n\nexport function useEventCandlesticksQuery(\n params: UseEventCandlesticksParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventCandlesticksQueryKey(params),\n queryFn: async () => fetchEventCandlesticks(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Market Candlesticks Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseMarketCandlesticksParams extends CandlesticksQueryParams {\n /** Market ticker */\n ticker: string;\n}\n\nexport function marketCandlesticksQueryKey(\n params: UseMarketCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"market\", params];\n}\n\nexport async function fetchMarketCandlesticks(\n client: IPredictClient,\n params: UseMarketCandlesticksParams,\n): Promise<CandlesticksResponse> {\n const { ticker, ...rest } = params;\n return await client.getMarketCandlesticks(ticker, rest);\n}\n\nexport function useMarketCandlesticksQuery(\n params: UseMarketCandlesticksParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketCandlesticksQueryKey(params),\n queryFn: async () => fetchMarketCandlesticks(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Market Candlesticks by Mint Hook\n// -----------------------------------------------------------------------------\n\nexport interface UseMarketCandlesticksByMintParams\n extends CandlesticksQueryParams {\n /** Mint address */\n mintAddress: string;\n}\n\nexport function marketCandlesticksByMintQueryKey(\n params: UseMarketCandlesticksByMintParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", \"market\", \"byMint\", params];\n}\n\nexport async function fetchMarketCandlesticksByMint(\n client: IPredictClient,\n params: UseMarketCandlesticksByMintParams,\n): Promise<CandlesticksResponse> {\n const { mintAddress, ...rest } = params;\n return await client.getMarketCandlesticksByMint(mintAddress, rest);\n}\n\nexport function useMarketCandlesticksByMintQuery(\n params: UseMarketCandlesticksByMintParams,\n options: Omit<\n UseQueryOptions<\n CandlesticksResponse,\n Error,\n CandlesticksResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketCandlesticksByMintQueryKey(params),\n queryFn: async () => fetchMarketCandlesticksByMint(client, params),\n ...options,\n });\n}\n\n// Legacy aliases for backward compatibility\n/** @deprecated Use useEventCandlesticksQuery or useMarketCandlesticksQuery instead */\nexport const usePriceHistoryQuery = useMarketCandlesticksQuery;\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n ForecastPercentileHistoryResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Event Forecast Percentile History Query\n// -----------------------------------------------------------------------------\n\nexport function forecastPercentileHistoryQueryKey(\n params: ForecastPercentileHistoryQueryParams,\n): unknown[] {\n return [\"predict\", \"forecast\", \"percentileHistory\", params];\n}\n\nexport async function fetchForecastPercentileHistory(\n client: IPredictClient,\n params: ForecastPercentileHistoryQueryParams,\n): Promise<ForecastPercentileHistoryResponse> {\n return await client.getEventForecastPercentileHistory(params);\n}\n\nexport function useForecastPercentileHistoryQuery(\n params: ForecastPercentileHistoryQueryParams,\n options: Omit<\n UseQueryOptions<\n ForecastPercentileHistoryResponse,\n Error,\n ForecastPercentileHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: forecastPercentileHistoryQueryKey(params),\n queryFn: async () => fetchForecastPercentileHistory(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Event Forecast Percentile History by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function forecastPercentileHistoryByMintQueryKey(\n params: ForecastPercentileHistoryByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"forecast\", \"percentileHistory\", \"byMint\", params];\n}\n\nexport async function fetchForecastPercentileHistoryByMint(\n client: IPredictClient,\n params: ForecastPercentileHistoryByMintQueryParams,\n): Promise<ForecastPercentileHistoryResponse> {\n return await client.getEventForecastPercentileHistoryByMint(params);\n}\n\nexport function useForecastPercentileHistoryByMintQuery(\n params: ForecastPercentileHistoryByMintQueryParams,\n options: Omit<\n UseQueryOptions<\n ForecastPercentileHistoryResponse,\n Error,\n ForecastPercentileHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: forecastPercentileHistoryByMintQueryKey(params),\n queryFn: async () => fetchForecastPercentileHistoryByMint(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n LiveDataResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Live Data Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataQueryKey(params: LiveDataQueryParams): unknown[] {\n return [\"predict\", \"liveData\", params];\n}\n\nexport async function fetchLiveData(\n client: IPredictClient,\n params: LiveDataQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveData(params);\n}\n\nexport function useLiveDataQuery(\n params: LiveDataQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataQueryKey(params),\n queryFn: async () => fetchLiveData(client, params),\n enabled: params.milestoneIds.length > 0,\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Live Data by Event Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataByEventQueryKey(\n params: LiveDataByEventQueryParams,\n): unknown[] {\n return [\"predict\", \"liveData\", \"byEvent\", params];\n}\n\nexport async function fetchLiveDataByEvent(\n client: IPredictClient,\n params: LiveDataByEventQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveDataByEvent(params);\n}\n\nexport function useLiveDataByEventQuery(\n params: LiveDataByEventQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataByEventQueryKey(params),\n queryFn: async () => fetchLiveDataByEvent(client, params),\n enabled: Boolean(params.eventTicker),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Live Data by Mint Query\n// -----------------------------------------------------------------------------\n\nexport function liveDataByMintQueryKey(\n params: LiveDataByMintQueryParams,\n): unknown[] {\n return [\"predict\", \"liveData\", \"byMint\", params];\n}\n\nexport async function fetchLiveDataByMint(\n client: IPredictClient,\n params: LiveDataByMintQueryParams,\n): Promise<LiveDataResponse> {\n return await client.getLiveDataByMint(params);\n}\n\nexport function useLiveDataByMintQuery(\n params: LiveDataByMintQueryParams,\n options: Omit<\n UseQueryOptions<LiveDataResponse, Error, LiveDataResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: liveDataByMintQueryKey(params),\n queryFn: async () => fetchLiveDataByMint(client, params),\n enabled: Boolean(params.mintAddress),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SeriesListResponse,\n SeriesResponse,\n SeriesQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Series List Hook\n// -----------------------------------------------------------------------------\n\nexport function seriesQueryKey(params?: SeriesQueryParams): unknown[] {\n return [\"predict\", \"series\", params ?? {}];\n}\n\nexport async function fetchSeries(\n client: IPredictClient,\n params?: SeriesQueryParams,\n): Promise<SeriesListResponse> {\n return await client.getSeries(params);\n}\n\nexport function useSeriesQuery(\n params?: SeriesQueryParams,\n queryOptions: Omit<\n UseQueryOptions<SeriesListResponse, Error, SeriesListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: seriesQueryKey(params),\n queryFn: async () => fetchSeries(client, params),\n ...queryOptions,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Series by Ticker Hook\n// -----------------------------------------------------------------------------\n\nexport function seriesByTickerQueryKey(seriesTicker: string): unknown[] {\n return [\"predict\", \"series\", \"byTicker\", seriesTicker];\n}\n\nexport async function fetchSeriesByTicker(\n client: IPredictClient,\n seriesTicker: string,\n): Promise<SeriesResponse> {\n return await client.getSeriesByTicker(seriesTicker);\n}\n\nexport function useSeriesByTickerQuery(\n seriesTicker: string,\n options: Omit<\n UseQueryOptions<SeriesResponse, Error, SeriesResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: seriesByTickerQueryKey(seriesTicker),\n queryFn: async () => fetchSeriesByTicker(client, seriesTicker),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Tags by Categories Hook\n// -----------------------------------------------------------------------------\n\nexport function tagsByCategoriesQueryKey(): unknown[] {\n return [\"predict\", \"tags\", \"byCategories\"];\n}\n\nexport async function fetchTagsByCategories(\n client: IPredictClient,\n): Promise<TagsByCategoriesResponse> {\n return await client.getTagsByCategories();\n}\n\nexport function useTagsByCategoriesQuery(\n options: Omit<\n UseQueryOptions<\n TagsByCategoriesResponse,\n Error,\n TagsByCategoriesResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tagsByCategoriesQueryKey(),\n queryFn: async () => fetchTagsByCategories(client),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Filters by Sports Hook\n// -----------------------------------------------------------------------------\n\nexport function filtersBySportsQueryKey(): unknown[] {\n return [\"predict\", \"filters\", \"bySports\"];\n}\n\nexport async function fetchFiltersBySports(\n client: IPredictClient,\n): Promise<FiltersBySportsResponse> {\n return await client.getFiltersBySports();\n}\n\nexport function useFiltersBySportsQuery(\n options: Omit<\n UseQueryOptions<\n FiltersBySportsResponse,\n Error,\n FiltersBySportsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: filtersBySportsQueryKey(),\n queryFn: async () => fetchFiltersBySports(client),\n ...options,\n });\n}\n\n// Legacy alias for backward compatibility\n/** @deprecated Use useTagsByCategoriesQuery instead */\nexport const useCategoriesQuery = useTagsByCategoriesQuery;\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SearchQueryParams,\n SearchResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function searchQueryKey(params: SearchQueryParams): unknown[] {\n return [\"predict\", \"search\", params];\n}\n\nexport async function fetchSearch(\n client: IPredictClient,\n params: SearchQueryParams,\n): Promise<SearchResponse> {\n return await client.search(params);\n}\n\nexport function useSearchQuery(\n params: SearchQueryParams,\n queryOptions: Omit<\n UseQueryOptions<SearchResponse, Error, SearchResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: searchQueryKey(params),\n queryFn: async () => fetchSearch(client, params),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n WalletPositionsResponse,\n PositionsByWalletQueryParams,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function positionsByWalletQueryKey(\n params: PositionsByWalletQueryParams,\n): unknown[] {\n return [\"predict\", \"positions\", \"byWallet\", params];\n}\n\nexport async function fetchPositionsByWallet(\n client: IPredictClient,\n params: PositionsByWalletQueryParams,\n): Promise<WalletPositionsResponse> {\n return await client.getPositionsByWallet(params);\n}\n\nexport function usePositionsByWalletQuery(\n params: PositionsByWalletQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n WalletPositionsResponse,\n Error,\n WalletPositionsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: positionsByWalletQueryKey(params),\n queryFn: async () => fetchPositionsByWallet(client, params),\n ...queryOptions,\n });\n}\n\nexport type { WalletPositionsResponse, PositionsByWalletQueryParams };\n","import { useContext } from \"react\";\nimport { UserPredictContext } from \"../contexts/UserPredictContext\";\n\nexport function useUserPredictContext() {\n const context = useContext(UserPredictContext);\n if (!context) {\n throw new Error(\n \"useUserPredictContext must be used within a UserPredictProvider\",\n );\n }\n return context;\n}\n","import { useContext, useMemo } from \"react\";\nimport { UserPredictContext } from \"../contexts/UserPredictContext\";\nimport type { StandardMarket, WalletPositionItem } from \"../types\";\n\nexport interface MarketPositionsResult {\n /** Positions matching the given market */\n positions: WalletPositionItem[];\n /** Whether the positions query is loading */\n isLoading: boolean;\n /** Whether UserPredictProvider is available in the tree */\n isAvailable: boolean;\n}\n\n/**\n * Returns the current user's positions filtered to a specific market.\n * Safe to call without UserPredictProvider — returns empty positions\n * with `isAvailable: false`.\n */\nexport function useMarketPositions(\n market: StandardMarket,\n): MarketPositionsResult {\n const ctx = useContext(UserPredictContext);\n\n return useMemo(() => {\n if (!ctx) {\n return { positions: [], isLoading: false, isAvailable: false };\n }\n\n const filtered = ctx.positions.filter(\n (p) => p.market?.ticker === market.ticker,\n );\n\n return {\n positions: filtered,\n isLoading: ctx.isLoading,\n isAvailable: true,\n };\n }, [ctx, market.ticker]);\n}\n","import {\n useQuery,\n useMutation,\n type UseQueryOptions,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n OutcomeMintsQueryParams,\n OutcomeMintsResponse,\n FilterOutcomeMintsRequest,\n FilterOutcomeMintsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Outcome Mints Query\n// -----------------------------------------------------------------------------\n\nexport function outcomeMintsQueryKey(\n params?: OutcomeMintsQueryParams,\n): unknown[] {\n return [\"predict\", \"outcomeMints\", params ?? {}];\n}\n\nexport async function fetchOutcomeMints(\n client: IPredictClient,\n params?: OutcomeMintsQueryParams,\n): Promise<OutcomeMintsResponse> {\n return await client.getOutcomeMints(params);\n}\n\nexport function useOutcomeMintsQuery(\n params?: OutcomeMintsQueryParams,\n options: Omit<\n UseQueryOptions<\n OutcomeMintsResponse,\n Error,\n OutcomeMintsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: outcomeMintsQueryKey(params),\n queryFn: async () => fetchOutcomeMints(client, params),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Filter Outcome Mints Mutation\n// -----------------------------------------------------------------------------\n\nexport async function filterOutcomeMints(\n client: IPredictClient,\n request: FilterOutcomeMintsRequest,\n): Promise<FilterOutcomeMintsResponse> {\n return await client.filterOutcomeMints(request);\n}\n\nexport function useFilterOutcomeMintsMutation(\n options: Omit<\n UseMutationOptions<\n FilterOutcomeMintsResponse,\n Error,\n FilterOutcomeMintsRequest\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: FilterOutcomeMintsRequest) =>\n filterOutcomeMints(client, request),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, QuoteQueryParams, QuoteResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Quote Query\n// -----------------------------------------------------------------------------\n\nexport function quoteQueryKey(params: QuoteQueryParams): unknown[] {\n return [\"predict\", \"quote\", params];\n}\n\nexport async function fetchQuote(\n client: IPredictClient,\n params: QuoteQueryParams,\n): Promise<QuoteResponse> {\n return await client.getQuote(params);\n}\n\nexport function useQuoteQuery(\n params: QuoteQueryParams,\n options: Omit<\n UseQueryOptions<QuoteResponse, Error, QuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: quoteQueryKey(params),\n queryFn: async () => fetchQuote(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Quotes are time-sensitive, don't cache for long\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds (formerly cacheTime)\n ...options,\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n SwapRequestBody,\n SwapResponse,\n SwapInstructionsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Create Swap Mutation\n// -----------------------------------------------------------------------------\n\nexport async function createSwap(\n client: IPredictClient,\n request: SwapRequestBody,\n): Promise<SwapResponse> {\n return await client.createSwap(request);\n}\n\nexport function useCreateSwapMutation(\n options: Omit<\n UseMutationOptions<SwapResponse, Error, SwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: SwapRequestBody) => createSwap(client, request),\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Create Swap Instructions Mutation\n// -----------------------------------------------------------------------------\n\nexport async function createSwapInstructions(\n client: IPredictClient,\n request: SwapRequestBody,\n): Promise<SwapInstructionsResponse> {\n return await client.createSwapInstructions(request);\n}\n\nexport function useCreateSwapInstructionsMutation(\n options: Omit<\n UseMutationOptions<SwapInstructionsResponse, Error, SwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: SwapRequestBody) =>\n createSwapInstructions(client, request),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n OrderQueryParams,\n OrderResponse,\n OrderStatusQueryParams,\n OrderStatusResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Order Query (Get quote and optionally transaction)\n// -----------------------------------------------------------------------------\n\nexport function orderQueryKey(params: OrderQueryParams): unknown[] {\n return [\"predict\", \"order\", params];\n}\n\nexport async function fetchOrder(\n client: IPredictClient,\n params: OrderQueryParams,\n): Promise<OrderResponse> {\n return await client.getOrder(params);\n}\n\nexport function useOrderQuery(\n params: OrderQueryParams,\n options: Omit<\n UseQueryOptions<OrderResponse, Error, OrderResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderQueryKey(params),\n queryFn: async () => fetchOrder(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Orders are time-sensitive, don't cache for long\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Order Status Query\n// -----------------------------------------------------------------------------\n\nexport function orderStatusQueryKey(params: OrderStatusQueryParams): unknown[] {\n return [\"predict\", \"order\", \"status\", params.signature];\n}\n\nexport async function fetchOrderStatus(\n client: IPredictClient,\n params: OrderStatusQueryParams,\n): Promise<OrderStatusResponse> {\n return await client.getOrderStatus(params);\n}\n\nexport function useOrderStatusQuery(\n params: OrderStatusQueryParams,\n options: Omit<\n UseQueryOptions<OrderStatusResponse, Error, OrderStatusResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderStatusQueryKey(params),\n queryFn: async () => fetchOrderStatus(client, params),\n enabled: Boolean(params.signature),\n // Poll for status updates; no retry — refetchInterval handles re-polling\n refetchInterval: options.refetchInterval ?? 3000,\n retry: false,\n ...options,\n });\n}\n","import {\n useQuery,\n useMutation,\n type UseQueryOptions,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n IntentQuoteQueryParams,\n IntentQuoteResponse,\n IntentSwapRequestBody,\n IntentSwapResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Intent Quote Query (Declarative Swap)\n// -----------------------------------------------------------------------------\n\nexport function intentQuoteQueryKey(params: IntentQuoteQueryParams): unknown[] {\n return [\"predict\", \"intent\", \"quote\", params];\n}\n\nexport async function fetchIntentQuote(\n client: IPredictClient,\n params: IntentQuoteQueryParams,\n): Promise<IntentQuoteResponse> {\n return await client.getIntentQuote(params);\n}\n\nexport function useIntentQuoteQuery(\n params: IntentQuoteQueryParams,\n options: Omit<\n UseQueryOptions<IntentQuoteResponse, Error, IntentQuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: intentQuoteQueryKey(params),\n queryFn: async () => fetchIntentQuote(client, params),\n enabled: Boolean(\n params.inputMint && params.outputMint && params.amount > 0,\n ),\n // Intent quotes are time-sensitive\n staleTime: 10_000, // 10 seconds\n gcTime: 30_000, // 30 seconds\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Submit Intent Swap Mutation\n// -----------------------------------------------------------------------------\n\nexport async function submitIntentSwap(\n client: IPredictClient,\n request: IntentSwapRequestBody,\n): Promise<IntentSwapResponse> {\n return await client.submitIntentSwap(request);\n}\n\nexport function useSubmitIntentSwapMutation(\n options: Omit<\n UseMutationOptions<IntentSwapResponse, Error, IntentSwapRequestBody>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (request: IntentSwapRequestBody) =>\n submitIntentSwap(client, request),\n ...options,\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n PredictionMarketInitQueryParams,\n PredictionMarketInitResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Initialize Prediction Market Mutation\n// -----------------------------------------------------------------------------\n\nexport async function initPredictionMarket(\n client: IPredictClient,\n params: PredictionMarketInitQueryParams,\n): Promise<PredictionMarketInitResponse> {\n return await client.initPredictionMarket(params);\n}\n\nexport function useInitPredictionMarketMutation(\n options: Omit<\n UseMutationOptions<\n PredictionMarketInitResponse,\n Error,\n PredictionMarketInitQueryParams\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useMutation({\n mutationFn: async (params: PredictionMarketInitQueryParams) =>\n initPredictionMarket(client, params),\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPredictClient,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n} from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Tokens Query\n// -----------------------------------------------------------------------------\n\nexport function tokensQueryKey(): unknown[] {\n return [\"predict\", \"tokens\"];\n}\n\nexport async function fetchTokens(\n client: IPredictClient,\n): Promise<TokenListResponse> {\n return await client.getTokens();\n}\n\nexport function useTokensQuery(\n options: Omit<\n UseQueryOptions<TokenListResponse, Error, TokenListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tokensQueryKey(),\n queryFn: async () => fetchTokens(client),\n // Token list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n\n// -----------------------------------------------------------------------------\n// Tokens With Decimals Query\n// -----------------------------------------------------------------------------\n\nexport function tokensWithDecimalsQueryKey(): unknown[] {\n return [\"predict\", \"tokens\", \"decimals\"];\n}\n\nexport async function fetchTokensWithDecimals(\n client: IPredictClient,\n): Promise<TokenListWithDecimalsResponse> {\n return await client.getTokensWithDecimals();\n}\n\nexport function useTokensWithDecimalsQuery(\n options: Omit<\n UseQueryOptions<\n TokenListWithDecimalsResponse,\n Error,\n TokenListWithDecimalsResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tokensWithDecimalsQueryKey(),\n queryFn: async () => fetchTokensWithDecimals(client),\n // Token list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPredictClient, VenueListResponse } from \"../types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n// -----------------------------------------------------------------------------\n// Venues Query\n// -----------------------------------------------------------------------------\n\nexport function venuesQueryKey(): unknown[] {\n return [\"predict\", \"venues\"];\n}\n\nexport async function fetchVenues(\n client: IPredictClient,\n): Promise<VenueListResponse> {\n return await client.getVenues();\n}\n\nexport function useVenuesQuery(\n options: Omit<\n UseQueryOptions<VenueListResponse, Error, VenueListResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: venuesQueryKey(),\n queryFn: async () => fetchVenues(client),\n // Venue list doesn't change often\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n ...options,\n });\n}\n","/**\n * DflowPredictWsClient - WebSocket client for real-time prediction market data\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat (ping/pong) for connection health\n * - Subscription management for prices, trades, orderbook channels\n * - Event emitter pattern for message handling\n */\nimport type {\n WsConnectionStatus,\n WsSubscribeOptions,\n WsPriceUpdate,\n WsTradeUpdate,\n WsOrderbookUpdate,\n IPredictWsClient,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Internal WebSocket Protocol Types\n// ---------------------------------------------------------------------------\n\n/** WebSocket channel types */\ntype WsChannel = \"prices\" | \"trades\" | \"orderbook\";\n\n/** Subscribe/Unsubscribe message */\ninterface WsSubscribeMessage {\n type: \"subscribe\" | \"unsubscribe\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n}\n\n/** Ping message */\ninterface WsPingMessage {\n type: \"ping\";\n}\n\n/** Pong response */\ninterface WsPongMessage {\n type: \"pong\";\n timestamp: number;\n}\n\n/** Status request message */\ninterface WsStatusRequestMessage {\n type: \"status\";\n}\n\n/** Status response message */\ninterface WsStatusMessage {\n type: \"status\";\n status: WsConnectionStatus;\n message?: string;\n connected?: boolean;\n clientCount?: number;\n subscriptions?: {\n prices: { all: boolean; tickers: string[] };\n trades: { all: boolean; tickers: string[] };\n orderbook: { all: boolean; tickers: string[] };\n };\n}\n\n/** Subscription confirmation message */\ninterface WsSubscriptionConfirmation {\n type: \"subscribed\" | \"unsubscribed\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n success: boolean;\n}\n\n/** Error message from server */\ninterface WsErrorMessage {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/** Union type for all data messages from server */\ntype WsDataMessage = WsPriceUpdate | WsTradeUpdate | WsOrderbookUpdate;\n\n/** Union type for all server messages */\ntype WsServerMessage =\n | WsDataMessage\n | WsStatusMessage\n | WsSubscriptionConfirmation\n | WsErrorMessage\n | WsPongMessage;\n\n/** Union type for all client messages */\ntype WsClientMessage =\n | WsSubscribeMessage\n | WsPingMessage\n | WsStatusRequestMessage;\n\n/** WebSocket event types for event emitter */\ntype WsEventType =\n | \"connect\"\n | \"disconnect\"\n | \"reconnecting\"\n | \"error\"\n | \"price\"\n | \"trade\"\n | \"orderbook\"\n | \"status\"\n | \"subscribed\"\n | \"unsubscribed\";\n\n/** WebSocket client configuration */\nexport interface WsClientConfig {\n /** WebSocket endpoint URL */\n wsUrl: string;\n /** Auto-connect on instantiation */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect interval base in ms (default: 1000) */\n reconnectIntervalBase?: number;\n /** Max reconnect interval in ms (default: 30000) */\n reconnectMaxInterval?: number;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_INTERVAL_BASE = 1000; // 1 second\nconst DEFAULT_RECONNECT_MAX_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_PING_INTERVAL = 30000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// Event Emitter Types\n// ---------------------------------------------------------------------------\n\ntype EventCallback<T = unknown> = (data: T) => void;\n\ninterface EventListeners {\n connect: EventCallback<void>[];\n disconnect: EventCallback<{ code?: number; reason?: string }>[];\n reconnecting: EventCallback<{ attempt: number; delay: number }>[];\n error: EventCallback<Error>[];\n price: EventCallback<WsPriceUpdate>[];\n trade: EventCallback<WsTradeUpdate>[];\n orderbook: EventCallback<WsOrderbookUpdate>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n unsubscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n}\n\n// ---------------------------------------------------------------------------\n// Subscription State\n// ---------------------------------------------------------------------------\n\ninterface ChannelSubscription {\n all: boolean;\n tickers: Set<string>;\n}\n\ninterface SubscriptionState {\n prices: ChannelSubscription;\n trades: ChannelSubscription;\n orderbook: ChannelSubscription;\n}\n\n// ---------------------------------------------------------------------------\n// DflowPredictWsClient Class\n// ---------------------------------------------------------------------------\n\nexport class DflowPredictWsClient implements IPredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectIntervalBase: number;\n private readonly reconnectMaxInterval: number;\n private readonly pingInterval: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private shouldReconnect = true;\n\n // Event listeners\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n price: [],\n trade: [],\n orderbook: [],\n status: [],\n subscribed: [],\n unsubscribed: [],\n };\n\n // Track current subscriptions for reconnection recovery\n private subscriptions: SubscriptionState = {\n prices: { all: false, tickers: new Set() },\n trades: { all: false, tickers: new Set() },\n orderbook: { all: false, tickers: new Set() },\n };\n\n constructor(config: WsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectIntervalBase =\n config.reconnectIntervalBase ?? DEFAULT_RECONNECT_INTERVAL_BASE;\n this.reconnectMaxInterval =\n config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX_INTERVAL;\n this.pingInterval = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Connection Management\n // ---------------------------------------------------------------------------\n\n /**\n * Connect to the WebSocket server\n */\n connect(): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n this.shouldReconnect = true;\n this.setStatus(\"connecting\");\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.setStatus(\"connected\");\n this.emit(\"connect\", undefined);\n\n // Restore subscriptions after reconnection\n this.restoreSubscriptions();\n\n // Start ping interval\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n const error = new Error(\"WebSocket error\");\n console.error(\"[DflowPredictWsClient] WebSocket error:\", event);\n this.emit(\"error\", error);\n };\n\n this.ws.onclose = (event) => {\n this.stopPingInterval();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n\n // Attempt reconnection\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch (error) {\n console.error(\n \"[DflowPredictWsClient] Failed to create WebSocket:\",\n error,\n );\n this.emit(\n \"error\",\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPingInterval();\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus(\"disconnected\");\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get current connection status\n */\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n // ---------------------------------------------------------------------------\n // Business Subscription Methods (IPredictWsClient interface)\n // ---------------------------------------------------------------------------\n\n /** Subscribe to price updates, returns unsubscribe function */\n subscribePrices(\n options: WsSubscribeOptions,\n onUpdate: (update: WsPriceUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"prices\", options);\n const removeListener = this.on(\"price\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"prices\", options);\n };\n }\n\n /** Subscribe to trade updates, returns unsubscribe function */\n subscribeTrades(\n options: WsSubscribeOptions,\n onUpdate: (update: WsTradeUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"trades\", options);\n const removeListener = this.on(\"trade\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"trades\", options);\n };\n }\n\n /** Subscribe to orderbook updates, returns unsubscribe function */\n subscribeOrderbook(\n options: WsSubscribeOptions,\n onUpdate: (update: WsOrderbookUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"orderbook\", options);\n const removeListener = this.on(\"orderbook\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"orderbook\", options);\n };\n }\n\n /** Subscribe to status changes, returns unsubscribe function */\n onStatusChange(callback: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", callback);\n }\n\n // ---------------------------------------------------------------------------\n // Event Emitter\n // ---------------------------------------------------------------------------\n\n /**\n * Add event listener\n */\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n listeners.push(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Remove event listener\n */\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n const index = listeners.indexOf(callback as EventCallback<unknown>);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * Remove all listeners for an event (or all events)\n */\n removeAllListeners(event?: WsEventType): void {\n if (event) {\n (this.listeners[event] as unknown[]).length = 0;\n } else {\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods\n // ---------------------------------------------------------------------------\n\n private subscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = true;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n subscription.all = false;\n for (const ticker of options.tickers) {\n subscription.tickers.add(ticker);\n }\n }\n\n this.sendSubscription(\"subscribe\", channel, options);\n }\n\n private unsubscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = false;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n for (const ticker of options.tickers) {\n subscription.tickers.delete(ticker);\n }\n }\n\n this.sendSubscription(\"unsubscribe\", channel, options);\n }\n\n private setStatus(status: WsConnectionStatus): void {\n if (this.status !== status) {\n this.status = status;\n this.emit(\"status\", status);\n }\n }\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const listeners = this.listeners[event] as EventCallback<typeof data>[];\n for (const listener of listeners) {\n try {\n listener(data);\n } catch (error) {\n console.error(\n `[DflowPredictWsClient] Error in ${event} listener:`,\n error,\n );\n }\n }\n }\n\n private send(message: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn(\n \"[DflowPredictWsClient] Cannot send message, WebSocket not connected\",\n );\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to send message:\", error);\n return false;\n }\n }\n\n private sendSubscription(\n type: \"subscribe\" | \"unsubscribe\",\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n this.send({\n type,\n channel,\n all: options.all,\n tickers: options.tickers,\n });\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as WsServerMessage;\n\n switch (message.type) {\n case \"ticker\":\n this.emit(\"price\", message as WsPriceUpdate);\n break;\n case \"trade\":\n this.emit(\"trade\", message as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", message as WsOrderbookUpdate);\n break;\n case \"status\":\n // Status message from server (different from connection status)\n break;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"unsubscribed\":\n this.emit(\"unsubscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"pong\":\n // Pong received, connection is alive\n break;\n case \"error\":\n console.error(\n \"[DflowPredictWsClient] Server error:\",\n message.message,\n );\n this.emit(\"error\", new Error(message.message));\n break;\n default:\n // Handle data messages without explicit type\n if (\"channel\" in message) {\n const dataMsg = message as WsDataMessage;\n switch (dataMsg.channel) {\n case \"prices\":\n this.emit(\"price\", dataMsg as WsPriceUpdate);\n break;\n case \"trades\":\n this.emit(\"trade\", dataMsg as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsOrderbookUpdate);\n break;\n }\n }\n }\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to parse message:\", error);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n this.reconnectIntervalBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMaxInterval,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private restoreSubscriptions(): void {\n for (const channel of [\"prices\", \"trades\", \"orderbook\"] as WsChannel[]) {\n const subscription = this.subscriptions[channel];\n\n if (subscription.all) {\n this.sendSubscription(\"subscribe\", channel, { all: true });\n } else if (subscription.tickers.size > 0) {\n this.sendSubscription(\"subscribe\", channel, {\n tickers: Array.from(subscription.tickers),\n });\n }\n }\n }\n\n private startPingInterval(): void {\n this.stopPingInterval();\n\n this.pingIntervalId = setInterval(() => {\n this.send({ type: \"ping\" });\n }, this.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new DflowPredictWsClient instance\n */\nexport function createDflowPredictWsClient(\n config: WsClientConfig,\n): DflowPredictWsClient {\n return new DflowPredictWsClient(config);\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport { DflowPredictWsClient, createDflowPredictWsClient } from \"../client/ws\";\nimport type { WsClientConfig } from \"../client/ws\";\nimport type { IPredictWsClient, WsConnectionStatus } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseWsConnectionParams {\n /** WebSocket endpoint URL */\n wsEndpoint: string;\n /** Auto-connect on mount (default: true) */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Enable connection (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseWsConnectionResult {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Current connection status */\n status: WsConnectionStatus;\n /** Whether currently connected */\n isConnected: boolean;\n /** Connect to WebSocket */\n connect: () => void;\n /** Disconnect from WebSocket */\n disconnect: () => void;\n /** Last error */\n error: Error | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for managing WebSocket connection lifecycle\n */\nexport function useWsConnection({\n wsEndpoint,\n autoConnect = true,\n autoReconnect = true,\n enabled = true,\n}: UseWsConnectionParams): UseWsConnectionResult {\n const [status, setStatus] = useState<WsConnectionStatus>(\"disconnected\");\n const [error, setError] = useState<Error | null>(null);\n const clientRef = useRef<DflowPredictWsClient | null>(null);\n\n // Initialize client\n useEffect(() => {\n if (!enabled) {\n if (clientRef.current) {\n clientRef.current.disconnect();\n clientRef.current = null;\n }\n setStatus(\"disconnected\");\n return;\n }\n\n const config: WsClientConfig = {\n wsUrl: wsEndpoint,\n autoConnect,\n autoReconnect,\n };\n\n const client = createDflowPredictWsClient(config);\n clientRef.current = client;\n\n // Listen for status changes\n const unsubStatus = client.on(\"status\", (newStatus) => {\n setStatus(newStatus);\n });\n\n // Listen for errors\n const unsubError = client.on(\"error\", (err) => {\n setError(err);\n });\n\n // Listen for successful connection to clear error\n const unsubConnect = client.on(\"connect\", () => {\n setError(null);\n });\n\n // Cleanup on unmount\n return () => {\n unsubStatus();\n unsubError();\n unsubConnect();\n client.disconnect();\n clientRef.current = null;\n };\n }, [wsEndpoint, autoConnect, autoReconnect, enabled]);\n\n const connect = useCallback(() => {\n clientRef.current?.connect();\n }, []);\n\n const disconnect = useCallback(() => {\n clientRef.current?.disconnect();\n }, []);\n\n return {\n client: clientRef.current,\n status,\n isConnected: status === \"connected\",\n connect,\n disconnect,\n error,\n };\n}\n","import { useContext, useEffect, useState } from \"react\";\nimport { PredictContext } from \"../contexts/PredictContext\";\nimport type { IPredictWsClient, WsConnectionStatus } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseWsClientResult {\n /** WebSocket client instance (null if not configured) */\n wsClient: IPredictWsClient | null;\n /** Current connection status */\n wsStatus: WsConnectionStatus;\n /** Whether currently connected */\n isWsConnected: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook to access the WebSocket client from PredictContext.\n * Connection status is derived directly from the wsClient instance.\n */\nexport function useWsClient(): UseWsClientResult {\n const context = useContext(PredictContext);\n\n if (!context) {\n throw new Error(\"useWsClient must be used within a PredictProvider\");\n }\n\n const { wsClient } = context;\n\n const [wsStatus, setWsStatus] = useState<WsConnectionStatus>(\n wsClient?.getStatus() ?? \"disconnected\",\n );\n\n useEffect(() => {\n if (!wsClient) {\n setWsStatus(\"disconnected\");\n return;\n }\n\n // Sync initial status\n setWsStatus(wsClient.getStatus());\n\n // Listen for status changes\n const unsubscribe = wsClient.onStatusChange(setWsStatus);\n return unsubscribe;\n }, [wsClient]);\n\n return {\n wsClient,\n wsStatus,\n isWsConnected: wsStatus === \"connected\",\n };\n}\n","import { useEffect, useState, useRef } from \"react\";\nimport type { IPredictWsClient, WsPriceUpdate } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UsePricesSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Callback when price update received */\n onUpdate?: (update: WsPriceUpdate) => void;\n}\n\nexport interface PriceData {\n yesBid: string | null;\n yesAsk: string | null;\n noBid: string | null;\n noAsk: string | null;\n updatedAt: number;\n}\n\nexport interface UsePricesSubscriptionResult {\n /** Map of market ticker to latest price data */\n prices: Map<string, PriceData>;\n /** Whether subscription is active */\n isSubscribed: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time price updates\n */\nexport function usePricesSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n onUpdate,\n}: UsePricesSubscriptionParams): UsePricesSubscriptionResult {\n const [prices, setPrices] = useState<Map<string, PriceData>>(new Map());\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribePrices(options, (update) => {\n setPrices((prev) => {\n const next = new Map(prev);\n next.set(update.market_ticker, {\n yesBid: update.yes_bid,\n yesAsk: update.yes_ask,\n noBid: update.no_bid,\n noAsk: update.no_ask,\n updatedAt: Date.now(),\n });\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled]);\n\n return {\n prices,\n isSubscribed,\n };\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport type { IPredictWsClient, WsTradeUpdate } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradesSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Maximum number of trades to keep in history (default: 100) */\n maxHistory?: number;\n /** Callback when trade update received */\n onUpdate?: (update: WsTradeUpdate) => void;\n}\n\nexport interface TradeData {\n tradeId: string;\n marketTicker: string;\n price: number;\n count: number;\n yesPrice: number;\n noPrice: number;\n takerSide: \"yes\" | \"no\";\n createdTime: number;\n}\n\nexport interface UseTradesSubscriptionResult {\n /** Recent trades (newest first) */\n trades: TradeData[];\n /** Whether subscription is active */\n isSubscribed: boolean;\n /** Clear trade history */\n clearHistory: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time trade updates\n */\nexport function useTradesSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n maxHistory = 100,\n onUpdate,\n}: UseTradesSubscriptionParams): UseTradesSubscriptionResult {\n const [trades, setTrades] = useState<TradeData[]>([]);\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribeTrades(options, (update) => {\n const trade: TradeData = {\n tradeId: update.trade_id,\n marketTicker: update.market_ticker,\n price: update.price,\n count: update.count,\n yesPrice: update.yes_price,\n noPrice: update.no_price,\n takerSide: update.taker_side,\n createdTime: update.created_time,\n };\n\n setTrades((prev) => {\n const next = [trade, ...prev];\n if (next.length > maxHistory) {\n return next.slice(0, maxHistory);\n }\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled, maxHistory]);\n\n const clearHistory = useCallback(() => {\n setTrades([]);\n }, []);\n\n return {\n trades,\n isSubscribed,\n clearHistory,\n };\n}\n","import { useEffect, useState, useCallback, useRef } from \"react\";\nimport type {\n IPredictWsClient,\n WsOrderbookUpdate,\n OrderbookLevel,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOrderbookSubscriptionParams {\n /** WebSocket client instance */\n client: IPredictWsClient | null;\n /** Subscribe to all markets */\n all?: boolean;\n /** Subscribe to specific market tickers */\n tickers?: string[];\n /** Enable subscription (default: true) */\n enabled?: boolean;\n /** Callback when orderbook update received */\n onUpdate?: (update: WsOrderbookUpdate) => void;\n}\n\nexport interface OrderbookData {\n yesBids: OrderbookLevel[];\n yesAsks: OrderbookLevel[];\n noBids: OrderbookLevel[];\n noAsks: OrderbookLevel[];\n updatedAt: number;\n}\n\nexport interface UseOrderbookSubscriptionResult {\n /** Map of market ticker to latest orderbook data */\n orderbooks: Map<string, OrderbookData>;\n /** Whether subscription is active */\n isSubscribed: boolean;\n /** Get orderbook for a specific ticker */\n getOrderbook: (ticker: string) => OrderbookData | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for subscribing to real-time orderbook updates\n */\nexport function useOrderbookSubscription({\n client,\n all = false,\n tickers = [],\n enabled = true,\n onUpdate,\n}: UseOrderbookSubscriptionParams): UseOrderbookSubscriptionResult {\n const [orderbooks, setOrderbooks] = useState<Map<string, OrderbookData>>(\n new Map(),\n );\n const [isSubscribed, setIsSubscribed] = useState(false);\n const onUpdateRef = useRef(onUpdate);\n\n // Keep onUpdate ref current\n useEffect(() => {\n onUpdateRef.current = onUpdate;\n }, [onUpdate]);\n\n // Subscribe/unsubscribe on mount/unmount or when params change\n useEffect(() => {\n if (!client || !enabled) {\n setIsSubscribed(false);\n return;\n }\n\n // Only subscribe if we have something to subscribe to\n if (!all && tickers.length === 0) {\n return;\n }\n\n const options = all ? { all: true } : { tickers };\n\n const unsubscribe = client.subscribeOrderbook(options, (update) => {\n setOrderbooks((prev) => {\n const next = new Map(prev);\n next.set(update.market_ticker, {\n yesBids: update.yes_bids,\n yesAsks: update.yes_asks,\n noBids: update.no_bids,\n noAsks: update.no_asks,\n updatedAt: Date.now(),\n });\n return next;\n });\n\n onUpdateRef.current?.(update);\n });\n\n setIsSubscribed(true);\n\n return () => {\n unsubscribe();\n setIsSubscribed(false);\n };\n }, [client, all, tickers.join(\",\"), enabled]);\n\n const getOrderbook = useCallback(\n (ticker: string) => orderbooks.get(ticker),\n [orderbooks],\n );\n\n return {\n orderbooks,\n isSubscribed,\n getOrderbook,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTagsByCategoriesQuery } from \"../../hooks\";\n\n// -----------------------------------------------------------------------------\n// Preferred display order\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER: string[] = [\n \"Politics\",\n \"Sports\",\n \"Culture\",\n \"Crypto\",\n \"Climate\",\n \"Economics\",\n \"Mentions\",\n \"Companies\",\n \"Financials\",\n \"Tech & Science\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** A single category with its tags */\nexport interface EventCategory {\n /** Category name (e.g. \"Politics\", \"Economics\") */\n category: string;\n /** Tags associated with this category */\n tags: string[];\n}\n\n/** Return type for the useEventsCategories hook */\nexport interface UseEventsCategoriesResult {\n /** Structured category list */\n data: EventCategory[];\n /** Whether data is still loading */\n isLoading: boolean;\n /** Whether there is an error */\n isError: boolean;\n /** Error information */\n error: Error | null;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * Fetches event categories and their tags.\n *\n * Uses `getTagsByCategories()` to build a sorted list of categories, each\n * containing the tags that belong to it.\n *\n * @example\n * ```tsx\n * const { data: categories, isLoading } = useEventsCategories();\n *\n * // categories = [\n * // { category: \"Politics\", tags: [\"US Elections\", ...] },\n * // { category: \"Sports\", tags: [\"NFL\", \"NBA\", ...] },\n * // ...\n * // ]\n * ```\n */\nexport function useEventsCategories(): UseEventsCategoriesResult {\n const {\n data: tagsData,\n isLoading,\n isError,\n error,\n } = useTagsByCategoriesQuery();\n\n const data = useMemo<EventCategory[]>(() => {\n if (!tagsData?.tagsByCategories) return [];\n\n const orderIndex = (cat: string) => {\n const idx = CATEGORY_ORDER.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER.length : idx;\n };\n\n return Object.entries(tagsData.tagsByCategories)\n .map(([category, tags]) => ({ category, tags }))\n .sort((a, b) => orderIndex(a.category) - orderIndex(b.category));\n }, [tagsData]);\n\n return { data, isLoading, isError, error: error ?? null };\n}\n","import { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface CategoryItem {\n category: string;\n tags: string[];\n /** Optional badge text displayed above the tab (e.g. \"New\", \"Hot\") */\n badge?: string;\n}\n\nexport interface TagItem {\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\nexport interface CategoriesUIProps {\n /** List of categories to display */\n categories: CategoryItem[];\n /** Currently selected category name (null = \"Trending\") */\n selectedCategory: string | null;\n /** Currently selected tag within the category (null = all tags) */\n selectedTag: string | null;\n /** Tags of the currently selected category */\n activeTags: TagItem[];\n /** Callback when a category is selected (null = \"Trending\") */\n onCategorySelect: (category: string | null) => void;\n /** Callback when a tag is selected (null = deselect) */\n onTagSelect: (tag: string | null) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Name of the tab that shows a pulsing dot (default: \"Trending\") */\n pulsingTab?: string;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function CategoriesUI({\n categories,\n selectedCategory,\n selectedTag,\n activeTags,\n onCategorySelect,\n onTagSelect,\n trailing,\n pulsingTab = \"Trending\",\n className,\n}: CategoriesUIProps) {\n const { t } = useTranslation();\n\n const handleSelectAll = useCallback(() => {\n onCategorySelect(null);\n }, [onCategorySelect]);\n\n const trendingLabel = t(\"predict.categories.trending\");\n\n return (\n <div\n className={cn(\n \"sticky top-0 z-30 flex w-full flex-col justify-between gap-2 px-4 py-1 lg:px-2 lg:py-1\",\n className,\n )}\n >\n {/* Primary row: category tabs + trailing controls */}\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"hideScrollbar min-w-0 flex-1 overflow-x-auto overflow-y-hidden\">\n <div className=\"flex min-h-8 items-stretch gap-x-2 lg:min-h-9\">\n {/* Trending tab */}\n <Tab\n label={trendingLabel}\n isSelected={selectedCategory === null}\n onPress={handleSelectAll}\n showPulse={trendingLabel === pulsingTab}\n />\n\n {/* Separator between Trending and categories */}\n <TabSeparator />\n\n {/* Category tabs */}\n {categories.map((cat) => (\n <Tab\n key={cat.category}\n label={cat.category}\n isSelected={selectedCategory === cat.category}\n onPress={() => onCategorySelect(cat.category)}\n badge={cat.badge}\n showPulse={cat.category === pulsingTab}\n />\n ))}\n </div>\n </div>\n {trailing && <div className=\"flex-shrink-0\">{trailing}</div>}\n </div>\n\n {/* Secondary: tag chips (visible when a category is selected) */}\n {selectedCategory && activeTags.length > 0 && (\n <div className=\"hideScrollbar overflow-x-auto overflow-y-hidden flex items-center\">\n <div className=\"flex gap-x-1 pl-2 lg:w-full lg:gap-x-2\">\n <Chip\n label={t(\"predict.categories.allMarkets\")}\n isSelected={selectedTag === null}\n onPress={() => onTagSelect(null)}\n />\n {activeTags.map((tag) => (\n <Chip\n key={tag.label}\n label={tag.label}\n icon={tag.icon}\n isSelected={selectedTag === tag.label}\n onPress={() => onTagSelect(tag.label)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Tab — primary category navigation item\n// -----------------------------------------------------------------------------\n\ninterface TabProps {\n label: string;\n isSelected: boolean;\n onPress: () => void;\n badge?: string;\n showPulse?: boolean;\n}\n\nfunction Tab({ label, isSelected, onPress, badge, showPulse }: TabProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"relative shrink-0 cursor-pointer whitespace-nowrap border-b p-1 text-base font-normal capitalize transition-colors\",\n isSelected\n ? \"border-primary/50 text-primary\"\n : \"border-transparent text-neutral-500 hover:text-neutral-300\",\n )}\n >\n {showPulse ? (\n <span className=\"flex items-center gap-x-1.5\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-[rgb(240,68,56)]\" />\n <span>{label}</span>\n </span>\n ) : (\n label\n )}\n\n {badge && (\n <span className=\"absolute -right-1 top-0 rounded bg-primary px-0.5 py-px text-[0.625rem] font-semibold leading-none text-neutral-950\">\n {badge}\n </span>\n )}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// TabSeparator — vertical divider between tab groups\n// -----------------------------------------------------------------------------\n\nfunction TabSeparator() {\n return (\n <span className=\"flex items-center text-neutral-600\" aria-hidden=\"true\">\n |\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Chip — secondary tag chip (pixel-perfect Jupiter clone)\n// -----------------------------------------------------------------------------\n\ninterface ChipProps {\n label: string;\n icon?: string;\n isSelected: boolean;\n onPress: () => void;\n}\n\nfunction Chip({ label, icon, isSelected, onPress }: ChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"flex shrink-0 items-center justify-center gap-x-1 min-w-14 rounded-2xl border px-2 py-1 text-sm font-medium uppercase transition-colors cursor-pointer\",\n isSelected\n ? \"border-transparent bg-primary text-black\"\n : \"border-border/80 text-neutral-200 hover:bg-primary/10 hover:text-primary\",\n )}\n >\n {icon && <span className={cn(\"iconify size-4\", icon)} />}\n {label}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Skeleton\n// -----------------------------------------------------------------------------\n\nexport function CategoriesSkeleton({ count = 6 }: { count?: number }) {\n return (\n <div className=\"flex items-center gap-x-2\">\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={i} className=\"h-6 w-16 shrink-0 rounded\" />\n ))}\n </div>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport { useEventsCategories } from \"./categories.script\";\nimport { CategoriesUI, CategoriesSkeleton } from \"./categories.ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Selection state emitted by the categories widget */\nexport interface CategorySelection {\n /** Selected category name, null when \"Trending\" is selected */\n category: string | null;\n /** Tags to filter by, null when no filter is applied */\n tags: string[] | null;\n}\n\nexport interface CategoriesWidgetProps {\n /**\n * Callback when category / tag selection changes.\n * - `category = null, tags = null` → \"Trending\" is selected (no filter)\n * - `category = \"Politics\", tags = [...]` → category selected with its tags\n */\n onSelect?: (selection: CategorySelection) => void;\n /** Optional class name */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidget({\n onSelect,\n className,\n}: CategoriesWidgetProps) {\n const { data: categories, isLoading } = useEventsCategories();\n\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [selectedTag, setSelectedTag] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (category: string | null) => {\n setSelectedCategory(category);\n setSelectedTag(null); // reset tag when category changes\n\n if (!category) {\n // \"Trending\" selected\n onSelect?.({ category: null, tags: null });\n } else {\n // find the category and emit all its tags\n const cat = categories.find((c) => c.category === category);\n onSelect?.({ category, tags: cat?.tags ?? null });\n }\n },\n [categories, onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tag: string | null) => {\n setSelectedTag(tag);\n\n if (!tag) {\n // deselected tag → fall back to full category\n const cat = categories.find((c) => c.category === selectedCategory);\n onSelect?.({ category: selectedCategory, tags: cat?.tags ?? null });\n } else {\n onSelect?.({ category: selectedCategory, tags: [tag] });\n }\n },\n [categories, selectedCategory, onSelect],\n );\n\n // --- render ---\n\n if (isLoading) {\n return <CategoriesSkeleton />;\n }\n\n // Get the tags for the currently selected category\n const rawTags =\n categories.find((c) => c.category === selectedCategory)?.tags ?? [];\n const activeTags = rawTags.map((t) => ({ label: t }));\n\n return (\n <CategoriesUI\n categories={categories}\n selectedCategory={selectedCategory}\n selectedTag={selectedTag}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n className={className}\n />\n );\n}\n","import { useMemo } from \"react\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useEventsInfiniteQuery, useSeriesQuery } from \"../../hooks\";\nimport type { StandardEvent, EventQueryParams } from \"../../types\";\n\n/**\n * useEvents parameters — extends EventQueryParams (without cursor) with\n * optional category / tags filtering.\n */\nexport interface UseEventsParams extends Omit<EventQueryParams, \"cursor\"> {\n /** Filter events by category (scopes the series lookup when tags is set) */\n category?: string | null;\n /**\n * Filter events by tags.\n * Internally converts tags → matching series tickers, then filters events.\n * Takes precedence over `seriesTickers` when provided.\n */\n tags?: string[] | null;\n}\n\n/**\n * useEvents return value\n */\nexport interface UseEventsResult {\n /** All accumulated events data */\n data: StandardEvent[];\n /** Whether *initial* data is still loading (no cache yet) */\n isLoading: boolean;\n /** Whether any fetch is in-flight (includes refetch / param change, excludes fetchNextPage) */\n isFetching: boolean;\n /** Whether more data is being fetched (infinite scroll) */\n isFetchingMore: boolean;\n /** Whether there is an error */\n isError: boolean;\n /** Error information */\n error: Error | null;\n /** Whether there is more data to load */\n hasMore: boolean;\n /** Fetch more results */\n fetchMore: () => void;\n /** Refetch all pages */\n refetch: () => void;\n}\n\n/**\n * Events list hook with infinite scroll support (cursor-based pagination)\n *\n * Supports filtering by `tags` – internally converts tags into matching series\n * tickers via a series query, then filters events by `seriesTickers`.\n *\n * @example\n * ```tsx\n * const {\n * data,\n * isLoading,\n * hasMore,\n * isFetchingMore,\n * fetchMore,\n * } = useEvents({\n * limit: 20,\n * status: 'active',\n * withNestedMarkets: true,\n * category: 'Politics',\n * tags: ['US Elections'],\n * });\n * ```\n */\nexport function useEvents(params: UseEventsParams = {}): UseEventsResult {\n // --- category / tags → seriesTickers conversion ---\n\n const { category, tags, ...restParams } = params;\n const needsSeriesLookup = !!category || (!!tags && tags.length > 0);\n\n const {\n data: seriesData,\n isFetching: isSeriesFetching,\n isError: isSeriesError,\n error: seriesError,\n } = useSeriesQuery(\n {\n ...(category ? { category } : {}),\n ...(tags && tags.length > 0 ? { tags: tags.join(\",\") } : {}),\n isInitialized: true,\n status: \"active\",\n },\n { enabled: needsSeriesLookup },\n );\n\n const derivedSeriesTickers = useMemo(() => {\n if (!needsSeriesLookup || !seriesData?.series) return undefined;\n\n // dflow API limits seriesTickers to 25\n const tickers = seriesData.series.map((s) => s.ticker).slice(0, 25);\n return tickers.length > 0 ? tickers.join(\",\") : undefined;\n }, [needsSeriesLookup, seriesData]);\n\n // --- build final query params ---\n\n const mergedParams = useMemo<Omit<EventQueryParams, \"cursor\">>(\n () => ({\n status: \"active\",\n withNestedMarkets: true,\n sort: \"volume24h\",\n order: \"desc\",\n limit: DEFAULT_PAGE_SIZE,\n ...restParams,\n ...(derivedSeriesTickers !== undefined\n ? { seriesTickers: derivedSeriesTickers }\n : {}),\n }),\n [restParams, derivedSeriesTickers],\n );\n\n const {\n data: infiniteData,\n isLoading: isEventsLoading,\n isFetching: isEventsFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage: fetchMore,\n refetch,\n } = useEventsInfiniteQuery(mergedParams);\n\n // Flatten all pages into a single events array\n const data = useMemo(\n () => infiniteData?.pages.flatMap((page) => page.events) ?? [],\n [infiniteData],\n );\n\n // If series query errors out, stop resolving to avoid stuck state\n const isSeriesResolving = needsSeriesLookup && !seriesData && !isSeriesError;\n\n // isLoading — true only on *initial* load (no cached data at all)\n // isFetching — true whenever any request is in-flight (param change / refetch), excludes fetchNextPage\n // includes isSeriesFetching so that switching tag shows skeleton even when stale series cache exists\n const isLoading = isSeriesResolving || isEventsLoading;\n const isFetching =\n isSeriesFetching ||\n isSeriesResolving ||\n (isEventsFetching && !isFetchingMore);\n\n return {\n data,\n isLoading,\n isFetching,\n isFetchingMore,\n isError: isSeriesError || isError,\n error: seriesError ?? error,\n hasMore,\n fetchMore,\n refetch,\n };\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { CategoriesSkeleton } from \"../categories/categories.ui\";\n\nexport type EventItemSkeletonProps = {\n className?: string;\n};\n\nexport function EventItemSkeleton({ className }: EventItemSkeletonProps) {\n return (\n <Skeleton\n className={cn(\n \"min-h-52 w-full rounded-xl border border-border/80 lg:min-h-72\",\n className,\n )}\n />\n );\n}\n\nexport type EventsSkeletonProps = {\n count?: number;\n};\n\nexport function EventsSkeleton({ count = 12 }: EventsSkeletonProps) {\n return (\n <div className=\"@container w-full h-full\">\n <div className=\"grid w-full grid-cols-1 gap-4 @[768px]:grid-cols-2 @[1024px]:grid-cols-3 @[1280px]:grid-cols-4\">\n {Array.from({ length: count }).map((_, i) => (\n <EventItemSkeleton key={i} />\n ))}\n </div>\n </div>\n );\n}\n\nexport function EventsPageSkeleton() {\n return (\n <div className=\"flex h-full w-full flex-col gap-y-3\">\n <CategoriesSkeleton />\n <div className=\"min-h-0 flex-1\">\n <EventsSkeleton />\n </div>\n </div>\n );\n}\n","export type GaugeChartUIProps = {\n /** Value between 0 and 100 (cents) */\n value: number;\n /** Whether to show percentage label */\n showLabel?: boolean;\n};\n\nexport function GaugeChartUI({ value, showLabel = true }: GaugeChartUIProps) {\n const normalized = 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={`${normalized * 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 {value.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 { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { GaugeChartUI } from \"./gauge-chart.ui\";\n\nexport type EventItemUIProps = {\n event: StandardEvent;\n onSelect?: (event: StandardEvent) => void;\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nexport function EventItemUI({\n event,\n onSelect,\n onSelectOutcome,\n}: EventItemUIProps) {\n const { t } = useTranslation();\n const [manualSelectedMarket, setManualSelectedMarket] =\n useState<StandardMarket | null>(null);\n\n const rawMarkets = event.markets || [];\n const markets =\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n )\n : rawMarkets;\n const openMarkets = markets.filter((market) => market.status === \"active\");\n\n const isSingleMarket = markets.length === 1;\n const selectedMarket = isSingleMarket ? markets[0] : manualSelectedMarket;\n\n const formattedVolume = useMemo(\n () => formatAmountUSDCompact((event.volume ?? 0) / 100),\n [event.volume],\n );\n\n // Get the yes price in cents (0-100) from the market\n // yesAsk / yesBid are in dollars (0~1), multiply by 100 to get cents\n const getYesCents = (market: StandardMarket): number | null => {\n if (market.yesAsk) return parseFloat(market.yesAsk) * 100;\n return null;\n };\n\n const getNoCents = (market: StandardMarket): number | null => {\n if (market.noAsk) return parseFloat(market.noAsk) * 100;\n return null;\n };\n\n const getYesPercent = (market: StandardMarket): string => {\n const yesCents = getYesCents(market);\n const noCents = getNoCents(market);\n if (yesCents != null) {\n if (noCents == null && yesCents <= 1) return \"< 1%\";\n return formatPercent(yesCents);\n }\n if (noCents != null) {\n if (noCents <= 1) return \"> 99%\";\n return formatPercent(100 - noCents);\n }\n return \"0%\";\n };\n\n const getNoPercent = (market: StandardMarket): string => {\n const yesCents = getYesCents(market);\n const noCents = getNoCents(market);\n if (noCents != null) {\n if (yesCents == null && noCents <= 1) return \"< 1%\";\n return formatPercent(noCents);\n }\n if (yesCents != null) {\n if (yesCents <= 1) return \"> 99%\";\n return formatPercent(100 - yesCents);\n }\n return \"0%\";\n };\n\n // Format cents price as percentage string\n const formatPercent = (cents: number | null): string =>\n cents != null ? `${cents.toFixed(0)}%` : \"--\";\n\n // Determine event status based on market statuses\n const eventStatus = useMemo(() => {\n const hasActiveMarket = markets.some((m) => m.status === \"active\");\n const allClosed = markets.every(\n (m) => m.status === \"closed\" || m.status === \"determined\",\n );\n\n if (allClosed)\n return {\n label: t(\"predict.event.status.closed\"),\n color: \"bg-danger-100/50 text-danger\",\n };\n if (hasActiveMarket)\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 }, [markets, t]);\n\n const handleMarketClick = (market: StandardMarket) => {\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 const displayedMarkets = openMarkets.slice(0, 2);\n const hasMoreMarkets = openMarkets.length > 2;\n\n return (\n <div\n className=\"flex h-full 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 @5xl:gap-y-3 @5xl:p-4\"\n onClick={handleSelect}\n >\n <div className=\"flex w-full flex-1 flex-col gap-y-1.5 @5xl:gap-y-3\">\n {/* Header: image, title, status */}\n <div className=\"flex items-center gap-4\">\n <Avatar\n src={event.imageUrl || 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 @5xl:h-12 @5xl:w-12\"\n />\n <StyledTooltip content={event.title} placement=\"bottom\">\n <p className=\"flex-1 min-w-0 h-10 @5xl:h-12 text-sm font-semibold @5xl:text-base line-clamp-2\">\n {event.title}\n </p>\n </StyledTooltip>\n\n {isSingleMarket ? (\n <GaugeChartUI value={getYesCents(markets[0]) ?? 50} />\n ) : (\n eventStatus.label !== t(\"predict.event.status.live\") && (\n <div\n className={`flex-shrink-0 flex items-center gap-x-2 rounded-lg px-2 py-1 text-sm @5xl:px-4 @5xl: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 @5xl:text-sm line-clamp-1\">\n {selectedMarket.yesSubTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-foreground @5xl:text-lg\">\n {getYesPercent(selectedMarket)}\n </span>\n <ChevronUpIcon className=\"w-3 h-3 text-default-500 @5xl:w-4 @5xl: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 @5xl:gap-y-1 @5xl:text-sm\">\n {displayedMarkets.map((market) => (\n <button\n type=\"button\"\n key={market.ticker}\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 @5xl:text-sm line-clamp-1\">\n {market.yesSubTitle}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-xs text-foreground @5xl:text-base\">\n {getYesPercent(market)}\n </span>\n <div className=\"flex h-full items-center gap-x-3 rounded-lg p-1 @5xl: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 {hasMoreMarkets && (\n <span className=\"text-xxs text-default-500 @5xl:text-xs\">\n {t(\"predict.event.moreMarkets\", {\n count: openMarkets.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 @5xl:text-base ${isSingleMarket ? \"mt-3\" : \"\"}`}\n >\n <Button\n color=\"primary\"\n fullWidth\n className=\"group/yes bg-primary-100 text-primary @3xl:!h-12 @3xl:!text-base\"\n size=\"sm\"\n onPress={handleYesClick}\n >\n <span className=\"group-hover/yes:hidden\">\n {t(\"predict.market.yes\")}\n </span>\n <span className=\"hidden group-hover/yes:inline\">\n {getYesPercent(selectedMarket)}\n </span>\n </Button>\n <Button\n color=\"secondary\"\n fullWidth\n className=\"group/no bg-secondary-100 text-secondary @3xl:!h-12 @3xl:!text-base\"\n size=\"sm\"\n onPress={handleNoClick}\n >\n <span className=\"group-hover/no:hidden\">\n {t(\"predict.market.no\")}\n </span>\n <span className=\"hidden group-hover/no:inline\">\n {getNoPercent(selectedMarket)}\n </span>\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 @5xl: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 @5xl:h-4 @5xl:w-4\" />\n </button>\n <span className=\"text-xxs text-default-600 @5xl:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\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 @5xl:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n handleBack();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3 @5xl:h-4 @5xl:w-4\" />\n <span>{t(\"predict.event.back\")}</span>\n </button>\n )}\n </div>\n );\n}\n","import { useCallback, useRef, type CSSProperties } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { EventItemUI } from \"./event-item.ui\";\n\n// Tailwind viewport breakpoints\nconst SM = 640;\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\n/** Gap between cards in px (matches Tailwind gap-4) */\nconst GAP = 16;\n\n/** Row heights per breakpoint (card height + bottom gap) */\nconst ROW_HEIGHT_XS = 192;\nconst ROW_HEIGHT_SM = 228;\nconst ROW_HEIGHT_LG = 244;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= SM) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n if (width >= MD) return ROW_HEIGHT_SM;\n return ROW_HEIGHT_XS;\n}\n\n// ---------------------------------------------------------------------------\n// EventsUI — virtual grid with infinite loading\n// ---------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n /** Events data to render */\n events: StandardEvent[];\n /** Whether there is more data to load */\n hasMore?: boolean;\n /** Callback to fetch more data */\n onFetchMore?: () => void;\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nexport function EventsUI({\n events,\n hasMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n}: EventsUIProps) {\n // --- container dimensions ---\n const containerRef = useRef<HTMLDivElement>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n // --- layout calculations ---\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const totalRowCount = hasMore ? dataRowCount + 1 : dataRowCount;\n\n // --- infinite loader ---\n const isRowLoaded = useCallback(\n (index: number) => index < dataRowCount,\n [dataRowCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount: totalRowCount,\n threshold: 3,\n });\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n {containerHeight > 0 && (\n <List\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventGridRow}\n rowCount={totalRowCount}\n rowHeight={rowHeight}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n gap: GAP,\n onSelect,\n onSelectOutcome,\n }}\n />\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row component — renders a single row of N columns\n// ---------------------------------------------------------------------------\n\ntype EventGridRowData = {\n events: StandardEvent[];\n columnCount: number;\n dataRowCount: number;\n gap: number;\n onSelect?: (event: StandardEvent) => void;\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n};\n\nfunction EventGridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n gap,\n onSelect,\n onSelectOutcome,\n}: RowComponentProps<EventGridRowData>) {\n // Loading indicator for the sentinel row beyond loaded data\n if (index >= dataRowCount) {\n return (\n <div style={style} className=\"flex justify-center items-start pt-4\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const startIdx = index * columnCount;\n const rowEvents = events.slice(startIdx, startIdx + columnCount);\n const emptySlots = columnCount - rowEvents.length;\n\n const innerStyle: CSSProperties = {\n display: \"flex\",\n gap,\n height: `calc(100% - ${gap}px)`,\n };\n\n return (\n <div style={style}>\n <div style={innerStyle}>\n {rowEvents.map((event) => (\n <div key={event.ticker} style={{ flex: 1, minWidth: 0 }}>\n <EventItemUI\n event={event}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n </div>\n ))}\n {/* Spacers to keep equal-width columns on the last row */}\n {emptySlots > 0 &&\n Array.from({ length: emptySlots }).map((_, i) => (\n <div key={`spacer-${i}`} style={{ flex: 1, minWidth: 0 }} />\n ))}\n </div>\n </div>\n );\n}\n","import { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { useEvents, type UseEventsParams } from \"./events.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { EventsUI } from \"./events.ui\";\n\nexport interface EventsWidgetProps extends UseEventsParams {\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}\n\nexport function EventsWidget({\n onSelect,\n onSelectOutcome,\n ...queryParams\n}: EventsWidgetProps) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n } = useEvents({ limit: DEFAULT_PAGE_SIZE, ...queryParams });\n\n if (isFetching) {\n return <EventsSkeleton count={DEFAULT_PAGE_SIZE} />;\n }\n\n return (\n <EventsUI\n events={events}\n hasMore={hasMore}\n onFetchMore={fetchMore}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n );\n}\n","import { useState, useCallback } from \"react\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport {\n CategoriesWidget,\n type CategorySelection,\n} from \"../categories/categories.widget\";\nimport { EventsWidget } from \"./events.widget\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageProps {\n /** Callback when an event is selected */\n onSelect?: (event: StandardEvent) => void;\n /** Callback when an outcome (yes/no) is selected */\n onSelectOutcome?: (\n event: StandardEvent,\n market: StandardMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({ onSelect, onSelectOutcome }: EventsPageProps) {\n const [selection, setSelection] = useState<CategorySelection>({\n category: null,\n tags: null,\n });\n\n const handleSelect = useCallback((s: CategorySelection) => {\n setSelection(s);\n }, []);\n\n return (\n <div className=\"flex h-full w-full flex-col gap-y-3\">\n {/* Category + tag filter bar */}\n <CategoriesWidget onSelect={handleSelect} />\n\n {/* Events grid */}\n <div className=\"min-h-0 flex-1\">\n <EventsWidget\n category={selection.category}\n tags={selection.tags}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n </div>\n </div>\n );\n}\n","// =============================================================================\n// Categories V2 Script\n//\n// Static data source. Tags are hardcoded from:\n// GET https://dev-prediction-markets-api.dflow.net/api/v1/tags_by_categories\n//\n// Slug logic mirrors mapTag() in prediction-server/internal/strategy/dflow/mapper.go:\n// slug = label (the original label string is used as the slug verbatim)\n//\n// This module is intentionally isolated from the v1 categories.script.ts so\n// the two implementations can coexist while v2 is progressively rolled out.\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// Static data — sourced from DFlow API (2025-03-22)\n// -----------------------------------------------------------------------------\n\n/**\n * Raw API shape from GET /api/v1/tags_by_categories.\n * Category keys map to tag arrays (null when the category has no sub-tags).\n */\nconst RAW_TAGS_BY_CATEGORIES: Record<string, string[] | null> = {\n Weather: [\n \"Daily temperature\",\n \"Snow and rain\",\n \"Climate change\",\n \"Natural disasters\",\n \"Hurricanes\",\n ],\n Companies: [\n \"IPOs\",\n \"Product launches\",\n \"KPIs\",\n \"Elon Musk\",\n \"CEOs\",\n \"Layoffs\",\n ],\n Crypto: [\n \"BTC\",\n \"15 min\",\n \"Hourly\",\n \"ETH\",\n \"SOL\",\n \"DOGE\",\n \"Pre-Market\",\n \"XRP\",\n \"BNB\",\n \"HYPE\",\n ],\n Economics: [\n \"Growth\",\n \"Fed\",\n \"Inflation\",\n \"Oil and energy\",\n \"Employment\",\n \"Housing\",\n \"Jobs & Economy\",\n \"Bankruptcy & Defaults\",\n \"GDP\",\n \"Global Central Banks\",\n ],\n Elections: [\"Primaries\", \"International elections\"],\n Entertainment: [\n \"Music\",\n \"Movies\",\n \"Music charts\",\n \"Television\",\n \"Awards\",\n \"Video games\",\n \"Oscars\",\n \"Rotten Tomatoes\",\n ],\n Financials: [\n \"S&P\",\n \"Nasdaq\",\n \"Daily\",\n \"Metals\",\n \"Treasuries\",\n \"Oil\",\n \"EUR/USD\",\n \"USD/JPY\",\n \"WTI\",\n ],\n Mentions: [\"Politicians\", \"Earnings\", \"Entertainment\"],\n Politics: [\n \"Trump\",\n \"Congress\",\n \"International\",\n \"SCOTUS & courts\",\n \"Local\",\n \"Recurring\",\n \"Iran\",\n \"House\",\n ],\n Science: [\"AI\", \"Energy\", \"Space\"],\n Social: null,\n Sports: [\n \"Soccer\",\n \"Basketball\",\n \"Baseball\",\n \"Football\",\n \"Hockey\",\n \"Golf\",\n \"Tennis\",\n \"Motorsport\",\n \"Esports\",\n \"Boxing\",\n \"MMA\",\n \"Rugby\",\n \"Lacrosse\",\n \"Mentions\",\n \"Chess\",\n \"Cricket\",\n \"Aussie Rules\",\n \"Darts\",\n ],\n World: null,\n};\n\n// -----------------------------------------------------------------------------\n// Preferred display order (matches the DFlow category taxonomy)\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER_V2: string[] = [\n \"Politics\",\n \"Sports\",\n \"Crypto\",\n \"Economics\",\n \"Financials\",\n \"Elections\",\n \"Entertainment\",\n \"Companies\",\n \"Science and Technology\",\n \"Climate and Weather\",\n \"Mentions\",\n \"Social\",\n \"World\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * A single category entry in the v2 navigation model.\n *\n * Slug logic: slug === label (verbatim), matching mapTag() in the prediction\n * server's DFlow strategy. Pass the slug directly to DFlow API filters.\n */\nexport interface CategoryItemV2 {\n /** Category slug — equals the label; use directly as DFlow `category` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Tag entries for this category (empty array when the category has no sub-tags) */\n tags: TagItemV2[];\n}\n\n/** A single tag entry in the v2 navigation model */\nexport interface TagItemV2 {\n /** Tag slug — equals the label; use directly as DFlow `tags` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Derived static data\n// -----------------------------------------------------------------------------\n\n/**\n * Sorted category list derived from the static DFlow API snapshot.\n * Memoised at module level — computed once, never re-created.\n */\nexport const CATEGORIES_V2: CategoryItemV2[] = (() => {\n const orderIndex = (cat: string): number => {\n const idx = CATEGORY_ORDER_V2.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER_V2.length : idx;\n };\n\n return Object.entries(RAW_TAGS_BY_CATEGORIES)\n .map(\n ([label, rawTags]): CategoryItemV2 => ({\n slug: label, // mapTag: slug = label\n label,\n tags: (rawTags ?? []).map((t): TagItemV2 => ({ slug: t, label: t })),\n }),\n )\n .sort((a, b) => orderIndex(a.slug) - orderIndex(b.slug));\n})();\n\n// -----------------------------------------------------------------------------\n// Selection type\n// -----------------------------------------------------------------------------\n\n/**\n * Selection emitted by CategoriesWidgetV2.\n *\n * - `categorySlug = null, tagSlug = null` → \"Trending\" (no filter)\n * - `categorySlug = \"Politics\", tagSlug = null` → category selected, all its tags\n * - `categorySlug = \"Politics\", tagSlug = \"Trump\"` → specific tag selected\n */\nexport interface TagSlugSelection {\n /** Selected category slug (null = Trending / no filter) */\n categorySlug: string | null;\n /** Selected tag slug within the category (null = all tags in the category) */\n tagSlug: string | null;\n}\n","// =============================================================================\n// CategoriesWidgetV2\n//\n// V2 version of the categories navigation widget. Key differences from v1:\n//\n// - Data comes from a static hardcoded snapshot (categories.v2.script.ts)\n// instead of a live API call. This removes the query dependency and makes\n// the widget usable without a backend during the transition period.\n//\n// - Callbacks emit `TagSlugSelection` (categorySlug / tagSlug) instead of\n// the v1 `CategorySelection` (category / tags[]). The slug values follow\n// the DFlow mapTag() convention: slug === label verbatim.\n//\n// - UI layer is shared with v1 (CategoriesUI / CategoriesSkeleton) so visual\n// appearance stays consistent.\n//\n// This file is intentionally isolated from v1 (categories.widget.tsx) to allow\n// both to coexist while v2 is progressively rolled out.\n// =============================================================================\nimport { useState, useCallback } from \"react\";\nimport { CategoriesUI, type CategoryItem, type TagItem } from \"./categories.ui\";\nimport {\n CATEGORIES_V2,\n type CategoryItemV2,\n type TagSlugSelection,\n} from \"./categories.v2.script\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type { TagSlugSelection } from \"./categories.v2.script\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface CategoriesWidgetV2Props {\n /**\n * Callback fired when the category / tag selection changes.\n *\n * Slug values follow the DFlow `mapTag()` convention (slug === label):\n * - `{ categorySlug: null, tagSlug: null }` → \"Trending\" (no filter)\n * - `{ categorySlug: \"Crypto\", tagSlug: null }` → category selected\n * - `{ categorySlug: \"Crypto\", tagSlug: \"BTC\" }` → specific tag selected\n */\n onSelect?: (selection: TagSlugSelection) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Optional class name applied to the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Adapter helpers\n// -----------------------------------------------------------------------------\n\n/** Convert v2 CategoryItemV2[] to the shape expected by CategoriesUI */\nfunction toUICategories(items: CategoryItemV2[]): CategoryItem[] {\n return items.map((c) => ({\n category: c.label,\n tags: c.tags.map((t) => t.label),\n }));\n}\n\nfunction toUITags(cat: CategoryItemV2 | undefined): TagItem[] {\n if (!cat) return [];\n return cat.tags.map((t) => ({\n label: t.label,\n icon: t.icon,\n }));\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidgetV2({\n onSelect,\n trailing,\n className,\n}: CategoriesWidgetV2Props) {\n const [selectedCategorySlug, setSelectedCategorySlug] = useState<\n string | null\n >(null);\n const [selectedTagSlug, setSelectedTagSlug] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (categoryLabel: string | null) => {\n setSelectedCategorySlug(categoryLabel); // slug === label in v2\n setSelectedTagSlug(null);\n\n onSelect?.({\n categorySlug: categoryLabel, // null → \"Trending\"\n tagSlug: null,\n });\n },\n [onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tagLabel: string | null) => {\n setSelectedTagSlug(tagLabel); // slug === label in v2\n\n onSelect?.({\n categorySlug: selectedCategorySlug,\n tagSlug: tagLabel,\n });\n },\n [selectedCategorySlug, onSelect],\n );\n\n // --- derive UI data ---\n\n const uiCategories = toUICategories(CATEGORIES_V2);\n\n const activeCat = CATEGORIES_V2.find((c) => c.slug === selectedCategorySlug);\n const activeTags = toUITags(activeCat);\n\n return (\n <CategoriesUI\n categories={uiCategories}\n selectedCategory={selectedCategorySlug}\n selectedTag={selectedTagSlug}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n trailing={trailing}\n className={className}\n />\n );\n}\n","// =============================================================================\n// EventsFilterV2UI\n//\n// Filter modal for the events list. Contains chip-based filter sections:\n// - Platform (source provider)\n// - Sort By (mirrors the toolbar sort dropdown)\n// - Time Remaining\n// - Min Volume\n// - Min Liquidity\n//\n// Pure presentational component — state is managed by the parent page via\n// a draft-and-apply pattern: the modal works on a draft copy of the filter\n// state, and only commits changes when \"Show Results\" is pressed.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n cn,\n StyledModal,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n RefreshIcon,\n} from \"@liberfi.io/ui\";\nimport type { V2ProviderSource } from \"../../client/v2\";\nimport type { SortPreset } from \"./events-toolbar.v2.ui\";\n\n// -----------------------------------------------------------------------------\n// Filter state type\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterState {\n sortPreset: SortPreset;\n sortAsc: boolean;\n source?: V2ProviderSource;\n timeRemaining?: string;\n minVolume?: string;\n minLiquidity?: string;\n}\n\nexport const DEFAULT_FILTER_STATE: EventsFilterState = {\n sortPreset: \"volume\",\n sortAsc: false,\n source: \"dflow\",\n timeRemaining: undefined,\n minVolume: undefined,\n minLiquidity: undefined,\n};\n\n/** Count how many non-default filters are active (excluding sortPreset) */\nexport function countActiveFilters(state: EventsFilterState): number {\n let count = 0;\n if (state.source) count++;\n if (state.timeRemaining) count++;\n if (state.minVolume) count++;\n if (state.minLiquidity) count++;\n return count;\n}\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterV2UIProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback to close the modal */\n onClose: () => void;\n /** Current committed filter state */\n value: EventsFilterState;\n /** Callback when \"Show Results\" is pressed with the new filter state */\n onChange: (state: EventsFilterState) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsFilterV2UI({\n isOpen,\n onClose,\n value,\n onChange,\n}: EventsFilterV2UIProps) {\n const { t } = useTranslation();\n\n // Draft state — local copy modified by user, committed on \"Show Results\"\n const [draft, setDraft] = useState<EventsFilterState>(value);\n\n // Sync draft when the modal opens with new value\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n setDraft(value);\n } else {\n onClose();\n }\n },\n [value, onClose],\n );\n\n const handleReset = useCallback(() => {\n setDraft(DEFAULT_FILTER_STATE);\n }, []);\n\n const handleApply = useCallback(() => {\n onChange(draft);\n onClose();\n }, [draft, onChange, onClose]);\n\n const updateDraft = useCallback(\n <K extends keyof EventsFilterState>(key: K, val: EventsFilterState[K]) => {\n setDraft((prev) => ({ ...prev, [key]: val }));\n },\n [],\n );\n\n const activeCount = useMemo(() => countActiveFilters(draft), [draft]);\n\n // Pre-translate chip labels so the child component receives plain strings\n const platformOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"polymarket\" as const, label: t(\"predict.platform.polymarket\") },\n { value: \"dflow\" as const, label: t(\"predict.platform.dflow\") },\n ],\n [t],\n );\n\n const timeRemainingOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1d\", label: t(\"predict.filter.lessThanDay\") },\n { value: \"7d\", label: t(\"predict.filter.lessThanWeek\") },\n { value: \"30d\", label: t(\"predict.filter.lessThanMonth\") },\n ],\n [t],\n );\n\n const volumeOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n const liquidityOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n size=\"md\"\n scrollBehavior=\"inside\"\n >\n <ModalContent>\n {/* Header */}\n <ModalHeader className=\"px-4 py-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.filter.title\")}\n </span>\n </ModalHeader>\n\n {/* Body */}\n <ModalBody className=\"flex flex-col gap-5\">\n {/* Platform */}\n <FilterSection label={t(\"predict.filter.platform\")}>\n <FilterChipGroup\n options={platformOptions}\n selected={draft.source}\n onSelect={(v) =>\n updateDraft(\"source\", v as V2ProviderSource | undefined)\n }\n />\n </FilterSection>\n\n {/* Time Remaining */}\n <FilterSection label={t(\"predict.filter.timeRemaining\")}>\n <FilterChipGroup\n options={timeRemainingOptions}\n selected={draft.timeRemaining}\n onSelect={(v) => updateDraft(\"timeRemaining\", v)}\n />\n </FilterSection>\n\n {/* Min Volume */}\n <FilterSection label={t(\"predict.filter.minVolume\")}>\n <FilterChipGroup\n options={volumeOptions}\n selected={draft.minVolume}\n onSelect={(v) => updateDraft(\"minVolume\", v)}\n />\n </FilterSection>\n\n {/* Min Liquidity */}\n <FilterSection label={t(\"predict.filter.minLiquidity\")}>\n <FilterChipGroup\n options={liquidityOptions}\n selected={draft.minLiquidity}\n onSelect={(v) => updateDraft(\"minLiquidity\", v)}\n />\n </FilterSection>\n </ModalBody>\n\n {/* Footer */}\n <ModalFooter className=\"px-4\">\n <div className=\"w-full flex justify-between items-center\">\n <Button\n variant=\"light\"\n color=\"default\"\n size=\"sm\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"predict.filter.reset\")}\n </Button>\n <Button\n color=\"primary\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"predict.filter.showResults\")}\n {activeCount > 0 && (\n <span className=\"ml-1 text-xs opacity-80\">({activeCount})</span>\n )}\n </Button>\n </div>\n </ModalFooter>\n </ModalContent>\n </StyledModal>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Filter section wrapper\n// -----------------------------------------------------------------------------\n\nfunction FilterSection({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"flex flex-col gap-2.5\">\n <span className=\"text-sm font-semibold text-foreground\">{label}</span>\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\ninterface ChipOption {\n value: string | undefined;\n label: string;\n}\n\ninterface FilterChipGroupProps {\n options: ChipOption[];\n selected: string | undefined;\n onSelect: (value: string | undefined) => void;\n allowDeselect?: boolean;\n}\n\nfunction FilterChipGroup({\n options,\n selected,\n onSelect,\n allowDeselect = true,\n}: FilterChipGroupProps) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {options.map((opt) => {\n const isActive = selected === opt.value;\n return (\n <button\n key={opt.value ?? \"__all\"}\n type=\"button\"\n onClick={() => {\n if (isActive && allowDeselect) {\n onSelect(undefined);\n } else {\n onSelect(opt.value);\n }\n }}\n className={cn(\n \"shrink-0 rounded-lg px-3 py-1.5 text-xs font-medium transition-colors duration-150 cursor-pointer border\",\n isActive\n ? \"bg-primary/15 text-primary border-primary/40\"\n : \"bg-content2 text-foreground/60 border-default-100 hover:bg-default-100 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","// =============================================================================\n// EventsToolbarV2UI\n//\n// Toolbar bar between categories and the events grid. Contains:\n// - Sort pill: sort-field dropdown + ascending/descending toggle\n// - Filter button with active-filter badge\n//\n// Pixel-level replica of Jupiter's prediction toolbar.\n// Pure presentational component — state is managed by the parent page.\n// =============================================================================\nimport { useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n CalendarIcon,\n ChartLineIcon,\n cn,\n DropletIcon,\n FilterIcon,\n StyledBadge,\n TimerIcon,\n} from \"@liberfi.io/ui\";\nimport type { V2EventSortField } from \"../../client/v2\";\n\n// -----------------------------------------------------------------------------\n// Sort presets\n// -----------------------------------------------------------------------------\n\nexport type SortPreset = \"start_time\" | \"volume\" | \"liquidity\" | \"ending_soon\";\n\nexport const SORT_PRESETS: Record<SortPreset, { sort_by: V2EventSortField }> = {\n start_time: { sort_by: \"created_at\" },\n volume: { sort_by: \"volume\" },\n liquidity: { sort_by: \"liquidity\" },\n ending_soon: { sort_by: \"end_at\" },\n};\n\nconst SORT_LABEL_KEYS = {\n start_time: \"predict.sort.startTime\",\n volume: \"predict.sort.volume\",\n liquidity: \"predict.sort.liquidity\",\n ending_soon: \"predict.sort.endingSoon\",\n} as const;\n\nconst SORT_ORDER: SortPreset[] = [\n \"start_time\",\n \"volume\",\n \"liquidity\",\n \"ending_soon\",\n];\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsToolbarV2UIProps {\n /** Currently active sort preset */\n sortPreset: SortPreset;\n /** Callback when the user picks a different sort preset */\n onSortChange: (preset: SortPreset) => void;\n /** Current sort direction: true = ascending, false = descending */\n sortAsc: boolean;\n /** Callback when the user toggles the sort direction */\n onSortAscChange: (asc: boolean) => void;\n /** Callback when the filter button is pressed */\n onFilterPress: () => void;\n /** Number of currently active filters (shown as badge count) */\n filterCount?: number;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsToolbarV2UI({\n sortPreset,\n onSortChange,\n sortAsc,\n onSortAscChange,\n onFilterPress,\n filterCount = 0,\n className,\n}: EventsToolbarV2UIProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isOpen) return;\n const onClickOutside = (e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"mousedown\", onClickOutside);\n document.addEventListener(\"keydown\", onEscape);\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutside);\n document.removeEventListener(\"keydown\", onEscape);\n };\n }, [isOpen]);\n\n const ActiveIcon = SORT_ICONS[sortPreset];\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n {/* Sort pill — dropdown + direction toggle */}\n <div\n ref={dropdownRef}\n className=\"relative flex shrink-0 items-center rounded-full border border-border\"\n >\n {/* Sort field selector */}\n <button\n type=\"button\"\n onClick={() => setIsOpen((v) => !v)}\n className=\"flex shrink-0 items-center gap-2 px-3 py-1.5 text-xs font-medium text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n <ActiveIcon className=\"size-[18px] shrink-0\" />\n <span className=\"whitespace-nowrap\">\n {t(SORT_LABEL_KEYS[sortPreset])}\n </span>\n </button>\n\n {/* Divider */}\n <div className=\"h-6 w-px bg-border\" />\n\n {/* Sort direction toggle */}\n <button\n type=\"button\"\n onClick={() => onSortAscChange(!sortAsc)}\n className=\"px-2.5 py-1.5 text-xs text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n {sortAsc ? \"↑\" : \"↓\"}\n </button>\n\n {/* Dropdown menu */}\n {isOpen && (\n <div className=\"absolute left-0 top-full z-20 mt-1 flex min-w-max flex-col gap-0.5 rounded-lg border border-border bg-content1 p-1 shadow-lg\">\n {SORT_ORDER.map((key) => {\n const Icon = SORT_ICONS[key];\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => {\n onSortChange(key);\n setIsOpen(false);\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded px-2.5 py-1.5 text-xs font-medium transition-colors cursor-pointer\",\n key === sortPreset\n ? \"bg-primary/10 text-primary\"\n : \"text-neutral hover:bg-content2 hover:text-foreground\",\n )}\n >\n <Icon className=\"size-4 shrink-0\" />\n <span>{t(SORT_LABEL_KEYS[key])}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Filter button */}\n <StyledBadge\n content={filterCount > 0 ? filterCount : undefined}\n color=\"primary\"\n size=\"sm\"\n isInvisible={filterCount === 0}\n >\n <button\n type=\"button\"\n onClick={onFilterPress}\n className=\"flex shrink-0 items-center gap-2 rounded-full border border-border px-3 py-1.5 text-xs font-medium text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n <FilterIcon className=\"size-[18px]\" />\n <span className=\"whitespace-nowrap\">{t(\"predict.filter.title\")}</span>\n </button>\n </StyledBadge>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Sort option icon map\n// -----------------------------------------------------------------------------\n\nconst SORT_ICONS: Record<SortPreset, React.FC<{ className?: string }>> = {\n start_time: CalendarIcon,\n volume: ChartLineIcon,\n liquidity: DropletIcon,\n ending_soon: TimerIcon,\n};\n","// =============================================================================\n// Events V2 Script\n//\n// V2 version of the events data hook. Composes:\n//\n// - resolveEventsV2Params() — builds clean API params from user inputs\n// - useEventsV2InfiniteQuery() — cursor-based infinite query (from hooks/v2)\n//\n// This file owns:\n// - UseEventsV2Params interface (accepts TagSlugSelection + UI-facing options)\n// - UseEventsV2Result interface (flat result with fetchMore / hasMore helpers)\n// - Page flattening + null filtering\n//\n// Data fetching and query key logic live in hooks/v2/useEventsV2InfiniteQuery.ts\n// so they can be reused for SSR prefetching.\n// =============================================================================\nimport { useMemo, useCallback } from \"react\";\nimport type {\n V2Event,\n V2ListEventsParams,\n V2Page,\n V2EventSortField,\n V2EventStatus,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport {\n resolveEventsV2Params,\n useEventsV2InfiniteQuery,\n} from \"../../hooks/v2/useEventsV2InfiniteQuery\";\nimport type { TagSlugSelection } from \"../categories/categories.v2.script\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type {\n V2Event,\n V2ListEventsParams,\n V2Page,\n V2EventSortField,\n V2EventStatus,\n V2ProviderSource,\n};\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Parameters for useEventsV2 */\nexport interface UseEventsV2Params {\n /**\n * Category / tag selection from CategoriesWidgetV2.\n *\n * Mapped to `V2ListEventsParams.tag_slug`:\n * - tagSlug is set → use tagSlug\n * - only categorySlug is set → use categorySlug\n * - both null → no filter (Trending)\n */\n tagSlugSelection?: TagSlugSelection | null;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n limit?: number;\n /** Event lifecycle status filter (default: \"open\") */\n status?: V2EventStatus;\n /** Sort field */\n sort_by?: V2EventSortField;\n /** Ascending sort (default: false → descending) */\n sort_asc?: boolean;\n /** Filter by upstream provider (undefined = all providers) */\n source?: V2ProviderSource;\n /** Include nested markets (default: true) */\n with_markets?: boolean;\n}\n\n/** Return value of useEventsV2 — mirrors the UseEventsResult interface from v1 */\nexport interface UseEventsV2Result {\n /** All accumulated V2 events from all loaded pages */\n data: V2Event[];\n /** True only on initial load (no cache yet) */\n isLoading: boolean;\n /** True whenever a request is in-flight (param change / refetch), excludes fetchMore */\n isFetching: boolean;\n /** True while loading additional pages via fetchMore */\n isFetchingMore: boolean;\n /** True when any query errored */\n isError: boolean;\n /** Error instance, or null */\n error: Error | null;\n /** True when more pages are available */\n hasMore: boolean;\n /** Load the next page */\n fetchMore: () => void;\n /** Refetch all pages from the first */\n refetch: () => void;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * V2 events list hook with cursor-based infinite scroll.\n *\n * Uses the prediction-server v2 client (PredictClientV2) directly, avoiding\n * the legacy DFlow series-lookup path that the v1 `useEvents` hook requires.\n *\n * @example\n * ```tsx\n * const { data, isLoading, hasMore, fetchMore } = useEventsV2({\n * tagSlugSelection: { categorySlug: \"Crypto\", tagSlug: \"BTC\" },\n * limit: 20,\n * });\n * ```\n */\nexport function useEventsV2(params: UseEventsV2Params = {}): UseEventsV2Result {\n const baseParams = useMemo<V2ListEventsParams>(\n () => resolveEventsV2Params(params),\n [\n params.tagSlugSelection,\n params.limit,\n params.status,\n params.sort_by,\n params.sort_asc,\n params.source,\n params.with_markets,\n ],\n );\n\n const {\n data: infiniteData,\n isLoading,\n isFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage,\n refetch,\n } = useEventsV2InfiniteQuery(baseParams);\n\n // Flatten all pages into a single events array, filtering out any null items\n // that the server may include (e.g. deleted or not-yet-indexed events).\n const data = useMemo(\n () =>\n infiniteData?.pages\n .flatMap((page) => page.items)\n .filter((item): item is V2Event => item != null) ?? [],\n [infiniteData],\n );\n\n const fetchMore = useCallback(() => {\n void fetchNextPage();\n }, [fetchNextPage]);\n\n const refetchAll = useCallback(() => {\n void refetch();\n }, [refetch]);\n\n return {\n data,\n isLoading,\n isFetching: isFetching && !isFetchingMore,\n isFetchingMore,\n isError,\n error: error ?? null,\n hasMore: hasMore ?? false,\n fetchMore,\n refetch: refetchAll,\n };\n}\n","// =============================================================================\n// EventItemV2UI\n//\n// V2 event card with three modes:\n// 1. **List view** — header + up to 3 outcome rows with a compact Yes/No\n// pill + footer (Show More / volume).\n// 2. **Single view** — header + single market with large Yes/No buy\n// buttons + View Event link.\n// 3. **Expanded view** — header + single market with large Yes/No buy\n// buttons + Back link.\n//\n// Pixel-perfect clone of the Jupiter Prediction Market card design.\n// =============================================================================\nimport { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Avatar,\n ChevronUpIcon,\n cn,\n KalshiIcon,\n Linkable,\n PolymarketIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market, V2ProviderSource } from \"../../client/v2\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport type EventItemV2UIProps = {\n event: V2Event;\n /** URL for the detail page. When set, header / Show More render as links. */\n href?: string;\n /** Custom link component (e.g. next/link). Passed to Linkable. */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: V2Event) => void;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n /** Called when the card is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n};\n\n// -----------------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------------\n\nconst MAX_DISPLAYED_OUTCOMES = 3;\n\n// -----------------------------------------------------------------------------\n// Outcome color scheme — 8-color palette with deterministic hash selection\n// -----------------------------------------------------------------------------\n\ntype OutcomeColor = { bg: string; text: string; shadow: string };\n\nconst C_PRIMARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-primary) / 0.14)\",\n text: \"hsl(var(--heroui-primary))\",\n shadow: \"hsl(var(--heroui-primary) / 0.18)\",\n};\n\nconst C_SECONDARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-secondary) / 0.14)\",\n text: \"hsl(var(--heroui-secondary))\",\n shadow: \"hsl(var(--heroui-secondary) / 0.18)\",\n};\n\nconst C_RED: OutcomeColor = {\n bg: \"rgba(239, 68, 68, 0.14)\",\n text: \"rgb(239, 68, 68)\",\n shadow: \"rgba(239, 68, 68, 0.18)\",\n};\n\nconst TEAM_PALETTE: OutcomeColor[] = [\n {\n bg: \"rgba(139,92,246,0.14)\",\n text: \"rgb(139,92,246)\",\n shadow: \"rgba(139,92,246,0.18)\",\n },\n {\n bg: \"rgba(34,197,94,0.14)\",\n text: \"rgb(34,197,94)\",\n shadow: \"rgba(34,197,94,0.18)\",\n },\n {\n bg: \"rgba(0,166,212,0.14)\",\n text: \"rgb(0,166,212)\",\n shadow: \"rgba(0,166,212,0.18)\",\n },\n {\n bg: \"rgba(194,120,32,0.14)\",\n text: \"rgb(194,120,32)\",\n shadow: \"rgba(194,120,32,0.18)\",\n },\n {\n bg: \"rgba(202,138,4,0.14)\",\n text: \"rgb(202,138,4)\",\n shadow: \"rgba(202,138,4,0.18)\",\n },\n {\n bg: \"rgba(236,72,153,0.14)\",\n text: \"rgb(236,72,153)\",\n shadow: \"rgba(236,72,153,0.18)\",\n },\n {\n bg: \"rgba(99,102,241,0.14)\",\n text: \"rgb(99,102,241)\",\n shadow: \"rgba(99,102,241,0.18)\",\n },\n {\n bg: \"rgba(244,114,82,0.14)\",\n text: \"rgb(244,114,82)\",\n shadow: \"rgba(244,114,82,0.18)\",\n },\n];\n\nfunction hashString(s: string): number {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = ((hash << 5) - hash + s.charCodeAt(i)) | 0;\n }\n return Math.abs(hash);\n}\n\nfunction getOutcomeColors(market: V2Market): [OutcomeColor, OutcomeColor] {\n const labels =\n market.outcomes?.map((o) => o.label?.toLowerCase().trim() ?? \"\") ?? [];\n\n if (labels.some((l) => l === \"up\") && labels.some((l) => l === \"down\")) {\n return [C_PRIMARY, C_RED];\n }\n\n if (labels.some((l) => l === \"yes\") && labels.some((l) => l === \"no\")) {\n return [C_PRIMARY, C_SECONDARY];\n }\n\n const label0 = labels[0] ?? \"\";\n const label1 = labels[1] ?? \"\";\n const idx0 = hashString(label0) % TEAM_PALETTE.length;\n let idx1 = hashString(label1) % TEAM_PALETTE.length;\n if (idx1 === idx0) idx1 = (idx1 + 1) % TEAM_PALETTE.length;\n\n return [TEAM_PALETTE[idx0], TEAM_PALETTE[idx1]];\n}\n\n// -----------------------------------------------------------------------------\n// Price helpers\n// -----------------------------------------------------------------------------\n\nfunction getYesAsk(market: V2Market): number | null {\n const yes = market.outcomes?.[0];\n if (!yes) return null;\n return yes.best_ask ?? yes.price ?? null;\n}\n\nfunction getYesPercent(market: V2Market): number {\n const price = getYesAsk(market);\n return price != null ? Math.round(price * 100) : 0;\n}\n\nfunction formatPercent(value: number): string {\n if (value <= 1 && value > 0) return \"< 1%\";\n if (value >= 99 && value < 100) return \"> 99%\";\n return `${value}%`;\n}\n\nfunction getYesCents(market: V2Market): string {\n const yes = market.outcomes?.[0];\n const price = yes?.best_ask ?? yes?.price ?? 0;\n return (price * 100).toFixed(1);\n}\n\nfunction getNoCents(market: V2Market): string {\n const no = market.outcomes?.[1];\n if (no) {\n const price = no.best_ask ?? no.price ?? 0;\n return Math.round(price * 100).toString();\n }\n const yes = market.outcomes?.[0];\n const yesPrice = yes?.best_ask ?? yes?.price ?? 0;\n return Math.round((1 - yesPrice) * 100).toString();\n}\n\n// -----------------------------------------------------------------------------\n// Countdown helpers\n// -----------------------------------------------------------------------------\n\nfunction formatCountdown(isoDate: string): string | null {\n const diff = new Date(isoDate).getTime() - Date.now();\n if (diff <= 0) return null;\n\n const d = Math.floor(diff / 86_400_000);\n const h = Math.floor((diff % 86_400_000) / 3_600_000);\n const m = Math.floor((diff % 3_600_000) / 60_000);\n\n const parts: string[] = [];\n if (d > 0) parts.push(`${d}d`);\n if (h > 0) parts.push(`${h}h`);\n parts.push(`${m}m`);\n\n return parts.join(\" \");\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nconst injectedCSS = `\n.badge-shine { position: relative; overflow: hidden; }\n.badge-shine::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(120deg,\n transparent 0%, transparent 30%,\n rgba(255,255,255,0.15) 45%, rgba(255,255,255,0.25) 50%,\n rgba(255,255,255,0.15) 55%, transparent 70%, transparent 100%);\n transform: translate(-200%);\n animation: badge-shine-sweep 6s ease-in-out infinite;\n}\n@keyframes badge-shine-sweep {\n 0% { transform: translate(-200%); }\n 60% { transform: translate(200%); }\n 100% { transform: translate(200%); }\n}\n`;\n\nexport function EventItemV2UI({\n event,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n onHover,\n}: EventItemV2UIProps) {\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const rawMarkets = event.markets ?? [];\n const markets = useMemo(\n () =>\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) =>\n (b.outcomes?.[0]?.price ?? 0) - (a.outcomes?.[0]?.price ?? 0),\n )\n : rawMarkets,\n [rawMarkets],\n );\n\n const openMarkets = markets.filter((m) => m.status === \"open\");\n const singleMarket = markets.length === 1;\n const displayedMarkets = openMarkets.slice(0, MAX_DISPLAYED_OUTCOMES);\n const moreCount = openMarkets.length - MAX_DISPLAYED_OUTCOMES;\n\n const formattedVolume = useMemo(() => {\n const vol = Math.round(event.volume ?? 0);\n return `$${vol.toLocaleString(\"en-US\")}`;\n }, [event.volume]);\n\n const expandedMarket = expandedSlug\n ? (openMarkets.find((m) => m.slug === expandedSlug) ?? null)\n : null;\n\n const isExpanded = !!expandedMarket || singleMarket;\n\n // -- handlers --\n\n const handleCardClick = () => {\n if (!isExpanded) {\n onSelect?.(event);\n }\n };\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (expandedMarket) {\n e.preventDefault();\n setExpandedSlug(null);\n }\n };\n\n const handleShowMore = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n return (\n <div\n className={cn(\n \"group flex h-full w-full flex-col rounded-xl\",\n \"min-h-52 border border-border/90 bg-background p-3\",\n \"lg:min-h-72 lg:max-w-md lg:p-4\",\n \"gap-y-1.5 lg:gap-y-4\",\n \"transition duration-300\",\n \"hover:border-primary/40 hover:shadow-card-glow\",\n \"focus-within:border-primary/40 focus-within:shadow-card-glow\",\n !isExpanded && \"cursor-pointer\",\n )}\n onMouseEnter={() => onHover?.(event)}\n onClick={handleCardClick}\n >\n <style>{injectedCSS}</style>\n {/* ---- Header ---- */}\n <CardHeader\n event={event}\n href={href}\n LinkComponent={LinkComponent}\n onClick={handleHeaderClick}\n isExpanded={isExpanded}\n />\n\n {/* ---- Body ---- */}\n <div className=\"flex flex-1 flex-col\">\n {singleMarket ? (\n <SingleMarketView\n market={openMarkets[0]}\n event={event}\n formattedVolume={formattedVolume}\n href={href}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n ) : expandedMarket ? (\n <ExpandedMarketView\n market={expandedMarket}\n event={event}\n onCollapse={() => setExpandedSlug(null)}\n onSelectOutcome={onSelectOutcome}\n />\n ) : (\n <MarketListView\n displayedMarkets={displayedMarkets}\n moreCount={moreCount}\n formattedVolume={formattedVolume}\n source={event.source}\n href={href}\n LinkComponent={LinkComponent}\n onMarketClick={(m) => setExpandedSlug(m.slug)}\n onShowMore={handleShowMore}\n />\n )}\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card header (avatar + title + badges)\n// -----------------------------------------------------------------------------\n\nfunction CardHeader({\n event,\n href,\n LinkComponent,\n onClick,\n isExpanded,\n}: {\n event: V2Event;\n href?: string;\n LinkComponent?: LinkComponentType;\n onClick: React.MouseEventHandler;\n isExpanded: boolean;\n}) {\n const countdown = event.start_at ? formatCountdown(event.start_at) : null;\n\n const cls =\n \"group/header flex items-center gap-x-2 lg:gap-x-4 w-full text-left cursor-pointer\";\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className={cls}\n onClick={onClick}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className=\"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover/header:scale-110 lg:h-12 lg:w-12\"\n classNames={{ base: \"bg-transparent\" }}\n />\n <div className=\"flex min-w-0 flex-1 flex-col justify-center gap-y-0.5\">\n <p\n className={cn(\n \"min-w-0 text-sm font-semibold leading-snug text-slate-200 line-clamp-2 lg:text-base\",\n isExpanded && \"group-hover/header:text-neutral-400\",\n )}\n >\n {event.title}\n </p>\n {countdown && (\n <span className=\"text-[10px] leading-4 text-neutral-500\">\n Live in {countdown}\n </span>\n )}\n </div>\n <EventIndicators event={event} />\n </Linkable>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Event indicator badges (Live / Crypto Countdown / Closed)\n// -----------------------------------------------------------------------------\n\ntype BadgeType =\n | { kind: \"live\" }\n | { kind: \"crypto-short\"; label: string; color: string }\n | { kind: \"closed\" };\n\nfunction getEventBadges(event: V2Event): BadgeType[] {\n const badges: BadgeType[] = [];\n\n if (event.status === \"closed\") {\n badges.push({ kind: \"closed\" });\n return badges.slice(0, 2);\n }\n\n const isCrypto = event.tags?.some((t) => t.label?.toLowerCase() === \"crypto\");\n const isLive = event.tags?.some((t) => t.label?.toLowerCase() === \"live\");\n\n if (isCrypto && event.end_at) {\n const remaining = new Date(event.end_at).getTime() - Date.now();\n const fiveMin = 5 * 60 * 1000;\n const fifteenMin = 15 * 60 * 1000;\n\n if (remaining > 0 && remaining <= fifteenMin) {\n const cryptoColor = remaining <= fiveMin ? \"#ef4444\" : \"#f59e0b\";\n badges.push({\n kind: \"crypto-short\",\n label: remaining <= fiveMin ? \"5m\" : \"15m\",\n color: cryptoColor,\n });\n }\n }\n\n if (isLive) {\n badges.push({ kind: \"live\" });\n }\n\n return badges.slice(0, 2);\n}\n\nfunction EventIndicators({ event }: { event: V2Event }) {\n const badges = useMemo(() => getEventBadges(event), [event]);\n\n if (badges.length === 0) return null;\n\n return (\n <div className=\"flex flex-shrink-0 flex-col items-end gap-1\">\n {badges.map((badge, i) => {\n switch (badge.kind) {\n case \"live\":\n return <LiveBadge key={i} />;\n case \"crypto-short\":\n return (\n <CryptoCountdownBadge\n key={i}\n label={badge.label}\n color={badge.color}\n />\n );\n case \"closed\":\n return <ClosedBadge key={i} />;\n }\n })}\n </div>\n );\n}\n\nfunction LiveBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md bg-[rgb(240,68,56)]/10 px-1.5 py-0.5 text-xs font-semibold text-[rgb(240,68,56)]\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-current\" />\n {t(\"predict.event.status.live\")}\n </span>\n );\n}\n\nfunction CryptoCountdownBadge({\n label,\n color,\n}: {\n label: string;\n color: string;\n}) {\n return (\n <span\n className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md px-1.5 py-0.5 text-xs font-semibold\"\n style={{\n backgroundColor: `${color}26`,\n color,\n }}\n >\n <TimerIcon className=\"size-3 shrink-0\" />\n {label}\n </span>\n );\n}\n\nfunction ClosedBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"inline-flex items-center rounded-md bg-neutral-800/80 px-1.5 py-0.5 text-xs font-semibold text-neutral-400\">\n {t(\"predict.event.status.closed\")}\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Market list view (normal card body)\n// -----------------------------------------------------------------------------\n\nfunction MarketListView({\n displayedMarkets,\n moreCount,\n formattedVolume,\n source,\n href,\n LinkComponent,\n onMarketClick,\n onShowMore,\n}: {\n displayedMarkets: V2Market[];\n moreCount: number;\n formattedVolume: string;\n source: V2ProviderSource;\n href?: string;\n LinkComponent?: LinkComponentType;\n onMarketClick: (market: V2Market) => void;\n onShowMore: React.MouseEventHandler;\n}) {\n const { t } = useTranslation();\n\n return (\n <>\n {displayedMarkets.length > 0 && (\n <div className=\"flex w-full flex-1 flex-col gap-y-0.5 lg:gap-y-2\">\n {displayedMarkets.map((market) => {\n const pct = getYesPercent(market);\n return (\n <button\n type=\"button\"\n key={market.slug}\n className=\"flex 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 onMarketClick(market);\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 line-clamp-1 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <YesNoPill />\n </div>\n </button>\n );\n })}\n </div>\n )}\n\n {/* Footer */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n {moreCount > 0 ? (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-neutral-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={onShowMore}\n >\n {t(\"predict.event.showMore\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n ) : (\n <div />\n )}\n <span className=\"inline-flex items-center gap-x-1.5 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={source} />\n </span>\n </div>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Elevated button (matches Jupiter design exactly)\n// -----------------------------------------------------------------------------\n\nfunction ElevatedButton({\n bgColor,\n textColor,\n shadowColor,\n onClick,\n children,\n}: {\n bgColor: string;\n textColor: string;\n shadowColor: string;\n onClick: React.MouseEventHandler;\n children: React.ReactNode;\n}) {\n const handleEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"2px\");\n el.style.transform = \"translateY(2px)\";\n };\n\n const handleLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"4px\");\n el.style.transform = \"translateY(0px)\";\n };\n\n return (\n <button\n type=\"button\"\n className=\"flex h-12 flex-1 w-full items-center justify-center gap-x-1 overflow-hidden rounded-lg p-3 text-base font-normal hover:cursor-pointer will-change-transform [-webkit-tap-highlight-color:transparent]\"\n style={\n {\n backgroundColor: bgColor,\n color: textColor,\n \"--shadow-color\": shadowColor,\n \"--shadow-offset\": \"4px\",\n boxShadow:\n \"inset 0 -1px 0 rgba(255,255,255,0.08), 0 var(--shadow-offset, 4px) 0 var(--shadow-color, rgba(0,0,0,0.22))\",\n transition: \"transform .12s, box-shadow .12s, opacity .14s\",\n } as React.CSSProperties\n }\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Outcome buy buttons (shared by SingleMarketView & ExpandedMarketView)\n// -----------------------------------------------------------------------------\n\nfunction OutcomeButtons({\n market,\n event,\n onSelectOutcome,\n dynamicColors = false,\n labelFormat = \"action\",\n}: {\n market: V2Market;\n event: V2Event;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n dynamicColors?: boolean;\n /** \"action\" → \"Yes XX.X¢\" / \"No XX¢\", \"label\" → \"Label XX¢\" */\n labelFormat?: \"action\" | \"label\";\n}) {\n const { t } = useTranslation();\n const [c0, c1] = dynamicColors\n ? getOutcomeColors(market)\n : [C_PRIMARY, C_SECONDARY];\n\n const yesLabel =\n labelFormat === \"label\"\n ? `${market.outcomes?.[0]?.label ?? \"Yes\"} ${getYesCents(market)}¢`\n : t(\"predict.market.action.yes\", { price: getYesCents(market) });\n\n const noLabel =\n labelFormat === \"label\"\n ? `${market.outcomes?.[1]?.label ?? \"No\"} ${getNoCents(market)}¢`\n : t(\"predict.market.action.no\", { price: getNoCents(market) });\n\n return (\n <div className=\"flex gap-2\">\n <ElevatedButton\n bgColor={c0.bg}\n textColor={c0.text}\n shadowColor={c0.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"yes\");\n }}\n >\n {yesLabel}\n </ElevatedButton>\n <ElevatedButton\n bgColor={c1.bg}\n textColor={c1.text}\n shadowColor={c1.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"no\");\n }}\n >\n {noLabel}\n </ElevatedButton>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Yes / No pill (compact, used in list rows)\n// -----------------------------------------------------------------------------\n\nfunction YesNoPill() {\n const { t } = useTranslation();\n\n return (\n <span className=\"inline-flex h-7 w-[85px] items-center justify-center gap-x-3 rounded-lg p-1.5 text-xs font-semibold flex-shrink-0 bg-gradient-to-r from-primary/15 to-secondary/15 lg:h-9 lg:w-24 lg:gap-x-4 lg:p-2 lg:text-sm\">\n <span className=\"text-primary\">{t(\"predict.market.yes\")}</span>\n <span className=\"text-neutral-400\">/</span>\n <span className=\"text-secondary\">{t(\"predict.market.no\")}</span>\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market view (only 1 open market — show buttons directly + View Event)\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketView({\n market,\n event,\n formattedVolume,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n}: {\n market: V2Market;\n event: V2Event;\n formattedVolume: string;\n href?: string;\n LinkComponent?: LinkComponentType;\n onSelect?: (event: V2Event) => void;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n const { t } = useTranslation();\n\n const handleViewEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n return (\n <>\n <div className=\"flex-1\">\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n dynamicColors\n labelFormat=\"label\"\n />\n </div>\n\n {/* Footer: View Event + Volume */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-neutral-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={handleViewEvent}\n >\n {t(\"predict.event.viewEvent\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n <span className=\"inline-flex items-center gap-x-1.5 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </div>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market view (single market with large Yes/No buttons)\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketView({\n market,\n event,\n onCollapse,\n onSelectOutcome,\n}: {\n market: V2Market;\n event: V2Event;\n onCollapse: () => void;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n const { t } = useTranslation();\n const pct = getYesPercent(market);\n\n return (\n <>\n <div className=\"flex-1\">\n {/* Market header with collapse toggle */}\n <button\n type=\"button\"\n className=\"flex h-9 w-full items-center justify-between cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-1 flex-shrink-0\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <ChevronUpIcon className=\"h-4 w-4 text-neutral-400\" />\n </div>\n </button>\n\n {/* Yes / No buy buttons */}\n <div className=\"mt-3\">\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n labelFormat=\"action\"\n />\n </div>\n </div>\n\n {/* Back */}\n <button\n type=\"button\"\n className=\"mt-auto flex items-center gap-x-1 pt-4 text-[10px] font-normal text-neutral-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3\" />\n {t(\"predict.event.back\")}\n </button>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Inline icons\n// -----------------------------------------------------------------------------\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M4.5 2.5L8 6l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Source (platform) icons\n// -----------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: V2ProviderSource }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","// =============================================================================\n// EventsV2UI\n//\n// V2 version of the events virtual grid. Accepts `V2Event[]` instead of the\n// legacy `StandardEvent[]`, and delegates card rendering to `EventItemV2UI`.\n//\n// Layout: responsive 1-4 column grid with react-window virtualisation and\n// infinite-scroll sentinel row. Pixel-perfect Jupiter Prediction Market clone.\n// =============================================================================\nimport { useCallback, useRef } from \"react\";\nimport {\n List,\n type ListImperativeAPI,\n type RowComponentProps,\n} from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport { EventItemV2UI } from \"./event-item.v2.ui\";\n\n// Tailwind viewport breakpoints (px)\n// const SM = 640;\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\n/** Extra inset in each card cell so the hover glow shadow is not clipped. */\nconst GLOW_INSET = 8;\n\n/** Row heights per breakpoint: card min-height + gap (16px) */\nconst ROW_HEIGHT_SM = 224; // mobile: 208 + 16\nconst ROW_HEIGHT_LG = 304; // desktop: 288 + 16\n\n/** Height of the end-of-list footer row */\nconst END_ROW_HEIGHT = 114;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= MD) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n return ROW_HEIGHT_SM;\n}\n\n// -----------------------------------------------------------------------------\n// EventsV2UI\n// -----------------------------------------------------------------------------\n\nexport type EventsV2UIProps = {\n /** V2 events to render */\n events: V2Event[];\n /** Whether more data is available */\n hasMore?: boolean;\n /** Callback to request the next page */\n onFetchMore?: () => void;\n /** Callback when a card is selected */\n onSelect?: (event: V2Event) => void;\n /** Callback when an outcome button (yes/no) is pressed */\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n};\n\nexport function EventsV2UI({\n events,\n hasMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsV2UIProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<ListImperativeAPI>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const showEndOfList = !hasMore && events.length > 0;\n const totalRowCount =\n dataRowCount + (hasMore ? 1 : 0) + (showEndOfList ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < dataRowCount,\n [dataRowCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount: totalRowCount,\n threshold: 3,\n });\n\n const handleScrollToTop = useCallback(() => {\n listRef.current?.scrollToRow({ index: 0, behavior: \"smooth\" });\n }, []);\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n {containerHeight > 0 && (\n <List\n listRef={listRef}\n className=\"no-scrollbar\"\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventV2GridRow}\n rowCount={totalRowCount}\n rowHeight={(index) => {\n if (showEndOfList && index === totalRowCount - 1)\n return END_ROW_HEIGHT;\n if (hasMore && index >= dataRowCount) return rowHeight;\n return rowHeight;\n }}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop: handleScrollToTop,\n }}\n />\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Row component\n// -----------------------------------------------------------------------------\n\ntype EventV2GridRowData = {\n events: V2Event[];\n columnCount: number;\n dataRowCount: number;\n showEndOfList: boolean;\n totalRowCount: number;\n onSelect?: (event: V2Event) => void;\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n getEventHref?: (event: V2Event) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: V2Event) => void;\n onScrollToTop?: () => void;\n};\n\nfunction EventV2GridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop,\n}: RowComponentProps<EventV2GridRowData>) {\n // End-of-list footer row\n if (showEndOfList && index === totalRowCount - 1) {\n return (\n <div style={style}>\n <EndOfListRow onScrollToTop={onScrollToTop} />\n </div>\n );\n }\n\n // Sentinel row — show spinner while the next page loads\n if (index >= dataRowCount) {\n return (\n <div style={style} className=\"flex justify-center items-start pt-4\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const startIdx = index * columnCount;\n const rowEvents = events.slice(startIdx, startIdx + columnCount);\n const emptySlots = columnCount - rowEvents.length;\n\n return (\n <div style={style}>\n <div className=\"flex w-full h-full\">\n {rowEvents.map((event) =>\n event == null ? null : (\n <div\n className=\"flex-1 min-w-0 flex\"\n key={event.slug}\n style={{ padding: GLOW_INSET }}\n >\n <EventItemV2UI\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n onHover={onHover}\n />\n </div>\n ),\n )}\n {/* Spacers to maintain equal column widths on the last row */}\n {emptySlots > 0 &&\n Array.from({ length: emptySlots }).map((_, i) => (\n <div key={`spacer-${i}`} style={{ flex: 1, minWidth: 0 }} />\n ))}\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// End of list + Back to top\n// -----------------------------------------------------------------------------\n\nfunction EndOfListRow({ onScrollToTop }: { onScrollToTop?: () => void }) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex w-full flex-col items-center justify-center gap-y-4 py-6\">\n {/* Divider line with text */}\n <div className=\"flex w-full items-center justify-center gap-x-4\">\n <div className=\"h-px w-16 bg-neutral-700\" />\n <span className=\"text-xs font-medium text-neutral-500\">\n {t(\"predict.event.endOfList\")}\n </span>\n <div className=\"h-px w-16 bg-neutral-700\" />\n </div>\n\n {/* Back to top button */}\n <button\n type=\"button\"\n className=\"flex cursor-pointer items-center gap-x-1 text-xs font-medium text-neutral-400\"\n onClick={onScrollToTop}\n >\n <span className=\"iconify size-4 ph--arrow-up-bold\" />\n <span>{t(\"predict.event.backToTop\")}</span>\n </button>\n </div>\n );\n}\n","// =============================================================================\n// EventsWidgetV2\n//\n// Container widget that wires useEventsV2 (data) to EventsV2UI (presentation).\n// Replaces EventsWidget (v1) for components that have already migrated to the\n// prediction-server v2 client and CategoriesWidgetV2 slug-based selection.\n//\n// Accepts `tagSlugSelection` (TagSlugSelection from CategoriesWidgetV2) instead\n// of the v1 `category` / `tags[]` pair, keeping the API consistent with the\n// rest of the v2 surface.\n// =============================================================================\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type {\n V2Event,\n V2Market,\n V2EventStatus,\n V2EventSortField,\n V2ProviderSource,\n} from \"../../client/v2\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport type { TagSlugSelection } from \"../categories/categories.v2.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { useEventsV2 } from \"./events.v2.script\";\nimport { EventsV2UI } from \"./events.v2.ui\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type { TagSlugSelection } from \"../categories/categories.v2.script\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsWidgetV2Props {\n /**\n * Category / tag selection from CategoriesWidgetV2.\n * Passed through directly to useEventsV2.\n */\n tagSlugSelection?: TagSlugSelection | null;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n limit?: number;\n /** Event lifecycle status filter (default: \"open\") */\n status?: V2EventStatus;\n /** Sort field */\n sort_by?: V2EventSortField;\n /** Ascending sort order (default: false → descending) */\n sort_asc?: boolean;\n /** Filter by upstream provider (undefined = all providers) */\n source?: V2ProviderSource;\n /** Include nested markets in the response (default: true) */\n with_markets?: boolean;\n /** Callback when an event card is selected */\n onSelect?: (event: V2Event) => void;\n /** Callback when an outcome button (yes/no) is pressed */\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function EventsWidgetV2({\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsWidgetV2Props) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n } = useEventsV2({\n tagSlugSelection,\n limit,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n });\n\n if (isFetching) {\n return <EventsSkeleton count={DEFAULT_PAGE_SIZE} />;\n }\n\n return (\n <EventsV2UI\n events={events}\n hasMore={hasMore}\n onFetchMore={fetchMore}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n );\n}\n","// =============================================================================\n// EventsPageV2\n//\n// V2 version of the events page. Composes:\n// - CategoriesWidgetV2 — category / tag navigation (static data, slug-based)\n// - EventsToolbarV2UI — sort dropdown + filter button\n// - EventsFilterV2UI — filter modal (platform, sort, time, volume, liquidity)\n// - EventsWidgetV2 — events grid backed by the prediction-server v2 client\n//\n// Owns the sort/filter state and converts it to API params for the widget.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport type { TagSlugSelection } from \"../categories/categories.v2.script\";\nimport { CategoriesWidgetV2 } from \"../categories/categories.v2.widget\";\nimport {\n EventsFilterV2UI,\n countActiveFilters,\n DEFAULT_FILTER_STATE,\n type EventsFilterState,\n} from \"./events-filter.v2.ui\";\nimport {\n EventsToolbarV2UI,\n SORT_PRESETS,\n type SortPreset,\n} from \"./events-toolbar.v2.ui\";\nimport { EventsWidgetV2 } from \"./events.v2.widget\";\n\n// Re-export types so page consumers have a single import point.\nexport type { TagSlugSelection } from \"../categories/categories.v2.script\";\nexport type { SortPreset } from \"./events-toolbar.v2.ui\";\nexport type { EventsFilterState } from \"./events-filter.v2.ui\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageV2Props {\n /** Callback when an event card is selected */\n onSelect?: (event: V2Event) => void;\n /** Callback when an outcome button (yes / no) is pressed */\n onSelectOutcome?: (\n event: V2Event,\n market: V2Market,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPageV2({\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsPageV2Props) {\n // Category / tag selection\n const [tagSlugSelection, setTagSlugSelection] = useState<TagSlugSelection>({\n categorySlug: null,\n tagSlug: null,\n });\n\n // Sort / filter state\n const [filterState, setFilterState] =\n useState<EventsFilterState>(DEFAULT_FILTER_STATE);\n\n // Filter modal disclosure\n const {\n isOpen: isFilterOpen,\n onOpen: openFilter,\n onClose: closeFilter,\n } = useDisclosure();\n\n // Handlers\n const handleCategorySelect = useCallback((selection: TagSlugSelection) => {\n setTagSlugSelection(selection);\n }, []);\n\n const handleSortChange = useCallback((preset: SortPreset) => {\n setFilterState((prev) => ({ ...prev, sortPreset: preset }));\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setFilterState((prev) => ({ ...prev, sortAsc: asc }));\n }, []);\n\n const handleFilterChange = useCallback((state: EventsFilterState) => {\n setFilterState(state);\n }, []);\n\n // Derive API sort_by from filter state\n const sortBy = useMemo(\n () => SORT_PRESETS[filterState.sortPreset].sort_by,\n [filterState.sortPreset],\n );\n\n const filterCount = useMemo(\n () => countActiveFilters(filterState),\n [filterState],\n );\n\n const toolbar = (\n <EventsToolbarV2UI\n sortPreset={filterState.sortPreset}\n onSortChange={handleSortChange}\n sortAsc={filterState.sortAsc}\n onSortAscChange={handleSortAscChange}\n onFilterPress={openFilter}\n filterCount={filterCount}\n />\n );\n\n return (\n <div className=\"flex h-full w-full max-w-[1680px] mx-auto flex-col gap-y-3\">\n {/* Navigation: categories + tags (with toolbar trailing the primary row) */}\n <CategoriesWidgetV2 onSelect={handleCategorySelect} trailing={toolbar} />\n\n {/* Filter modal */}\n <EventsFilterV2UI\n isOpen={isFilterOpen}\n onClose={closeFilter}\n value={filterState}\n onChange={handleFilterChange}\n />\n\n {/* Events grid */}\n <div className=\"min-h-0 flex-1\">\n <EventsWidgetV2\n tagSlugSelection={tagSlugSelection}\n sort_by={sortBy}\n sort_asc={filterState.sortAsc}\n source={filterState.source}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useCallback, useEffect, useContext } from \"react\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport { ORDER_MIN_QUANTITY } from \"../../consts\";\nimport { UserPredictContext } from \"../../contexts/UserPredictContext\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport { useOrderQuery, useOrderStatusQuery } from \"../../hooks/useOrderQuery\";\nimport type {\n StandardMarket,\n OrderResponse,\n OrderStatusResponse,\n MarketAccountInfo,\n} from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Trade outcome - yes or no */\nexport type TradeOutcome = \"yes\" | \"no\";\n\n/** Trade side - buy or sell */\nexport type TradeSide = \"buy\" | \"sell\";\n\nexport interface UseTradeFormParams {\n /** Market to trade in */\n market: StandardMarket;\n /** Chain network to use (default: 'solana') */\n chain?: string;\n /** Initial trade outcome */\n initialOutcome?: TradeOutcome;\n /** Initial trade side */\n initialSide?: TradeSide;\n}\n\nexport interface TradeFormValidation {\n isValid: boolean;\n errors: string[];\n}\n\nexport interface UseTradeFormResult {\n // -- State ------------------------------------------------------------------\n /** Current outcome (yes/no) */\n outcome: TradeOutcome;\n /** Current side (buy/sell) */\n side: TradeSide;\n /** Number of contracts */\n quantity: number;\n\n // -- Derived ----------------------------------------------------------------\n /** Number of shares (buy: amount / price, sell: quantity) */\n shares: number;\n /** Estimated cost in dollars */\n estimatedCost: number;\n /** Potential payout in dollars */\n potentialPayout: number;\n /** Potential profit in dollars */\n potentialProfit: number;\n /** Whether the user is authenticated */\n isAuthenticated: boolean;\n /** Best bid price from order book (cents) */\n bestBid: number | null;\n /** Best ask price from order book (cents) */\n bestAsk: number | null;\n /** Current order response from the API (includes quote + transaction) */\n order: OrderResponse | null;\n /** Price impact percentage */\n priceImpact: number | null;\n\n // -- Balances ---------------------------------------------------------------\n /** USDC balance in dollars (for buy side) */\n usdcBalance: number | null;\n /** Outcome token balance in token units (for sell side) */\n outcomeTokenBalance: number | null;\n /** Yes token balance (shares held) */\n yesTokenBalance: number | null;\n /** No token balance (shares held) */\n noTokenBalance: number | null;\n /** Whether balance is being fetched */\n isBalanceLoading: boolean;\n\n // -- Status -----------------------------------------------------------------\n /** Whether order/quote is being fetched */\n isQuoteLoading: boolean;\n /** Whether a transaction is being signed/sent or order is pending */\n isSubmitting: boolean;\n /** Order/quote fetch error (if any) */\n quoteError: Error | null;\n /** Transaction hash after successful send */\n txHash: string | null;\n /** Order status polling result (null before submit or after reset) */\n orderStatus: OrderStatusResponse | null;\n /** Form validation result */\n validation: TradeFormValidation;\n\n // -- Actions ----------------------------------------------------------------\n /** Set outcome */\n setOutcome: (outcome: TradeOutcome) => void;\n /** Set side */\n setSide: (side: TradeSide) => void;\n /** Set quantity (minimum ORDER_MIN_QUANTITY) */\n setQuantity: (quantity: number) => void;\n /** Submit the swap */\n submit: () => void;\n /** Reset form to initial values */\n reset: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get mint address for the specified outcome from market accounts.\n * `accounts` is keyed by collateral token mint (e.g. USDC mint), not by chain.\n */\nfunction getMintAddress(\n accounts: Record<string, MarketAccountInfo>,\n collateralMint: string,\n outcome: TradeOutcome,\n): string | null {\n const accountInfo = accounts[collateralMint];\n if (!accountInfo) return null;\n return outcome === \"yes\" ? accountInfo.yesMint : accountInfo.noMint;\n}\n\nconst USDC_MINT = SOLANA_TOKENS.stablecoins.USDC.address;\n\n/** Fire a celebration confetti burst 🎉 */\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n\n // Center burst\n confetti({\n ...defaults,\n particleCount: 80,\n origin: { x: 0.5, y: 0.4 },\n });\n\n // Left side\n setTimeout(() => {\n confetti({\n ...defaults,\n particleCount: 40,\n origin: { x: 0.3, y: 0.6 },\n });\n }, 150);\n\n // Right side\n setTimeout(() => {\n confetti({\n ...defaults,\n particleCount: 40,\n origin: { x: 0.7, y: 0.6 },\n });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeForm({\n market,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chain: _chain = \"solana\",\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormParams): UseTradeFormResult {\n const { t } = useTranslation();\n\n // USDC balance from predict context (populated by UserPredictProvider)\n const userPredictCtx = useContext(UserPredictContext);\n\n // Auth & wallet from wallet-connector\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n\n // Form state\n const [outcome, setOutcome] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n\n // Get the outcome mint address (accounts are keyed by collateral mint, e.g. USDC)\n const outcomeMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, outcome),\n [market.accounts, outcome],\n );\n\n // Determine input/output mints based on side\n const { inputMint, outputMint } = useMemo(() => {\n if (side === \"buy\") {\n // Buying outcome tokens: USDC -> Outcome Mint\n return { inputMint: USDC_MINT, outputMint: outcomeMint };\n }\n // Selling outcome tokens: Outcome Mint -> USDC\n return { inputMint: outcomeMint, outputMint: USDC_MINT };\n }, [side, outcomeMint]);\n\n // Quote query (enabled only when we have valid mints and quantity)\n const quoteEnabled =\n Boolean(inputMint) && Boolean(outputMint) && quantity > 0;\n\n // Current price per share (0–1, in dollars)\n const pricePerShare = useMemo(() => {\n if (outcome === \"yes\") {\n return Number(market.yesAsk ?? 0.5);\n }\n return Number(market.noAsk ?? 0.5);\n }, [outcome, market.yesAsk, market.noAsk]);\n\n // For buy: quantity = dollar amount → convert to shares\n // For sell: quantity = number of shares\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n return pricePerShare > 0 ? quantity / pricePerShare : 0;\n }\n return quantity;\n }, [side, quantity, pricePerShare]);\n\n // Amount in smallest unit (6 decimals) for the inputMint\n // Buy: inputMint = USDC → amount = dollar amount × 10^6\n // Sell: inputMint = outcome token → amount = shares × 10^6\n const amount = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return Math.round(quantity * 1_000_000);\n }, [quantity]);\n\n // Order query – returns quote data + base64 transaction when userPublicKey is provided\n const {\n data: order,\n isLoading: isQuoteLoading,\n error: quoteError,\n refetch: refetchOrder,\n } = useOrderQuery(\n {\n userPublicKey: userPublicKey ?? undefined,\n inputMint: inputMint ?? \"\",\n outputMint: outputMint ?? \"\",\n amount,\n slippageBps: 100, // 1% slippage\n },\n {\n enabled: quoteEnabled,\n },\n );\n\n // Balances from UserPredictContext (predict-service positions API)\n const usdcBalance = userPredictCtx?.usdcBalance ?? null;\n const isBalanceLoading = userPredictCtx?.isLoading ?? false;\n const refetchBalance = userPredictCtx?.refetch;\n\n // Positions for this market from UserPredictContext\n const positions = userPredictCtx?.positions;\n\n // Outcome token balance (shares the user holds for selected outcome)\n const outcomeTokenBalance = useMemo(() => {\n if (!positions || !outcomeMint) return null;\n const pos = positions.find((p) => p.mint === outcomeMint);\n return pos ? pos.balance : 0;\n }, [positions, outcomeMint]);\n\n // Yes / No token balances (for displaying under each button on sell side)\n const yesMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, \"yes\"),\n [market.accounts],\n );\n const noMint = useMemo(\n () => getMintAddress(market.accounts, USDC_MINT, \"no\"),\n [market.accounts],\n );\n\n const yesTokenBalance = useMemo(() => {\n if (!positions || !yesMint) return null;\n const pos = positions.find((p) => p.mint === yesMint);\n return pos ? pos.balance : 0;\n }, [positions, yesMint]);\n\n const noTokenBalance = useMemo(() => {\n if (!positions || !noMint) return null;\n const pos = positions.find((p) => p.mint === noMint);\n return pos ? pos.balance : 0;\n }, [positions, noMint]);\n\n // Order book query for best bid/ask\n const { data: orderBook } = useOrderBookQuery(market.ticker, {\n refetchInterval: 5000,\n });\n\n // Best bid/ask from order book\n const bestBid = useMemo(() => {\n const bids = outcome === \"yes\" ? orderBook?.yesBids : orderBook?.noBids;\n return bids?.[0]?.price ?? null;\n }, [orderBook, outcome]);\n\n const bestAsk = useMemo(() => {\n const asks = outcome === \"yes\" ? orderBook?.yesAsks : orderBook?.noAsks;\n return asks?.[0]?.price ?? null;\n }, [orderBook, outcome]);\n\n // Price impact from order\n const priceImpact = useMemo(() => {\n if (!order?.priceImpactPct) return null;\n return parseFloat(order.priceImpactPct);\n }, [order]);\n\n // Cost calculation (in dollars)\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (order) {\n // Order inAmount is in lamports (6 decimals), convert to dollars\n return parseInt(order.inAmount) / 1_000_000;\n }\n // Fallback estimate\n if (side === \"buy\") {\n // Buy: user inputs dollar amount, that IS the cost\n return quantity;\n }\n // Sell: shares × bid price\n const bidPrice =\n outcome === \"yes\"\n ? Number(market.yesBid ?? 0)\n : Number(market.noBid ?? 0);\n return quantity * bidPrice;\n }, [order, side, outcome, quantity, market.yesBid, market.noBid]);\n\n // Potential payout (in dollars) if prediction is correct\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n // Each share pays $1 if correct; shares = amount / pricePerShare\n return shares * 1; // shares × $1\n }\n // Selling: receive the premium upfront (estimatedCost is what you get)\n return estimatedCost;\n }, [side, shares, estimatedCost, quantity]);\n\n // Profit = payout - cost (in dollars)\n const potentialProfit = potentialPayout - estimatedCost;\n\n // Side setter – clears quantity on switch\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\n // Quantity setter – allows NaN (empty input)\n const setQuantity = useCallback(\n (v: number) => {\n if (isNaN(v)) {\n setQuantityRaw(NaN);\n return;\n }\n const clamped = Math.max(0, v);\n // Buy side: keep up to 2 decimal places (dollar amount)\n // Sell side: integer only (contracts)\n const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n // Refetch order when quantity changes\n useEffect(() => {\n if (quoteEnabled) {\n refetchOrder();\n }\n }, [quantity, outcome, side, quoteEnabled, refetchOrder]);\n\n // Validation – form-level checks including balance, auth is handled by useAuthCallback\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n\n if (market.status !== \"active\") {\n errors.push(\"Market is not active\");\n }\n\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(\"Insufficient USDC balance\");\n }\n\n // Balance check: sell side requires enough shares\n if (\n side === \"sell\" &&\n outcomeTokenBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > outcomeTokenBalance\n ) {\n errors.push(\"Insufficient shares\");\n }\n\n return { isValid: errors.length === 0, errors };\n }, [quantity, market.status, side, usdcBalance, outcomeTokenBalance]);\n\n // Transaction hash after successful send\n const [txHash, setTxHash] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n // Signature currently being polled for order status (cleared on terminal state)\n const [pendingTxSignature, setPendingTxSignature] = useState<string | null>(\n null,\n );\n\n // Poll order status until terminal state\n const { data: orderStatusData } = useOrderStatusQuery(\n { signature: pendingTxSignature ?? \"\" },\n { enabled: !!pendingTxSignature },\n );\n\n // React to terminal order status\n useEffect(() => {\n if (!orderStatusData || !pendingTxSignature) return;\n\n const { status } = orderStatusData;\n\n if (status === \"closed\") {\n setIsSubmitting(false);\n setPendingTxSignature(null);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n setQuantityRaw(NaN);\n refetchBalance?.();\n } else if (status === \"failed\" || status === \"expired\") {\n setIsSubmitting(false);\n setPendingTxSignature(null);\n toast.error(t(\"predict.trade.submitError\"));\n }\n }, [orderStatusData, pendingTxSignature, refetchBalance, t]);\n\n // Submit: get order (with transaction) → sign → send → poll status\n const submit = useCallback(async () => {\n if (\n !validation.isValid ||\n !isAuthenticated ||\n !userPublicKey ||\n !solanaWallet ||\n isBalanceLoading\n ) {\n console.warn(\"[TradeForm] submit blocked by guard:\", {\n validationFailed: !validation.isValid,\n notAuthenticated: !isAuthenticated,\n noPublicKey: !userPublicKey,\n noWallet: !solanaWallet,\n balanceLoading: isBalanceLoading,\n });\n return;\n }\n\n setTxHash(null);\n setPendingTxSignature(null);\n setIsSubmitting(true);\n\n try {\n // Use cached order or fetch a fresh one\n let currentOrder = order;\n if (!currentOrder?.transaction) {\n console.warn(\"[TradeForm] no cached order with tx, refetching…\");\n const result = await refetchOrder();\n currentOrder = result.data;\n }\n\n if (!currentOrder?.transaction) {\n console.error(\n \"[TradeForm] unable to obtain order transaction, aborting\",\n );\n setIsSubmitting(false);\n return;\n }\n\n // Decode the base64-encoded transaction\n const txBytes = Uint8Array.from(atob(currentOrder.transaction), (c) =>\n c.charCodeAt(0),\n );\n\n // Sign and send — returns base58-encoded transaction signature\n const signature = await solanaWallet.sendTransaction(txBytes);\n console.warn(\"[TradeForm] transaction sent:\", signature);\n setTxHash(signature);\n\n // Poll order status with the signature until terminal state\n setPendingTxSignature(signature);\n } catch (err) {\n console.error(\"[TradeForm] submit failed:\", err);\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n userPublicKey,\n solanaWallet,\n order,\n isBalanceLoading,\n refetchOrder,\n t,\n ]);\n\n // Reset\n const reset = useCallback(() => {\n setOutcome(initialOutcome);\n setSideRaw(initialSide);\n setQuantityRaw(NaN);\n setTxHash(null);\n setPendingTxSignature(null);\n setIsSubmitting(false);\n }, [initialOutcome, initialSide]);\n\n return {\n outcome,\n side,\n quantity,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n isAuthenticated,\n bestBid,\n bestAsk,\n order: order ?? null,\n priceImpact,\n usdcBalance,\n outcomeTokenBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isQuoteLoading,\n isSubmitting,\n quoteError: quoteError ?? null,\n txHash,\n orderStatus: orderStatusData ?? null,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n reset,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, Tabs, Tab, StyledNumberInput } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport type { TradeSide, TradeOutcome } from \"./trade-form.script\";\n\nconst USDC_LOGO = `https://s1.chainstream.io/chains/sol/tokens/${SOLANA_TOKENS.stablecoins.USDC.address}/image.png`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeFormUIProps {\n /** Event data */\n event?: StandardEvent;\n /** Market data */\n market: StandardMarket;\n /** Current outcome */\n outcome: TradeOutcome;\n /** Current side */\n side: TradeSide;\n /** Number of contracts */\n quantity: number;\n /** Estimated cost in cents */\n estimatedCost: number;\n /** Potential payout in cents */\n potentialPayout: number;\n /** Potential profit in cents */\n potentialProfit: number;\n /** Whether swap is being submitted */\n isSubmitting: boolean;\n /** USDC balance in dollars (null if not loaded) */\n usdcBalance: number | null;\n /** Yes token balance (shares held, for sell side) */\n yesTokenBalance: number | null;\n /** No token balance (shares held, for sell side) */\n noTokenBalance: number | null;\n /** Whether balance is loading */\n isBalanceLoading: boolean;\n /** Whether the form is valid */\n isValid: boolean;\n /** Validation error messages */\n validationErrors: string[];\n /** Set outcome */\n onOutcomeChange: (outcome: TradeOutcome) => void;\n /** Set side */\n onSideChange: (side: TradeSide) => void;\n /** Set quantity */\n onQuantityChange: (quantity: number) => void;\n /** Submit swap */\n onSubmit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeFormUI({\n event,\n market,\n outcome,\n side,\n quantity,\n potentialProfit,\n estimatedCost,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n isValid,\n onOutcomeChange,\n onSideChange,\n onQuantityChange,\n onSubmit,\n}: TradeFormUIProps) {\n const { t } = useTranslation();\n\n // Button label\n const submitLabel = useMemo(() => {\n if (isSubmitting) return t(\"predict.trade.submitting\");\n const sideLabel =\n side === \"buy\" ? t(\"predict.trade.buy\") : t(\"predict.trade.sell\");\n const outcomeLabel =\n outcome === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\");\n return `${sideLabel} ${outcomeLabel}`;\n }, [isSubmitting, side, outcome, t]);\n\n // Button color\n const submitColor = useMemo(() => {\n return outcome === \"yes\" ? \"primary\" : \"secondary\";\n }, [outcome]);\n\n return (\n <div className=\"flex w-full flex-col gap-y-4 rounded-xl border border-default-200 bg-content1 p-4\">\n {/* Event title bar */}\n {event && (\n <div className=\"flex items-center gap-x-3\">\n {event.imageUrl && (\n <img\n src={event.imageUrl}\n alt={event.title}\n className=\"h-10 w-10 shrink-0 rounded-lg object-cover\"\n />\n )}\n <div className=\"flex min-w-0 flex-col gap-y-0.5\">\n <span className=\"text-sm text-neutral-500 leading-tight line-clamp-1\">\n {event.title}\n </span>\n <span className=\"text-base font-semibold leading-tight line-clamp-1\">\n <span\n className={outcome === \"yes\" ? \"text-bullish\" : \"text-bearish\"}\n >\n {side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}{\" \"}\n {outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n <span className=\"text-foreground\">\n {\" · \"}\n {outcome === \"yes\" ? market.yesSubTitle : market.noSubTitle}\n </span>\n </span>\n </div>\n </div>\n )}\n\n {/* Side tabs: Buy / Sell */}\n <Tabs\n variant=\"underlined\"\n selectedKey={side}\n onSelectionChange={(key) => onSideChange(key as TradeSide)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"buy\" title={t(\"predict.trade.buy\")} />\n <Tab key=\"sell\" title={t(\"predict.trade.sell\")} />\n </Tabs>\n\n {/* Outcome: Yes / No */}\n <div className=\"flex gap-x-2\">\n {([\"yes\", \"no\"] as TradeOutcome[]).map((o) => {\n const holdingBalance = o === \"yes\" ? yesTokenBalance : noTokenBalance;\n return (\n <div key={o} className=\"flex flex-1 flex-col gap-y-1\">\n <button\n type=\"button\"\n onClick={() => onOutcomeChange(o)}\n className={`w-full rounded-lg border py-2 text-sm font-medium transition-colors cursor-pointer ${\n outcome === o\n ? o === \"yes\"\n ? \"border-primary bg-primary-50 text-primary\"\n : \"border-secondary bg-secondary-50 text-secondary\"\n : \"border-default-400 text-foreground hover:border-default-500\"\n }`}\n >\n <span>\n {o === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\")}\n </span>\n {(() => {\n const price =\n side === \"buy\"\n ? o === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : o === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? (\n <span className=\"ml-1 opacity-70\">\n {Math.round(Number(price) * 100)}¢\n </span>\n ) : null;\n })()}\n </button>\n {/* Holdings display (sell side, selected outcome only) */}\n {side === \"sell\" && outcome === o && (\n <span className=\"text-center text-xs text-foreground\">\n {isBalanceLoading ? \"–\" : `${holdingBalance ?? 0} shares`}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {side === \"buy\" && (\n <div className=\"flex items-center justify-end gap-x-1 text-xs text-default-500\">\n <img\n src={USDC_LOGO}\n alt=\"USDC\"\n className=\"h-4 w-4 rounded-full object-cover\"\n />\n <span>{t(\"predict.trade.balance\")}:</span>\n <span className=\"font-medium text-foreground\">\n {usdcBalance != null ? `$${usdcBalance.toFixed(2)}` : \"–\"}\n </span>\n </div>\n )}\n\n {/* Amount / Shares input */}\n <div className=\"flex flex-col gap-y-1.5\">\n <span className=\"text-sm font-medium text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.amount\")\n : t(\"predict.trade.contracts\")}\n </span>\n <StyledNumberInput\n key={side}\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n value={isNaN(quantity) ? undefined : quantity}\n onValueChange={(v) => {\n onQuantityChange(v);\n }}\n minValue={0}\n step={side === \"buy\" ? 0.01 : 1}\n formatOptions={\n side === \"buy\"\n ? { maximumFractionDigits: 2 }\n : { maximumFractionDigits: 0 }\n }\n startContent={\n side === \"buy\" ? (\n <span className=\"text-default-600 text-xl\">$</span>\n ) : undefined\n }\n classNames={{\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 h-14 min-h-14\",\n input: \"text-lg\",\n }}\n />\n\n {/* Quick amount buttons */}\n <div className=\"flex gap-x-2 justify-end\">\n {side === \"buy\" ? (\n <>\n {[1, 5, 10, 100].map((amt) => (\n <button\n key={amt}\n type=\"button\"\n onClick={() =>\n onQuantityChange(\n Math.round(\n ((isNaN(quantity) ? 0 : quantity) + amt) * 100,\n ) / 100,\n )\n }\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n +{amt}$\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n /* TODO: set to max balance */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </>\n ) : (\n <>\n {[25, 50].map((pct) => (\n <button\n key={pct}\n type=\"button\"\n onClick={() => {\n /* TODO: set to pct% of holdings */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {pct}%\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n /* TODO: set to max holdings */\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Payout / Receive display */}\n {!isNaN(quantity) && quantity > 0 && (\n <div className=\"flex flex-col items-end gap-y-0.5\">\n <span className=\"text-sm text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.potentialWin\")\n : t(\"predict.trade.estimatedReceive\")}\n </span>\n <span className=\"text-xl font-semibold text-bullish\">\n ${(side === \"buy\" ? potentialProfit : estimatedCost).toFixed(2)}\n </span>\n </div>\n )}\n\n {/* Submit button */}\n <Button\n color={submitColor as \"primary\" | \"secondary\" | \"default\"}\n fullWidth\n radius=\"lg\"\n size=\"lg\"\n isDisabled={!isValid || isSubmitting}\n isLoading={isSubmitting}\n onPress={onSubmit}\n >\n {submitLabel}\n </Button>\n </div>\n );\n}\n","import { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport {\n useTradeForm,\n type TradeSide,\n type TradeOutcome,\n} from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormWidgetProps {\n /** Event data */\n event?: StandardEvent;\n /** Market to trade */\n market: StandardMarket;\n /** Initial trade side */\n initialSide?: TradeSide;\n /** Initial trade outcome */\n initialOutcome?: TradeOutcome;\n /** Chain network (default: 'solana') */\n chain?: string;\n}\n\nexport function TradeFormWidget({\n event,\n market,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormWidgetProps) {\n const {\n outcome,\n side,\n quantity,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n } = useTradeForm({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n // Wrap submit with auth check — triggers sign-in if not authenticated\n const authenticatedSubmit = useAuthCallback(submit);\n\n return (\n <TradeFormUI\n event={event}\n market={market}\n outcome={outcome}\n side={side}\n quantity={quantity}\n estimatedCost={estimatedCost}\n potentialPayout={potentialPayout}\n potentialProfit={potentialProfit}\n usdcBalance={usdcBalance}\n yesTokenBalance={yesTokenBalance}\n noTokenBalance={noTokenBalance}\n isBalanceLoading={isBalanceLoading}\n isSubmitting={isSubmitting}\n isValid={validation.isValid}\n validationErrors={validation.errors}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onQuantityChange={setQuantity}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\n/** Repeatable skeleton row for market list */\nfunction MarketRow() {\n return (\n <div className=\"flex items-center gap-x-3 px-2 py-3 lg:gap-x-4\">\n <Skeleton className=\"h-4 flex-1 rounded-md\" />\n <Skeleton className=\"h-5 w-10 shrink-0 rounded-md\" />\n <div className=\"flex gap-x-2\">\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n </div>\n </div>\n );\n}\n\nexport interface EventDetailSkeletonProps {\n /** Number of market rows */\n marketCount?: number;\n}\n\nexport function EventDetailSkeleton({\n marketCount = 4,\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 animate-pulse\">\n {/* Header: avatar + title */}\n <div className=\"flex items-center gap-x-3 lg:gap-x-4\">\n <Skeleton className=\"h-14 w-14 shrink-0 rounded-lg lg:h-18 lg:w-18\" />\n <div className=\"flex flex-col gap-y-1.5 min-w-0 flex-1\">\n <Skeleton className=\"h-3 w-24 rounded-md lg:w-32\" />\n <Skeleton className=\"h-5 w-48 rounded-md lg:h-6 lg:w-72\" />\n </div>\n </div>\n\n {/* Chart placeholder */}\n <Skeleton className=\"h-[200px] w-full rounded-xl lg:h-[280px]\" />\n\n {/* Volume + range bar */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-3 w-32 rounded-md\" />\n <div className=\"flex gap-x-1\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton key={i} className=\"h-7 w-10 rounded-md\" />\n ))}\n </div>\n </div>\n\n {/* Market rows */}\n <div className=\"flex flex-col divide-y divide-default-200\">\n {Array.from({ length: marketCount }).map((_, i) => (\n <MarketRow key={i} />\n ))}\n </div>\n </div>\n );\n}\n\n/** Compact skeleton for the sidebar trade form area */\nexport function TradeFormSkeleton() {\n return (\n <div className=\"flex w-full flex-col gap-y-4 rounded-xl border border-default-200 bg-content1 p-4 animate-pulse\">\n {/* Header */}\n <div className=\"flex items-center gap-x-3\">\n <Skeleton className=\"h-10 w-10 shrink-0 rounded-lg\" />\n <div className=\"flex flex-col gap-y-1 flex-1\">\n <Skeleton className=\"h-3 w-28 rounded-md\" />\n <Skeleton className=\"h-4 w-40 rounded-md\" />\n </div>\n </div>\n {/* Tabs */}\n <div className=\"flex gap-x-4\">\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n <Skeleton className=\"h-4 w-12 rounded-md\" />\n </div>\n {/* Outcome buttons */}\n <div className=\"flex gap-x-2\">\n <Skeleton className=\"h-10 flex-1 rounded-lg\" />\n <Skeleton className=\"h-10 flex-1 rounded-lg\" />\n </div>\n {/* Input */}\n <Skeleton className=\"h-14 w-full rounded-lg\" />\n {/* Submit */}\n <Skeleton className=\"h-12 w-full rounded-lg\" />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n DEFAULT_CHART_RANGE,\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n type ChartRangeType,\n} from \"../../consts\";\nimport { useEventByIdQuery } from \"../../hooks/useEventByIdQuery\";\nimport { usePredictClient } from \"../../hooks/usePredictClient\";\nimport {\n marketCandlesticksQueryKey,\n fetchMarketCandlesticks,\n} from \"../../hooks/usePriceHistoryQuery\";\nimport { useSeriesByTickerQuery } from \"../../hooks/useSeriesQuery\";\nimport type { CandlesticksResponse } from \"../../types\";\n\nexport interface UseEventDetailParams {\n eventId: string;\n /** Market tickers to query candlesticks for. Default is first 4 markets of the event, max is 4. */\n candlestickMarketTickers?: string[];\n /** Chart time range (1d / 1w / 1m / all). Determines both the query window and candlestick granularity. */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetail = (params: UseEventDetailParams) => {\n const { candlestickMarketTickers, chartRange = DEFAULT_CHART_RANGE } = params;\n\n // Derive candlestick granularity and query time window from chart range\n const candlestickPeriodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n // Stabilise endTs so it doesn't change on every render; recompute when range changes\n const candlestickEndTs = useMemo(\n () => Math.floor(Date.now() / 1000),\n [chartRange],\n );\n\n const client = usePredictClient();\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEventByIdQuery({ id: params.eventId, withNestedMarkets: true });\n\n // For ALL range, start from the earliest market openTime; otherwise use duration offset\n const candlestickStartTs = useMemo(() => {\n if (rangeDuration != null) return candlestickEndTs - rangeDuration;\n // Find the earliest openTime across all markets\n const markets = event?.markets;\n if (!markets?.length) return candlestickEndTs;\n return Math.min(...markets.map((m) => m.openTime));\n }, [candlestickEndTs, rangeDuration, event?.markets]);\n\n const {\n data: series,\n isLoading: isSeriesLoading,\n error: seriesError,\n } = useSeriesByTickerQuery(event?.seriesTicker ?? \"\", {\n enabled: !!event?.seriesTicker,\n });\n\n // Build a list of market tickers to fetch candlesticks for\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n const markets =\n candlestickMarketTickers && candlestickMarketTickers.length > 0\n ? candlestickMarketTickers\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((ticker) => event.markets!.find((m) => m.ticker === ticker))\n .filter((m) => m !== undefined)\n : [...event.markets]\n .sort((a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.ticker);\n }, [candlestickMarketTickers, event?.markets]);\n\n // Query candlesticks for each market in parallel\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((ticker) => ({\n queryKey: marketCandlesticksQueryKey({\n ticker,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n queryFn: () =>\n fetchMarketCandlesticks(client, {\n ticker,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n enabled: marketsToQuery.length > 0,\n })),\n });\n\n const isCandlesticksLoading = candlestickQueries.some((q) => q.isLoading);\n\n const candlestickErrors = useMemo(() => {\n const errors = new Map<string, Error>();\n marketsToQuery.forEach((ticker, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) {\n errors.set(ticker, error);\n }\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n // Build a map of ticker -> candlesticks\n const candlesticks = useMemo(() => {\n const map = new Map<string, CandlesticksResponse>();\n marketsToQuery.forEach((ticker, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) {\n map.set(ticker, data);\n }\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n series,\n isSeriesLoading,\n seriesError,\n /** Derived candlestick granularity (for chart formatting) */\n periodInterval: candlestickPeriodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n","import { useMemo } from \"react\";\nimport { useWalletPortfoliosQuery } from \"@liberfi.io/react\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport type { StandardMarket } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MarketHolding {\n /** Number of Yes outcome shares held */\n yesShares: number;\n /** Number of No outcome shares held */\n noShares: number;\n}\n\n/** Map of market ticker → holdings */\nexport type MarketsHoldingsMap = Map<string, MarketHolding>;\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nconst USDC_MINT = SOLANA_TOKENS.stablecoins.USDC.address;\n\n/**\n * Fetches wallet portfolio and computes Yes / No token holdings\n * for each market. React Query deduplicates the wallet query\n * automatically.\n */\nexport function useMarketsHoldings(markets: StandardMarket[]): {\n holdings: MarketsHoldingsMap;\n isLoading: boolean;\n} {\n const { status } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = status === \"authenticated\";\n const address = solanaWallet?.address;\n\n const { data: walletPortfolios, isLoading } = useWalletPortfoliosQuery(\n { chain: Chain.SOLANA, address: address ?? \"\" },\n {\n enabled: isAuthenticated && Boolean(address),\n refetchInterval: 10_000,\n },\n );\n\n const holdings = useMemo<MarketsHoldingsMap>(() => {\n const map = new Map<string, MarketHolding>();\n if (!walletPortfolios?.portfolios || markets.length === 0) return map;\n\n // Build a lookup: mint address → token amount\n const balanceByMint = new Map<string, number>();\n for (const p of walletPortfolios.portfolios) {\n balanceByMint.set(p.address, parseFloat(p.amount));\n }\n\n for (const market of markets) {\n const accountInfo = market.accounts[USDC_MINT];\n if (!accountInfo) continue;\n\n const yesShares = balanceByMint.get(accountInfo.yesMint) ?? 0;\n const noShares = balanceByMint.get(accountInfo.noMint) ?? 0;\n\n if (yesShares > 0 || noShares > 0) {\n map.set(market.ticker, { yesShares, noShares });\n }\n }\n\n return map;\n }, [walletPortfolios, markets]);\n\n return { holdings, isLoading };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n CHART_RANGE_SAMPLE_INTERVAL,\n ChartRange,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { StandardMarket, CandlesticksResponse } from \"../../types\";\n\n// Breathing dot rendered at the last data point of each line\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction BreathingDot(props: any) {\n const { cx, cy, index, dataLength, stroke } = props;\n if (index !== dataLength - 1 || cx == null || cy == null) return null;\n\n return (\n <g>\n {/* Pulsing outer ring */}\n <circle cx={cx} cy={cy} r={6} fill={stroke} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;8;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.1;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n {/* Solid inner dot */}\n <circle cx={cx} cy={cy} r={3} fill={stroke} />\n </g>\n );\n}\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 chart range\nfunction formatTimestamp(\n timestamp: number,\n chartRange: ChartRangeType,\n): string {\n const date = new Date(timestamp * 1000);\n\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n // Show time: \"14:30\"\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ONE_WEEK:\n case ChartRange.ONE_MONTH:\n // Show date with time: \"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 ChartRange.ALL:\n default:\n // Show date only: \"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 EventCandlesticksProps {\n /** Map of market ticker to candlestick data */\n candlesticks?: Map<string, CandlesticksResponse>;\n /** Markets to display (used for labels) */\n markets?: StandardMarket[];\n /** Loading state */\n isLoading?: boolean;\n /** Chart time range (determines X-axis formatting) */\n chartRange?: ChartRangeType;\n /** Callback when hovered data changes */\n onDataChange?: (data: CurrentMarketData | null) => void;\n}\n\n// Transform candlesticks into chart data with sampling\nfunction transformCandlesticks(\n candlesticks: Map<string, CandlesticksResponse>,\n marketTickers: string[],\n chartRange: ChartRangeType,\n): MarketDataPoint[] {\n const sampleInterval = CHART_RANGE_SAMPLE_INTERVAL[chartRange];\n\n // Build per-market timestamp → value maps (using end_period_ts directly)\n const perMarketMaps: Map<string, Map<number, number>> = new Map();\n\n candlesticks.forEach((response, marketTicker) => {\n const map = new Map<number, number>();\n const points = response.candlesticks ?? [];\n points.forEach((point) => {\n // Align to sample interval boundary, keep the last value per bucket\n const bucket =\n point.end_period_ts - (point.end_period_ts % sampleInterval);\n map.set(bucket, point.yes_ask.close);\n });\n perMarketMaps.set(marketTicker, map);\n });\n\n // Collect all unique sampled timestamps (union across all markets)\n const allTimestamps = new Set<number>();\n for (const map of perMarketMaps.values()) {\n for (const ts of map.keys()) {\n allTimestamps.add(ts);\n }\n }\n\n // Sort timestamps\n const sortedTimestamps = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Create data points for all timestamps, forward-filling missing values\n const lastValues = new Map<string, number>();\n\n return sortedTimestamps.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 marketTickers.forEach((marketTicker) => {\n const value = perMarketMaps.get(marketTicker)?.get(timestamp);\n if (value !== undefined) {\n dataPoint[marketTicker] = Math.round(value * 100) / 100;\n lastValues.set(marketTicker, dataPoint[marketTicker] as number);\n } else {\n // Use the most recent previous value if available, otherwise leave empty\n const lastValue = lastValues.get(marketTicker);\n if (lastValue !== undefined) {\n dataPoint[marketTicker] = lastValue;\n }\n }\n });\n\n return dataPoint;\n });\n}\n\nexport function EventCandlesticks({\n candlesticks,\n markets = [],\n isLoading,\n chartRange = ChartRange.ALL,\n onDataChange,\n}: EventCandlesticksProps) {\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 tickers that have candlestick data\n const marketTickers = useMemo(() => {\n if (!candlesticks) return [];\n return Array.from(candlesticks.keys()).slice(0, 4); // Max 4 markets\n }, [candlesticks]);\n\n // Transform data for chart\n const chartData = useMemo(() => {\n if (!candlesticks || candlesticks.size === 0) return [];\n return transformCandlesticks(candlesticks, marketTickers, chartRange);\n }, [candlesticks, marketTickers, chartRange]);\n\n // Calculate Y-axis domain based on actual data values\n const yAxisDomain = useMemo(() => {\n if (chartData.length === 0 || marketTickers.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 marketTickers.forEach((marketTicker) => {\n const value = dataPoint[marketTicker] 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, marketTickers]);\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: marketTickers.map((marketTicker, idx) => {\n const market = markets.find((m) => m.ticker === marketTicker);\n return {\n id: marketTicker,\n label: market?.yesSubTitle || `Market ${idx + 1}`,\n value: (dataPoint[marketTicker] as number) ?? 0,\n color: CHART_COLORS[idx % CHART_COLORS.length].stroke,\n };\n }),\n };\n },\n [chartData, marketTickers, 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 sampleIntervalX = 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 % sampleIntervalX === 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, chartRange)}\n </text>\n );\n }}\n tickLine={false}\n axisLine={false}\n interval={0}\n />\n <CartesianGrid\n horizontal={true}\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--heroui-default-200))\"\n />\n <YAxis\n domain={yAxisDomain}\n tickLine={false}\n axisLine={false}\n tick={{ fontSize: 10, fill: \"hsl(var(--heroui-default-500))\" }}\n tickFormatter={(value: number) => `${value}%`}\n width={40}\n />\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 formatTimestamp(value, chartRange)\n }\n formatter={(value: number, name: string) => {\n const market = markets.find((m) => m.ticker === name);\n const label = market?.yesSubTitle || name;\n return [`${value.toFixed(2)}%`, label];\n }}\n />\n {marketTickers.map((marketTicker, index) => (\n <Line\n key={marketTicker}\n type=\"monotone\"\n dataKey={marketTicker}\n stroke={CHART_COLORS[index % CHART_COLORS.length].stroke}\n strokeWidth={2}\n isAnimationActive={false}\n dot={(dotProps) => (\n <BreathingDot\n key={`dot-${marketTicker}-${dotProps.index}`}\n {...dotProps}\n dataLength={chartData.length}\n />\n )}\n activeDot={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 { useMemo } from \"react\";\nimport {\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n DEFAULT_CHART_RANGE,\n type ChartRangeType,\n} from \"../../consts\";\nimport { useMarketCandlesticksQuery } from \"../../hooks/usePriceHistoryQuery\";\n\nexport interface UseMarketCandlesticksParams {\n /** Market ticker */\n marketTicker: string;\n /** Market open time (unix timestamp), used as start for \"ALL\" range */\n openTime?: number;\n /** Selected chart range */\n chartRange?: ChartRangeType;\n}\n\nexport function useMarketCandlesticks({\n marketTicker,\n openTime,\n chartRange = DEFAULT_CHART_RANGE,\n}: UseMarketCandlesticksParams) {\n const periodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n // Stabilise endTs per range change\n const endTs = useMemo(() => Math.floor(Date.now() / 1000), [chartRange]);\n\n const startTs = useMemo(() => {\n if (rangeDuration != null) return endTs - rangeDuration;\n // ALL: start from market open time\n return openTime ?? endTs;\n }, [endTs, rangeDuration, openTime]);\n\n const {\n data: candlesticks,\n isLoading,\n isFetching,\n error,\n } = useMarketCandlesticksQuery(\n {\n ticker: marketTicker,\n startTs,\n endTs,\n periodInterval,\n },\n { enabled: !!marketTicker },\n );\n\n return {\n candlesticks,\n /** true on initial load (no cached data) */\n isLoading,\n /** true whenever a request is in-flight (including range switches with stale data) */\n isFetching,\n error,\n periodInterval,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n ChartRange,\n CHART_RANGE_SAMPLE_INTERVAL,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { CandlesticksResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst CHART_COLOR = \"hsl(var(--heroui-primary))\";\n\nconst RANGE_OPTIONS = [\n { value: ChartRange.ONE_DAY, label: \"1D\" },\n { value: ChartRange.ONE_WEEK, label: \"1W\" },\n { value: ChartRange.ONE_MONTH, label: \"1M\" },\n { value: ChartRange.ALL, label: \"ALL\" },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface DataPoint {\n timestamp: number;\n date: string;\n value: number;\n volume: number;\n}\n\nexport interface EventMarketCandlesticksUIProps {\n /** Candlestick data for the market */\n candlesticks?: CandlesticksResponse;\n /** Whether data is loading */\n isLoading?: boolean;\n /** Current chart range */\n chartRange: ChartRangeType;\n /** Callback when range changes */\n onRangeChange?: (range: ChartRangeType) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Breathing dot at the last data point\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction BreathingDot(props: any) {\n const { cx, cy, index, dataLength, stroke } = props;\n if (index !== dataLength - 1 || cx == null || cy == null) return null;\n\n return (\n <g>\n <circle cx={cx} cy={cy} r={6} fill={stroke} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;8;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.1;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={cx} cy={cy} r={3} fill={stroke} />\n </g>\n );\n}\n\nfunction formatTimestamp(\n timestamp: number,\n chartRange: ChartRangeType,\n): string {\n const date = new Date(timestamp * 1000);\n\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n case ChartRange.ONE_WEEK:\n case ChartRange.ONE_MONTH:\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 ChartRange.ALL:\n default:\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n\nfunction formatCompact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(0);\n}\n\nfunction transformCandlesticks(\n candlesticks: CandlesticksResponse,\n chartRange: ChartRangeType,\n): DataPoint[] {\n const sampleInterval = CHART_RANGE_SAMPLE_INTERVAL[chartRange];\n const points = candlesticks.candlesticks ?? [];\n\n // Bucket by sample interval, keep last close & sum volume per bucket\n const bucketMap = new Map<number, { close: number; volume: number }>();\n for (const point of points) {\n const bucket = point.end_period_ts - (point.end_period_ts % sampleInterval);\n const existing = bucketMap.get(bucket);\n bucketMap.set(bucket, {\n close: point.yes_ask.close,\n volume: (existing?.volume ?? 0) + (point.volume ?? 0),\n });\n }\n\n // Sort by timestamp\n const sorted = Array.from(bucketMap.entries()).sort((a, b) => a[0] - b[0]);\n\n return sorted.map(([timestamp, { close, volume }]) => ({\n timestamp,\n date: new Date(timestamp * 1000).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n value: Math.round(close * 100) / 100,\n volume,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketCandlesticksUI({\n candlesticks,\n isLoading,\n chartRange,\n onRangeChange,\n}: EventMarketCandlesticksUIProps) {\n const chartData = useMemo(() => {\n if (!candlesticks) return [];\n return transformCandlesticks(candlesticks, chartRange);\n }, [candlesticks, chartRange]);\n\n const yAxisDomain = useMemo(() => {\n if (chartData.length === 0) return [0, 100] as [number, number];\n\n let minValue = Infinity;\n let maxValue = -Infinity;\n\n for (const dp of chartData) {\n if (dp.value < minValue) minValue = dp.value;\n if (dp.value > maxValue) maxValue = dp.value;\n }\n\n if (minValue === Infinity || maxValue === -Infinity) {\n return [0, 100] as [number, number];\n }\n\n const range = maxValue - minValue;\n const padding = Math.max(range * 0.2, 5);\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]);\n\n // ---------- Loading ----------\n if (isLoading) {\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full flex items-center justify-center\">\n <div className=\"text-neutral text-sm\">Loading chart...</div>\n </div>\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n }\n\n // ---------- Empty ----------\n if (chartData.length === 0) {\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full flex items-center justify-center\">\n <div className=\"text-neutral text-sm\">No price history data</div>\n </div>\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n }\n\n // ---------- Chart ----------\n return (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"h-[200px] w-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 10, right: 16, left: 16, bottom: 0 }}\n >\n <XAxis\n dataKey=\"timestamp\"\n tick={(props) => {\n const { x, y, payload, index } = props;\n const totalPoints = chartData.length;\n const maxLabels = 6;\n const sampleIntervalX = Math.max(\n 1,\n Math.ceil(totalPoints / maxLabels),\n );\n const isFirst = index === 0;\n const isLast = index === totalPoints - 1;\n const isSampled = index % sampleIntervalX === 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, chartRange)}\n </text>\n );\n }}\n tickLine={false}\n axisLine={false}\n interval={0}\n />\n <CartesianGrid\n horizontal={true}\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"hsl(var(--heroui-default-200))\"\n />\n <YAxis\n domain={yAxisDomain}\n tickLine={false}\n axisLine={false}\n tick={{\n fontSize: 10,\n fill: \"hsl(var(--heroui-default-500))\",\n }}\n tickFormatter={(value: number) => `${value}%`}\n width={40}\n />\n <Tooltip\n cursor={{ stroke: \"hsl(var(--heroui-default-300))\" }}\n content={({ active, payload }) => {\n if (!active || !payload?.length) return null;\n const dp = payload[0].payload as DataPoint;\n const cents = Math.round(dp.value);\n return (\n <div className=\"rounded-lg border border-default-200 bg-content1 px-3 py-2 shadow-md\">\n <div className=\"text-lg font-semibold text-primary\">\n Yes {cents}¢\n </div>\n <div className=\"text-sm text-neutral\">\n Vol {formatCompact(dp.volume)} ·{\" \"}\n {formatTimestamp(dp.timestamp, chartRange)}\n </div>\n </div>\n );\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"value\"\n stroke={CHART_COLOR}\n strokeWidth={2}\n isAnimationActive={false}\n dot={(dotProps) => (\n <BreathingDot\n key={`dot-${dotProps.index}`}\n {...dotProps}\n dataLength={chartData.length}\n />\n )}\n activeDot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n\n <RangeSelector chartRange={chartRange} onRangeChange={onRangeChange} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Range selector\n// ---------------------------------------------------------------------------\n\nfunction RangeSelector({\n chartRange,\n onRangeChange,\n}: {\n chartRange: ChartRangeType;\n onRangeChange?: (range: ChartRangeType) => void;\n}) {\n return (\n <div className=\"flex items-center justify-end gap-x-1\">\n {RANGE_OPTIONS.map((opt) => {\n const isActive = chartRange === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n className={`px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"bg-default-100 text-default-600 hover:bg-default-200\"\n }`}\n onClick={() => onRangeChange?.(opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderbookLevel } from \"../../types\";\n\nexport interface UseMarketOrderbookParams {\n /** Market ticker to fetch orderbook for */\n marketTicker: string;\n}\n\nexport interface ProcessedOrderbook {\n /** Yes side bids (sorted descending by price) */\n yesBids: OrderbookLevel[];\n /** Yes side asks (sorted ascending by price) */\n yesAsks: OrderbookLevel[];\n /** No side bids (sorted descending by price) */\n noBids: OrderbookLevel[];\n /** No side asks (sorted ascending by price) */\n noAsks: OrderbookLevel[];\n /** Best yes bid price */\n bestYesBid: number | null;\n /** Best yes ask price */\n bestYesAsk: number | null;\n /** Best no bid price */\n bestNoBid: number | null;\n /** Best no ask price */\n bestNoAsk: number | null;\n /** Orderbook sequence number */\n sequence: number | null;\n}\n\nexport function useMarketOrderbook({ marketTicker }: UseMarketOrderbookParams) {\n const {\n data: orderbook,\n isLoading: isOrderbookLoading,\n error: orderbookError,\n } = useOrderBookQuery(marketTicker, {\n enabled: !!marketTicker,\n });\n\n const processedOrderbook = useMemo<ProcessedOrderbook | null>(() => {\n if (!orderbook) return null;\n\n const { yesBids, yesAsks, noBids, noAsks } = orderbook;\n\n return {\n yesBids,\n yesAsks,\n noBids,\n noAsks,\n bestYesBid: yesBids.length > 0 ? yesBids[0].price : null,\n bestYesAsk: yesAsks.length > 0 ? yesAsks[0].price : null,\n bestNoBid: noBids.length > 0 ? noBids[0].price : null,\n bestNoAsk: noAsks.length > 0 ? noAsks[0].price : null,\n sequence: orderbook.sequence ?? null,\n };\n }, [orderbook]);\n\n return {\n orderbook: processedOrderbook,\n isOrderbookLoading,\n orderbookError,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { OrderbookLevel } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventMarketOrderbookUIProps {\n /** Bid levels (sorted descending by price) */\n bids: OrderbookLevel[];\n /** Ask levels (sorted ascending by price) */\n asks: OrderbookLevel[];\n /** Whether data is loading */\n isLoading?: boolean;\n /** Max number of levels per side to display */\n maxLevels?: number;\n /** Callback when a price level row is clicked */\n onPriceClick?: (price: number, side: \"bid\" | \"ask\") => void;\n}\n\ninterface OrderbookRow extends OrderbookLevel {\n /** Cumulative quantity up to this level */\n cumulative: number;\n /** Depth ratio 0–1 relative to the max cumulative across both sides */\n depth: number;\n /** Total value = price × quantity */\n total: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRows(\n levels: OrderbookLevel[],\n maxLevels: number,\n): OrderbookRow[] {\n const sliced = levels.slice(0, maxLevels);\n let cumulative = 0;\n return sliced.map((level) => {\n cumulative += level.quantity;\n return {\n ...level,\n cumulative,\n depth: 0,\n total: level.price * level.quantity,\n };\n });\n}\n\nfunction applyDepth(rows: OrderbookRow[], maxCum: number) {\n for (const row of rows) {\n row.depth = maxCum > 0 ? row.cumulative / maxCum : 0;\n }\n}\n\n/** Format price as percentage (0.94 → \"94¢\") */\nfunction formatPrice(price: number): string {\n const cents = Math.round(price * 100);\n return `${cents}¢`;\n}\n\n/** Format quantity with compact notation */\nfunction formatQty(qty: number): string {\n if (qty >= 1_000_000) return `${(qty / 1_000_000).toFixed(1)}M`;\n if (qty >= 1_000) return `${(qty / 1_000).toFixed(1)}K`;\n return qty.toLocaleString();\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\n/** Format total value (price × quantity, as USD-like value) */\nfunction formatTotal(total: number): string {\n if (total >= 1_000_000) return `$${(total / 1_000_000).toFixed(2)}M`;\n if (total >= 1_000) return `$${(total / 1_000).toFixed(2)}K`;\n if (total >= 1) return `$${total.toFixed(2)}`;\n return `$${total.toFixed(4)}`;\n}\n\nfunction RowItem({\n row,\n side,\n showType = false,\n onClick,\n}: {\n row: OrderbookRow;\n side: \"bid\" | \"ask\";\n /** Only show the type label on designated rows */\n showType?: boolean;\n onClick?: (price: number, side: \"bid\" | \"ask\") => void;\n}) {\n const { t } = useTranslation();\n const isAsk = side === \"ask\";\n const barColor = isAsk ? \"bg-bullish/10\" : \"bg-bearish/10\";\n const typeColor = isAsk ? \"text-bullish\" : \"text-bearish\";\n\n return (\n <button\n type=\"button\"\n className=\"relative grid w-full grid-cols-4 px-2 py-2.5 text-xs cursor-pointer hover:bg-default-100 transition-colors\"\n onClick={() => onClick?.(row.price, side)}\n >\n {/* Depth bar */}\n <div\n className={`absolute inset-y-0 left-0 ${barColor} transition-[width] duration-200`}\n style={{ width: `${row.depth * 100}%` }}\n />\n {/* Type – only shown on the row nearest the spread */}\n <span\n className={`relative z-10 font-mono font-medium ${typeColor} text-left`}\n >\n {showType\n ? isAsk\n ? t(\"predict.trade.bestAsk\")\n : t(\"predict.trade.bestBid\")\n : \"\"}\n </span>\n {/* Price */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatPrice(row.price)}\n </span>\n {/* Contracts */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatQty(row.quantity)}\n </span>\n {/* Total */}\n <span className=\"relative z-10 font-mono text-foreground text-right\">\n {formatTotal(row.total)}\n </span>\n </button>\n );\n}\n\nfunction SkeletonRow({ index }: { index: number }) {\n // Stagger widths for a more natural look\n const widths = [\"60%\", \"45%\", \"75%\", \"55%\", \"65%\", \"50%\", \"70%\", \"40%\"];\n return (\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div\n className=\"h-4 animate-pulse rounded bg-default-100\"\n style={{ width: widths[index % widths.length] }}\n />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n </div>\n );\n}\n\nfunction Skeleton() {\n return (\n <div className=\"flex flex-col\">\n {/* Header skeleton */}\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-1/2\" />\n </div>\n {/* Ask rows */}\n {Array.from({ length: DEFAULT_MAX_LEVELS }).map((_, i) => (\n <SkeletonRow key={`ask-${i}`} index={i} />\n ))}\n {/* Spread */}\n <div className=\"flex justify-center border-y border-default-200 px-2 py-2.5\">\n <div className=\"h-4 w-24 animate-pulse rounded bg-default-100\" />\n </div>\n {/* Bid rows */}\n {Array.from({ length: DEFAULT_MAX_LEVELS }).map((_, i) => (\n <SkeletonRow key={`bid-${i}`} index={i + 3} />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_LEVELS = 8;\n\nexport function EventMarketOrderbookUI({\n bids,\n asks,\n isLoading = false,\n maxLevels = DEFAULT_MAX_LEVELS,\n onPriceClick,\n}: EventMarketOrderbookUIProps) {\n const { t } = useTranslation();\n\n const { bidRows, askRows, spread, spreadPercent } = useMemo(() => {\n const bidRows = buildRows(bids, maxLevels);\n const askRows = buildRows(asks, maxLevels);\n\n // Use the same max cumulative across both sides for comparable depth bars\n const maxCum = Math.max(\n bidRows[bidRows.length - 1]?.cumulative ?? 0,\n askRows[askRows.length - 1]?.cumulative ?? 0,\n );\n applyDepth(bidRows, maxCum);\n applyDepth(askRows, maxCum);\n\n const bestBid = bidRows[0]?.price ?? null;\n const bestAsk = askRows[0]?.price ?? null;\n\n let spread: number | null = null;\n let spreadPercent: number | null = null;\n if (bestBid != null && bestAsk != null) {\n spread = bestAsk - bestBid;\n const mid = (bestBid + bestAsk) / 2;\n if (mid > 0) {\n spreadPercent = Math.round((spread / mid) * 10000) / 100;\n }\n }\n\n return { bidRows, askRows, spread, spreadPercent };\n }, [bids, asks, maxLevels]);\n\n if (isLoading) {\n return <Skeleton />;\n }\n\n const isEmpty = bidRows.length === 0 && askRows.length === 0;\n\n if (isEmpty) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.orderBook.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n {/* Column headers */}\n <div className=\"grid grid-cols-4 px-2 py-2.5 text-xs text-neutral\">\n <span />\n <span className=\"text-right\">{t(\"predict.orderBook.price\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.contracts\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.total\")}</span>\n </div>\n\n {/* Asks (reversed so lowest price is nearest the spread) */}\n <div className=\"flex flex-col-reverse\">\n {askRows.map((row, i) => (\n <RowItem\n key={row.price}\n row={row}\n side=\"ask\"\n showType={i === 0}\n onClick={onPriceClick}\n />\n ))}\n </div>\n\n {/* Spread */}\n {spread != null && (\n <div className=\"flex items-center justify-center gap-x-2 border-y border-default-200 px-2 py-2.5 text-xs text-default-500\">\n <span>\n {t(\"predict.orderBook.spread\")}: {formatPrice(spread)}\n </span>\n {spreadPercent != null && (\n <span className=\"text-default-400\">({spreadPercent}%)</span>\n )}\n </div>\n )}\n\n {/* Bids */}\n <div className=\"flex flex-col\">\n {bidRows.map((row, i) => (\n <RowItem\n key={row.price}\n row={row}\n side=\"bid\"\n showType={i === 0}\n onClick={onPriceClick}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { WalletPositionItem } from \"../../types\";\n\nexport interface PositionWithPnL extends WalletPositionItem {\n /** Weighted-average entry price (0–1 scale, same as yesAsk/noAsk) */\n avgCost: number | null;\n /** Current market price for this outcome (0–1 scale) */\n currentPrice: number | null;\n /** Total unrealised P&L in USD: (currentPrice − avgCost) × balance */\n pnl: number | null;\n /** Unrealised P&L as a percentage of avg cost */\n pnlPercent: number | null;\n}\n\nexport interface EventMarketPositionsUIProps {\n positions: PositionWithPnL[];\n isLoading?: boolean;\n}\n\nfunction formatBalance(balance: number): string {\n if (balance >= 1_000_000) return `${(balance / 1_000_000).toFixed(2)}M`;\n if (balance >= 1_000) return `${(balance / 1_000).toFixed(2)}K`;\n return balance.toLocaleString(undefined, { maximumFractionDigits: 2 });\n}\n\nfunction formatPnL(pnl: number): string {\n const abs = Math.abs(pnl);\n const sign = pnl >= 0 ? \"+\" : \"-\";\n if (abs >= 1_000) return `${sign}$${(abs / 1_000).toFixed(1)}K`;\n if (abs >= 1) return `${sign}$${abs.toFixed(2)}`;\n return `${sign}$${abs.toFixed(4)}`;\n}\n\nexport function EventMarketPositionsUI({\n positions,\n isLoading = false,\n}: EventMarketPositionsUIProps) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n if (positions.length === 0) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.positions.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n {/* Header */}\n <div className=\"grid grid-cols-5 px-2 py-2.5 text-xs text-neutral\">\n <span>{t(\"predict.positions.outcome\")}</span>\n <span className=\"text-right\">{t(\"predict.positions.qty\")}</span>\n <span className=\"text-right\">{t(\"predict.positions.avgCost\")}</span>\n <span className=\"text-right\">\n {t(\"predict.positions.currentPrice\")}\n </span>\n <span className=\"text-right\">{t(\"predict.positions.pnl\")}</span>\n </div>\n\n {/* Rows */}\n {positions.map((pos) => {\n const isYes = pos.position === \"YES\";\n const sideColor = isYes ? \"text-bullish\" : \"text-bearish\";\n const sideLabel = isYes\n ? t(\"predict.market.yes\")\n : t(\"predict.market.no\");\n\n const avgCostDisplay =\n pos.avgCost != null ? `${Math.round(pos.avgCost * 100)}¢` : \"—\";\n\n const priceDisplay =\n pos.currentPrice != null\n ? `${Math.round(pos.currentPrice * 100)}¢`\n : \"—\";\n\n const hasPnL = pos.pnl != null && pos.pnlPercent != null;\n const pnlColor =\n hasPnL && pos.pnl! > 0\n ? \"text-bullish\"\n : hasPnL && pos.pnl! < 0\n ? \"text-bearish\"\n : \"text-foreground\";\n\n return (\n <div\n key={pos.mint}\n className=\"grid grid-cols-5 px-2 py-2.5 text-xs hover:bg-default-100 transition-colors\"\n >\n <span className={`font-medium ${sideColor}`}>{sideLabel}</span>\n <span className=\"text-right font-mono text-foreground\">\n {formatBalance(pos.balance)}\n </span>\n <span className=\"text-right font-mono text-foreground\">\n {avgCostDisplay}\n </span>\n <span className=\"text-right font-mono text-foreground\">\n {priceDisplay}\n </span>\n <span className={`text-right font-mono ${pnlColor}`}>\n {hasPnL ? (\n <span className=\"flex flex-col items-end\">\n <span>{formatPnL(pos.pnl!)}</span>\n <span className=\"text-[10px] opacity-70\">\n {pos.pnlPercent! >= 0 ? \"+\" : \"\"}\n {pos.pnlPercent!.toFixed(1)}%\n </span>\n </span>\n ) : (\n \"—\"\n )}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { OnchainTrade } from \"../../types\";\n\nexport interface EventMarketTradesUIProps {\n trades: OnchainTrade[];\n isLoading?: boolean;\n}\n\nfunction formatAmount(amount: number): string {\n const ui = amount / 1_000_000;\n if (ui >= 1_000_000) return `${(ui / 1_000_000).toFixed(2)}M`;\n if (ui >= 1_000) return `${(ui / 1_000).toFixed(2)}K`;\n return ui.toLocaleString(undefined, { maximumFractionDigits: 2 });\n}\n\nfunction formatPrice(price: number | null | undefined): string {\n if (price == null) return \"—\";\n return `${Math.round(price * 100)}¢`;\n}\n\nfunction formatTime(ts: number): string {\n const date = new Date(ts * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day} ${hours}:${minutes}`;\n}\n\nfunction SkeletonRow({ index }: { index: number }) {\n const widths = [\"60%\", \"45%\", \"75%\", \"55%\", \"65%\"];\n return (\n <div className=\"grid grid-cols-4 gap-x-2 px-2 py-2.5\">\n <div\n className=\"h-4 animate-pulse rounded bg-default-100\"\n style={{ width: widths[index % widths.length] }}\n />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n <div className=\"h-4 animate-pulse rounded bg-default-100 ml-auto w-3/4\" />\n </div>\n );\n}\n\nexport function EventMarketTradesUI({\n trades,\n isLoading = false,\n}: EventMarketTradesUIProps) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex flex-col\">\n {Array.from({ length: 6 }).map((_, i) => (\n <SkeletonRow key={i} index={i} />\n ))}\n </div>\n );\n }\n\n if (trades.length === 0) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.tradeHistory.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n {/* Header */}\n <div className=\"grid grid-cols-4 px-2 py-2.5 text-xs text-neutral\">\n <span>{t(\"predict.tradeHistory.side\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.price\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.qty\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.time\")}</span>\n </div>\n\n {/* Rows */}\n {trades.map((trade) => {\n const isYes = trade.side === \"yes\";\n const sideColor = isYes ? \"text-bullish\" : \"text-bearish\";\n const sideLabel = trade.side\n ? isYes\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")\n : \"—\";\n\n return (\n <div\n key={trade.id}\n className=\"grid grid-cols-4 px-2 py-2.5 text-xs hover:bg-default-100 transition-colors\"\n >\n <span className={`font-medium ${sideColor}`}>{sideLabel}</span>\n <span className=\"text-right font-mono text-foreground\">\n {formatPrice(trade.usdPricePerContract)}\n </span>\n <span className=\"text-right font-mono text-foreground\">\n {formatAmount(trade.outputAmount)}\n </span>\n <span className=\"text-right text-default-500\">\n {formatTime(trade.createdAt)}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { Tabs, Tab } from \"@liberfi.io/ui\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport { DEFAULT_CHART_RANGE, type ChartRangeType } from \"../../consts\";\nimport { useMarketPositions } from \"../../hooks/useMarketPositions\";\nimport { useOnchainTradesByWalletQuery } from \"../../hooks/useOnchainTradesQuery\";\nimport type { OnchainTrade, StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { useMarketCandlesticks } from \"./event-market-candlesticks.script\";\nimport { EventMarketCandlesticksUI } from \"./event-market-candlesticks.ui\";\nimport { useMarketOrderbook } from \"./event-market-orderbook.script\";\nimport { EventMarketOrderbookUI } from \"./event-market-orderbook.ui\";\nimport {\n EventMarketPositionsUI,\n type PositionWithPnL,\n} from \"./event-market-positions.ui\";\nimport { EventMarketTradesUI } from \"./event-market-trades.ui\";\n\ntype MarketDetailTab =\n | \"trade-yes\"\n | \"trade-no\"\n | \"graph\"\n | \"positions\"\n | \"trade-history\";\n\nexport interface EventMarketDetailWidgetProps {\n market: StandardMarket;\n /** Callback when an orderbook row is clicked – propagates market, outcome & side */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventMarketDetailWidget({\n market,\n onTradeAction,\n}: EventMarketDetailWidgetProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<MarketDetailTab>(\"trade-yes\");\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n const { orderbook, isOrderbookLoading } = useMarketOrderbook({\n marketTicker: market.ticker,\n });\n\n const { candlesticks, isFetching: isCandlesticksLoading } =\n useMarketCandlesticks({\n marketTicker: market.ticker,\n openTime: market.openTime,\n chartRange,\n });\n\n const { positions, isLoading: isPositionsLoading } =\n useMarketPositions(market);\n\n const { status } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const walletAddress = solanaWallet?.address;\n\n const { data: tradesData, isLoading: isTradesLoading } =\n useOnchainTradesByWalletQuery(\n { walletAddress: walletAddress ?? \"\" },\n {\n enabled:\n (activeTab === \"trade-history\" || activeTab === \"positions\") &&\n status === \"authenticated\" &&\n !!walletAddress,\n },\n );\n\n const marketTrades = (tradesData?.trades ?? []).filter(\n (t) => t.marketTicker === market.ticker,\n );\n\n const positionsWithPnL: PositionWithPnL[] = useMemo(() => {\n return positions.map((pos) => {\n const buyTrades = marketTrades.filter(\n (t) =>\n t.outputMint === pos.mint &&\n t.usdPricePerContract != null &&\n t.contracts != null &&\n t.contracts > 0,\n );\n\n const avgCost = computeAvgCost(buyTrades);\n\n const currentPrice =\n pos.position === \"YES\"\n ? parseNullablePrice(pos.market?.yesAsk)\n : parseNullablePrice(pos.market?.noAsk);\n\n let pnl: number | null = null;\n let pnlPercent: number | null = null;\n if (avgCost != null && currentPrice != null) {\n pnl = (currentPrice - avgCost) * pos.balance;\n pnlPercent =\n avgCost > 0 ? ((currentPrice - avgCost) / avgCost) * 100 : null;\n }\n\n return { ...pos, avgCost, currentPrice, pnl, pnlPercent };\n });\n }, [positions, marketTrades]);\n\n const handleYesPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"yes\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n const handleNoPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"no\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n <Tabs\n variant=\"underlined\"\n selectedKey={activeTab}\n onSelectionChange={(key) => setActiveTab(key as MarketDetailTab)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"trade-yes\" title={t(\"predict.market.tradeYes\")} />\n <Tab key=\"trade-no\" title={t(\"predict.market.tradeNo\")} />\n <Tab key=\"graph\" title={t(\"predict.market.graph\")} />\n <Tab key=\"positions\" title={t(\"predict.positions.title\")} />\n <Tab key=\"trade-history\" title={t(\"predict.tradeHistory.title\")} />\n </Tabs>\n\n <div className=\"min-h-[120px]\">\n {activeTab === \"trade-yes\" && (\n <EventMarketOrderbookUI\n bids={orderbook?.yesBids ?? []}\n asks={orderbook?.yesAsks ?? []}\n isLoading={isOrderbookLoading}\n onPriceClick={handleYesPriceClick}\n />\n )}\n\n {activeTab === \"trade-no\" && (\n <EventMarketOrderbookUI\n bids={orderbook?.noBids ?? []}\n asks={orderbook?.noAsks ?? []}\n isLoading={isOrderbookLoading}\n onPriceClick={handleNoPriceClick}\n />\n )}\n\n {activeTab === \"graph\" && (\n <EventMarketCandlesticksUI\n candlesticks={candlesticks}\n isLoading={isCandlesticksLoading}\n chartRange={chartRange}\n onRangeChange={setChartRange}\n />\n )}\n\n {activeTab === \"positions\" && (\n <EventMarketPositionsUI\n positions={positionsWithPnL}\n isLoading={isPositionsLoading}\n />\n )}\n\n {activeTab === \"trade-history\" && (\n <EventMarketTradesUI\n trades={marketTrades}\n isLoading={isTradesLoading}\n />\n )}\n </div>\n </div>\n );\n}\n\nfunction computeAvgCost(\n buyTrades: Pick<OnchainTrade, \"usdPricePerContract\" | \"contracts\">[],\n): number | null {\n if (buyTrades.length === 0) return null;\n let totalContracts = 0;\n let totalCost = 0;\n for (const t of buyTrades) {\n totalContracts += t.contracts!;\n totalCost += t.usdPricePerContract! * t.contracts!;\n }\n return totalContracts > 0 ? totalCost / totalContracts : null;\n}\n\nfunction parseNullablePrice(price: string | null | undefined): number | null {\n if (price == null) return null;\n const n = Number(price);\n return Number.isFinite(n) ? n : null;\n}\n","import { useState, type ReactNode } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, Chip, ChevronDownIcon, ChevronUpIcon } from \"@liberfi.io/ui\";\nimport type { MarketsHoldingsMap } from \"../../hooks/useMarketsHoldings\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\n\nconst DEFAULT_VISIBLE_COUNT = 4;\n\nexport interface EventMarketsUIProps {\n /** Markets list (should already be sorted) */\n markets: StandardMarket[];\n /** Render expanded detail content for a market */\n renderMarketDetail?: (market: StandardMarket) => ReactNode;\n /** Callback when a market Yes/No button is clicked */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n /** Per-market token holdings for the current user */\n marketHoldings?: MarketsHoldingsMap;\n}\n\n/** Parse ask price in dollars (0–1) → cents (0–100), null if absent */\nfunction getMarketPrices(market: StandardMarket) {\n const yesCents = market.yesAsk\n ? Math.round(parseFloat(market.yesAsk) * 100)\n : null;\n const noCents = market.noAsk\n ? Math.round(parseFloat(market.noAsk) * 100)\n : null;\n return { yesCents, noCents };\n}\n\nexport function EventMarketsUI({\n markets,\n renderMarketDetail,\n onTradeAction,\n marketHoldings,\n}: EventMarketsUIProps) {\n const { t } = useTranslation();\n const [showAll, setShowAll] = useState(false);\n const [expandedTicker, setExpandedTicker] = useState<string | null>(null);\n\n if (markets.length === 0) return null;\n\n const hasMore = markets.length > DEFAULT_VISIBLE_COUNT;\n const visibleMarkets = showAll\n ? markets\n : markets.slice(0, DEFAULT_VISIBLE_COUNT);\n\n const toggleExpand = (ticker: string) => {\n setExpandedTicker((prev) => (prev === ticker ? null : ticker));\n };\n\n return (\n <div className=\"flex flex-col divide-y divide-default-200\">\n {visibleMarkets.map((market) => {\n const { yesCents, noCents } = getMarketPrices(market);\n const isExpanded = expandedTicker === market.ticker;\n\n return (\n <div key={market.ticker} className=\"flex flex-col\">\n <div\n className=\"flex items-center gap-x-3 px-2 py-3 transition-colors hover:bg-content2 lg:gap-x-4 cursor-pointer\"\n onClick={() => toggleExpand(market.ticker)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleExpand(market.ticker);\n }\n }}\n >\n {/* Col 1: Title + Holdings tags */}\n <div className=\"flex flex-col gap-y-1 min-w-0 flex-1\">\n <span className=\"text-sm font-medium truncate lg:text-base\">\n {market.yesSubTitle}\n </span>\n {(() => {\n const holding = marketHoldings?.get(market.ticker);\n if (!holding) return null;\n const { yesShares, noShares } = holding;\n if (yesShares <= 0 && noShares <= 0) return null;\n return (\n <div className=\"flex items-center gap-x-1.5\">\n {yesShares > 0 && (\n <Chip\n size=\"sm\"\n variant=\"flat\"\n color=\"primary\"\n classNames={{\n base: \"h-5\",\n content: \"text-[10px] font-medium px-1\",\n }}\n >\n {t(\"predict.market.sharesYes\", {\n shares:\n yesShares % 1 === 0\n ? yesShares\n : yesShares.toFixed(2),\n })}\n </Chip>\n )}\n {noShares > 0 && (\n <Chip\n size=\"sm\"\n variant=\"flat\"\n color=\"secondary\"\n classNames={{\n base: \"h-5\",\n content: \"text-[10px] font-medium px-1\",\n }}\n >\n {t(\"predict.market.sharesNo\", {\n shares:\n noShares % 1 === 0\n ? noShares\n : noShares.toFixed(2),\n })}\n </Chip>\n )}\n </div>\n );\n })()}\n </div>\n\n {/* Col 2: Yes Percentage */}\n {(() => {\n const hasYes = yesCents != null;\n const hasNo = noCents != null;\n\n if (hasYes && !hasNo && yesCents <= 1) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n {\"< 1%\"}\n </span>\n );\n }\n if (hasNo && !hasYes && noCents <= 1) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n {\"> 99%\"}\n </span>\n );\n }\n if (!hasYes && !hasNo) {\n return (\n <span className=\"text-lg font-bold shrink-0 text-center text-default-400 lg:text-xl\">\n 0%\n </span>\n );\n }\n return (\n <span className=\"text-lg font-bold shrink-0 text-center lg:text-xl\">\n {`${yesCents}%`}\n </span>\n );\n })()}\n\n {/* Col 3: Yes / No Buttons */}\n <div className=\"flex items-center gap-x-2 flex-1 justify-end\">\n <Button\n size=\"sm\"\n color=\"primary\"\n className=\"w-20 bg-primary-100 text-primary\"\n onPress={() => onTradeAction?.(market, \"yes\", \"buy\")}\n >\n {yesCents != null\n ? t(\"predict.market.action.yes\", { price: yesCents })\n : t(\"predict.market.yes\")}\n </Button>\n <Button\n size=\"sm\"\n color=\"secondary\"\n className=\"w-20 bg-secondary-100 text-secondary\"\n onPress={() => onTradeAction?.(market, \"no\", \"buy\")}\n >\n {noCents != null\n ? t(\"predict.market.action.no\", { price: noCents })\n : t(\"predict.market.no\")}\n </Button>\n </div>\n\n {/* Expand/Collapse indicator */}\n {isExpanded ? (\n <ChevronUpIcon className=\"h-4 w-4 shrink-0 text-default-400\" />\n ) : (\n <ChevronDownIcon className=\"h-4 w-4 shrink-0 text-default-400\" />\n )}\n </div>\n\n {/* Expanded detail content */}\n {isExpanded && renderMarketDetail && (\n <div className=\"max-h-100 overflow-y-auto px-2 pb-3\">\n {renderMarketDetail(market)}\n </div>\n )}\n </div>\n );\n })}\n\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex items-center justify-center gap-x-1.5 px-2 py-2.5 text-sm text-default-500 transition-colors cursor-pointer hover:text-primary\"\n >\n {showAll ? (\n <>\n <span>{t(\"predict.event.rules.collapse\")}</span>\n <ChevronUpIcon className=\"h-4 w-4\" />\n </>\n ) : (\n <>\n <span>\n {t(\"predict.event.moreMarkets\", {\n count: markets.length - DEFAULT_VISIBLE_COUNT,\n })}\n </span>\n <ChevronDownIcon className=\"h-4 w-4\" />\n </>\n )}\n </button>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Select, SelectItem } from \"@liberfi.io/ui\";\nimport type {\n StandardEvent,\n StandardMarket,\n SeriesResponse,\n} from \"../../types\";\n\nexport interface EventRulesUIProps {\n /** Markets list (should already be sorted) */\n markets: StandardMarket[];\n /** Event data */\n event: StandardEvent;\n /** Series data */\n series?: SeriesResponse;\n}\n\nconst CLOSED_STATUSES = new Set([\"closed\", \"determined\", \"finalized\"]);\n\nfunction formatTimestamp(ts: number): string {\n const date = new Date(ts * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n\ninterface TimelineItem {\n label: string;\n value: string;\n isActive: boolean;\n}\n\nfunction EventTimeline({ market }: { market: StandardMarket }) {\n const isClosed = CLOSED_STATUSES.has(market.status);\n\n const items: TimelineItem[] = useMemo(() => {\n const openItem: TimelineItem = {\n label: \"Market Open\",\n value: formatTimestamp(market.openTime),\n isActive: true,\n };\n\n const closeItem: TimelineItem = {\n label: \"Market Closes\",\n value: isClosed\n ? formatTimestamp(market.closeTime)\n : \"After the outcome occurs\",\n isActive: isClosed,\n };\n\n const payoutItem: TimelineItem = {\n label: \"Projected Payout\",\n value: \"30 minutes after closing\",\n isActive: market.status === \"finalized\",\n };\n\n return [openItem, closeItem, payoutItem];\n }, [market.openTime, market.closeTime, market.status, isClosed]);\n\n const closeDescription = useMemo(() => {\n if (isClosed) return null;\n\n if (market.canCloseEarly && market.earlyCloseCondition) {\n return `${market.earlyCloseCondition} Otherwise, it closes by ${formatTimestamp(market.expirationTime)}.`;\n }\n\n return `This market closes by ${formatTimestamp(market.expirationTime)}.`;\n }, [\n isClosed,\n market.canCloseEarly,\n market.earlyCloseCondition,\n market.expirationTime,\n ]);\n\n return (\n <div className=\"flex flex-col\">\n {items.map((item, index) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\n {/* Timeline indicator */}\n <div className=\"flex flex-col items-center w-3\">\n <div\n className={`h-3 w-3 shrink-0 rounded-full border-2 mt-0.5 ${\n item.isActive\n ? \"border-primary bg-primary\"\n : \"border-default-300 bg-transparent\"\n }`}\n />\n {index < items.length - 1 && (\n <div className=\"w-px flex-1 bg-default-200\" />\n )}\n </div>\n {/* Content */}\n <div\n className={`flex flex-col ${index < items.length - 1 ? \"pb-4\" : \"\"}`}\n >\n <span className=\"text-xs font-medium text-foreground lg:text-sm\">\n {item.label}\n </span>\n <span className=\"text-xs text-default-500 lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n {closeDescription && (\n <p className=\"text-xs text-default-500 mt-3 lg:text-sm\">\n {closeDescription}\n </p>\n )}\n </div>\n );\n}\n\nexport function EventRulesUI({ markets, event, series }: EventRulesUIProps) {\n const { t } = useTranslation();\n const [selectedMarketTicker, setSelectedMarketTicker] = useState<\n string | null\n >(null);\n\n const marketsWithRules = markets.filter((m) => m.rulesPrimary);\n if (marketsWithRules.length === 0) return null;\n\n const selectedMarket =\n marketsWithRules.find((m) => m.ticker === selectedMarketTicker) ??\n marketsWithRules[0];\n if (!selectedMarket?.rulesPrimary) return null;\n\n return (\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 {marketsWithRules.length > 1 && (\n <Select\n size=\"sm\"\n aria-label=\"Select market rules\"\n className=\"max-w-48\"\n classNames={{\n trigger: \"min-h-8 h-8\",\n value: \"text-xs\",\n }}\n selectedKeys={new Set([selectedMarket.ticker])}\n onSelectionChange={(keys) => {\n if (keys === \"all\") return;\n const selected = Array.from(keys) as string[];\n if (selected.length > 0) {\n setSelectedMarketTicker(selected[0]);\n }\n }}\n >\n {marketsWithRules.map((market) => (\n <SelectItem key={market.ticker} textValue={market.yesSubTitle}>\n <span className=\"text-xs truncate\">{market.yesSubTitle}</span>\n </SelectItem>\n ))}\n </Select>\n )}\n <div className=\"text-xs text-foreground lg:text-sm\">\n {selectedMarket.rulesPrimary}\n </div>\n\n {/* Timeline and payout */}\n <span className=\"text-xs font-medium text-default-500 mt-2 lg:text-sm\">\n Timeline and payout\n </span>\n <EventTimeline market={selectedMarket} />\n\n {/* Tickers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-default-400 mt-2 lg:text-xs\">\n {series?.ticker && (\n <span>\n <span className=\"text-default-500\">Series:</span>{\" \"}\n <span className=\"text-foreground\">{series.ticker}</span>\n </span>\n )}\n {event.ticker && (\n <span>\n <span className=\"text-default-500\">Event:</span>{\" \"}\n <span className=\"text-foreground\">{event.ticker}</span>\n </span>\n )}\n <span>\n <span className=\"text-default-500\">Market:</span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.ticker}</span>\n </span>\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Avatar, Select, SelectItem, SelectSection } from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n ChartRange,\n type ChartRangeType,\n type CandlestickPeriodType,\n} from \"../../consts\";\nimport { useMarketsHoldings } from \"../../hooks/useMarketsHoldings\";\nimport type {\n StandardEvent,\n StandardMarket,\n CandlesticksResponse,\n SeriesResponse,\n} from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport {\n EventCandlesticks,\n getLatestEventData,\n type CurrentMarketData,\n} from \"./event-candlesticks.ui\";\nimport { EventMarketDetailWidget } from \"./event-market-detail.widget\";\nimport { EventMarketsUI } from \"./event-markets.ui\";\nimport { EventRulesUI } from \"./event-rules.ui\";\n\nconst RANGE_OPTIONS = [\n { value: ChartRange.ONE_DAY, label: \"1D\" },\n { value: ChartRange.ONE_WEEK, label: \"1W\" },\n { value: ChartRange.ONE_MONTH, label: \"1M\" },\n { value: ChartRange.ALL, label: \"ALL\" },\n];\n\nexport interface EventDetailUIProps {\n event: StandardEvent;\n /** Series data for the event */\n series?: SeriesResponse;\n /** Map of market ticker to candlestick data */\n candlesticks?: Map<string, CandlesticksResponse>;\n /** Currently selected chart range */\n chartRange?: ChartRangeType;\n /** Derived candlestick period interval (for chart formatting) */\n periodInterval?: CandlestickPeriodType;\n /** Whether candlesticks are loading */\n isCandlesticksLoading?: boolean;\n /** Map of market ticker to candlestick error */\n candlestickErrors?: Map<string, Error>;\n /** Callback when chart range changes */\n onRangeChange?: (range: ChartRangeType) => void;\n /** Selected market tickers for candlestick chart */\n selectedMarketTickers?: string[];\n /** Callback when selected markets change */\n onMarketSelectionChange?: (marketTickers: string[]) => void;\n /** Callback when a trade action is triggered (market button / orderbook click) */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventDetailUI({\n event,\n series,\n candlesticks,\n chartRange = ChartRange.ONE_DAY,\n periodInterval,\n isCandlesticksLoading,\n onRangeChange,\n selectedMarketTickers,\n onMarketSelectionChange,\n onTradeAction,\n}: EventDetailUIProps) {\n const { t } = useTranslation();\n const [currentData, setCurrentData] = useState<CurrentMarketData | null>(\n getLatestEventData(),\n );\n const [isCompact, setIsCompact] = useState(false);\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel) return;\n\n let compact = false;\n let rafId = 0;\n\n const update = () => {\n const { bottom } = sentinel.getBoundingClientRect();\n // Hysteresis: require scrolling 20px past sentinel to enter compact,\n // but exit compact as soon as sentinel is back in viewport.\n // This breaks the feedback loop where header height change\n // could toggle the sentinel's visibility back and forth.\n const shouldBeCompact = compact ? bottom < 0 : bottom < -20;\n\n if (shouldBeCompact !== compact) {\n compact = shouldBeCompact;\n setIsCompact(shouldBeCompact);\n }\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n // Use capture to also detect scroll events from non-window scroll containers\n window.addEventListener(\"scroll\", onScroll, {\n passive: true,\n capture: true,\n });\n update();\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n };\n }, []);\n\n const markets = useMemo(\n () =>\n [...(event.markets || [])].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n ),\n [event.markets],\n );\n\n // Fetch per-market yes/no token holdings for the connected wallet\n const { holdings: marketHoldings } = useMarketsHoldings(markets);\n\n const formattedVolume = useMemo(\n () => formatAmountUSDCompact((event.volume ?? 0) / 100),\n [event.volume],\n );\n\n const formattedEndDate = useMemo(() => {\n if (!event.strikeDate) return null;\n const date = new Date(event.strikeDate * 1000);\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.strikeDate]);\n\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 pb-8 lg:px-4 lg:pb-12 lg:max-w-3xl\">\n {/* Sentinel element to detect scroll */}\n <div ref={sentinelRef} className=\"h-0 w-0\" />\n\n {/* Event header - sticky with compact transition */}\n <div\n className={`sticky top-0 z-30 flex items-center bg-background/80 backdrop-blur-md transition-all duration-300 ${\n isCompact\n ? \"gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.imageUrl || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className={`flex-shrink-0 transition-all duration-300 ${\n isCompact\n ? \"!h-8 !w-8 lg:!h-10 lg:!w-10\"\n : \"!h-14 !w-14 lg:!h-18 lg:!w-18\"\n }`}\n />\n <div className=\"flex flex-col min-w-0\">\n {!isCompact &&\n (series?.category || (series?.tags && series.tags.length > 0)) && (\n <span className=\"text-xs text-default-500 lg:text-sm truncate\">\n {series.category}\n {series.category && series.tags?.length > 0 && \" · \"}\n {series.tags?.join(\", \")}\n </span>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCompact ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\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 <EventCandlesticks\n candlesticks={candlesticks}\n chartRange={chartRange}\n markets={markets}\n isLoading={isCandlesticksLoading}\n onDataChange={(data) => setCurrentData(data)}\n />\n\n {/* Volume, period selector and market selector */}\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 mt-2\">\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 <div className=\"flex items-center gap-x-1\">\n {RANGE_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => onRangeChange?.(option.value)}\n className={`px-2 lg:px-3 py-1 text-xs rounded-md transition-colors cursor-pointer ${\n chartRange === 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 {markets.length > 1 && (\n <Select\n size=\"sm\"\n selectionMode=\"multiple\"\n placeholder=\"Markets\"\n aria-label=\"Select markets\"\n className=\"min-w-28 max-w-48\"\n classNames={{\n trigger: \"min-h-8 h-8\",\n value: \"text-xs\",\n }}\n selectedKeys={\n selectedMarketTickers\n ? new Set(selectedMarketTickers)\n : undefined\n }\n onSelectionChange={(keys) => {\n if (keys === \"all\") return;\n const selected = Array.from(keys) as string[];\n if (selected.length <= MAX_PRICE_HISTORY_MARKETS) {\n onMarketSelectionChange?.(selected);\n }\n }}\n >\n <SelectSection\n title={`Pick up to ${MAX_PRICE_HISTORY_MARKETS} markets`}\n classNames={{\n heading: \"text-xs text-default-400 px-2 py-1\",\n }}\n >\n {markets.map((market) => (\n <SelectItem\n key={market.ticker}\n textValue={market.yesSubTitle}\n >\n <span className=\"text-xs truncate\">\n {market.yesSubTitle}\n </span>\n </SelectItem>\n ))}\n </SelectSection>\n </Select>\n )}\n </div>\n </div>\n </div>\n\n {/* Markets */}\n <EventMarketsUI\n markets={markets}\n onTradeAction={onTradeAction}\n marketHoldings={marketHoldings}\n renderMarketDetail={(market) => (\n <EventMarketDetailWidget\n market={market}\n onTradeAction={onTradeAction}\n />\n )}\n />\n\n {/* Rules section */}\n <EventRulesUI markets={markets} event={event} series={series} />\n </div>\n );\n}\n","import { useState, useEffect, useRef, useMemo } from \"react\";\nimport {\n DEFAULT_CHART_RANGE,\n ChartRange,\n MAX_PRICE_HISTORY_MARKETS,\n type ChartRangeType,\n} from \"../../consts\";\nimport type { StandardMarket } from \"../../types\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport { useEventDetail } from \"./event-detail.scripts\";\nimport { EventDetailUI } from \"./event-detail.ui\";\n\n// ------------------------------------------------------------\nexport interface EventDetailWidgetProps {\n eventId: string;\n /** Initial market tickers to query candlesticks for. Default is first 4 markets of the event, max is 4. */\n initialMarketTickers?: string[];\n /** Initial chart range. Default is \"1d\" (1 day). */\n initialChartRange?: ChartRangeType;\n /** Callback when a trade action is triggered (market button / orderbook click) */\n onTradeAction?: (\n market: StandardMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nexport function EventDetailWidget({\n eventId,\n initialMarketTickers,\n initialChartRange = DEFAULT_CHART_RANGE,\n onTradeAction,\n}: EventDetailWidgetProps) {\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(initialChartRange);\n const [selectedMarketTickers, setSelectedMarketTickers] = useState<\n string[] | undefined\n >(initialMarketTickers);\n\n const {\n event,\n isEventLoading,\n eventError,\n series,\n isSeriesLoading,\n periodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n } = useEventDetail({\n eventId,\n candlestickMarketTickers: selectedMarketTickers,\n chartRange,\n });\n\n // Set default selected markets once when event first loads\n const marketsInitializedRef = useRef(!!initialMarketTickers);\n useEffect(() => {\n if (event?.markets && !marketsInitializedRef.current) {\n marketsInitializedRef.current = true;\n const defaultMarketTickers = [...event.markets]\n .sort((a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0))\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((m) => m.ticker);\n setSelectedMarketTickers(defaultMarketTickers);\n }\n }, [event?.markets]);\n\n // Memoize handlers\n const handleRangeChange = useMemo(\n () => (newRange: ChartRangeType) => {\n setChartRange(newRange);\n },\n [],\n );\n\n const handleMarketSelectionChange = useMemo(\n () => (marketTickers: string[]) => {\n setSelectedMarketTickers(marketTickers);\n },\n [],\n );\n\n if (isEventLoading || isSeriesLoading) {\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 series={series}\n candlesticks={candlesticks}\n chartRange={chartRange}\n periodInterval={periodInterval}\n isCandlesticksLoading={isCandlesticksLoading}\n candlestickErrors={candlestickErrors}\n onRangeChange={handleRangeChange}\n selectedMarketTickers={selectedMarketTickers}\n onMarketSelectionChange={handleMarketSelectionChange}\n onTradeAction={onTradeAction}\n />\n );\n}\n\n// Re-export for convenience\nexport { ChartRange, type ChartRangeType };\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Drawer,\n DrawerContent,\n DrawerBody,\n useDisclosure,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport { useEventByIdQuery } from \"../../hooks/useEventByIdQuery\";\nimport type { StandardMarket } from \"../../types\";\nimport {\n type TradeOutcome,\n type TradeSide,\n} from \"../trade-form/trade-form.script\";\nimport { TradeFormWidget } from \"../trade-form/trade-form.widget\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport {\n EventDetailWidget,\n type EventDetailWidgetProps,\n} from \"./event-detail.widget\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventDetailPageProps\n extends Omit<EventDetailWidgetProps, \"eventId\" | \"onTradeAction\"> {\n /** Event ticker ID */\n eventId: string;\n /** Chain network for trading (default: 'solana') */\n chain?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventDetailPage({\n eventId,\n chain,\n ...widgetProps\n}: EventDetailPageProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n // Fetch event to get the list of markets (react-query deduplicates with EventDetailWidget)\n const { data: event, isLoading: isEventLoading } = useEventByIdQuery({\n id: eventId,\n withNestedMarkets: true,\n });\n\n // Sort markets by yesAsk descending (same order as EventDetailUI)\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort(\n (a, b) => Number(b.yesAsk ?? 0) - Number(a.yesAsk ?? 0),\n ),\n [event?.markets],\n );\n\n // Trade action state – tracks which market / outcome / side were selected\n const [tradeSelection, setTradeSelection] = useState<{\n market: StandardMarket;\n outcome: TradeOutcome;\n side: TradeSide;\n /** Monotonic counter so we can key-remount the form on each action */\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: StandardMarket, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n // On mobile, also open the trade drawer\n if (isMobile) onOpen();\n },\n [isMobile, onOpen],\n );\n\n // Selected market for the trade form — prefer trade-action selection, fallback to top market\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -------------------------------------------------------------------------\n // Loading skeleton\n // -------------------------------------------------------------------------\n if (isEventLoading) {\n if (isMobile) {\n return <EventDetailSkeleton />;\n }\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailSkeleton />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n // -------------------------------------------------------------------------\n // Mobile layout: full-width detail + floating trade button + drawer\n // -------------------------------------------------------------------------\n // Common key to force TradeFormWidget remount when trade action changes\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.ticker}-${tradeSelection.version}`\n : (selectedMarket?.ticker ?? \"default\");\n\n if (isMobile) {\n return (\n <>\n <div className=\"w-full pb-20\">\n <EventDetailWidget\n eventId={eventId}\n onTradeAction={handleTradeAction}\n {...widgetProps}\n />\n </div>\n\n {/* Floating trade button */}\n {selectedMarket && (\n <div className=\"fixed inset-x-0 bottom-0 z-40 flex justify-center p-3 bg-gradient-to-t from-background via-background/90 to-transparent\">\n <Button\n color=\"primary\"\n size=\"lg\"\n className=\"w-full max-w-md font-semibold\"\n onPress={onOpen}\n >\n {t(\"predict.trade.action\")}\n </Button>\n </div>\n )}\n\n {/* Trade form drawer */}\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n placement=\"bottom\"\n size=\"lg\"\n hideCloseButton\n classNames={{\n base: \"max-h-[85dvh] rounded-t-2xl\",\n body: \"p-0\",\n }}\n >\n <DrawerContent>\n <DrawerBody>\n {selectedMarket && (\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n }\n\n // -------------------------------------------------------------------------\n // Desktop layout: detail on the left + trade form fixed on the right\n // -------------------------------------------------------------------------\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n {/* Main content */}\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailWidget\n eventId={eventId}\n onTradeAction={handleTradeAction}\n {...widgetProps}\n />\n </div>\n\n {/* Sidebar – sticky trade form */}\n {selectedMarket && (\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 flex flex-col gap-y-4\">\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n </div>\n </aside>\n )}\n </div>\n );\n}\n","/**\n * Narrow adapter for converting V2 types to Standard types.\n *\n * Used exclusively at the boundary where V2 data meets legacy components\n * that still require StandardEvent / StandardMarket (e.g. TradeFormWidget,\n * EventMarketDetailWidget). V2 UI components should use V2 types directly.\n */\nimport type { V2Event, V2Market, V2MarketStatus } from \"../client/v2\";\nimport type { MarketStatus, StandardEvent, StandardMarket } from \"../types\";\n\nfunction isoToUnix(iso: string | undefined): number {\n if (!iso) return 0;\n const ms = new Date(iso).getTime();\n return Number.isFinite(ms) ? Math.floor(ms / 1000) : 0;\n}\n\nfunction priceToString(price: number | undefined): string | null {\n if (price == null) return null;\n return String(Math.round(price * 100));\n}\n\nconst STATUS_MAP: Record<V2MarketStatus, MarketStatus> = {\n pending: \"initialized\",\n open: \"active\",\n closed: \"determined\",\n voided: \"finalized\",\n};\n\n/**\n * Convert a V2Market to the legacy StandardMarket shape.\n * DFlow-specific fields that don't exist in V2 get safe defaults.\n */\nexport function v2MarketToStandard(v2: V2Market): StandardMarket {\n const yes = v2.outcomes[0];\n const no = v2.outcomes[1];\n\n return {\n ticker: v2.slug,\n eventTicker: v2.event_slug,\n marketType: \"binary\",\n title: yes?.label ?? v2.question,\n subtitle: v2.description ?? v2.question,\n yesSubTitle: yes?.label ?? \"Yes\",\n noSubTitle: no?.label ?? \"No\",\n openTime: isoToUnix(v2.start_at),\n closeTime: isoToUnix(v2.end_at),\n expirationTime: isoToUnix(v2.expires_at ?? v2.end_at),\n status: STATUS_MAP[v2.status] ?? \"active\",\n volume: v2.volume ?? 0,\n result: v2.result ?? \"\",\n openInterest: v2.open_interest ?? 0,\n canCloseEarly: false,\n rulesPrimary: v2.rules?.[0] ?? \"\",\n accounts: {},\n yesAsk: priceToString(yes?.best_ask ?? yes?.price),\n yesBid: priceToString(yes?.best_bid),\n noAsk: priceToString(no?.best_ask ?? no?.price),\n noBid: priceToString(no?.best_bid),\n rulesSecondary: v2.rules?.slice(1).join(\"\\n\") ?? null,\n };\n}\n\n/**\n * Convert a V2Event to the legacy StandardEvent shape.\n * Used when passing event data to TradeFormWidget.\n */\nexport function v2EventToStandard(v2: V2Event): StandardEvent {\n return {\n ticker: v2.slug,\n seriesTicker: \"\",\n title: v2.title,\n subtitle: v2.subtitle ?? \"\",\n imageUrl: v2.image_url,\n liquidity: v2.liquidity,\n openInterest: v2.open_interest,\n volume: v2.volume != null ? Math.round(v2.volume * 100) : null,\n volume24h: v2.volume_24h != null ? Math.round(v2.volume_24h * 100) : null,\n strikeDate: isoToUnix(v2.end_at),\n settlementSources: v2.settlement_sources?.map((s) => ({\n name: s.name ?? \"\",\n url: s.url,\n })),\n markets: v2.markets?.map(v2MarketToStandard),\n };\n}\n","import { useState, useMemo, useCallback, useEffect } from \"react\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { useAuth, useWallets } from \"@liberfi.io/wallet-connector\";\nimport type { V2Market, V2ProviderSource } from \"../../client/v2\";\nimport { ORDER_MIN_QUANTITY } from \"../../consts\";\nimport { useDFlowQuoteV2 } from \"../../hooks/v2/useDFlowQuoteV2\";\nimport { useDFlowSubmitV2 } from \"../../hooks/v2/useDFlowSubmitV2\";\nimport { useOrderV2Query } from \"../../hooks/v2/useOrderV2Query\";\nimport { useOrderbookV2Query } from \"../../hooks/v2/useOrderbookV2Query\";\nimport { usePositionsV2Query } from \"../../hooks/v2/usePositionsV2Query\";\nimport type {\n TradeOutcome,\n TradeSide,\n TradeFormValidation,\n} from \"./trade-form.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeFormV2Params {\n market: V2Market;\n chain?: string;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n}\n\nexport interface UseTradeFormV2Result {\n outcome: TradeOutcome;\n side: TradeSide;\n quantity: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isSubmitting: boolean;\n validation: TradeFormValidation;\n setOutcome: (outcome: TradeOutcome) => void;\n setSide: (side: TradeSide) => void;\n setQuantity: (quantity: number) => void;\n submit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n confetti({ ...defaults, particleCount: 80, origin: { x: 0.5, y: 0.4 } });\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.3, y: 0.6 } });\n }, 150);\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.7, y: 0.6 } });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeFormV2({\n market,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chain: _chain = \"solana\",\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormV2Params): UseTradeFormV2Result {\n const { t } = useTranslation();\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n const source: V2ProviderSource = market.source;\n\n const [outcome, setOutcome] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [pendingSignature, setPendingSignature] = useState<string | null>(null);\n\n // Price per share from market outcomes\n const pricePerShare = useMemo(() => {\n const idx = outcome === \"yes\" ? 0 : 1;\n const o = market.outcomes[idx];\n return side === \"buy\"\n ? (o?.best_ask ?? o?.price ?? 0.5)\n : (o?.best_bid ?? o?.price ?? 0.5);\n }, [market.outcomes, outcome, side]);\n\n // Shares calculation\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return side === \"buy\"\n ? pricePerShare > 0\n ? quantity / pricePerShare\n : 0\n : quantity;\n }, [side, quantity, pricePerShare]);\n\n // Amount in smallest unit for quote\n const amountStr = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return \"0\";\n return String(Math.round(quantity * 1_000_000));\n }, [quantity]);\n\n // Determine input/output mints from provider_meta\n const yesMint = (market.provider_meta?.[\"dflow.yesMint\"] as string) ?? \"\";\n const noMint = (market.provider_meta?.[\"dflow.noMint\"] as string) ?? \"\";\n const usdcMint =\n (market.provider_meta?.[\"dflow.collateralMint\"] as string) ?? \"\";\n const outcomeMint = outcome === \"yes\" ? yesMint : noMint;\n\n const inputMint = side === \"buy\" ? usdcMint : outcomeMint;\n const outputMint = side === \"buy\" ? outcomeMint : usdcMint;\n\n // DFlow quote\n const quoteEnabled =\n Boolean(inputMint) &&\n Boolean(outputMint) &&\n Boolean(userPublicKey) &&\n amountStr !== \"0\";\n\n const { data: quoteData, refetch: refetchQuote } = useDFlowQuoteV2(\n {\n inputMint,\n outputMint,\n amount: amountStr,\n userPublicKey: userPublicKey ?? \"\",\n slippageBps: 100,\n },\n { enabled: quoteEnabled },\n );\n\n // Positions for balance\n const { data: positionsData, isLoading: isBalanceLoading } =\n usePositionsV2Query(\n { source, user: userPublicKey ?? \"\" },\n { enabled: Boolean(userPublicKey) },\n );\n\n const usdcBalance = useMemo(() => {\n if (!positionsData) return null;\n const total = positionsData.positions.reduce((sum, p) => {\n if (p.side === \"USDC\" || p.side === \"collateral\")\n return sum + p.current_value;\n return sum;\n }, 0);\n return total || null;\n }, [positionsData]);\n\n const yesTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"yes\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n const noTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"no\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n // Cost / payout\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") return quantity;\n const bidPrice =\n outcome === \"yes\"\n ? (market.outcomes[0]?.best_bid ?? 0)\n : (market.outcomes[1]?.best_bid ?? 0);\n return quantity * bidPrice;\n }, [side, outcome, quantity, market.outcomes]);\n\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") return shares * 1;\n return estimatedCost;\n }, [side, shares, estimatedCost, quantity]);\n\n const potentialProfit = potentialPayout - estimatedCost;\n\n // Side setter\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\n const setQuantity = useCallback(\n (v: number) => {\n if (isNaN(v)) {\n setQuantityRaw(NaN);\n return;\n }\n const clamped = Math.max(0, v);\n const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n // Validation\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n if (market.status !== \"open\") {\n errors.push(\"Market is not active\");\n }\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(\"Insufficient USDC balance\");\n }\n const holdingBalance = outcome === \"yes\" ? yesTokenBalance : noTokenBalance;\n if (\n side === \"sell\" &&\n holdingBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > holdingBalance\n ) {\n errors.push(\"Insufficient shares\");\n }\n return { isValid: errors.length === 0, errors };\n }, [\n quantity,\n market.status,\n side,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n outcome,\n ]);\n\n // DFlow submit mutation\n const { mutateAsync: submitDFlow } = useDFlowSubmitV2();\n\n // Poll order status for pending signature\n const { data: orderStatus } = useOrderV2Query(\n { id: pendingSignature ?? \"\", source },\n { enabled: Boolean(pendingSignature) },\n );\n\n // React to terminal order status\n useEffect(() => {\n if (!orderStatus || !pendingSignature) return;\n const { status } = orderStatus;\n if (status === \"closed\") {\n setIsSubmitting(false);\n setPendingSignature(null);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n setQuantityRaw(NaN);\n } else if (status === \"failed\" || status === \"expired\") {\n setIsSubmitting(false);\n setPendingSignature(null);\n toast.error(t(\"predict.trade.submitError\"));\n }\n }, [orderStatus, pendingSignature, t]);\n\n // Submit\n const submit = useCallback(async () => {\n if (\n !validation.isValid ||\n !isAuthenticated ||\n !userPublicKey ||\n !solanaWallet\n ) {\n return;\n }\n\n setIsSubmitting(true);\n setPendingSignature(null);\n\n try {\n // Get fresh quote with transaction\n const quoteResult = await refetchQuote();\n const quote = quoteResult.data;\n const transaction = (quote as Record<string, unknown>)?.transaction as\n | string\n | undefined;\n\n if (!transaction) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n // Sign and send\n const txBytes = Uint8Array.from(atob(transaction), (c) =>\n c.charCodeAt(0),\n );\n const signature = await solanaWallet.sendTransaction(txBytes);\n\n // Submit to prediction-server for tracking\n await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...txBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: inputMint,\n output_mint: outputMint,\n amount: amountStr,\n price: String(pricePerShare),\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n outcome: outcome === \"yes\" ? \"YES\" : \"NO\",\n market_slug: market.slug,\n slippage_bps: 100,\n },\n });\n\n setPendingSignature(signature);\n } catch (err) {\n console.error(\"[TradeFormV2] submit failed:\", err);\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n userPublicKey,\n solanaWallet,\n refetchQuote,\n submitDFlow,\n inputMint,\n outputMint,\n amountStr,\n pricePerShare,\n side,\n outcome,\n market.slug,\n t,\n ]);\n\n return {\n outcome,\n side,\n quantity,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n };\n}\n","import { useMemo } from \"react\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport {\n v2EventToStandard,\n v2MarketToStandard,\n} from \"../../utils/v2-market-adapter\";\nimport { useTradeFormV2 } from \"./trade-form-v2.script\";\nimport type { TradeSide, TradeOutcome } from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormV2WidgetProps {\n event?: V2Event;\n market: V2Market;\n initialSide?: TradeSide;\n initialOutcome?: TradeOutcome;\n chain?: string;\n}\n\nexport function TradeFormV2Widget({\n event,\n market,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormV2WidgetProps) {\n const {\n outcome,\n side,\n quantity,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n setOutcome,\n setSide,\n setQuantity,\n submit,\n } = useTradeFormV2({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n const authenticatedSubmit = useAuthCallback(submit);\n\n const adaptedEvent = useMemo(\n () => (event ? v2EventToStandard(event) : undefined),\n [event],\n );\n const adaptedMarket = useMemo(() => v2MarketToStandard(market), [market]);\n\n return (\n <TradeFormUI\n event={adaptedEvent}\n market={adaptedMarket}\n outcome={outcome}\n side={side}\n quantity={quantity}\n estimatedCost={estimatedCost}\n potentialPayout={potentialPayout}\n potentialProfit={potentialProfit}\n usdcBalance={usdcBalance}\n yesTokenBalance={yesTokenBalance}\n noTokenBalance={noTokenBalance}\n isBalanceLoading={isBalanceLoading}\n isSubmitting={isSubmitting}\n isValid={validation.isValid}\n validationErrors={validation.errors}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onQuantityChange={setQuantity}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\nimport type {\n V2Event,\n V2Position,\n V2Trade,\n V2UserOrder,\n} from \"../../client/v2\";\nimport { useCancelOrderV2Mutation } from \"../../hooks/v2/useCancelOrderV2Mutation\";\nimport { useOrdersV2Query } from \"../../hooks/v2/useOrdersV2Query\";\nimport { usePositionsV2Query } from \"../../hooks/v2/usePositionsV2Query\";\nimport { useTradesByWalletV2Query } from \"../../hooks/v2/useTradesByWalletV2Query\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UserActivityV2SectionProps {\n event: V2Event;\n /** Connected wallet address. When empty the section shows a connect prompt. */\n walletAddress?: string;\n /** Callback to cancel an open order. */\n onCancelOrder?: (orderId: string) => void;\n}\n\ntype ActivityTab = \"positions\" | \"orders\" | \"trades\";\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function UserActivityV2Section({\n event,\n walletAddress,\n onCancelOrder,\n}: UserActivityV2SectionProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ActivityTab>(\"positions\");\n\n const marketSlugs = useMemo(\n () => event.markets?.map((m) => m.slug) ?? [],\n [event.markets],\n );\n\n const tabs: { key: ActivityTab; label: string }[] = [\n { key: \"positions\", label: t(\"predict.positions.title\") },\n { key: \"orders\", label: t(\"predict.openOrders.title\") },\n { key: \"trades\", label: t(\"predict.tradeHistory.title\") },\n ];\n\n return (\n <div className=\"flex flex-col gap-y-2 mt-6 px-1 lg:px-4\">\n {/* Tab bar */}\n <div className=\"flex items-center gap-x-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-2 text-sm font-medium transition-colors cursor-pointer\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-primary\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n {!walletAddress ? (\n <div className=\"flex items-center justify-center py-12 text-sm text-neutral\">\n {t(\"predict.trade.connectWallet\")}\n </div>\n ) : (\n <div className=\"min-h-[120px]\">\n {activeTab === \"positions\" && (\n <PositionsTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n />\n )}\n {activeTab === \"orders\" && (\n <OrdersTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n onCancelOrder={onCancelOrder}\n />\n )}\n {activeTab === \"trades\" && (\n <TradesTab source={event.source} walletAddress={walletAddress} />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Positions Tab\n// ---------------------------------------------------------------------------\n\nfunction PositionsTab({\n source,\n walletAddress,\n marketSlugs,\n}: {\n source: V2Event[\"source\"];\n walletAddress: string;\n marketSlugs: string[];\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = usePositionsV2Query({\n source,\n user: walletAddress,\n });\n\n const positions = useMemo(() => {\n if (!data?.positions) return [];\n if (marketSlugs.length === 0) return data.positions;\n return data.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n );\n }, [data?.positions, marketSlugs]);\n\n if (isLoading) return <TabSkeleton rows={3} />;\n\n if (positions.length === 0) {\n return <EmptyState message={t(\"predict.positions.empty\")} />;\n }\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs lg:text-sm\">\n <thead>\n <tr className=\"text-neutral text-left\">\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.positions.market\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.positions.side\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.positions.size\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.positions.avgCost\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.positions.currentPrice\")}\n </th>\n <th className=\"py-2 font-normal text-right\">\n {t(\"predict.positions.pnl\")}\n </th>\n </tr>\n </thead>\n <tbody>\n {positions.map((pos, idx) => (\n <PositionRow\n key={`${pos.market?.slug ?? idx}-${pos.side}`}\n position={pos}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction PositionRow({ position }: { position: V2Position }) {\n const pnlColor =\n position.pnl > 0\n ? \"text-success\"\n : position.pnl < 0\n ? \"text-danger\"\n : \"text-foreground\";\n const pnlSign = position.pnl > 0 ? \"+\" : \"\";\n\n return (\n <tr className=\"border-b border-border/50 last:border-b-0\">\n <td className=\"py-2 pr-2 text-foreground max-w-[180px] truncate\">\n {position.market?.outcomes?.[0]?.label ??\n position.market?.question ??\n \"—\"}\n </td>\n <td className=\"py-2 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium uppercase\",\n position.side.toLowerCase() === \"yes\"\n ? \"bg-primary/10 text-primary\"\n : \"bg-secondary/10 text-secondary\",\n )}\n >\n {position.side}\n </span>\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {position.size}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {formatPrice(position.avg_price)}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {formatPrice(position.current_price)}\n </td>\n <td className={cn(\"py-2 text-right font-mono\", pnlColor)}>\n {pnlSign}${Math.abs(position.pnl).toFixed(2)}\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {position.pnl_percent.toFixed(1)}%)\n </span>\n </td>\n </tr>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Orders Tab\n// ---------------------------------------------------------------------------\n\nfunction OrdersTab({\n source,\n walletAddress,\n marketSlugs,\n onCancelOrder,\n}: {\n source: V2Event[\"source\"];\n walletAddress: string;\n marketSlugs: string[];\n onCancelOrder?: (orderId: string) => void;\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = useOrdersV2Query({\n source,\n wallet_address: walletAddress,\n });\n\n const cancelMutation = useCancelOrderV2Mutation();\n\n const orders = useMemo(() => {\n if (!data?.items) return [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n let filtered = data.items.filter((o) => openStatuses.has(o.status));\n if (marketSlugs.length > 0) {\n filtered = filtered.filter(\n (o) => o.market_id && marketSlugs.includes(o.market_id),\n );\n }\n return filtered;\n }, [data?.items, marketSlugs]);\n\n const handleCancel = (orderId: string) => {\n if (onCancelOrder) {\n onCancelOrder(orderId);\n } else {\n cancelMutation.mutate({ source, id: orderId });\n }\n };\n\n if (isLoading) return <TabSkeleton rows={3} />;\n\n if (orders.length === 0) {\n return <EmptyState message={t(\"predict.openOrders.empty\")} />;\n }\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs lg:text-sm\">\n <thead>\n <tr className=\"text-neutral text-left\">\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.openOrders.side\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.openOrders.outcome\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.openOrders.type\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.openOrders.price\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.openOrders.filled\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.openOrders.status\")}\n </th>\n <th className=\"py-2 font-normal\" />\n </tr>\n </thead>\n <tbody>\n {orders.map((order) => (\n <OrderRow\n key={order.id}\n order={order}\n onCancel={() => handleCancel(order.id)}\n isCancelling={cancelMutation.isPending}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction OrderRow({\n order,\n onCancel,\n isCancelling,\n}: {\n order: V2UserOrder;\n onCancel: () => void;\n isCancelling: boolean;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n\n return (\n <tr className=\"border-b border-border/50 last:border-b-0\">\n <td className=\"py-2 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n </td>\n <td className=\"py-2 pr-2 text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </td>\n <td className=\"py-2 pr-2 text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {order.price ? formatPrice(parseFloat(order.price)) : \"—\"}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {order.size_matched ?? \"0\"}/{order.original_size ?? \"—\"}\n </td>\n <td className=\"py-2 pr-2\">\n <OrderStatusBadge status={order.status} />\n </td>\n <td className=\"py-2 text-right\">\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={isCancelling}\n className=\"text-[10px] text-danger hover:text-danger/80 cursor-pointer disabled:opacity-50 transition-colors\"\n >\n {isCancelling ? (\n <Spinner size=\"sm\" />\n ) : (\n t(\"predict.openOrders.cancel\")\n )}\n </button>\n </td>\n </tr>\n );\n}\n\nfunction OrderStatusBadge({ status }: { status: string }) {\n const colorMap: Record<string, string> = {\n live: \"bg-success/10 text-success\",\n open: \"bg-success/10 text-success\",\n submitted: \"bg-warning/10 text-warning\",\n pending: \"bg-warning/10 text-warning\",\n matched: \"bg-primary/10 text-primary\",\n cancelled: \"bg-neutral/10 text-neutral\",\n failed: \"bg-danger/10 text-danger\",\n expired: \"bg-neutral/10 text-neutral\",\n };\n\n return (\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium capitalize\",\n colorMap[status] ?? \"bg-neutral/10 text-neutral\",\n )}\n >\n {status}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Trades Tab\n// ---------------------------------------------------------------------------\n\nfunction TradesTab({\n source,\n walletAddress,\n}: {\n source: V2Event[\"source\"];\n walletAddress: string;\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = useTradesByWalletV2Query({\n source,\n wallet: walletAddress,\n limit: 50,\n });\n\n const trades = data?.items ?? [];\n\n if (isLoading) return <TabSkeleton rows={3} />;\n\n if (trades.length === 0) {\n return <EmptyState message={t(\"predict.tradeHistory.empty\")} />;\n }\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs lg:text-sm\">\n <thead>\n <tr className=\"text-neutral text-left\">\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.tradeHistory.side\")}\n </th>\n <th className=\"py-2 pr-2 font-normal\">\n {t(\"predict.tradeHistory.outcome\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.tradeHistory.price\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.tradeHistory.qty\")}\n </th>\n <th className=\"py-2 pr-2 font-normal text-right\">\n {t(\"predict.tradeHistory.total\")}\n </th>\n <th className=\"py-2 font-normal text-right\">\n {t(\"predict.tradeHistory.time\")}\n </th>\n </tr>\n </thead>\n <tbody>\n {trades.map((trade) => (\n <TradeRow key={trade.id} trade={trade} />\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction TradeRow({ trade }: { trade: V2Trade }) {\n const isBuy = trade.side.toUpperCase() === \"BUY\";\n const timeStr = formatTimestamp(trade.timestamp);\n\n return (\n <tr className=\"border-b border-border/50 last:border-b-0\">\n <td className=\"py-2 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {trade.side}\n </span>\n </td>\n <td className=\"py-2 pr-2 text-foreground capitalize\">\n {trade.outcome ?? \"—\"}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {formatPrice(trade.price)}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n {trade.size}\n </td>\n <td className=\"py-2 pr-2 text-right font-mono text-foreground\">\n ${trade.usd_size.toFixed(2)}\n </td>\n <td className=\"py-2 text-right text-neutral whitespace-nowrap\">\n {timeStr}\n </td>\n </tr>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ message }: { message: string }) {\n return (\n <div className=\"flex items-center justify-center py-12 text-sm text-neutral\">\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ rows }: { rows: number }) {\n return (\n <div className=\"flex flex-col gap-y-2 py-3 animate-pulse\">\n {Array.from({ length: rows }).map((_, i) => (\n <Skeleton key={i} className=\"h-8 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatPrice(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n return `${month}/${day} ${hours}:${mins}`;\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Tabs, Tab, Spinner } from \"@liberfi.io/ui\";\nimport type { V2Market, V2ProviderSource } from \"../../client/v2\";\nimport { useCandlesticksV2Query } from \"../../hooks/v2/useCandlesticksV2Query\";\nimport { useMarketTradesV2Query } from \"../../hooks/v2/useMarketTradesV2Query\";\nimport { useOrderbookV2Query } from \"../../hooks/v2/useOrderbookV2Query\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventMarketOrderbookUI } from \"./event-market-orderbook.ui\";\n\ntype MarketDetailTab = \"trade-yes\" | \"trade-no\" | \"activity\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatPrice(price: number): string {\n return `${Math.round(price * 100)}¢`;\n}\n\nfunction formatQty(qty: number): string {\n if (qty >= 1_000_000) return `${(qty / 1_000_000).toFixed(1)}M`;\n if (qty >= 1_000) return `${(qty / 1_000).toFixed(1)}K`;\n return qty.toLocaleString();\n}\n\nfunction formatTime(ts: number): string {\n const date = new Date(ts * 1000);\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day} ${hours}:${minutes}`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventMarketDetailV2WidgetProps {\n market: V2Market;\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDetailV2Widget({\n market,\n onTradeAction,\n}: EventMarketDetailV2WidgetProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<MarketDetailTab>(\"trade-yes\");\n\n const source = market.source;\n\n const { data: orderbook, isLoading: isOrderbookLoading } =\n useOrderbookV2Query(\n { slug: market.slug, source },\n { enabled: activeTab === \"trade-yes\" || activeTab === \"trade-no\" },\n );\n\n const { data: tradesData, isLoading: isTradesLoading } =\n useMarketTradesV2Query(\n { slug: market.slug, source, limit: 20 },\n { enabled: activeTab === \"activity\" },\n );\n\n const handleYesPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"yes\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n const handleNoPriceClick = useCallback(\n (_price: number, bookSide: \"bid\" | \"ask\") => {\n onTradeAction?.(market, \"no\", bookSide === \"ask\" ? \"buy\" : \"sell\");\n },\n [market, onTradeAction],\n );\n\n const yesBids = useMemo(\n () =>\n (orderbook?.bids ?? []).map((o) => ({\n price: o.price,\n quantity: o.size,\n })),\n [orderbook?.bids],\n );\n const yesAsks = useMemo(\n () =>\n (orderbook?.asks ?? []).map((o) => ({\n price: o.price,\n quantity: o.size,\n })),\n [orderbook?.asks],\n );\n\n const trades = tradesData?.items ?? [];\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n <Tabs\n variant=\"underlined\"\n selectedKey={activeTab}\n onSelectionChange={(key) => setActiveTab(key as MarketDetailTab)}\n classNames={{ tabList: \"gap-x-4\", tab: \"px-0\" }}\n >\n <Tab key=\"trade-yes\" title={t(\"predict.market.tradeYes\")} />\n <Tab key=\"trade-no\" title={t(\"predict.market.tradeNo\")} />\n <Tab key=\"activity\" title={t(\"predict.activity.title\")} />\n </Tabs>\n\n <div className=\"min-h-[120px]\">\n {activeTab === \"trade-yes\" && (\n <EventMarketOrderbookUI\n bids={yesBids}\n asks={yesAsks}\n isLoading={isOrderbookLoading}\n onPriceClick={handleYesPriceClick}\n />\n )}\n\n {activeTab === \"trade-no\" && (\n <EventMarketOrderbookUI\n bids={yesBids}\n asks={yesAsks}\n isLoading={isOrderbookLoading}\n onPriceClick={handleNoPriceClick}\n />\n )}\n\n {activeTab === \"activity\" && (\n <V2TradesTable trades={trades} isLoading={isTradesLoading} />\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// V2 Trades table (uses V2Trade directly, no legacy adapter)\n// ---------------------------------------------------------------------------\n\nfunction V2TradesTable({\n trades,\n isLoading,\n}: {\n trades: import(\"../../client/v2\").V2Trade[];\n isLoading: boolean;\n}) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-8\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n if (trades.length === 0) {\n return (\n <div className=\"flex items-center justify-center py-6 text-sm text-neutral\">\n {t(\"predict.tradeHistory.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"grid grid-cols-4 px-2 py-2.5 text-xs text-neutral\">\n <span>{t(\"predict.tradeHistory.side\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.price\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.qty\")}</span>\n <span className=\"text-right\">{t(\"predict.tradeHistory.time\")}</span>\n </div>\n\n {trades.map((trade) => {\n const isYes = trade.outcome?.toLowerCase() === \"yes\";\n const sideColor = isYes ? \"text-bullish\" : \"text-bearish\";\n const sideLabel = isYes\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\");\n\n return (\n <div\n key={trade.id}\n className=\"grid grid-cols-4 px-2 py-2.5 text-xs hover:bg-default-100 transition-colors\"\n >\n <span className={`font-medium ${sideColor}`}>{sideLabel}</span>\n <span className=\"text-right font-mono text-foreground\">\n {formatPrice(trade.price)}\n </span>\n <span className=\"text-right font-mono text-foreground\">\n {formatQty(trade.size)}\n </span>\n <span className=\"text-right text-default-500\">\n {formatTime(trade.timestamp)}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","// =============================================================================\n// EventPriceChartV2\n//\n// Pixel-accurate clone of the Jupiter Prediction Market price chart.\n// Uses Recharts LineChart with 7 visual effects:\n// 1. Top legend (dot + label + live %)\n// 2. Real-time tooltip on hover\n// 3. Active cursor dot on each line\n// 4. Breathing pulsing dot at the last data point\n// 5. Left/right opacity overlay that follows the cursor\n// 6. Custom X/Y axis styling\n// 7. Horizontal dashed grid lines\n//\n// Accepts a V2Event and selects up to 4 markets to display via a chip selector.\n// =============================================================================\nimport {\n Component,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ErrorInfo,\n type ReactNode,\n} from \"react\";\nimport {\n CartesianGrid,\n Customized,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport {\n ChartRange,\n DEFAULT_CHART_RANGE,\n type ChartRangeType,\n} from \"../../consts\";\nimport {\n useMarketHistoryV2,\n type MarketHistorySeries,\n} from \"../../hooks/v2/useMarketHistoryV2\";\n\n// ---------------------------------------------------------------------------\n// Error boundary — prevents chart crashes from taking down the page\n// ---------------------------------------------------------------------------\n\ninterface ChartErrorBoundaryState {\n error: Error | null;\n}\n\nclass ChartErrorBoundary extends Component<\n { children: ReactNode; fallbackHeight?: number },\n ChartErrorBoundaryState\n> {\n state: ChartErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\"[EventPriceChartV2] render error:\", error, info);\n }\n\n render() {\n if (this.state.error) {\n return (\n <div\n style={{\n height: this.props.fallbackHeight ?? 320,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n <span>Chart unavailable</span>\n <span style={{ fontSize: 11, opacity: 0.7 }}>\n {this.state.error.message}\n </span>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MAX_SELECTED = 4;\n\n/** Jupiter-aligned chart colors */\nconst CHART_COLORS = [\n \"#22d3ee\", // cyan\n \"#a3e635\", // lime\n \"#f97316\", // orange\n \"#f472b6\", // pink\n \"#a78bfa\", // violet\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n // e.g. \"14:30\"\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n // e.g. \"Mar 18\"\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(2)}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Interval labels\n// ---------------------------------------------------------------------------\n\nconst INTERVAL_OPTIONS: { range: ChartRangeType; label: string }[] = [\n { range: ChartRange.ONE_DAY, label: \"1D\" },\n { range: ChartRange.ONE_WEEK, label: \"1W\" },\n { range: ChartRange.ONE_MONTH, label: \"1M\" },\n { range: ChartRange.ALL, label: \"ALL\" },\n];\n\n// ---------------------------------------------------------------------------\n// IntervalSwitcher — plain text buttons, Jupiter-style\n// ---------------------------------------------------------------------------\n\ninterface IntervalSwitcherProps {\n value: ChartRangeType;\n onChange: (range: ChartRangeType) => void;\n}\n\nfunction IntervalSwitcher({ value, onChange }: IntervalSwitcherProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\n {INTERVAL_OPTIONS.map(({ range, label }) => {\n const isActive = range === value;\n return (\n <button\n key={range}\n onClick={() => onChange(range)}\n style={{\n padding: \"2px 8px\",\n border: \"none\",\n background: \"transparent\",\n color: isActive ? \"#f9fafb\" : \"#6b7280\",\n fontWeight: isActive ? 700 : 400,\n fontSize: 12,\n cursor: \"pointer\",\n borderRadius: 4,\n letterSpacing: \"0.02em\",\n transition: \"color 0.15s\",\n userSelect: \"none\",\n }}\n >\n {label}\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// BreathingDotsLayer — renders ONE breathing dot per series at its last point.\n// Injected via <Customized> so it runs once, not once-per-data-point.\n// ---------------------------------------------------------------------------\n\ninterface BreathingDotsLayerProps {\n /** Pairs of [cx, cy, color] for each series' last point. */\n dots: Array<{ cx: number; cy: number; color: string }>;\n // Recharts passes extra layout props — accept and ignore them.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nfunction BreathingDotsLayer({ dots }: BreathingDotsLayerProps) {\n return (\n <>\n {dots.map(({ cx, cy, color }, i) => (\n <g key={i}>\n <circle cx={cx} cy={cy} r={6} fill={color} opacity={0.3}>\n <animate\n attributeName=\"r\"\n values=\"4;9;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.05;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={cx} cy={cy} r={3.5} fill={color} />\n </g>\n ))}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// useCursorOverlay\n//\n// Returns refs for the chart wrapper div and the overlay div.\n// Mouse position tracking is done at the div level (not via Recharts internals)\n// so the approach works regardless of Recharts version or SVG structure.\n// DOM style is updated imperatively — zero React re-renders on mousemove.\n// ---------------------------------------------------------------------------\n\nfunction useCursorOverlay() {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n\n const onMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const wrapper = wrapperRef.current;\n const overlay = overlayRef.current;\n if (!wrapper || !overlay) return;\n\n const rect = wrapper.getBoundingClientRect();\n // Cursor offset as percentage of the wrapper — this is exactly where the\n // cursor is visually, so the gradient cutoff aligns perfectly with it.\n const xPct = ((e.clientX - rect.left) / rect.width) * 100;\n\n // Left of cursor: transparent (lines at full brightness).\n // Right of cursor: ~38% dark overlay, matching Jupiter's visual where\n // lines to the right appear ~30% dimmer than lines to the left.\n overlay.style.background = `linear-gradient(to right, transparent ${xPct}%, rgba(0,0,0,0.38) ${xPct}%)`;\n overlay.style.opacity = \"1\";\n }, []);\n\n const onMouseLeave = useCallback(() => {\n if (overlayRef.current) overlayRef.current.style.opacity = \"0\";\n }, []);\n\n return { wrapperRef, overlayRef, onMouseMove, onMouseLeave };\n}\n\n// ---------------------------------------------------------------------------\n// CustomTooltip\n// ---------------------------------------------------------------------------\n\ninterface CustomTooltipPayloadItem {\n dataKey: string;\n value: number | undefined;\n stroke: string;\n color: string;\n}\n\ninterface CustomTooltipProps {\n active?: boolean;\n payload?: CustomTooltipPayloadItem[];\n label?: number | string;\n labelMap: Map<string, string>;\n}\n\nfunction CustomTooltip({\n active,\n payload,\n label,\n labelMap,\n}: CustomTooltipProps) {\n if (!active || !payload?.length) return null;\n\n const sorted = [...(payload as CustomTooltipPayloadItem[])]\n .filter((p) => p.value != null)\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n return (\n <div\n style={{\n background: \"rgba(10,10,10,0.92)\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n minWidth: 180,\n backdropFilter: \"blur(8px)\",\n fontSize: 12,\n }}\n >\n <div style={{ color: \"#9ca3af\", marginBottom: 6, fontWeight: 500 }}>\n {typeof label === \"number\" ? formatTimestamp(label) : label}\n </div>\n {sorted.map((p) => (\n <div\n key={p.dataKey}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 3,\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n width: 3,\n height: 14,\n borderRadius: 2,\n background: p.stroke ?? p.color,\n flexShrink: 0,\n }}\n />\n <span\n style={{\n color: \"#e5e7eb\",\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: 120,\n }}\n >\n {labelMap.get(p.dataKey) ?? p.dataKey}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {p.value != null ? formatPercent(p.value) : \"-\"}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// MarketSelector — dropdown multi-select, max MAX_SELECTED markets\n// ---------------------------------------------------------------------------\n\ninterface MarketSelectorProps {\n markets: V2Market[];\n selectedSlugs: string[];\n colorMap: Map<string, string>;\n onToggle: (slug: string) => void;\n}\n\nfunction MarketSelector({\n markets,\n selectedSlugs,\n colorMap,\n onToggle,\n}: MarketSelectorProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleClick(e: MouseEvent) {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const atMax = selectedSlugs.length >= MAX_SELECTED;\n\n // Trigger label: show colored dots + count summary\n const triggerContent = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n flex: 1,\n minWidth: 0,\n }}\n >\n {/* Color dots for selected markets */}\n <div style={{ display: \"flex\", gap: 3, flexShrink: 0 }}>\n {selectedSlugs.map((slug) => (\n <span\n key={slug}\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: colorMap.get(slug) ?? \"#6b7280\",\n display: \"inline-block\",\n }}\n />\n ))}\n </div>\n {/* Label */}\n <span\n style={{\n color: \"#e5e7eb\",\n fontSize: 12,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {selectedSlugs.length === 1\n ? (markets.find((m) => m.slug === selectedSlugs[0])?.question ??\n \"1 market\")\n : `${selectedSlugs.length} / ${markets.length} markets`}\n </span>\n </div>\n );\n\n return (\n <div\n ref={rootRef}\n style={{ position: \"relative\", display: \"inline-block\", maxWidth: 320 }}\n >\n {/* Trigger button */}\n <button\n onClick={() => setOpen((v) => !v)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 10px\",\n borderRadius: 8,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"rgba(255,255,255,0.05)\",\n cursor: \"pointer\",\n minWidth: 160,\n maxWidth: 320,\n userSelect: \"none\",\n }}\n >\n {triggerContent}\n {/* Chevron */}\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n style={{\n flexShrink: 0,\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.15s\",\n color: \"#6b7280\",\n }}\n >\n <path\n d=\"M2 4l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Dropdown panel */}\n {open && (\n <div\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: 0,\n zIndex: 50,\n background: \"#111827\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 10,\n boxShadow: \"0 8px 24px rgba(0,0,0,0.5)\",\n minWidth: 260,\n maxWidth: 360,\n maxHeight: 320,\n overflowY: \"auto\",\n padding: \"6px 0\",\n }}\n >\n {/* Header hint */}\n <div\n style={{\n padding: \"4px 12px 8px\",\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n marginBottom: 4,\n }}\n >\n Select up to {MAX_SELECTED} markets\n </div>\n\n {markets.map((market) => {\n const isSelected = selectedSlugs.includes(market.slug);\n const isDisabled = !isSelected && atMax;\n const isOnlyOne = isSelected && selectedSlugs.length === 1;\n const color = colorMap.get(market.slug) ?? \"#6b7280\";\n const yesOutcome =\n market.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes[0];\n const pct =\n yesOutcome?.price != null\n ? `${Math.round(yesOutcome.price * 100)}%`\n : null;\n\n return (\n <button\n key={market.slug}\n onClick={() => {\n if (isOnlyOne || isDisabled) return;\n onToggle(market.slug);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n width: \"100%\",\n padding: \"7px 12px\",\n border: \"none\",\n background: isSelected\n ? \"rgba(255,255,255,0.05)\"\n : \"transparent\",\n cursor: isDisabled || isOnlyOne ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.35 : 1,\n textAlign: \"left\",\n transition: \"background 0.1s\",\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isOnlyOne)\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.07)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n isSelected ? \"rgba(255,255,255,0.05)\" : \"transparent\";\n }}\n >\n {/* Checkbox */}\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: 4,\n border: isSelected\n ? `2px solid ${color}`\n : \"2px solid rgba(255,255,255,0.2)\",\n background: isSelected ? `${color}30` : \"transparent\",\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {isSelected && (\n <svg width=\"9\" height=\"7\" viewBox=\"0 0 9 7\" fill=\"none\">\n <path\n d=\"M1 3.5L3.5 6L8 1\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n\n {/* Color dot */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n }}\n />\n\n {/* Question text */}\n <span\n style={{\n color: isSelected ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 12,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n\n {/* Odds */}\n {pct && (\n <span\n style={{\n color,\n fontWeight: 700,\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n {pct}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Legend\n// ---------------------------------------------------------------------------\n\ninterface LegendBarProps {\n series: MarketHistorySeries[];\n colorMap: Map<string, string>;\n currentValues: Map<string, number>;\n}\n\nfunction LegendBar({ series, colorMap, currentValues }: LegendBarProps) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"4px 16px\",\n padding: \"0 2px\",\n }}\n >\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n const value = currentValues.get(s.marketSlug);\n return (\n <div\n key={s.marketSlug}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n }}\n >\n <span\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n }}\n />\n <span style={{ color: \"#9ca3af\" }}>{s.label}</span>\n {value != null && (\n <span style={{ color: \"#f9fafb\", fontWeight: 700 }}>\n {formatPercent(value)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Chart data transformation (timestamp union + forward fill)\n// ---------------------------------------------------------------------------\n\ntype ChartRow = Record<string, number>;\n\nfunction buildChartData(series: MarketHistorySeries[]): ChartRow[] {\n if (series.length === 0) return [];\n\n const allTimestamps = new Set<number>();\n series.forEach((s) => s.data.forEach((p) => allTimestamps.add(p.timestamp)));\n\n const sorted = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Build per-series lookup map\n const lookups = series.map((s) => {\n const m = new Map<number, number>();\n s.data.forEach((p) => m.set(p.timestamp, p.price));\n return { slug: s.marketSlug, map: m };\n });\n\n const lastValues = new Map<string, number>();\n\n return sorted.map((ts) => {\n const row: ChartRow = { timestamp: ts };\n lookups.forEach(({ slug, map }) => {\n const val = map.get(ts);\n if (val !== undefined) {\n lastValues.set(slug, val);\n row[slug] = val;\n } else {\n const last = lastValues.get(slug);\n if (last !== undefined) row[slug] = last;\n }\n });\n return row;\n });\n}\n\n// ---------------------------------------------------------------------------\n// EventPriceChartV2\n// ---------------------------------------------------------------------------\n\nexport interface EventPriceChartV2Props {\n event: V2Event;\n isLoading?: boolean;\n /** Optional CSS class for the outer container */\n className?: string;\n}\n\nexport function EventPriceChartV2(props: EventPriceChartV2Props) {\n return (\n <ChartErrorBoundary>\n <EventPriceChartV2Inner {...props} />\n </ChartErrorBoundary>\n );\n}\n\nfunction EventPriceChartV2Inner({\n event,\n isLoading: externalLoading,\n className,\n}: EventPriceChartV2Props) {\n const allMarkets = useMemo(() => event.markets ?? [], [event.markets]);\n\n // Default: first MAX_SELECTED markets selected\n const [selectedSlugs, setSelectedSlugs] = useState<string[]>(() =>\n allMarkets.slice(0, MAX_SELECTED).map((m) => m.slug),\n );\n\n // Chart time range (interval selector)\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n // Stable color mapping: market slug → color\n const colorMap = useMemo(() => {\n const map = new Map<string, string>();\n allMarkets.forEach((m, idx) => {\n map.set(m.slug, CHART_COLORS[idx % CHART_COLORS.length]);\n });\n return map;\n }, [allMarkets]);\n\n const selectedMarkets = useMemo(\n () => allMarkets.filter((m) => selectedSlugs.includes(m.slug)),\n [allMarkets, selectedSlugs],\n );\n\n const { series: hookSeries, isLoading: hookLoading } = useMarketHistoryV2(\n selectedMarkets,\n chartRange,\n );\n const isLoading = externalLoading || hookLoading;\n\n // Belt-and-suspenders: if hook returns no renderable data, generate\n // synthetic flat lines from current outcome prices so the chart is never empty.\n const series = useMemo<MarketHistorySeries[]>(() => {\n if (hookSeries.length > 0 && hookSeries.some((s) => s.data.length > 0)) {\n return hookSeries;\n }\n const now = Date.now();\n const dayMs = 86_400_000;\n return selectedMarkets.map((market) => {\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const price = yesOutcome?.price ?? 0.5;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price },\n { timestamp: now, price },\n ],\n };\n });\n }, [hookSeries, selectedMarkets]);\n\n const chartData = useMemo(() => buildChartData(series), [series]);\n\n // Y-axis domain: padded range of all values\n const yDomain = useMemo((): [number, number] => {\n if (chartData.length === 0) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n selectedSlugs.forEach((slug) => {\n chartData.forEach((row) => {\n const v = row[slug];\n if (v != null) {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n });\n });\n if (!isFinite(min)) return [0, 1];\n const pad = Math.max((max - min) * 0.15, 0.05);\n return [Math.max(0, min - pad), Math.min(1, max + pad)];\n }, [chartData, selectedSlugs]);\n\n // Current values for legend (latest point)\n const currentValues = useMemo(() => {\n const map = new Map<string, number>();\n series.forEach((s) => {\n if (s.data.length > 0) {\n map.set(s.marketSlug, s.data[s.data.length - 1].price);\n }\n });\n return map;\n }, [series]);\n\n // Tooltip label map\n const labelMap = useMemo(() => {\n const map = new Map<string, string>();\n series.forEach((s) => map.set(s.marketSlug, s.label));\n return map;\n }, [series]);\n\n // Effect 5: cursor overlay (left transparent / right dimmed)\n const {\n wrapperRef: chartWrapperRef,\n overlayRef: overlayDivRef,\n onMouseMove: handleWrapperMouseMove,\n onMouseLeave: handleWrapperMouseLeave,\n } = useCursorOverlay();\n\n // Market selector toggle handler\n const handleToggle = useCallback((slug: string) => {\n setSelectedSlugs((prev) => {\n if (prev.includes(slug)) {\n if (prev.length <= 1) return prev;\n return prev.filter((s) => s !== slug);\n }\n if (prev.length >= MAX_SELECTED) return prev;\n return [...prev, slug];\n });\n }, []);\n\n // ---------------------------------------------------------------------------\n // Loading / empty states\n // ---------------------------------------------------------------------------\n\n if (isLoading) {\n return (\n <div\n style={{\n height: 320,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n border: \"2.5px solid #22d3ee\",\n borderTopColor: \"transparent\",\n animation: \"spin 0.7s linear infinite\",\n }}\n />\n </div>\n );\n }\n\n if (chartData.length === 0) {\n return (\n <div\n style={{\n height: 320,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n No price history data\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}\n >\n {/* Market selector chips */}\n {allMarkets.length > 1 && (\n <MarketSelector\n markets={allMarkets}\n selectedSlugs={selectedSlugs}\n colorMap={colorMap}\n onToggle={handleToggle}\n />\n )}\n\n {/* Legend */}\n <LegendBar\n series={series}\n colorMap={colorMap}\n currentValues={currentValues}\n />\n\n {/* Chart */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 0 }}>\n <div\n ref={chartWrapperRef}\n style={{\n height: 300,\n width: \"100%\",\n userSelect: \"none\",\n position: \"relative\",\n }}\n onMouseMove={handleWrapperMouseMove}\n onMouseLeave={handleWrapperMouseLeave}\n >\n {/* Effect 5: left transparent / right dimmed overlay div */}\n <div\n ref={overlayDivRef}\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n />\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 8, right: 16, left: 0, bottom: 0 }}\n >\n {/* Effect 7: horizontal dashed grid */}\n <CartesianGrid\n horizontal\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"#374151\"\n opacity={0.5}\n />\n\n {/* Effect 6: X axis */}\n <XAxis\n dataKey=\"timestamp\"\n type=\"number\"\n scale=\"time\"\n domain={[\"dataMin\", \"dataMax\"]}\n tickFormatter={(ms: number) => formatTimestamp(ms, chartRange)}\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n minTickGap={70}\n />\n\n {/* Effect 6: Y axis */}\n <YAxis\n domain={yDomain}\n tickFormatter={(v: number) => `${Math.round(v * 100)}%`}\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n width={40}\n tickCount={6}\n />\n\n {/* Effect 2: real-time tooltip */}\n <Tooltip\n content={(props) => (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <CustomTooltip {...(props as any)} labelMap={labelMap} />\n )}\n cursor={{\n stroke: \"#4b5563\",\n strokeWidth: 1,\n strokeDasharray: \"4 4\",\n }}\n isAnimationActive={false}\n />\n\n {/* Lines — dot={false} to skip per-point React calls */}\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <Line\n key={s.marketSlug}\n type=\"stepAfter\"\n dataKey={s.marketSlug}\n stroke={color}\n strokeWidth={2}\n dot={false}\n // Effect 3: active cursor dot\n activeDot={{\n r: 4.5,\n strokeWidth: 2,\n stroke: \"rgba(10,10,10,0.8)\",\n fill: color,\n }}\n connectNulls\n isAnimationActive={false}\n />\n );\n })}\n\n {/*\n * Effect 4: breathing dots at each series' last data point.\n * Injected via <Customized> to access xScale/yScale once per render,\n * instead of rendering a React component for every single data point.\n */}\n <Customized\n component={(props: Record<string, unknown>) => {\n const xScale = props.xAxisMap\n ? (Object.values(props.xAxisMap as any)[0] as any)?.scale\n : null;\n\n const yScale = props.yAxisMap\n ? (Object.values(props.yAxisMap as any)[0] as any)?.scale\n : null;\n\n const dots: Array<{ cx: number; cy: number; color: string }> =\n [];\n\n if (xScale && yScale && chartData.length > 0) {\n const lastRow = chartData[chartData.length - 1];\n series.forEach((s) => {\n const yVal = lastRow[s.marketSlug];\n if (yVal == null) return;\n const cx = xScale(lastRow.timestamp);\n const cy = yScale(yVal);\n if (cx == null || cy == null) return;\n dots.push({\n cx,\n cy,\n color: colorMap.get(s.marketSlug) ?? \"#6b7280\",\n });\n });\n }\n\n return <BreathingDotsLayer dots={dots} />;\n }}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n\n {/* Bottom bar: interval switcher (Jupiter-style: right-aligned text buttons) */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n paddingRight: 4,\n marginTop: 2,\n }}\n >\n <IntervalSwitcher value={chartRange} onChange={setChartRange} />\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useEffect, useRef } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Avatar, cn } from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market } from \"../../client/v2\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventMarketDetailV2Widget } from \"./event-market-detail-v2.widget\";\nimport { EventPriceChartV2 } from \"./event-price-chart-v2.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(market: V2Market): number {\n return market.outcomes[0]?.best_ask ?? market.outcomes[0]?.price ?? 0;\n}\n\nfunction formatPercent(value: number): string {\n return `${Math.round(value * 100)}%`;\n}\n\nfunction formatCents(value: number): string {\n const cents = value * 100;\n if (cents < 1 && cents > 0) return `< 1`;\n if (Number.isInteger(cents)) return `${cents}`;\n return cents.toFixed(1);\n}\n\n/** Display label for a market row — prefer first outcome label, fall back to question. */\nfunction getMarketLabel(market: V2Market): string {\n return market.outcomes?.[0]?.label ?? market.question;\n}\n\nfunction getPlatformLabel(source: string): string {\n switch (source) {\n case \"polymarket\":\n return \"Polymarket\";\n case \"dflow\":\n return \"Kalshi\";\n default:\n return source;\n }\n}\n\nfunction formatISOTimestamp(iso: string | undefined): string {\n if (!iso) return \"—\";\n const date = new Date(iso);\n if (isNaN(date.getTime())) return \"—\";\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n\n// ---------------------------------------------------------------------------\n// Countdown hook\n// ---------------------------------------------------------------------------\n\nfunction useCountdown(targetIso: string | undefined): string | null {\n const [now, setNow] = useState(Date.now());\n\n useEffect(() => {\n if (!targetIso) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [targetIso]);\n\n if (!targetIso) return null;\n const target = new Date(targetIso).getTime();\n if (isNaN(target)) return null;\n\n const diff = target - now;\n if (diff <= 0) return null;\n\n const days = Math.floor(diff / 86400000);\n const hours = Math.floor((diff % 86400000) / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n parts.push(`${String(hours).padStart(2, \"0\")}h`);\n parts.push(`${String(mins).padStart(2, \"0\")}m`);\n parts.push(`${String(secs).padStart(2, \"0\")}s`);\n return parts.join(\" \");\n}\n\nfunction formatCountdownDate(iso: string | undefined): string | null {\n if (!iso) return null;\n const d = new Date(iso);\n if (isNaN(d.getTime())) return null;\n const hours = d.getHours().toString().padStart(2, \"0\");\n const mins = d.getMinutes().toString().padStart(2, \"0\");\n const month = (d.getMonth() + 1).toString().padStart(2, \"0\");\n const day = d.getDate().toString().padStart(2, \"0\");\n const year = d.getFullYear();\n const offset = -d.getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(offset / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${month}/${day}/${year} (${sign}${tzHours})`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailV2UIProps {\n event: V2Event;\n /** Callback when a trade action is triggered */\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailV2UI({\n event,\n onTradeAction,\n}: EventDetailV2UIProps) {\n const { t } = useTranslation();\n const [isCompact, setIsCompact] = useState(false);\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel) return;\n\n let compact = false;\n let rafId = 0;\n\n const update = () => {\n const { bottom } = sentinel.getBoundingClientRect();\n const shouldBeCompact = compact ? bottom < 0 : bottom < -20;\n if (shouldBeCompact !== compact) {\n compact = shouldBeCompact;\n setIsCompact(shouldBeCompact);\n }\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n window.addEventListener(\"scroll\", onScroll, {\n passive: true,\n capture: true,\n });\n update();\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n };\n }, []);\n\n const markets = useMemo(\n () =>\n [...(event.markets || [])].sort((a, b) => getYesAsk(b) - getYesAsk(a)),\n [event.markets],\n );\n\n const formattedVolume = useMemo(\n () => `$${Math.round(event.volume ?? 0).toLocaleString(\"en-US\")}`,\n [event.volume],\n );\n\n // Countdown: show \"Begins in\" if event hasn't started, \"Ends in\" if active\n const startCountdown = useCountdown(event.start_at);\n const endCountdown = useCountdown(event.end_at);\n const startDateFormatted = formatCountdownDate(event.start_at);\n const endDateFormatted = formatCountdownDate(event.end_at);\n\n return (\n <div className=\"w-full flex flex-col gap-4 lg:gap-y-6 px-1 pb-8 lg:px-4 lg:pb-12 lg:max-w-3xl\">\n {/* Sentinel */}\n <div ref={sentinelRef} className=\"h-0 w-0\" />\n\n {/* Header – sticky with compact transition */}\n <div\n className={`sticky top-0 z-30 flex items-center bg-background/80 backdrop-blur-md transition-all duration-300 ${\n isCompact\n ? \"gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className={`flex-shrink-0 transition-all duration-300 ${\n isCompact\n ? \"!h-8 !w-8 lg:!h-10 lg:!w-10\"\n : \"!h-14 !w-14 lg:!h-18 lg:!w-18\"\n }`}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n {!isCompact && (\n <div className=\"flex items-center gap-1.5\">\n <PlatformBadge source={event.source} />\n {event.tags?.slice(0, 3).map((tag) => (\n <span key={tag.slug} className=\"text-xs text-neutral truncate\">\n {tag.label}\n </span>\n ))}\n </div>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCompact ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\n </div>\n\n {/* Countdown timer */}\n {(startCountdown || endCountdown) && (\n <div className=\"flex items-center gap-x-2 text-xs text-neutral lg:text-sm font-mono\">\n {startCountdown ? (\n <>\n <span>\n {t(\"predict.event.beginsIn\", { time: startCountdown })}\n </span>\n {startDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span>{startDateFormatted}</span>\n </>\n )}\n </>\n ) : endCountdown ? (\n <>\n <span>{t(\"predict.event.endsIn\", { time: endCountdown })}</span>\n {endDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span>{endDateFormatted}</span>\n </>\n )}\n </>\n ) : null}\n </div>\n )}\n\n {/* Chart section — self-contained Jupiter-style chart */}\n <EventPriceChartV2 event={event} />\n\n {/* Volume */}\n <div className=\"text-sm text-neutral\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </div>\n\n {/* Markets list */}\n <EventMarketsV2UI markets={markets} onTradeAction={onTradeAction} />\n\n {/* Rules section */}\n <EventRulesV2UI markets={markets} event={event} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Markets list (Jupiter-style table layout)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VISIBLE_COUNT = 5;\n\ninterface EventMarketsV2UIProps {\n markets: V2Market[];\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction EventMarketsV2UI({ markets, onTradeAction }: EventMarketsV2UIProps) {\n const { t } = useTranslation();\n const [showAll, setShowAll] = useState(false);\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n if (markets.length === 0) return null;\n\n const hasMore = markets.length > DEFAULT_VISIBLE_COUNT;\n const visibleMarkets = showAll\n ? markets\n : markets.slice(0, DEFAULT_VISIBLE_COUNT);\n\n const toggleExpand = (slug: string) => {\n setExpandedSlug((prev) => (prev === slug ? null : slug));\n };\n\n return (\n <div className=\"flex flex-col\">\n {/* Table */}\n <table className=\"w-full border-collapse\">\n {/* Column header */}\n <thead>\n <tr>\n <th />\n <th className=\"py-2 text-left text-xs text-neutral font-normal lg:text-center lg:text-sm\">\n {t(\"predict.market.table.chance\")}\n </th>\n <th />\n </tr>\n </thead>\n <tbody>\n {visibleMarkets.map((market, idx) => {\n const yesPrice = getYesAsk(market);\n const noPrice =\n market.outcomes[1]?.best_ask ?? market.outcomes[1]?.price;\n const isTopMarket = idx === 0;\n const isExpanded = expandedSlug === market.slug;\n\n return (\n <MarketRow\n key={market.slug}\n market={market}\n yesPrice={yesPrice}\n noPrice={noPrice ?? undefined}\n isTopMarket={isTopMarket}\n isExpanded={isExpanded}\n onToggleExpand={() => toggleExpand(market.slug)}\n onTradeAction={onTradeAction}\n />\n );\n })}\n </tbody>\n </table>\n\n {/* More Markets button */}\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex w-full items-center justify-start gap-x-2 py-2 pl-1 text-xs text-neutral lg:pl-2 lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>\n {showAll\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.moreMarketsLabel\")}\n </span>\n <svg\n className={cn(\n \"h-4 w-4 transition-transform\",\n showAll && \"rotate-180\",\n )}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Market Row (Jupiter-style <tr>)\n// ---------------------------------------------------------------------------\n\ninterface MarketRowProps {\n market: V2Market;\n yesPrice: number;\n noPrice?: number;\n isTopMarket: boolean;\n isExpanded: boolean;\n onToggleExpand: () => void;\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction MarketRow({\n market,\n yesPrice,\n noPrice,\n isTopMarket,\n isExpanded,\n onToggleExpand,\n onTradeAction,\n}: MarketRowProps) {\n const { t } = useTranslation();\n const volumeFormatted = market.volume\n ? `$${Math.round(market.volume).toLocaleString(\"en-US\")} vol`\n : undefined;\n\n return (\n <>\n <tr\n className=\"cursor-pointer border-b border-border text-xs hover:bg-content2 lg:text-base\"\n onClick={onToggleExpand}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggleExpand();\n }\n }}\n >\n {/* TD1: Avatar + Name + Volume */}\n <td className=\"py-2 pl-1 lg:pl-2\">\n <div className=\"flex items-center gap-x-1 lg:gap-x-2\">\n <Avatar\n src={market.image_url || undefined}\n name={getMarketLabel(market)?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-5 shrink-0 lg:size-8\"\n imgProps={{ className: \"object-cover\" }}\n />\n <div className=\"flex flex-col\">\n <span className=\"text-foreground truncate max-w-[200px] lg:max-w-[300px]\">\n {getMarketLabel(market)}\n </span>\n {volumeFormatted && (\n <span className=\"text-[8px] text-neutral lg:text-xxs\">\n {volumeFormatted}\n </span>\n )}\n </div>\n </div>\n </td>\n\n {/* TD2: Chance % */}\n <td className=\"py-2 text-left text-foreground lg:text-center\">\n {formatPercent(yesPrice)}\n </td>\n\n {/* TD3: Yes / No buttons */}\n <td className=\"py-2 pr-1 lg:pr-2\">\n <div className=\"flex items-center justify-end gap-x-2\">\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-opacity\",\n isTopMarket\n ? \"bg-primary text-primary-foreground\"\n : \"bg-primary/10 text-primary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"yes\", \"buy\");\n }}\n >\n {t(\"predict.market.action.yes\", {\n price: formatCents(yesPrice),\n })}\n </button>\n <button\n type=\"button\"\n className=\"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 bg-secondary/10 text-secondary cursor-pointer hover:opacity-80 transition-opacity\"\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"no\", \"buy\");\n }}\n >\n {noPrice != null\n ? t(\"predict.market.action.no\", {\n price: formatCents(noPrice),\n })\n : t(\"predict.market.no\")}\n </button>\n </div>\n </td>\n </tr>\n\n {/* Expanded detail row */}\n {isExpanded && (\n <tr>\n <td colSpan={3} className=\"px-2 pb-3\">\n <div className=\"max-h-100 overflow-y-auto\">\n <EventMarketDetailV2Widget\n market={market}\n onTradeAction={onTradeAction}\n />\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Rules (V2-native)\n// ---------------------------------------------------------------------------\n\ninterface EventRulesV2UIProps {\n markets: V2Market[];\n event: V2Event;\n}\n\nfunction EventRulesV2UI({ markets, event }: EventRulesV2UIProps) {\n const { t } = useTranslation();\n const [selectedSlug, setSelectedSlug] = useState<string | null>(null);\n const [showFullRules, setShowFullRules] = useState(false);\n\n const marketsWithRules = markets.filter((m) => m.rules && m.rules.length > 0);\n if (marketsWithRules.length === 0) return null;\n\n const selectedMarket =\n marketsWithRules.find((m) => m.slug === selectedSlug) ??\n marketsWithRules[0];\n if (!selectedMarket?.rules?.length) return null;\n\n const rulesText = selectedMarket.rules.join(\"\\n\\n\");\n const truncatedRules =\n rulesText.length > 200 && !showFullRules\n ? rulesText.slice(0, 200) + \"...\"\n : rulesText;\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n {/* Rules summary heading */}\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.event.rules\")}\n </span>\n\n {/* Market selector (only if multiple markets have rules) */}\n {marketsWithRules.length > 1 && (\n <div className=\"flex gap-x-2 overflow-x-auto\">\n {marketsWithRules.map((market) => (\n <button\n key={market.slug}\n type=\"button\"\n onClick={() => {\n setSelectedSlug(market.slug);\n setShowFullRules(false);\n }}\n className={cn(\n \"shrink-0 rounded-lg px-3 py-1.5 text-xs transition-colors cursor-pointer\",\n selectedMarket.slug === market.slug\n ? \"bg-content2 text-foreground\"\n : \"text-neutral hover:bg-content2\",\n )}\n >\n {getMarketLabel(market)}\n </button>\n ))}\n </div>\n )}\n\n {/* Rules text */}\n <div className=\"text-xs text-foreground/80 lg:text-sm whitespace-pre-wrap\">\n {truncatedRules}\n </div>\n\n {rulesText.length > 200 && (\n <button\n type=\"button\"\n onClick={() => setShowFullRules((v) => !v)}\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors self-start\"\n >\n {showFullRules\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.showMore\")}\n </button>\n )}\n\n {/* Timeline */}\n <span className=\"text-xs font-medium text-neutral mt-2 lg:text-sm\">\n Timeline\n </span>\n <div className=\"flex flex-col\">\n {[\n {\n label: \"Market Open\",\n value: formatISOTimestamp(selectedMarket.start_at),\n isActive: true,\n },\n {\n label: \"Market Closes\",\n value: formatISOTimestamp(selectedMarket.end_at),\n isActive:\n selectedMarket.status === \"closed\" ||\n selectedMarket.status === \"voided\",\n },\n ].map((item, index, arr) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\n <div className=\"flex flex-col items-center w-3\">\n <div\n className={`h-3 w-3 shrink-0 rounded-full border-2 mt-0.5 ${\n item.isActive\n ? \"border-primary bg-primary\"\n : \"border-border bg-transparent\"\n }`}\n />\n {index < arr.length - 1 && (\n <div className=\"w-px flex-1 bg-border\" />\n )}\n </div>\n <div\n className={`flex flex-col ${index < arr.length - 1 ? \"pb-4\" : \"\"}`}\n >\n <span className=\"text-xs font-medium text-foreground lg:text-sm\">\n {item.label}\n </span>\n <span className=\"text-xs text-neutral lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* Identifiers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-neutral mt-2 lg:text-xs\">\n <span>\n <span className=\"text-neutral\">Event:</span>{\" \"}\n <span className=\"text-foreground\">{event.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">Market:</span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">Source:</span>{\" \"}\n <span className=\"text-foreground\">\n {getPlatformLabel(selectedMarket.source)}\n </span>\n </span>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Platform badge\n// ---------------------------------------------------------------------------\n\nfunction PlatformBadge({ source }: { source: string }) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-x-1 rounded px-1.5 py-0.5\",\n \"text-[10px] font-medium leading-none\",\n source === \"polymarket\"\n ? \"bg-blue-500/15 text-blue-400\"\n : \"bg-primary-500/15 text-primary\",\n )}\n >\n <span\n className={cn(\n \"h-1.5 w-1.5 rounded-sm\",\n source === \"polymarket\" ? \"bg-blue-400\" : \"bg-primary\",\n )}\n />\n {getPlatformLabel(source)}\n </span>\n );\n}\n","import type { V2Market, V2ProviderSource } from \"../../client/v2\";\nimport { useEventV2Query } from \"../../hooks/v2/useEventV2Query\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport {\n EventDetailV2UI,\n type EventDetailV2UIProps,\n} from \"./event-detail.v2.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailWidgetV2Props {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"dflow\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: V2ProviderSource;\n /** Callback when a trade action is triggered (market button / orderbook click). */\n onTradeAction?: (\n market: V2Market,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailWidgetV2({\n eventSlug,\n source,\n onTradeAction,\n}: EventDetailWidgetV2Props) {\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEventV2Query({ slug: eventSlug, source });\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 <EventDetailV2UI event={event} onTradeAction={onTradeAction} />;\n}\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Avatar,\n Button,\n Drawer,\n DrawerContent,\n DrawerBody,\n useDisclosure,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport type { V2Event, V2Market, V2ProviderSource } from \"../../client/v2\";\nimport { useEventV2Query } from \"../../hooks/v2/useEventV2Query\";\nimport { useSimilarEventsV2Query } from \"../../hooks/v2/useSimilarEventsV2Query\";\nimport { TradeFormV2Widget } from \"../trade-form/trade-form-v2.widget\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { UserActivityV2Section } from \"./event-detail-activity-v2.ui\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport { EventDetailWidgetV2 } from \"./event-detail.v2.widget\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: V2Market): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailPageV2Props {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"dflow\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: V2ProviderSource;\n /** Chain network for trading (default: 'solana'). */\n chain?: string;\n /** Connected wallet address for user activity (positions/orders/trades). */\n walletAddress?: string;\n /** Callback when a similar event card is clicked. Receives the clicked event. */\n onSimilarEventClick?: (event: V2Event) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailPageV2({\n eventSlug,\n source,\n chain,\n walletAddress,\n onSimilarEventClick,\n}: EventDetailPageV2Props) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const { data: event, isLoading: isEventLoading } = useEventV2Query({\n slug: eventSlug,\n source,\n });\n\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort((a, b) => getYesAsk(b) - getYesAsk(a)),\n [event?.markets],\n );\n\n const [tradeSelection, setTradeSelection] = useState<{\n market: V2Market;\n outcome: TradeOutcome;\n side: TradeSide;\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: V2Market, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n if (isMobile) onOpen();\n },\n [isMobile, onOpen],\n );\n\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -----------------------------------------------------------------------\n // Loading skeleton\n // -----------------------------------------------------------------------\n if (isEventLoading) {\n if (isMobile) {\n return <EventDetailSkeleton />;\n }\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailSkeleton />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 max-h-[calc(100dvh-2rem)] overflow-y-auto scrollbar-thin\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.slug}-${tradeSelection.version}`\n : (selectedMarket?.slug ?? \"default\");\n\n // -----------------------------------------------------------------------\n // Mobile layout\n // -----------------------------------------------------------------------\n if (isMobile) {\n return (\n <>\n <div className=\"w-full pb-20\">\n <EventDetailWidgetV2\n eventSlug={eventSlug}\n source={source}\n onTradeAction={handleTradeAction}\n />\n\n {event && (\n <UserActivityV2Section\n event={event}\n walletAddress={walletAddress}\n />\n )}\n\n {event && (\n <SimilarEventsSection\n eventSlug={eventSlug}\n source={event.source}\n onEventClick={onSimilarEventClick}\n />\n )}\n </div>\n\n {selectedMarket && (\n <div className=\"fixed inset-x-0 bottom-0 z-40 flex justify-center p-3 bg-gradient-to-t from-background via-background/90 to-transparent\">\n <Button\n color=\"primary\"\n size=\"lg\"\n className=\"w-full max-w-md font-semibold\"\n onPress={onOpen}\n >\n {t(\"predict.trade.action\")}\n </Button>\n </div>\n )}\n\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n placement=\"bottom\"\n size=\"lg\"\n hideCloseButton\n classNames={{\n base: \"max-h-[85dvh] rounded-t-2xl\",\n body: \"p-0\",\n }}\n >\n <DrawerContent>\n <DrawerBody>\n {selectedMarket && (\n <TradeFormV2Widget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n }\n\n // -----------------------------------------------------------------------\n // Desktop layout\n // -----------------------------------------------------------------------\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n {/* Left column: event detail + user activity */}\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailWidgetV2\n eventSlug={eventSlug}\n source={source}\n onTradeAction={handleTradeAction}\n />\n\n {event && (\n <UserActivityV2Section event={event} walletAddress={walletAddress} />\n )}\n </div>\n\n {/* Right sidebar: sticky container with internal scroll (Jupiter-style) */}\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 flex flex-col gap-y-4 max-h-[calc(100dvh-2rem)] overflow-y-auto scrollbar-thin\">\n {selectedMarket && (\n <TradeFormV2Widget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n\n {event && (\n <SimilarEventsSection\n eventSlug={eventSlug}\n source={event.source}\n onEventClick={onSimilarEventClick}\n />\n )}\n </div>\n </aside>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Similar Events\n// ---------------------------------------------------------------------------\n\nfunction SimilarEventsSection({\n eventSlug,\n source,\n onEventClick,\n}: {\n eventSlug: string;\n source: V2ProviderSource;\n onEventClick?: (event: V2Event) => void;\n}) {\n const { t } = useTranslation();\n const { data: similarEvents, isLoading } = useSimilarEventsV2Query({\n slug: eventSlug,\n source,\n limit: 4,\n });\n\n if (isLoading || !similarEvents || similarEvents.length === 0) return null;\n\n return (\n <div className=\"flex flex-col gap-y-3 mt-6 px-1 lg:px-0\">\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.similar.title\")}\n </span>\n <div className=\"grid grid-cols-1 gap-3\">\n {similarEvents.map((ev) => (\n <SimilarEventCard key={ev.slug} event={ev} onClick={onEventClick} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction SimilarEventCard({\n event,\n onClick,\n}: {\n event: V2Event;\n onClick?: (event: V2Event) => void;\n}) {\n const yesPrice = event.markets?.[0]?.outcomes[0]?.price;\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n className=\"flex items-center gap-x-3 rounded-xl border border-border p-3 hover:bg-content2 transition-colors cursor-pointer text-left w-full\"\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-10 shrink-0\"\n imgProps={{ className: \"object-cover\" }}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">\n {event.title}\n </span>\n {yesPrice != null && (\n <span className=\"text-xs text-neutral\">\n {Math.round(yesPrice * 100)}% chance\n </span>\n )}\n </div>\n </button>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { V2Event, V2Market, V2ProviderSource } from \"../../client/v2\";\nimport {\n MAX_PRICE_HISTORY_MARKETS,\n DEFAULT_CHART_RANGE,\n CHART_RANGE_PERIOD,\n CHART_RANGE_DURATION,\n type ChartRangeType,\n} from \"../../consts\";\nimport { usePredictClient } from \"../../hooks/usePredictClient\";\nimport {\n marketCandlesticksQueryKey,\n fetchMarketCandlesticks,\n} from \"../../hooks/usePriceHistoryQuery\";\nimport { useEventV2Query } from \"../../hooks/v2/useEventV2Query\";\nimport type { CandlesticksResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: V2Market): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\nfunction isoToUnix(iso: string | undefined): number {\n if (!iso) return 0;\n const ms = new Date(iso).getTime();\n return Number.isFinite(ms) ? Math.floor(ms / 1000) : 0;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport interface UseEventDetailV2Params {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"dflow\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: V2ProviderSource;\n /** Market slugs to query candlesticks for. Default: top 4 by yesAsk. */\n candlestickMarketSlugs?: string[];\n /** Chart time range (1d / 1w / 1m / all). */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetailV2 = (params: UseEventDetailV2Params) => {\n const {\n candlestickMarketSlugs,\n chartRange = DEFAULT_CHART_RANGE,\n source,\n } = params;\n\n const candlestickPeriodInterval = CHART_RANGE_PERIOD[chartRange];\n const rangeDuration = CHART_RANGE_DURATION[chartRange];\n\n const candlestickEndTs = useMemo(\n () => Math.floor(Date.now() / 1000),\n\n [chartRange],\n );\n\n const oldClient = usePredictClient();\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEventV2Query({ slug: params.eventSlug, source });\n\n const candlestickStartTs = useMemo(() => {\n if (rangeDuration != null) return candlestickEndTs - rangeDuration;\n const markets = event?.markets;\n if (!markets?.length) return candlestickEndTs;\n return Math.min(...markets.map((m) => isoToUnix(m.start_at)));\n }, [candlestickEndTs, rangeDuration, event?.markets]);\n\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n const markets =\n candlestickMarketSlugs && candlestickMarketSlugs.length > 0\n ? candlestickMarketSlugs\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((slug) => event.markets!.find((m) => m.slug === slug))\n .filter((m): m is V2Market => m !== undefined)\n : [...event.markets]\n .sort((a, b) => getYesAsk(b) - getYesAsk(a))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.slug);\n }, [candlestickMarketSlugs, event?.markets]);\n\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((slug) => ({\n queryKey: marketCandlesticksQueryKey({\n ticker: slug,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n queryFn: () =>\n fetchMarketCandlesticks(oldClient, {\n ticker: slug,\n startTs: candlestickStartTs,\n endTs: candlestickEndTs,\n periodInterval: candlestickPeriodInterval,\n }),\n enabled: marketsToQuery.length > 0,\n })),\n });\n\n const isCandlesticksLoading = candlestickQueries.some((q) => q.isLoading);\n\n const candlestickErrors = useMemo(() => {\n const errors = new Map<string, Error>();\n marketsToQuery.forEach((slug, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) errors.set(slug, error);\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n const candlesticks = useMemo(() => {\n const map = new Map<string, CandlesticksResponse>();\n marketsToQuery.forEach((slug, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) map.set(slug, data);\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n periodInterval: candlestickPeriodInterval,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n\nexport type { V2Event, V2Market };\n","import { useMemo } from \"react\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderbookLevel } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOrderBookParams {\n /** Market ticker */\n marketTicker: string;\n /** Maximum number of levels to display per side */\n maxLevels?: number;\n /** Polling interval in milliseconds (0 to disable) */\n refetchInterval?: number;\n /** Which outcome to display (yes or no). Defaults to yes. */\n outcome?: \"yes\" | \"no\";\n}\n\nexport interface OrderBookRow extends OrderbookLevel {\n /** Cumulative quantity up to (and including) this level */\n cumulative: number;\n /** Depth ratio 0–1 relative to the maximum cumulative quantity */\n depth: number;\n}\n\nexport interface UseOrderBookResult {\n /** Bid rows sorted from highest to lowest price */\n bids: OrderBookRow[];\n /** Ask rows sorted from lowest to highest price */\n asks: OrderBookRow[];\n /** Spread in cents */\n spread: number | null;\n /** Spread as percentage of midpoint */\n spreadPercent: number | null;\n /** Midpoint price in cents */\n midpoint: number | null;\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildRows(\n levels: OrderbookLevel[] | undefined,\n maxLevels: number,\n): OrderBookRow[] {\n if (!levels) return [];\n const sliced = levels.slice(0, maxLevels);\n let cumulative = 0;\n const rows: OrderBookRow[] = sliced.map((level) => {\n cumulative += level.quantity;\n return { ...level, cumulative, depth: 0 };\n });\n\n // Calculate depth ratio\n const maxCum = rows[rows.length - 1]?.cumulative ?? 1;\n for (const row of rows) {\n row.depth = row.cumulative / maxCum;\n }\n\n return rows;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useOrderBook({\n marketTicker,\n maxLevels = 10,\n refetchInterval = 5000,\n outcome = \"yes\",\n}: UseOrderBookParams): UseOrderBookResult {\n const {\n data: orderBook,\n isLoading,\n isFetching,\n } = useOrderBookQuery(marketTicker, {\n refetchInterval: refetchInterval || undefined,\n });\n\n // Select bids and asks based on outcome\n const rawBids = useMemo(() => {\n return outcome === \"yes\" ? orderBook?.yesBids : orderBook?.noBids;\n }, [orderBook, outcome]);\n\n const rawAsks = useMemo(() => {\n return outcome === \"yes\" ? orderBook?.yesAsks : orderBook?.noAsks;\n }, [orderBook, outcome]);\n\n const bids = useMemo(\n () => buildRows(rawBids, maxLevels),\n [rawBids, maxLevels],\n );\n\n const asks = useMemo(\n () => buildRows(rawAsks, maxLevels),\n [rawAsks, maxLevels],\n );\n\n // Calculate spread\n const spread = useMemo(() => {\n if (bids.length === 0 || asks.length === 0) return null;\n return asks[0].price - bids[0].price;\n }, [bids, asks]);\n\n const midpoint = useMemo(() => {\n if (bids.length === 0 || asks.length === 0) return null;\n return (bids[0].price + asks[0].price) / 2;\n }, [bids, asks]);\n\n const spreadPercent = useMemo(() => {\n if (spread === null || midpoint === null || midpoint === 0) return null;\n return Math.round((spread / midpoint) * 10000) / 100;\n }, [spread, midpoint]);\n\n return {\n bids,\n asks,\n spread,\n spreadPercent,\n midpoint,\n isLoading,\n isFetching,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type { OrderBookRow } from \"./order-book.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OrderBookUIProps {\n /** Bid rows (highest to lowest) */\n bids: OrderBookRow[];\n /** Ask rows (lowest to highest) */\n asks: OrderBookRow[];\n /** Spread in cents */\n spread: number | null;\n /** Spread percentage */\n spreadPercent: number | null;\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Callback when a price level is clicked */\n onPriceClick?: (price: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction OrderBookRowItem({\n row,\n side,\n onClick,\n}: {\n row: OrderBookRow;\n side: \"bid\" | \"ask\";\n onClick?: (price: number) => void;\n}) {\n const isBid = side === \"bid\";\n const barColor = isBid ? \"bg-primary/10\" : \"bg-danger/10\";\n const textColor = isBid ? \"text-primary\" : \"text-danger\";\n\n return (\n <button\n type=\"button\"\n className=\"relative flex w-full items-center justify-between px-3 py-1 text-xs hover:bg-default-100 cursor-pointer\"\n onClick={() => onClick?.(row.price)}\n >\n {/* Depth bar */}\n <div\n className={`absolute inset-y-0 ${isBid ? \"right-0\" : \"left-0\"} ${barColor}`}\n style={{ width: `${row.depth * 100}%` }}\n />\n {/* Content */}\n <span className={`relative z-10 font-medium ${textColor}`}>\n {row.price}¢\n </span>\n <span className=\"relative z-10 text-default-600\">{row.quantity}</span>\n <span className=\"relative z-10 text-default-400\">{row.cumulative}</span>\n </button>\n );\n}\n\nfunction Skeleton() {\n return (\n <div className=\"flex flex-col gap-y-1 py-2\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={i}\n className=\"mx-3 h-4 animate-pulse rounded bg-default-100\"\n />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function OrderBookUI({\n bids,\n asks,\n spread,\n spreadPercent,\n isLoading,\n onPriceClick,\n}: OrderBookUIProps) {\n const { t } = useTranslation();\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.orderBook.title\")}\n </div>\n <Skeleton />\n <Skeleton />\n </div>\n );\n }\n\n const isEmpty = bids.length === 0 && asks.length === 0;\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-default-200 px-3 py-2\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.orderBook.title\")}\n </span>\n </div>\n\n {isEmpty ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.orderBook.empty\")}\n </div>\n ) : (\n <>\n {/* Column headers */}\n <div className=\"flex items-center justify-between px-3 py-1 text-xxs text-default-400\">\n <span>{t(\"predict.orderBook.price\")}</span>\n <span>{t(\"predict.orderBook.qty\")}</span>\n <span>{t(\"predict.orderBook.total\")}</span>\n </div>\n\n {/* Asks (reversed so lowest is at bottom, near spread) */}\n <div className=\"flex flex-col-reverse\">\n {asks.map((row) => (\n <OrderBookRowItem\n key={row.price}\n row={row}\n side=\"ask\"\n onClick={onPriceClick}\n />\n ))}\n </div>\n\n {/* Spread */}\n {spread !== null && (\n <div className=\"flex items-center justify-center gap-x-2 border-y border-default-200 py-1.5 text-xs text-default-500\">\n <span>\n {t(\"predict.orderBook.spread\")}: {spread}¢\n </span>\n {spreadPercent !== null && (\n <span className=\"text-default-400\">({spreadPercent}%)</span>\n )}\n </div>\n )}\n\n {/* Bids */}\n <div className=\"flex flex-col\">\n {bids.map((row) => (\n <OrderBookRowItem\n key={row.price}\n row={row}\n side=\"bid\"\n onClick={onPriceClick}\n />\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { useOrderBook } from \"./order-book.script\";\nimport { OrderBookUI } from \"./order-book.ui\";\n\nexport interface OrderBookWidgetProps {\n /** Market ticker */\n marketTicker: string;\n /** Maximum levels per side (default 10) */\n maxLevels?: number;\n /** Polling interval in ms (default 5000, 0 to disable) */\n refetchInterval?: number;\n /** Callback when a price level is clicked */\n onPriceClick?: (price: number) => void;\n /** Which outcome to display (yes or no). Defaults to yes. */\n outcome?: \"yes\" | \"no\";\n}\n\nexport function OrderBookWidget({\n marketTicker,\n maxLevels,\n refetchInterval,\n onPriceClick,\n outcome,\n}: OrderBookWidgetProps) {\n const { bids, asks, spread, spreadPercent, isLoading } = useOrderBook({\n marketTicker,\n maxLevels,\n refetchInterval,\n outcome,\n });\n\n return (\n <OrderBookUI\n bids={bids}\n asks={asks}\n spread={spread}\n spreadPercent={spreadPercent}\n isLoading={isLoading}\n onPriceClick={onPriceClick}\n />\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books. There are no \"open orders\" in the\n * traditional sense.\n *\n * For tracking swap/order status, use `useOrderStatusQuery` with the order signature\n * returned from `useCreateSwapMutation`.\n */\nimport { useState, useCallback } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseOpenOrdersParams {\n /** Polling interval in ms (0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated Order type - new API uses swap model\n */\nexport interface Order {\n id: string;\n marketId: string;\n side: \"buy\" | \"sell\";\n outcome: \"yes\" | \"no\";\n type: \"limit\" | \"market\";\n price: number;\n quantity: number;\n filledQuantity: number;\n status: \"open\" | \"partial\" | \"filled\" | \"cancelled\";\n createdAt: string;\n}\n\nexport interface UseOpenOrdersResult {\n /** List of open orders */\n orders: Order[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** ID of the order currently being cancelled (null if none) */\n cancellingOrderId: string | null;\n /** Cancel an order by id */\n cancelOrder: (orderId: string) => void;\n /** Error from the most recent cancel attempt */\n cancelError: Error | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated This hook is deprecated. The new dflow API uses a swap-based model.\n * Use `useOrderStatusQuery` to track swap status instead.\n */\nexport function useOpenOrders(\n _params: UseOpenOrdersParams = {},\n): UseOpenOrdersResult {\n const [cancellingOrderId, setCancellingOrderId] = useState<string | null>(\n null,\n );\n const [cancelError] = useState<Error | null>(null);\n\n // No-op cancel function - API no longer supports this\n const cancelOrder = useCallback((_orderId: string) => {\n console.warn(\n \"useOpenOrders.cancelOrder is deprecated. Use swap-based order model instead.\",\n );\n setCancellingOrderId(null);\n }, []);\n\n return {\n orders: [],\n isLoading: false,\n isFetching: false,\n cancellingOrderId,\n cancelOrder,\n cancelError,\n };\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books.\n */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n} from \"@liberfi.io/ui\";\nimport type { Order } from \"./open-orders.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OpenOrdersUIProps {\n /** List of open orders */\n orders: Order[];\n /** Whether data is loading */\n isLoading: boolean;\n /** ID of the order currently being cancelled */\n cancellingOrderId: string | null;\n /** Cancel an order */\n onCancel: (orderId: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso);\n return d.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function OpenOrdersUI({\n orders,\n isLoading,\n cancellingOrderId,\n onCancel,\n}: OpenOrdersUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n orders.map((order) => ({\n key: order.id,\n side: order.side,\n outcome: order.outcome,\n type: order.type,\n price: order.price,\n filled: `${order.filledQuantity}/${order.quantity}`,\n status: order.status,\n createdAt: formatDate(order.createdAt),\n isCancelling: order.id === cancellingOrderId,\n id: order.id,\n })),\n [orders, cancellingOrderId],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.openOrders.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.openOrders.title\")}\n {orders.length > 0 && (\n <span className=\"ml-1 text-default-400\">({orders.length})</span>\n )}\n </div>\n\n {orders.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.openOrders.empty\")}\n </div>\n ) : (\n <div className=\"w-full overflow-x-auto\">\n <StyledTable\n radius=\"none\"\n aria-label=\"Open orders\"\n className=\"min-w-[600px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Side\" width={60}>\n {t(\"predict.openOrders.side\")}\n </TableColumn>\n <TableColumn textValue=\"Outcome\" width={60}>\n {t(\"predict.openOrders.outcome\")}\n </TableColumn>\n <TableColumn textValue=\"Type\" width={60}>\n {t(\"predict.openOrders.type\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={60}>\n {t(\"predict.openOrders.price\")}\n </TableColumn>\n <TableColumn textValue=\"Filled\" width={80}>\n {t(\"predict.openOrders.filled\")}\n </TableColumn>\n <TableColumn textValue=\"Status\" width={70}>\n {t(\"predict.openOrders.status\")}\n </TableColumn>\n <TableColumn textValue=\"Time\" width={120}>\n {t(\"predict.openOrders.time\")}\n </TableColumn>\n <TableColumn textValue=\"Action\" width={80} align=\"end\">\n {\" \"}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.key}>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.side === \"buy\" ? \"text-primary\" : \"text-danger\"\n }`}\n >\n {row.side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}\n </span>\n </TableCell>\n <TableCell>\n <span\n className={`text-xs ${\n row.outcome === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs capitalize\">{row.type}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.price}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.filled}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs capitalize\">{row.status}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-default-500\">\n {row.createdAt}\n </span>\n </TableCell>\n <TableCell className=\"text-right\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n color=\"danger\"\n isLoading={row.isCancelling}\n onPress={() => onCancel(row.id)}\n >\n {t(\"predict.openOrders.cancel\")}\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n )}\n </div>\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API uses a swap-based\n * model instead of traditional order books. See open-orders.script.tsx for alternatives.\n */\nimport { useOpenOrders } from \"./open-orders.script\";\nimport { OpenOrdersUI } from \"./open-orders.ui\";\n\nexport interface OpenOrdersWidgetProps {\n /** Polling interval in ms (default 10000, 0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated This widget is deprecated. Use swap-based order model instead.\n */\nexport function OpenOrdersWidget({\n refetchInterval,\n}: OpenOrdersWidgetProps = {}) {\n const { orders, isLoading, cancellingOrderId, cancelOrder } = useOpenOrders({\n refetchInterval,\n });\n\n return (\n <OpenOrdersUI\n orders={orders}\n isLoading={isLoading}\n cancellingOrderId={cancellingOrderId}\n onCancel={cancelOrder}\n />\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useTradesQuery } from \"../../hooks/useTradesQuery\";\nimport type {\n SingleTradeResponse,\n TradesQueryParams,\n MultiTradeResponse,\n} from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeHistoryParams {\n /** Optional filter by market ticker */\n ticker?: string;\n /** Page size */\n pageSize?: number;\n}\n\nexport interface UseTradeHistoryResult {\n /** Current page of trades */\n trades: SingleTradeResponse[];\n /** Whether initial data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** Current page (1-based) */\n page: number;\n /** Page size */\n pageSize: number;\n /** Whether more pages exist */\n hasNextPage: boolean;\n /** Whether a previous page exists */\n hasPrevPage: boolean;\n /** Navigate to a specific page */\n goToPage: (page: number) => void;\n /** Go to the next page */\n nextPage: () => void;\n /** Go to the previous page */\n prevPage: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeHistory({\n ticker,\n pageSize = DEFAULT_PAGE_SIZE,\n}: UseTradeHistoryParams = {}): UseTradeHistoryResult {\n const [page, setPage] = useState(1);\n const [cursors, setCursors] = useState<(string | undefined)[]>([undefined]);\n\n const currentCursor = cursors[page - 1];\n\n const queryParams = useMemo<TradesQueryParams>(\n () => ({\n ...(ticker ? { ticker } : {}),\n limit: pageSize,\n ...(currentCursor ? { cursor: currentCursor } : {}),\n }),\n [ticker, pageSize, currentCursor],\n );\n\n const { data, isLoading, isFetching } = useTradesQuery(queryParams);\n\n const response = data as MultiTradeResponse | undefined;\n\n const trades = response?.trades ?? [];\n const hasNextPage = !!response?.cursor;\n const hasPrevPage = page > 1;\n\n const goToPage = useCallback(\n (p: number) => {\n if (p >= 1 && p <= cursors.length) setPage(p);\n },\n [cursors.length],\n );\n\n const nextPage = useCallback(() => {\n if (hasNextPage && response?.cursor) {\n setCursors((prev) => {\n const newCursors = [...prev];\n if (newCursors.length === page) {\n newCursors.push(response.cursor!);\n }\n return newCursors;\n });\n setPage((prev) => prev + 1);\n }\n }, [hasNextPage, response?.cursor, page]);\n\n const prevPage = useCallback(() => {\n if (hasPrevPage) setPage((prev) => prev - 1);\n }, [hasPrevPage]);\n\n return {\n trades,\n isLoading,\n isFetching,\n page,\n pageSize,\n hasNextPage,\n hasPrevPage,\n goToPage,\n nextPage,\n prevPage,\n };\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"@liberfi.io/ui\";\nimport type { SingleTradeResponse } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeHistoryUIProps {\n /** List of trades for current page */\n trades: SingleTradeResponse[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether background refetch is in progress */\n isFetching: boolean;\n /** Current page (1-based) */\n page: number;\n /** Whether more pages exist */\n hasNextPage: boolean;\n /** Whether a previous page exists */\n hasPrevPage: boolean;\n /** Go to next page */\n onNextPage: () => void;\n /** Go to previous page */\n onPrevPage: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatDate(timestamp: number): string {\n const d = new Date(timestamp * 1000);\n return d.toLocaleString(\"default\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeHistoryUI({\n trades,\n isLoading,\n isFetching,\n page,\n hasNextPage,\n hasPrevPage,\n onNextPage,\n onPrevPage,\n}: TradeHistoryUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n trades.map((trade) => ({\n key: trade.tradeId,\n ticker: trade.ticker,\n takerSide: trade.takerSide,\n price: trade.price,\n yesPrice: trade.yesPrice,\n noPrice: trade.noPrice,\n count: trade.count,\n createdAt: formatDate(trade.createdTime),\n })),\n [trades],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.tradeHistory.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.tradeHistory.title\")}\n </div>\n\n {trades.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.tradeHistory.empty\")}\n </div>\n ) : (\n <>\n <div\n className={`w-full overflow-x-auto ${isFetching ? \"opacity-60\" : \"\"}`}\n >\n <StyledTable\n radius=\"none\"\n aria-label=\"Trade history\"\n className=\"min-w-[480px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Side\" width={60}>\n {t(\"predict.tradeHistory.side\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={80}>\n {t(\"predict.tradeHistory.price\")}\n </TableColumn>\n <TableColumn textValue=\"Yes\" width={60}>\n {t(\"predict.trade.yes\")}\n </TableColumn>\n <TableColumn textValue=\"No\" width={60}>\n {t(\"predict.trade.no\")}\n </TableColumn>\n <TableColumn textValue=\"Qty\" width={60}>\n {t(\"predict.tradeHistory.qty\")}\n </TableColumn>\n <TableColumn textValue=\"Time\" width={120}>\n {t(\"predict.tradeHistory.time\")}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.key}>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.takerSide === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.takerSide === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.price}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-primary\">\n {row.yesPrice}¢\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-secondary\">\n {row.noPrice}¢\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.count}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs text-default-500\">\n {row.createdAt}\n </span>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n\n {/* Pagination */}\n {(hasPrevPage || hasNextPage) && (\n <div className=\"flex items-center justify-between border-t border-default-200 px-3 py-2\">\n <Button\n size=\"sm\"\n variant=\"flat\"\n isDisabled={!hasPrevPage}\n onPress={onPrevPage}\n startContent={<ChevronLeftIcon className=\"h-3 w-3\" />}\n >\n {t(\"predict.pagination.prev\")}\n </Button>\n <span className=\"text-xs text-default-500\">\n {t(\"predict.pagination.page\", { page })}\n </span>\n <Button\n size=\"sm\"\n variant=\"flat\"\n isDisabled={!hasNextPage}\n onPress={onNextPage}\n endContent={<ChevronRightIcon className=\"h-3 w-3\" />}\n >\n {t(\"predict.pagination.next\")}\n </Button>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n","import { useTradeHistory } from \"./trade-history.script\";\nimport { TradeHistoryUI } from \"./trade-history.ui\";\n\nexport interface TradeHistoryWidgetProps {\n /** Optional filter by market ticker */\n ticker?: string;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n pageSize?: number;\n}\n\nexport function TradeHistoryWidget({\n ticker,\n pageSize,\n}: TradeHistoryWidgetProps = {}) {\n const {\n trades,\n isLoading,\n isFetching,\n page,\n hasNextPage,\n hasPrevPage,\n nextPage,\n prevPage,\n } = useTradeHistory({ ticker, pageSize });\n\n return (\n <TradeHistoryUI\n trades={trades}\n isLoading={isLoading}\n isFetching={isFetching}\n page={page}\n hasNextPage={hasNextPage}\n hasPrevPage={hasPrevPage}\n onNextPage={nextPage}\n onPrevPage={prevPage}\n />\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly. To track positions, you need to query user's token\n * balances for outcome mint addresses and calculate positions manually.\n *\n * Use `useOutcomeMintsQuery` and `useMarketsBatchQuery` to build positions\n * from on-chain data.\n */\nimport { useMemo } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UsePositionsParams {\n /** Polling interval in ms (0 to disable) */\n refetchInterval?: number;\n}\n\n/**\n * @deprecated Position type - not provided by new API\n */\nexport interface Position {\n id: string;\n marketId: string;\n marketTitle: string;\n outcome: \"yes\" | \"no\";\n quantity: number;\n avgPrice: number;\n avgCostBasis: number;\n currentPrice: number;\n unrealizedPnl: number;\n realizedPnl: number;\n}\n\nexport interface PositionsSummary {\n /** Total market value in cents */\n totalValue: number;\n /** Total unrealised PnL in cents */\n totalUnrealizedPnl: number;\n /** Total realised PnL in cents */\n totalRealizedPnl: number;\n /** Number of positions */\n count: number;\n}\n\nexport interface UsePositionsResult {\n /** Positions list */\n positions: Position[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether a background refetch is in progress */\n isFetching: boolean;\n /** Aggregated summary across all positions */\n summary: PositionsSummary;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * @deprecated This hook is deprecated. The new dflow API does not provide\n * positions data. Use on-chain token balance queries instead.\n */\nexport function usePositions(\n _params: UsePositionsParams = {},\n): UsePositionsResult {\n // Return empty positions - API no longer supports this\n const summary = useMemo<PositionsSummary>(\n () => ({\n totalValue: 0,\n totalUnrealizedPnl: 0,\n totalRealizedPnl: 0,\n count: 0,\n }),\n [],\n );\n\n return {\n positions: [],\n isLoading: false,\n isFetching: false,\n summary,\n };\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly.\n */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n StyledTable,\n TableHeader,\n TableColumn,\n TableBody,\n TableRow,\n TableCell,\n} from \"@liberfi.io/ui\";\nimport { formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport type { Position, PositionsSummary } from \"./positions.script\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PositionsUIProps {\n /** List of positions */\n positions: Position[];\n /** Whether data is loading */\n isLoading: boolean;\n /** Aggregated summary */\n summary: PositionsSummary;\n /** Callback when a position's sell button is clicked */\n onSell?: (position: Position) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst fmtCents = (cents: number) => formatAmountUSDCompact(cents / 100);\n\nfunction PnlText({ value }: { value: number }) {\n if (value === 0) {\n return <span className=\"text-default-500\">{fmtCents(0)}</span>;\n }\n const isPositive = value > 0;\n return (\n <span className={isPositive ? \"text-success\" : \"text-danger\"}>\n {isPositive ? \"+\" : \"\"}\n {fmtCents(value)}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PositionsUI({\n positions,\n isLoading,\n summary,\n onSell,\n}: PositionsUIProps) {\n const { t } = useTranslation();\n\n const rows = useMemo(\n () =>\n positions.map((pos) => ({\n key: `${pos.marketId}-${pos.outcome}`,\n marketTitle: pos.marketTitle,\n outcome: pos.outcome,\n quantity: pos.quantity,\n avgCost: pos.avgCostBasis,\n currentPrice: pos.currentPrice,\n value: pos.currentPrice * pos.quantity,\n unrealizedPnl: pos.unrealizedPnl,\n position: pos,\n })),\n [positions],\n );\n\n if (isLoading) {\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n <div className=\"border-b border-default-200 px-3 py-2 text-sm font-medium\">\n {t(\"predict.positions.title\")}\n </div>\n <div className=\"flex flex-col gap-y-2 p-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"h-8 animate-pulse rounded bg-default-100\" />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col rounded-xl border border-default-200 bg-content1\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-default-200 px-3 py-2\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.positions.title\")}\n {positions.length > 0 && (\n <span className=\"ml-1 text-default-400\">({positions.length})</span>\n )}\n </span>\n </div>\n\n {positions.length === 0 ? (\n <div className=\"flex items-center justify-center py-8 text-xs text-default-400\">\n {t(\"predict.positions.empty\")}\n </div>\n ) : (\n <>\n <div className=\"w-full overflow-x-auto\">\n <StyledTable\n radius=\"none\"\n aria-label=\"Positions\"\n className=\"min-w-[640px]\"\n >\n <TableHeader>\n <TableColumn textValue=\"Market\" width={200}>\n {t(\"predict.positions.market\")}\n </TableColumn>\n <TableColumn textValue=\"Outcome\" width={60}>\n {t(\"predict.positions.outcome\")}\n </TableColumn>\n <TableColumn textValue=\"Qty\" width={50}>\n {t(\"predict.positions.qty\")}\n </TableColumn>\n <TableColumn textValue=\"Avg Cost\" width={70}>\n {t(\"predict.positions.avgCost\")}\n </TableColumn>\n <TableColumn textValue=\"Price\" width={60}>\n {t(\"predict.positions.currentPrice\")}\n </TableColumn>\n <TableColumn textValue=\"Value\" width={80}>\n {t(\"predict.positions.value\")}\n </TableColumn>\n <TableColumn textValue=\"PnL\" width={80}>\n {t(\"predict.positions.pnl\")}\n </TableColumn>\n </TableHeader>\n <TableBody>\n {rows.map((row) => (\n <TableRow\n key={row.key}\n className={\n onSell ? \"cursor-pointer hover:bg-default-50\" : \"\"\n }\n onClick={() => onSell?.(row.position)}\n >\n <TableCell>\n <span className=\"text-xs font-medium line-clamp-1\">\n {row.marketTitle}\n </span>\n </TableCell>\n <TableCell>\n <span\n className={`text-xs font-medium ${\n row.outcome === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\"\n }`}\n >\n {row.outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.quantity}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.avgCost}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{row.currentPrice}¢</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">{fmtCents(row.value)}</span>\n </TableCell>\n <TableCell>\n <span className=\"text-xs\">\n <PnlText value={row.unrealizedPnl} />\n </span>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </StyledTable>\n </div>\n\n {/* Summary footer */}\n <div className=\"flex items-center justify-between border-t border-default-200 px-3 py-2 text-xs\">\n <div className=\"flex items-center gap-x-4\">\n <span className=\"text-default-500\">\n {t(\"predict.positions.totalValue\")}:{\" \"}\n <span className=\"font-medium text-foreground\">\n {fmtCents(summary.totalValue)}\n </span>\n </span>\n </div>\n <div className=\"flex items-center gap-x-4\">\n <span className=\"text-default-500\">\n {t(\"predict.positions.unrealizedPnl\")}:{\" \"}\n <PnlText value={summary.totalUnrealizedPnl} />\n </span>\n <span className=\"text-default-500\">\n {t(\"predict.positions.realizedPnl\")}:{\" \"}\n <PnlText value={summary.totalRealizedPnl} />\n </span>\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n","/**\n * @deprecated This component is deprecated as the new dflow API does not provide\n * positions data directly. See positions.script.tsx for alternatives.\n */\nimport { usePositions, type Position } from \"./positions.script\";\nimport { PositionsUI } from \"./positions.ui\";\n\nexport interface PositionsWidgetProps {\n /** Polling interval in ms (default 15000, 0 to disable) */\n refetchInterval?: number;\n /** Callback when a position's sell action is triggered */\n onSell?: (position: Position) => void;\n}\n\n/**\n * @deprecated This widget is deprecated. Use on-chain token balance queries instead.\n */\nexport function PositionsWidget({\n refetchInterval,\n onSell,\n}: PositionsWidgetProps = {}) {\n const { positions, isLoading, summary } = usePositions({ refetchInterval });\n\n return (\n <PositionsUI\n positions={positions}\n isLoading={isLoading}\n summary={summary}\n onSell={onSell}\n />\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\n\nconst MAX_HISTORY_SIZE = 10;\n\nconst searchHistoriesAtom = atomWithStorage<string[]>(\n \"liberfi:predict_search_histories\",\n [],\n undefined,\n { getOnInit: true },\n);\n\nexport function usePredictSearchHistory() {\n const [histories, setHistories] = useAtom(searchHistoriesAtom);\n\n const addHistory = useCallback(\n (keyword: string) => {\n const trimmed = keyword.trim();\n if (!trimmed) return;\n\n setHistories((prev) => {\n const filtered = prev.filter((h) => h !== trimmed);\n return [trimmed, ...filtered].slice(0, MAX_HISTORY_SIZE);\n });\n },\n [setHistories],\n );\n\n const clearHistories = useCallback(() => {\n setHistories([]);\n }, [setHistories]);\n\n return { histories, addHistory, clearHistories };\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Chip, TrashIcon, Button } from \"@liberfi.io/ui\";\n\nexport type SearchHistoryUIProps = {\n histories: string[];\n onSelect?: (keyword: string) => void;\n onClear?: () => void;\n className?: string;\n};\n\nexport function SearchHistoryUI({\n histories,\n onSelect,\n onClear,\n className,\n}: SearchHistoryUIProps) {\n const { t } = useTranslation();\n\n if (histories.length === 0) return null;\n\n return (\n <div className={cn(\"px-4 pb-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.search.history\")}\n </span>\n <Button\n isIconOnly\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <TrashIcon width={20} height={20} />\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {histories.map((keyword) => (\n <Chip\n key={keyword}\n size=\"sm\"\n variant=\"bordered\"\n className={cn(\n \"text-neutral\",\n \"border-border border-1\",\n \"cursor-pointer\",\n \"hover:opacity-hover\",\n )}\n onClick={() => onSelect?.(keyword)}\n >\n {keyword}\n </Chip>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"@liberfi.io/ui\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\nimport { SearchHistoryUI } from \"./search-history.ui\";\n\nexport type SearchHistoryWidgetProps = {\n /** Callback when a history keyword is selected */\n onSelect?: (keyword: string) => void;\n className?: string;\n};\n\nexport function SearchHistoryWidget({\n onSelect,\n className,\n}: SearchHistoryWidgetProps) {\n const { histories, clearHistories } = usePredictSearchHistory();\n\n return (\n <SearchHistoryUI\n className={cn(className)}\n histories={histories}\n onSelect={onSelect}\n onClear={clearHistories}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Kbd,\n SearchIcon,\n StyledInput,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\n\nexport type SearchInputUIProps = {\n /** Controlled input value */\n value: string;\n /** Called on every keystroke */\n onValueChange: (value: string) => void;\n /** Called when clear button is pressed */\n onClear?: () => void;\n /** Called when Esc button is pressed */\n onEscape?: () => void;\n className?: string;\n};\n\nexport function SearchInputUI({\n value,\n onValueChange,\n onClear,\n onEscape,\n className,\n}: SearchInputUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={className}>\n <StyledInput\n autoFocus\n variant=\"flat\"\n radius=\"full\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"predict.search.placeholder\")}\n startContent={\n <SearchIcon width={20} height={20} className=\"text-neutral\" />\n }\n endContent={\n value ? (\n <Button\n isIconOnly\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n ) : (\n <Kbd\n className=\"min-w-8 justify-center text-xs text-neutral bg-transparent border border-border rounded-full cursor-pointer select-none\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n onEscape?.();\n }}\n >\n Esc\n </Kbd>\n )\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { Avatar, cn, Linkable } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event } from \"../../client/v2\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type SearchResultItemUIProps = {\n event: V2Event;\n /** URL for the detail page. When set, the row renders as a link via Linkable. */\n href?: string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: V2Event) => void;\n /** Called when the row is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n className?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchResultItemUI({\n event,\n href,\n LinkComponent,\n onSelect,\n onHover,\n className,\n}: SearchResultItemUIProps) {\n const firstTag = event.tags?.[0];\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n className={cn(\n \"w-full h-full px-3 flex items-center gap-3\",\n \"hover:cursor-pointer hover:bg-content2 rounded-lg\",\n \"transition-colors duration-150\",\n className,\n )}\n onClick={(e) => {\n // When href is present, Next.js Link would also navigate client-side.\n // Prevent that so navigation is handled exactly once by the onSelect callback\n // (which closes the modal, then the caller does router.push).\n // Right-click / middle-click \"Open in new tab\" still works via href.\n if (href && onSelect) e.preventDefault();\n onSelect?.(event);\n }}\n onMouseEnter={() => onHover?.(event)}\n >\n {/* Avatar */}\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"full\"\n className=\"h-10 w-10 flex-shrink-0\"\n />\n\n {/* Title + Tag */}\n <div className=\"flex-1 min-w-0 flex items-center gap-2.5\">\n <span className=\"min-w-0 text-sm font-medium truncate\">\n {event.title}\n </span>\n\n {firstTag && (\n <span\n className={cn(\n \"flex-shrink-0 inline-flex items-center\",\n \"rounded-full px-2.5 py-1.5\",\n \"text-[11px] font-semibold leading-none uppercase\",\n \"bg-primary/15 text-primary\",\n )}\n >\n {firstTag.label}\n </span>\n )}\n </div>\n </Linkable>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { V2Event, V2ProviderSource } from \"../../client/v2\";\nimport { useSearchEventsInfiniteQuery } from \"../../hooks/v2/useSearchEventsInfiniteQuery\";\n\nexport interface UseSearchResultListScriptParams {\n keyword?: string;\n limit?: number;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: V2ProviderSource;\n}\n\nexport function useSearchResultListScript({\n keyword = \"\",\n limit,\n source,\n}: UseSearchResultListScriptParams) {\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchEventsInfiniteQuery({ keyword, limit, source }, { enabled: true });\n\n const events = useMemo<V2Event[]>(\n () =>\n data?.pages\n .flatMap((p) => p.items)\n .filter((item): item is V2Event => item != null) ?? [],\n [data],\n );\n\n return {\n events,\n isLoading,\n isFetchingNextPage,\n hasNextPage: hasNextPage ?? false,\n fetchNextPage,\n };\n}\n","\"use client\";\n\nimport { ReactElement, useCallback, useMemo, useRef } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, EmptyIcon, Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event } from \"../../client/v2\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport {\n useSearchResultListScript,\n type UseSearchResultListScriptParams,\n} from \"./search-result-list.script\";\n\nconst ROW_HEIGHT = 56;\n\nexport type SearchResultListWidgetProps = {\n onSelect?: (event: V2Event) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n className?: string;\n} & UseSearchResultListScriptParams;\n\nexport function SearchResultListWidget({\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n className,\n ...scriptParams\n}: SearchResultListWidgetProps) {\n const { events, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchResultListScript(scriptParams);\n\n const ref = useRef<HTMLDivElement>(null);\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => index < events.length,\n [events],\n );\n\n const loadMoreItems = useCallback(async () => {\n if (hasNextPage && !isFetchingNextPage) {\n await fetchNextPage();\n }\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const itemCount = useMemo(\n () => (hasNextPage ? events.length + 1 : events.length),\n [events, hasNextPage],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 5,\n });\n\n if (isLoading) {\n return <LoadingState className={className} />;\n }\n\n if (events.length === 0) {\n return <EmptyState className={className} />;\n }\n\n return (\n <div className={cn(\"w-full h-full flex flex-col\", className)}>\n <div className=\"flex-auto min-h-0\" ref={ref}>\n <List\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={SearchResultRow}\n rowCount={itemCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ events, onSelect, getEventHref, LinkComponent, onHover }}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row renderer\n// ---------------------------------------------------------------------------\n\ninterface SearchResultRowData {\n events: V2Event[];\n onSelect?: (event: V2Event) => void;\n getEventHref?: (event: V2Event) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: V2Event) => void;\n}\n\nfunction SearchResultRow({\n index,\n style,\n events,\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n}: RowComponentProps<SearchResultRowData>): ReactElement {\n const event = events[index];\n\n if (!event) {\n return (\n <div style={style} className=\"flex items-center justify-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n return (\n <div style={style}>\n <SearchResultItemUI\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onHover={onHover}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// States\n// ---------------------------------------------------------------------------\n\nfunction LoadingState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\"flex items-center justify-center gap-2 py-16\", className)}\n >\n <Spinner size=\"sm\" />\n <span className=\"text-sm text-neutral\">\n {t(\"predict.search.loading\")}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-16\",\n className,\n )}\n >\n <EmptyIcon width={28} height={28} className=\"text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral\">\n {t(\"predict.search.noResults\")}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { debounce } from \"@liberfi.io/utils\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\n\nexport interface UseSearchScriptParams {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n}\n\nexport function useSearchScript({ onKeywordChange }: UseSearchScriptParams) {\n const [text, setText] = useState(\"\");\n const [keyword, setKeyword] = useState(\"\");\n const { addHistory } = usePredictSearchHistory();\n\n const onKeywordChangeStable = useCallbackRef(onKeywordChange);\n const addHistoryStable = useCallbackRef(addHistory);\n\n const debouncedSearch = useMemo(\n () =>\n debounce((v: string) => {\n setKeyword(v);\n onKeywordChangeStable(v);\n if (v) addHistoryStable(v);\n }, 500),\n [onKeywordChangeStable, addHistoryStable],\n );\n\n const setText_ = useCallback(\n (v: string) => {\n setText(v);\n debouncedSearch(v);\n },\n [debouncedSearch],\n );\n\n const setKeyword_ = useCallback(\n (value: string) => {\n debouncedSearch.cancel();\n setText(value);\n setKeyword(value);\n onKeywordChangeStable(value);\n if (value) addHistoryStable(value);\n },\n [debouncedSearch, onKeywordChangeStable, addHistoryStable],\n );\n\n const clearKeyword = useCallback(() => setKeyword_(\"\"), [setKeyword_]);\n\n return {\n text,\n keyword,\n setText: setText_,\n setKeyword: setKeyword_,\n clearKeyword,\n };\n}\n","\"use client\";\n\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport type { V2Event, V2ProviderSource } from \"../../client/v2\";\nimport { SearchHistoryWidget } from \"./search-history.widget\";\nimport { SearchInputUI } from \"./search-input.ui\";\nimport { SearchResultListWidget } from \"./search-result-list.widget\";\nimport { useSearchScript } from \"./search.script\";\n\nexport type SearchWidgetProps = {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n /** Callback when an event is selected */\n onSelectEvent?: (event: V2Event) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n /** Called when the Esc button / key is pressed. */\n onEscape?: () => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: V2ProviderSource;\n};\n\nexport function SearchWidget({\n onKeywordChange,\n onSelectEvent,\n getEventHref,\n LinkComponent,\n onHover,\n onEscape,\n source,\n}: SearchWidgetProps) {\n const { text, keyword, setText, setKeyword, clearKeyword } = useSearchScript({\n onKeywordChange,\n });\n\n return (\n <div className=\"w-full h-full flex flex-col gap-3\">\n <SearchInputUI\n value={text}\n onValueChange={setText}\n onClear={clearKeyword}\n onEscape={onEscape}\n />\n {!keyword && <SearchHistoryWidget onSelect={setKeyword} />}\n <SearchResultListWidget\n className=\"flex-auto min-h-0\"\n keyword={keyword}\n onSelect={onSelectEvent}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n source={source}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport {\n Button,\n ModalBody,\n ModalContent,\n ModalHeader,\n StyledModal,\n useScreen,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport type { V2Event, V2ProviderSource } from \"../../client/v2\";\nimport { SearchWidget } from \"./search.widget\";\n\nexport type PredictSearchModalParams = {\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: V2Event) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: V2Event) => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: V2ProviderSource;\n};\n\nexport type PredictSearchModalResult = V2Event;\n\nexport const PREDICT_SEARCH_MODAL_ID = \"predict-search\";\n\nexport function PredictSearchModal({\n id = PREDICT_SEARCH_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictSearchModalParams, PredictSearchModalResult> id={id}>\n {(modalProps) => <PredictSearchModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictSearchModalContent({\n params,\n isOpen,\n onOpenChange,\n onResult,\n}: RenderAsyncModalProps<PredictSearchModalParams, PredictSearchModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const handleSelectEvent = useCallback(\n (event: V2Event) => {\n onResult(event);\n },\n [onResult],\n );\n\n const handleEscape = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"full\" : \"lg\"}\n hideCloseButton\n backdrop=\"blur\"\n radius=\"lg\"\n >\n <ModalContent className=\"w-full h-full\">\n <ModalHeader className=\"sm:hidden flex items-center justify-between pt-4 pb-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.search.title\")}\n </span>\n <Button\n isIconOnly\n onPress={() => onOpenChange(false)}\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6\"\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n </ModalHeader>\n <ModalBody className=\"p-4\">\n <SearchWidget\n getEventHref={params?.getEventHref}\n LinkComponent={params?.LinkComponent}\n onHover={params?.onHover}\n source={params?.source}\n onSelectEvent={handleSelectEvent}\n onEscape={handleEscape}\n />\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, cn, Kbd, SearchIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport type { V2Event } from \"../../client/v2\";\nimport {\n PREDICT_SEARCH_MODAL_ID,\n type PredictSearchModalParams,\n type PredictSearchModalResult,\n} from \"./search.modal\";\n\nexport type SearchEventsButtonProps = {\n /** Callback when an event is selected from the search modal */\n onSelectEvent?: (event: V2Event) => void;\n /** Params forwarded to the search modal (getEventHref, LinkComponent, onHover) */\n modalParams?: Omit<PredictSearchModalParams, never>;\n className?: string;\n};\n\nexport function SearchEventsButton({\n onSelectEvent,\n modalParams,\n className,\n}: SearchEventsButtonProps) {\n const { t } = useTranslation();\n const { isDesktop, isMobile } = useScreen();\n\n const { onOpen, onClose } = useAsyncModal<\n PredictSearchModalParams,\n PredictSearchModalResult\n >(PREDICT_SEARCH_MODAL_ID);\n\n const onSelectEventStable = useCallbackRef(onSelectEvent);\n\n const handleOpen = useCallbackRef(async () => {\n const result = await onOpen({ params: modalParams });\n if (result) {\n onSelectEventStable(result);\n }\n });\n\n const handleClose = useCallbackRef(() => {\n onClose();\n });\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n const isInEditableElement =\n !!activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.getAttribute(\"contenteditable\") === \"true\");\n\n if (event.key === \"/\" && !isInEditableElement) {\n event.preventDefault();\n handleOpen();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleOpen, handleClose]);\n\n return (\n <Button\n size=\"sm\"\n radius=\"full\"\n isIconOnly={!isDesktop}\n onPress={handleOpen}\n variant={isMobile ? \"flat\" : \"bordered\"}\n startContent={\n isDesktop ? <SearchIcon className=\"text-neutral\" /> : undefined\n }\n endContent={\n isDesktop ? (\n <Kbd className=\"ml-auto min-w-6 justify-center text-xs bg-transparent border border-border rounded-full\">\n /\n </Kbd>\n ) : undefined\n }\n className={cn(\n isDesktop && \"min-w-56 justify-start pl-3 pr-1.5 text-neutral\",\n className,\n )}\n >\n {isDesktop ? (\n t(\"predict.search.placeholder\")\n ) : (\n <SearchIcon className=\"text-neutral\" />\n )}\n </Button>\n );\n}\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport { PredictContext } from \"../contexts\";\nimport type { IPredictClient, IPredictWsClient } from \"../types\";\n\nexport type PredictProviderProps = PropsWithChildren<{\n /** The predict API client instance */\n client: IPredictClient;\n /** WebSocket client instance (optional, enables WebSocket features) */\n wsClient?: IPredictWsClient | null;\n}>;\n\nexport function PredictProvider({\n client,\n wsClient = null,\n children,\n}: PredictProviderProps) {\n const value = useMemo(\n () => ({\n client,\n wsClient,\n }),\n [client, wsClient],\n );\n\n return (\n <PredictContext.Provider value={value}>{children}</PredictContext.Provider>\n );\n}\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport { UserPredictContext } from \"../contexts/UserPredictContext\";\nimport { usePositionsByWalletQuery } from \"../hooks/usePositionsByWalletQuery\";\n\nconst DEFAULT_POLLING_INTERVAL = 30_000;\n\nexport type UserPredictProviderProps = PropsWithChildren<{\n /** Wallet address to poll positions for */\n walletAddress: string;\n /** Polling interval in milliseconds (default: 30 000) */\n pollingInterval?: number;\n /** Whether polling is enabled (default: true) */\n enabled?: boolean;\n}>;\n\nexport function UserPredictProvider({\n walletAddress,\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n enabled = true,\n children,\n}: UserPredictProviderProps) {\n const { data, isLoading, error, refetch } = usePositionsByWalletQuery(\n { walletAddress },\n {\n enabled: enabled && !!walletAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n const value = useMemo(\n () => ({\n positions: data?.positions ?? [],\n usdcBalance: data?.usdcBalance ?? 0,\n isLoading,\n error: error ?? null,\n refetch,\n }),\n [data?.positions, data?.usdcBalance, isLoading, error, refetch],\n );\n\n return (\n <UserPredictContext.Provider value={value}>\n {children}\n </UserPredictContext.Provider>\n );\n}\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport type { PredictClientV2 } from \"../../client/v2\";\nimport { PredictV2Context } from \"../../contexts/v2\";\n\nexport type PredictV2ProviderProps = PropsWithChildren<{\n /**\n * A `PredictClientV2` instance pointed at the prediction-server endpoint.\n *\n * @example\n * ```tsx\n * import { createPredictClientV2 } from \"@liberfi.io/ui-predict\";\n *\n * const client = createPredictClientV2(\"https://api.example.com\");\n *\n * <PredictV2Provider client={client}>\n * <App />\n * </PredictV2Provider>\n * ```\n */\n client: PredictClientV2;\n}>;\n\n/**\n * Provides the v2 prediction client via React context.\n *\n * Place this provider at the application root (or any subtree boundary)\n * where v2 prediction hooks are used. It is independent of `PredictProvider`,\n * allowing both to coexist during an incremental migration.\n */\nexport function PredictV2Provider({\n client,\n children,\n}: PredictV2ProviderProps) {\n const value = useMemo(() => ({ client }), [client]);\n\n return (\n <PredictV2Context.Provider value={value}>\n {children}\n </PredictV2Context.Provider>\n );\n}\n","import { httpGet, httpPost } from \"@liberfi.io/utils\";\nimport type { ProviderType } from \"../types\";\n\n/**\n * Build a query string from a params object.\n * Skips `undefined` and `null` values.\n */\nexport function buildQuery(\n params: Record<string, unknown>,\n provider?: ProviderType,\n): string {\n const qs = new URLSearchParams();\n\n // Add provider if specified\n if (provider) {\n qs.set(\"provider\", provider);\n }\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n qs.set(key, JSON.stringify(value));\n } else {\n qs.set(key, String(value));\n }\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/** Cast typed params to Record for buildQuery */\nexport function toRecord<T extends object>(params: T): Record<string, unknown> {\n return params as unknown as Record<string, unknown>;\n}\n\n/**\n * Base class for prediction market clients.\n * Provides common HTTP request utilities.\n */\nexport abstract class BasePredictClient {\n constructor(\n protected readonly endpoint: string,\n protected readonly provider: ProviderType,\n ) {}\n\n /**\n * Build URL with query parameters\n */\n protected buildUrl(path: string, params?: Record<string, unknown>): string {\n const query = buildQuery(params ?? {}, this.provider);\n return `${this.endpoint}${path}${query}`;\n }\n\n /**\n * Perform a GET request\n */\n protected async fetch<T>(\n path: string,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpGet<T>(url);\n }\n\n /**\n * Perform a POST request\n */\n protected async postRequest<T, P = unknown>(\n path: string,\n data: P,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpPost<T, P>(url, data);\n }\n}\n","import type {\n IPredictClient,\n StandardEventsResponse,\n StandardEvent,\n StandardMarketsResponse,\n StandardMarket,\n OrderbookResponse,\n OrderbookLevel,\n MultiTradeResponse,\n MultiOnchainTradeResponse,\n CandlesticksResponse,\n ForecastPercentileHistoryResponse,\n SeriesListResponse,\n SeriesResponse,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n SearchResponse,\n OutcomeMintsResponse,\n FilterOutcomeMintsResponse,\n LiveDataResponse,\n QuoteResponse,\n SwapResponse,\n SwapInstructionsResponse,\n OrderResponse,\n OrderStatusResponse,\n IntentQuoteResponse,\n IntentSwapResponse,\n PredictionMarketInitResponse,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n VenueListResponse,\n EventQueryParams,\n MarketQueryParams,\n MarketsBatchRequest,\n TradesQueryParams,\n TradesByMintQueryParams,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n PositionsByWalletQueryParams,\n WalletPositionsResponse,\n OutcomeMintsQueryParams,\n FilterOutcomeMintsRequest,\n QuoteQueryParams,\n SwapRequestBody,\n OrderQueryParams,\n OrderStatusQueryParams,\n IntentQuoteQueryParams,\n IntentSwapRequestBody,\n PredictionMarketInitQueryParams,\n} from \"../types\";\nimport { BasePredictClient, toRecord } from \"./base\";\n\n// ---------------------------------------------------------------------------\n// DFlow-specific raw orderbook types (internal to this client)\n// ---------------------------------------------------------------------------\n\n/** Raw orderbook side as returned by the DFlow API: price string → quantity */\ntype DflowOrderbookSideRaw = Record<string, number>;\n\n/** Raw orderbook response shape from DFlow API */\ninterface DflowRawOrderbookResponse {\n yes_bids?: DflowOrderbookSideRaw;\n yes_asks?: DflowOrderbookSideRaw;\n no_bids?: DflowOrderbookSideRaw;\n no_asks?: DflowOrderbookSideRaw;\n sequence?: number;\n}\n\n/** Parse a raw orderbook side into sorted OrderbookLevel[] */\nfunction parseSide(\n raw: DflowOrderbookSideRaw | undefined,\n sort: \"asc\" | \"desc\",\n): OrderbookLevel[] {\n if (!raw) return [];\n const levels: OrderbookLevel[] = Object.entries(raw).map(\n ([priceStr, quantity]) => ({\n price: parseFloat(priceStr),\n quantity,\n }),\n );\n levels.sort((a, b) =>\n sort === \"desc\" ? b.price - a.price : a.price - b.price,\n );\n return levels;\n}\n\n/** Normalise DFlow raw orderbook response into public OrderbookResponse */\nfunction normalizeOrderbook(raw: DflowRawOrderbookResponse): OrderbookResponse {\n return {\n yesBids: parseSide(raw.yes_bids, \"desc\"),\n yesAsks: parseSide(raw.yes_asks, \"asc\"),\n noBids: parseSide(raw.no_bids, \"desc\"),\n noAsks: parseSide(raw.no_asks, \"asc\"),\n sequence: raw.sequence,\n };\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * DFlow Prediction Market Client.\n * Implements IPredictClient interface using the DFlow API.\n */\nexport class DflowPredictClient\n extends BasePredictClient\n implements IPredictClient\n{\n constructor(endpoint: string) {\n super(endpoint, \"dflow\");\n }\n\n // -- Events ----------------------------------------------------------------\n\n async getEvents(params?: EventQueryParams): Promise<StandardEventsResponse> {\n return await this.fetch<StandardEventsResponse>(\n \"/v2/event\",\n toRecord(params ?? {}),\n );\n }\n\n async getEventById(\n eventId: string,\n withNestedMarkets?: boolean,\n ): Promise<StandardEvent> {\n return await this.fetch<StandardEvent>(`/v2/event/${eventId}`, {\n withNestedMarkets,\n });\n }\n\n async getEventCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/event/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getEventForecastPercentileHistory(\n params: ForecastPercentileHistoryQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { seriesTicker, eventId, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/${seriesTicker}/${eventId}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n async getEventForecastPercentileHistoryByMint(\n params: ForecastPercentileHistoryByMintQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/by-mint/${mintAddress}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n // -- Markets ---------------------------------------------------------------\n\n async getMarkets(\n params?: MarketQueryParams,\n ): Promise<StandardMarketsResponse> {\n return await this.fetch<StandardMarketsResponse>(\n \"/v2/market\",\n toRecord(params ?? {}),\n );\n }\n\n async getMarketById(marketId: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(`/v2/market/${marketId}`);\n }\n\n async getMarketByMint(mintAddress: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(\n `/v2/market/by-mint/${mintAddress}`,\n );\n }\n\n async getMarketsBatch(\n request: MarketsBatchRequest,\n ): Promise<StandardMarketsResponse> {\n return await this.postRequest<StandardMarketsResponse, MarketsBatchRequest>(\n \"/v2/market/batch\",\n request,\n );\n }\n\n async getMarketCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getMarketCandlesticksByMint(\n mintAddress: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/by-mint/${mintAddress}/candlesticks`,\n toRecord(params),\n );\n }\n\n // -- Orderbook -------------------------------------------------------------\n\n async getOrderbook(marketTicker: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/${marketTicker}`,\n );\n return normalizeOrderbook(raw);\n }\n\n async getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/by-mint/${mintAddress}`,\n );\n return normalizeOrderbook(raw);\n }\n\n // -- Trades ----------------------------------------------------------------\n\n async getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse> {\n return await this.fetch<MultiTradeResponse>(\n \"/v2/trades\",\n toRecord(params ?? {}),\n );\n }\n\n async getTradesByMint(\n params: TradesByMintQueryParams,\n ): Promise<MultiTradeResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<MultiTradeResponse>(\n `/v2/trades/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- On-Chain Trades -------------------------------------------------------\n\n async getOnchainTradesByWallet(\n params: OnchainTradesByWalletQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { walletAddress, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-wallet/${walletAddress}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByEvent(\n params: OnchainTradesByEventQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByMarket(\n params: OnchainTradesByMarketQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { marketTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-market/${marketTicker}`,\n toRecord(rest),\n );\n }\n\n // -- Live Data -------------------------------------------------------------\n\n async getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse> {\n return await this.fetch<LiveDataResponse>(\"/v2/live\", {\n milestoneIds: params.milestoneIds.join(\",\"),\n });\n }\n\n async getLiveDataByEvent(\n params: LiveDataByEventQueryParams,\n ): Promise<LiveDataResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getLiveDataByMint(\n params: LiveDataByMintQueryParams,\n ): Promise<LiveDataResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Series ----------------------------------------------------------------\n\n async getSeries(params?: SeriesQueryParams): Promise<SeriesListResponse> {\n return await this.fetch<SeriesListResponse>(\n \"/v2/series\",\n toRecord(params ?? {}),\n );\n }\n\n async getSeriesByTicker(seriesTicker: string): Promise<SeriesResponse> {\n return await this.fetch<SeriesResponse>(`/v2/series/${seriesTicker}`);\n }\n\n // -- Tags & Sports ---------------------------------------------------------\n\n async getTagsByCategories(): Promise<TagsByCategoriesResponse> {\n return await this.fetch<TagsByCategoriesResponse>(\"/v2/tags/by_categories\");\n }\n\n async getFiltersBySports(): Promise<FiltersBySportsResponse> {\n return await this.fetch<FiltersBySportsResponse>(\"/v2/sports/filters\");\n }\n\n // -- Search ----------------------------------------------------------------\n\n async search(params: SearchQueryParams): Promise<SearchResponse> {\n return await this.fetch<SearchResponse>(\"/v2/search\", toRecord(params));\n }\n\n // -- Positions -------------------------------------------------------------\n\n async getPositionsByWallet(\n params: PositionsByWalletQueryParams,\n ): Promise<WalletPositionsResponse> {\n const { walletAddress } = params;\n return await this.fetch<WalletPositionsResponse>(\n `/v2/positions/by-wallet/${walletAddress}`,\n );\n }\n\n // -- Outcome Mints ---------------------------------------------------------\n\n async getOutcomeMints(\n params?: OutcomeMintsQueryParams,\n ): Promise<OutcomeMintsResponse> {\n return await this.fetch<OutcomeMintsResponse>(\n \"/v2/outcome_mints\",\n toRecord(params ?? {}),\n );\n }\n\n async filterOutcomeMints(\n request: FilterOutcomeMintsRequest,\n ): Promise<FilterOutcomeMintsResponse> {\n return await this.postRequest<\n FilterOutcomeMintsResponse,\n FilterOutcomeMintsRequest\n >(\"/v2/filter_outcome_mints\", request);\n }\n\n // -- Quote & Swap (Imperative) ---------------------------------------------\n\n async getQuote(params: QuoteQueryParams): Promise<QuoteResponse> {\n return await this.fetch<QuoteResponse>(\"/v2/swap/quote\", toRecord(params));\n }\n\n async createSwap(request: SwapRequestBody): Promise<SwapResponse> {\n return await this.postRequest<SwapResponse, SwapRequestBody>(\n \"/v2/swap\",\n request,\n );\n }\n\n async createSwapInstructions(\n request: SwapRequestBody,\n ): Promise<SwapInstructionsResponse> {\n return await this.postRequest<SwapInstructionsResponse, SwapRequestBody>(\n \"/v2/swap/instructions\",\n request,\n );\n }\n\n // -- Order API -------------------------------------------------------------\n\n async getOrder(params: OrderQueryParams): Promise<OrderResponse> {\n return await this.fetch<OrderResponse>(\"/v2/order\", toRecord(params));\n }\n\n async getOrderStatus(\n params: OrderStatusQueryParams,\n ): Promise<OrderStatusResponse> {\n try {\n return await this.fetch<OrderStatusResponse>(\n \"/v2/order/status\",\n toRecord(params),\n );\n } catch (err: unknown) {\n // 404 means the order hasn't been indexed yet — return pending so polling continues\n const is404 = err instanceof Error && /\\b404\\b/.test(err.message);\n if (is404) {\n return { status: \"pending\", inAmount: \"0\", outAmount: \"0\" };\n }\n throw err;\n }\n }\n\n // -- Intent (Declarative Swap) ---------------------------------------------\n\n async getIntentQuote(\n params: IntentQuoteQueryParams,\n ): Promise<IntentQuoteResponse> {\n return await this.fetch<IntentQuoteResponse>(\n \"/v2/intent/quote\",\n toRecord(params),\n );\n }\n\n async submitIntentSwap(\n request: IntentSwapRequestBody,\n ): Promise<IntentSwapResponse> {\n return await this.postRequest<IntentSwapResponse, IntentSwapRequestBody>(\n \"/v2/intent/swap\",\n request,\n );\n }\n\n // -- Prediction Market Init ------------------------------------------------\n\n async initPredictionMarket(\n params: PredictionMarketInitQueryParams,\n ): Promise<PredictionMarketInitResponse> {\n return await this.fetch<PredictionMarketInitResponse>(\n \"/v2/prediction-market/init\",\n toRecord(params),\n );\n }\n\n // -- Token & Venue ---------------------------------------------------------\n\n async getTokens(): Promise<TokenListResponse> {\n return await this.fetch<TokenListResponse>(\"/v2/tokens\");\n }\n\n async getTokensWithDecimals(): Promise<TokenListWithDecimalsResponse> {\n return await this.fetch<TokenListWithDecimalsResponse>(\n \"/v2/tokens/decimals\",\n );\n }\n\n async getVenues(): Promise<VenueListResponse> {\n return await this.fetch<VenueListResponse>(\"/v2/venues\");\n }\n}\n","import { httpGet, httpPost, httpDelete } from \"@liberfi.io/utils\";\nimport type {\n V2CancelOrderResult,\n V2Candlestick,\n V2DFlowQuoteRequest,\n V2DFlowQuoteResponse,\n V2DFlowSubmitRequest,\n V2DFlowSubmitResponse,\n V2Event,\n V2ListCandlesticksParams,\n V2ListEventsParams,\n V2ListMarketTradesParams,\n V2ListOrdersParams,\n V2ListTradesByWalletParams,\n V2Market,\n V2Orderbook,\n V2Page,\n V2PositionsResponse,\n V2PriceHistoryRange,\n V2PriceHistoryResponse,\n V2ProviderSource,\n V2SimilarEventsParams,\n V2Trade,\n V2UserOrder,\n} from \"./types\";\n\n/**\n * Build a URL query string from a params object.\n * `undefined` and `null` values are omitted.\n * Boolean values are serialised as \"true\" / \"false\" strings.\n */\nfunction buildV2Query(params: Record<string, unknown>): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/**\n * HTTP client for the prediction-server REST API (v2 / prediction-server backend).\n *\n * Covers `GET /api/v1/events` (listEvents), `GET /api/v1/events/:slug` (getEvent),\n * and `GET /api/v1/markets/:slug` (getMarket).\n *\n * This client is intentionally decoupled from the legacy `DflowPredictClient` so\n * that both can be used in parallel during the incremental migration from the old\n * DFlow-direct integration to the unified prediction-server backend.\n *\n * @example\n * ```ts\n * const client = new PredictClientV2(\"https://api.example.com\");\n * const page = await client.listEvents({ status: \"open\", limit: 20 });\n * const event = await client.getEvent(\"will-trump-win-2024\");\n * const market = await client.getMarket(\"will-trump-win-2024-yes\");\n * ```\n */\nexport class PredictClientV2 {\n constructor(private readonly endpoint: string) {}\n\n /**\n * List prediction events with optional filtering, sorting, and pagination.\n *\n * Maps to `GET /api/v1/events`.\n *\n * @param params - Optional query parameters (filter, sort, pagination).\n * @returns A paginated page of events.\n */\n async listEvents(params?: V2ListEventsParams): Promise<V2Page<V2Event>> {\n const query = buildV2Query((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/events${query}`;\n return await httpGet<V2Page<V2Event>>(url);\n }\n\n /**\n * Fetch a single prediction event by its slug.\n *\n * Maps to `GET /api/v1/events/:slug?source=...`.\n *\n * @param slug - Canonical event slug (e.g. \"will-trump-win-2024\" for Polymarket\n * or \"KXBTCD-25FEB-T68000\" for DFlow).\n * @param source - Upstream provider (`\"dflow\"` or `\"polymarket\"`).\n * @returns The matching event.\n * @throws When the server responds with 404 or any other non-2xx status.\n */\n async getEvent(slug: string, source?: V2ProviderSource): Promise<V2Event> {\n const query = source ? buildV2Query({ source }) : \"\";\n const url = `${this.endpoint}/api/v1/events/${encodeURIComponent(slug)}${query}`;\n return await httpGet<V2Event>(url);\n }\n\n /**\n * Fetch a single prediction market by its slug.\n *\n * Maps to `GET /api/v1/markets/:slug?source=...`.\n *\n * @param slug - Canonical market slug.\n * @param source - Upstream provider (`\"dflow\"` or `\"polymarket\"`).\n * @returns The matching market.\n * @throws When the server responds with 404 or any other non-2xx status.\n */\n async getMarket(slug: string, source?: V2ProviderSource): Promise<V2Market> {\n const query = source ? buildV2Query({ source }) : \"\";\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}${query}`;\n return await httpGet<V2Market>(url);\n }\n\n // -------------------------------------------------------------------------\n // Market sub-resources\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/markets/:slug/orderbook?source=...`. */\n async getOrderbook(\n slug: string,\n source: V2ProviderSource,\n ): Promise<V2Orderbook> {\n const query = buildV2Query({ source });\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/orderbook${query}`;\n return await httpGet<V2Orderbook>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/trades?source=...`. */\n async listMarketTrades(\n slug: string,\n params: V2ListMarketTradesParams,\n ): Promise<V2Page<V2Trade>> {\n const query = buildV2Query(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/trades${query}`;\n return await httpGet<V2Page<V2Trade>>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/price-history?source=...&range=...`. */\n async getPriceHistory(\n slug: string,\n source: V2ProviderSource,\n range?: V2PriceHistoryRange,\n ): Promise<V2PriceHistoryResponse> {\n const query = buildV2Query({ source, range });\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/price-history${query}`;\n return await httpGet<V2PriceHistoryResponse>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/candlesticks?interval=...&limit=...`. */\n async listCandlesticks(\n slug: string,\n params?: V2ListCandlesticksParams,\n ): Promise<V2Candlestick[]> {\n const query = buildV2Query((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/candlesticks${query}`;\n return await httpGet<V2Candlestick[]>(url);\n }\n\n // -------------------------------------------------------------------------\n // Event sub-resources\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/events/:slug/similar?source=...`. */\n async getSimilarEvents(\n slug: string,\n source: V2ProviderSource,\n params?: V2SimilarEventsParams,\n ): Promise<V2Event[]> {\n const query = buildV2Query({ source, ...params });\n const url = `${this.endpoint}/api/v1/events/${encodeURIComponent(slug)}/similar${query}`;\n return await httpGet<V2Event[]>(url);\n }\n\n // -------------------------------------------------------------------------\n // Positions\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/positions?source=...&user=...`. */\n async getPositions(\n source: V2ProviderSource,\n user: string,\n ): Promise<V2PositionsResponse> {\n const query = buildV2Query({ source, user });\n const url = `${this.endpoint}/api/v1/positions${query}`;\n return await httpGet<V2PositionsResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // Orders\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/orders?source=...&wallet_address=...`. */\n async listOrders(params: V2ListOrdersParams): Promise<V2Page<V2UserOrder>> {\n const query = buildV2Query(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/orders${query}`;\n return await httpGet<V2Page<V2UserOrder>>(url);\n }\n\n /** Maps to `GET /api/v1/orders/:id?source=...`. */\n async getOrder(id: string, source: V2ProviderSource): Promise<V2UserOrder> {\n const query = buildV2Query({ source });\n const url = `${this.endpoint}/api/v1/orders/${encodeURIComponent(id)}${query}`;\n return await httpGet<V2UserOrder>(url);\n }\n\n /** Maps to `DELETE /api/v1/orders/:id?source=...`. */\n async cancelOrder(\n id: string,\n source: V2ProviderSource,\n ): Promise<V2CancelOrderResult> {\n const query = buildV2Query({ source });\n const url = `${this.endpoint}/api/v1/orders/${encodeURIComponent(id)}${query}`;\n return await httpDelete<V2CancelOrderResult>(url);\n }\n\n // -------------------------------------------------------------------------\n // DFlow trading\n // -------------------------------------------------------------------------\n\n /** Maps to `POST /api/v1/orders/dflow/quote`. */\n async createDFlowQuote(\n body: V2DFlowQuoteRequest,\n ): Promise<V2DFlowQuoteResponse> {\n const url = `${this.endpoint}/api/v1/orders/dflow/quote`;\n return await httpPost<V2DFlowQuoteResponse>(url, body);\n }\n\n /** Maps to `POST /api/v1/orders/dflow/submit`. */\n async submitDFlowTransaction(\n body: V2DFlowSubmitRequest,\n ): Promise<V2DFlowSubmitResponse> {\n const url = `${this.endpoint}/api/v1/orders/dflow/submit`;\n return await httpPost<V2DFlowSubmitResponse>(url, body);\n }\n\n // -------------------------------------------------------------------------\n // Trades by wallet\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/trades?source=...&wallet=...`. */\n async listTradesByWallet(\n params: V2ListTradesByWalletParams,\n ): Promise<V2Page<V2Trade>> {\n const query = buildV2Query(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/trades${query}`;\n return await httpGet<V2Page<V2Trade>>(url);\n }\n}\n\n/**\n * Factory function for `PredictClientV2`.\n *\n * @param endpoint - Base URL of the prediction-server, without a trailing slash.\n */\nexport function createPredictClientV2(endpoint: string): PredictClientV2 {\n return new PredictClientV2(endpoint);\n}\n"]}
|