@agg-market/ui 9.0.0 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/{chunk-N7U7QCSB.mjs → chunk-55YYUTBK.mjs} +807 -358
  2. package/dist/{chunk-3U4VHAP6.mjs → chunk-5G4T5R2H.mjs} +6 -2
  3. package/dist/{chunk-6CRY27SQ.mjs → chunk-GYOCLZGH.mjs} +538 -418
  4. package/dist/{chunk-HJ4UPYM7.mjs → chunk-RYQSVETG.mjs} +201 -165
  5. package/dist/{chunk-3G7C6WEC.mjs → chunk-XP7DREIX.mjs} +47 -15
  6. package/dist/events.js +575 -429
  7. package/dist/events.mjs +6 -4
  8. package/dist/index.js +1577 -948
  9. package/dist/index.mjs +10 -6
  10. package/dist/modals.js +1185 -374
  11. package/dist/modals.mjs +4 -2
  12. package/dist/pages.js +1400 -1010
  13. package/dist/pages.mjs +4 -4
  14. package/dist/primitives.js +46 -14
  15. package/dist/primitives.mjs +1 -1
  16. package/dist/styles.css +1 -1
  17. package/dist/tailwind.css +1 -1
  18. package/dist/trading.js +20 -4
  19. package/dist/trading.mjs +2 -2
  20. package/dist/types/events/item/event-list-item.types.d.mts +1 -2
  21. package/dist/types/events/item/event-list-item.types.d.ts +1 -2
  22. package/dist/types/events/item-details/event-list-item-details.types.d.mts +1 -4
  23. package/dist/types/events/item-details/event-list-item-details.types.d.ts +1 -4
  24. package/dist/types/events/item-details/event-list-item-details.utils.d.mts +42 -3
  25. package/dist/types/events/item-details/event-list-item-details.utils.d.ts +42 -3
  26. package/dist/types/events/list/event-list.types.d.mts +2 -1
  27. package/dist/types/events/list/event-list.types.d.ts +2 -1
  28. package/dist/types/events/list/index.d.mts +1 -1
  29. package/dist/types/events/list/index.d.ts +1 -1
  30. package/dist/types/events/market-details/index.d.mts +6 -2
  31. package/dist/types/events/market-details/index.d.ts +6 -2
  32. package/dist/types/events/market-details/market-details.types.d.mts +33 -9
  33. package/dist/types/events/market-details/market-details.types.d.ts +33 -9
  34. package/dist/types/events/market-details/market-details.utils.d.mts +15 -10
  35. package/dist/types/events/market-details/market-details.utils.d.ts +15 -10
  36. package/dist/types/modals/index.d.mts +1 -0
  37. package/dist/types/modals/index.d.ts +1 -0
  38. package/dist/types/pages/event-market/event-market.types.d.mts +2 -0
  39. package/dist/types/pages/event-market/event-market.types.d.ts +2 -0
  40. package/dist/types/pages/home/home.constants.d.mts +1 -3
  41. package/dist/types/pages/home/home.constants.d.ts +1 -3
  42. package/dist/types/pages/home/home.types.d.mts +0 -2
  43. package/dist/types/pages/home/home.types.d.ts +0 -2
  44. package/dist/types/pages/home/home.utils.d.mts +4 -0
  45. package/dist/types/pages/home/home.utils.d.ts +4 -0
  46. package/dist/types/pages/home/index.d.mts +1 -1
  47. package/dist/types/pages/home/index.d.ts +1 -1
  48. package/dist/types/primitives/chart/index.d.mts +9 -1
  49. package/dist/types/primitives/chart/index.d.ts +9 -1
  50. package/dist/types/primitives/venue-logo/index.d.mts +1 -1
  51. package/dist/types/primitives/venue-logo/index.d.ts +1 -1
  52. package/package.json +3 -3
@@ -27,7 +27,7 @@ import {
27
27
  marketDetailsDefaultIsOpened,
28
28
  orderBookRowLimitDefault,
29
29
  toDate
30
- } from "./chunk-3G7C6WEC.mjs";
30
+ } from "./chunk-XP7DREIX.mjs";
31
31
 
32
32
  // src/events/item/index.tsx
33
33
  import dayjs from "dayjs";
@@ -238,7 +238,6 @@ var EventListItemContent = ({
238
238
  event,
239
239
  title,
240
240
  image,
241
- showVenueLogo = true,
242
241
  maxOutcomes = 2,
243
242
  classNames,
244
243
  venueInfo,
@@ -274,7 +273,7 @@ var EventListItemContent = ({
274
273
  return;
275
274
  if ((eventToHandle == null ? void 0 : eventToHandle.key) === "Enter" || (eventToHandle == null ? void 0 : eventToHandle.key) === " ") {
276
275
  eventToHandle == null ? void 0 : eventToHandle.preventDefault();
277
- onClick();
276
+ onClick == null ? void 0 : onClick(event);
278
277
  }
279
278
  };
280
279
  const renderArbitrage = (value) => {
@@ -301,7 +300,7 @@ var EventListItemContent = ({
301
300
  className: cn(baseCardClassName, onClick && "cursor-pointer", classNames == null ? void 0 : classNames.root),
302
301
  role: onClick ? "button" : void 0,
303
302
  tabIndex: onClick ? 0 : void 0,
304
- onClick,
303
+ onClick: () => onClick == null ? void 0 : onClick(event),
305
304
  onKeyDown: handleKeyDown,
306
305
  "aria-label": ariaLabel != null ? ariaLabel : resolvedTitle,
307
306
  children: [
@@ -355,7 +354,7 @@ var EventListItemContent = ({
355
354
  Badge,
356
355
  {
357
356
  text: config.formatPercent(probability),
358
- prefix: showVenueLogo ? /* @__PURE__ */ jsx(VenueLogo, { venue: visibleOutcome.venue, size: "small" }) : void 0,
357
+ prefix: /* @__PURE__ */ jsx(VenueLogo, { venue: visibleOutcome.venue, size: "small" }),
359
358
  size: "large",
360
359
  classNames: {
361
360
  root: cn(
@@ -388,7 +387,7 @@ var EventListItemContent = ({
388
387
  ) }),
389
388
  /* @__PURE__ */ jsx("span", { className: "text-agg-muted-foreground", children: "\xD7" }),
390
389
  singleVenue ? /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 truncate text-agg-muted-foreground", children: [
391
- showVenueLogo ? /* @__PURE__ */ jsx(
390
+ /* @__PURE__ */ jsx(
392
391
  VenueLogo,
393
392
  {
394
393
  venue: singleVenue,
@@ -396,14 +395,14 @@ var EventListItemContent = ({
396
395
  isMonochromatic: true,
397
396
  className: "text-agg-muted-foreground!"
398
397
  }
399
- ) : null,
398
+ ),
400
399
  /* @__PURE__ */ jsx("span", { children: venueLabel })
401
400
  ] }) : /* @__PURE__ */ jsx("span", { className: "truncate text-agg-muted-foreground", children: formatCountLabel(
402
401
  venueCount,
403
402
  labels.eventItem.venueSingular,
404
403
  labels.eventItem.venuePlural
405
404
  ) }),
406
- showVenueLogo && !singleVenue && visibleVenueLogos.length > 0 ? /* @__PURE__ */ jsx("span", { className: "flex items-center gap-1 overflow-hidden", children: visibleVenueLogos.map((venue) => /* @__PURE__ */ jsx(
405
+ !singleVenue && visibleVenueLogos.length > 0 ? /* @__PURE__ */ jsx("span", { className: "flex items-center gap-1 overflow-hidden", children: visibleVenueLogos.map((venue) => /* @__PURE__ */ jsx(
407
406
  VenueLogo,
408
407
  {
409
408
  venue,
@@ -471,7 +470,13 @@ EventListItem.displayName = "EventListItem";
471
470
 
472
471
  // src/events/item-details/index.tsx
473
472
  import { useEffect, useMemo as useMemo3, useState } from "react";
474
- import { useLabels as useLabels3, usePriceHistory, useSdkUiConfig as useSdkUiConfig2, useVenueEvent as useVenueEvent2 } from "@agg-market/hooks";
473
+ import {
474
+ useLabels as useLabels3,
475
+ useMarketChart,
476
+ useSdkUiConfig as useSdkUiConfig2,
477
+ useVenueEvent as useVenueEvent2,
478
+ timeRangeToInterval
479
+ } from "@agg-market/hooks";
475
480
 
476
481
  // src/primitives/chart/chart-type-switch.tsx
477
482
  import { useLabels as useLabels2 } from "@agg-market/hooks";
@@ -534,7 +539,9 @@ var ChartTypeSwitch = ({
534
539
  "transition-colors duration-200 ease-in-out",
535
540
  isActive ? "text-agg-foreground" : "text-agg-muted-foreground"
536
541
  ),
537
- onClick: () => {
542
+ onClick: (e) => {
543
+ e.stopPropagation();
544
+ e.preventDefault();
538
545
  if (isActive) {
539
546
  return;
540
547
  }
@@ -563,14 +570,9 @@ var isDateLikeLabel = (value) => {
563
570
  return false;
564
571
  return dayjs2(value).isValid();
565
572
  };
566
- var formatDateLabel = (value) => {
567
- if (!isDateLikeLabel(value))
568
- return value;
569
- return dayjs2(value).format("MMM D, YYYY");
570
- };
571
- var getDefaultSelectedTimeRange = (value) => {
573
+ var getDefaultSelectedTimeRange = (value, fallback = "1D") => {
572
574
  if (!value)
573
- return "1M";
575
+ return fallback;
574
576
  return value;
575
577
  };
576
578
  var getTimeWindowByRange = (range) => {
@@ -652,24 +654,6 @@ var resolveOutcomesByVenue = (venueMarkets, selectedOutcomeLabel) => {
652
654
  };
653
655
  }).filter((item) => item != null);
654
656
  };
655
- var buildPriceHistoryGroups = (selectedOutcomes, fallbackMarketId) => {
656
- const marketIdByVenue = /* @__PURE__ */ new Map();
657
- selectedOutcomes.forEach(({ venue, market }) => {
658
- var _a, _b;
659
- const marketWithCanonicalId = market;
660
- const canonicalMarketId = (_a = marketWithCanonicalId.marketId) != null ? _a : fallbackMarketId;
661
- if (!canonicalMarketId)
662
- return;
663
- if (!marketIdByVenue.has(venue)) {
664
- marketIdByVenue.set(venue, /* @__PURE__ */ new Set());
665
- }
666
- (_b = marketIdByVenue.get(venue)) == null ? void 0 : _b.add(canonicalMarketId);
667
- });
668
- return [...marketIdByVenue.entries()].map(([venue, marketIds]) => ({
669
- venue,
670
- venueMarketOutcomeIds: [...marketIds]
671
- })).filter((group) => group.venueMarketOutcomeIds.length > 0);
672
- };
673
657
  var resolveSeriesColor = (venue, index) => {
674
658
  var _a;
675
659
  const colorFromVenue = lineColorByVenue[venue];
@@ -677,6 +661,98 @@ var resolveSeriesColor = (venue, index) => {
677
661
  return colorFromVenue;
678
662
  return (_a = fallbackLineColors[index % fallbackLineColors.length]) != null ? _a : "#2e5cff";
679
663
  };
664
+ var toNonEmptyString = (value) => {
665
+ if (typeof value !== "string")
666
+ return void 0;
667
+ const trimmedValue = value.trim();
668
+ return trimmedValue ? trimmedValue : void 0;
669
+ };
670
+ var resolveCanonicalMarketId = (venueMarkets, fallbackMarketId) => {
671
+ var _a;
672
+ const uniqueMarketIds = Array.from(
673
+ new Set(venueMarkets.map((market) => toNonEmptyString(market.marketId)).filter(Boolean))
674
+ );
675
+ if (uniqueMarketIds.length === 1) {
676
+ return uniqueMarketIds[0];
677
+ }
678
+ return (_a = toNonEmptyString(fallbackMarketId)) != null ? _a : uniqueMarketIds[0];
679
+ };
680
+ var toChartDisplayValue = (value, transformProbability) => {
681
+ if (value == null || !Number.isFinite(value))
682
+ return void 0;
683
+ return transformProbability(value) * 100;
684
+ };
685
+ var marketChartCandleToLineChartPoint = (candle, transformProbability) => {
686
+ var _a, _b, _c, _d;
687
+ const open = (_a = toChartDisplayValue(candle.open, transformProbability)) != null ? _a : 0;
688
+ const high = (_b = toChartDisplayValue(candle.high, transformProbability)) != null ? _b : open;
689
+ const low = (_c = toChartDisplayValue(candle.low, transformProbability)) != null ? _c : open;
690
+ const close = (_d = toChartDisplayValue(candle.close, transformProbability)) != null ? _d : open;
691
+ return {
692
+ time: candle.time,
693
+ value: close,
694
+ open,
695
+ high,
696
+ low,
697
+ close
698
+ };
699
+ };
700
+ var marketChartCandleToScaledCandlePoint = (candle, transformProbability) => {
701
+ var _a, _b, _c, _d;
702
+ const point = marketChartCandleToLineChartPoint(candle, transformProbability);
703
+ return {
704
+ time: point.time,
705
+ open: (_a = point.open) != null ? _a : point.value,
706
+ high: (_b = point.high) != null ? _b : point.value,
707
+ low: (_c = point.low) != null ? _c : point.value,
708
+ close: (_d = point.close) != null ? _d : point.value,
709
+ v: candle.volume
710
+ };
711
+ };
712
+ var resolveMarketChartVenueSeries = ({
713
+ chartData,
714
+ transformProbability
715
+ }) => {
716
+ if (!chartData)
717
+ return [];
718
+ return Object.entries(chartData.venues).map(([venue, venueData]) => ({
719
+ venue,
720
+ points: venueData.candles.map(
721
+ (candle) => marketChartCandleToLineChartPoint(candle, transformProbability)
722
+ )
723
+ })).filter((item) => item.points.length > 0);
724
+ };
725
+ var resolveMarketChartLiveState = ({
726
+ chartData,
727
+ selectedVenue,
728
+ transformProbability
729
+ }) => {
730
+ var _a, _b;
731
+ if (!chartData) {
732
+ return {
733
+ liveCandle: null,
734
+ lineValue: void 0,
735
+ live: false
736
+ };
737
+ }
738
+ const venueEntries = selectedVenue ? Object.entries(chartData.venues).filter(([venue]) => venue === selectedVenue) : Object.entries(chartData.venues);
739
+ if (venueEntries.length === 0) {
740
+ return {
741
+ liveCandle: null,
742
+ lineValue: void 0,
743
+ live: false
744
+ };
745
+ }
746
+ const singleVenueView = selectedVenue != null || venueEntries.length === 1;
747
+ const liveCandleEntry = singleVenueView ? venueEntries.find(([, venueData]) => venueData.liveCandle != null) : null;
748
+ const primaryLineValue = (_b = (_a = venueEntries[0]) == null ? void 0 : _a[1]) == null ? void 0 : _b.lineValue;
749
+ const lineValue = primaryLineValue != null ? toChartDisplayValue(primaryLineValue, transformProbability) : void 0;
750
+ return {
751
+ liveCandle: (liveCandleEntry == null ? void 0 : liveCandleEntry[1].liveCandle) ? marketChartCandleToScaledCandlePoint(liveCandleEntry[1].liveCandle, transformProbability) : null,
752
+ lineValue,
753
+ live: liveCandleEntry != null
754
+ };
755
+ };
680
756
 
681
757
  // src/events/item-details/index.tsx
682
758
  import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
@@ -741,31 +817,23 @@ var resolveAverageProbability = (values) => {
741
817
  return void 0;
742
818
  return validValues.reduce((sum, value) => sum + value, 0) / validValues.length;
743
819
  };
744
- var resolveOutcomeCandidateIds = (market, outcome) => {
745
- var _a, _b;
746
- const marketWithCanonicalId = market;
747
- return [
748
- outcome.id,
749
- (_a = outcome.externalIdentifier) != null ? _a : void 0,
750
- market.externalIdentifier,
751
- (_b = marketWithCanonicalId.marketId) != null ? _b : void 0
752
- ].filter((value) => typeof value === "string" && value.trim().length > 0);
753
- };
754
820
  var EventListItemDetailsGraphSection = ({
755
821
  venueMarkets,
756
- canonicalMarketId,
757
822
  selectedOutcomeLabel,
758
823
  onSelectedOutcomeLabelChange,
759
824
  switchLabels,
760
825
  isDateOutcomeMarket,
761
826
  classNames,
762
- showVenueLogo,
763
827
  venueInfo,
764
828
  formatPercent,
765
829
  selectedTimeRange,
766
- selectedChartType
830
+ selectedChartType,
831
+ selectedOutcome: _selectedOutcome,
832
+ selectedMarket
767
833
  }) => {
834
+ var _a, _b;
768
835
  const labels = useLabels3();
836
+ const { enableLiveUpdates } = useSdkUiConfig2();
769
837
  const [selectedVenue, setSelectedVenue] = useState(null);
770
838
  const [activeProbabilityMode, setActiveProbabilityMode] = useState("yes");
771
839
  const probabilityModeConfigs = useMemo3(() => {
@@ -834,105 +902,71 @@ var EventListItemDetailsGraphSection = ({
834
902
  no: buildModeData("no")
835
903
  };
836
904
  }, [labels, probabilityModeConfigs, selectedOutcomesByMode, venueInfo]);
837
- const allOutcomesForHistory = useMemo3(() => {
838
- const outcomeByModeAndId = /* @__PURE__ */ new Map();
839
- probabilityModeOrder.forEach((mode) => {
840
- selectedOutcomesByMode[mode].forEach((outcomeByVenue) => {
841
- outcomeByModeAndId.set(
842
- `${outcomeByVenue.venue}:${outcomeByVenue.outcome.id}`,
843
- outcomeByVenue
844
- );
845
- });
846
- });
847
- return [...outcomeByModeAndId.values()];
848
- }, [selectedOutcomesByMode]);
849
- const priceHistoryGroups = useMemo3(() => {
850
- return buildPriceHistoryGroups(allOutcomesForHistory, canonicalMarketId);
851
- }, [allOutcomesForHistory, canonicalMarketId]);
852
905
  const timeWindow = useMemo3(() => {
853
906
  return getTimeWindowByRange(selectedTimeRange);
854
907
  }, [selectedTimeRange]);
908
+ const activeOutcomes = selectedOutcomesByMode[activeProbabilityMode];
909
+ const activeCanonicalMarketId = useMemo3(() => {
910
+ return resolveCanonicalMarketId(activeOutcomes.map((item) => item.market));
911
+ }, [activeOutcomes]);
912
+ const venueMarketIds = useMemo3(() => {
913
+ return activeOutcomes.map((item) => item.market.id);
914
+ }, [activeOutcomes]);
855
915
  const {
856
- data: priceHistoryData,
857
- isLoading: isPriceHistoryLoading,
858
- error: priceHistoryError,
859
- results: priceHistoryResults
860
- } = usePriceHistory(__spreadProps(__spreadValues({
861
- groups: priceHistoryGroups
862
- }, timeWindow), {
863
- enabled: priceHistoryGroups.length > 0
864
- }));
865
- const priceHistoryByVenue = useMemo3(() => {
866
- const historyByVenue = /* @__PURE__ */ new Map();
867
- if (!(priceHistoryData == null ? void 0 : priceHistoryData.length)) {
868
- return historyByVenue;
869
- }
870
- priceHistoryData.forEach((historyItem) => {
871
- const venue = historyItem.venue;
872
- const venueHistory = historyByVenue.get(venue);
873
- if (venueHistory) {
874
- venueHistory.push(historyItem);
875
- return;
876
- }
877
- historyByVenue.set(venue, [historyItem]);
878
- });
879
- return historyByVenue;
880
- }, [priceHistoryData]);
881
- const chartSeriesByMode = useMemo3(() => {
882
- const buildSeries = (mode) => {
883
- const modeConfig = probabilityModeConfigs[mode];
884
- const chartSeries = [];
885
- normalizedVenueDataByMode[mode].forEach((venueData) => {
886
- var _a;
887
- const venueHistory = priceHistoryByVenue.get(venueData.venue);
888
- if (!(venueHistory == null ? void 0 : venueHistory.length))
889
- return;
890
- const candidateIds = resolveOutcomeCandidateIds(venueData.market, venueData.outcome);
891
- const matchingHistory = (_a = venueHistory.find((historyItem) => candidateIds.includes(historyItem.marketId))) != null ? _a : venueHistory.length === 1 ? venueHistory[0] : void 0;
892
- if (!matchingHistory)
893
- return;
894
- const points = matchingHistory.points.map((point) => {
895
- const probability = normalizeProbability(point.price);
896
- if (probability == null || !Number.isFinite(point.timestamp))
897
- return null;
898
- const open = normalizeProbability(point.open);
899
- const high = normalizeProbability(point.high);
900
- const low = normalizeProbability(point.low);
901
- const close = normalizeProbability(point.close);
902
- const transformedPoint = {
903
- time: point.timestamp,
904
- value: clampProbability(modeConfig.transformProbability(probability)) * 100,
905
- open: open == null ? void 0 : clampProbability(modeConfig.transformProbability(open)) * 100,
906
- high: high == null ? void 0 : clampProbability(modeConfig.transformProbability(high)) * 100,
907
- low: low == null ? void 0 : clampProbability(modeConfig.transformProbability(low)) * 100,
908
- close: close == null ? void 0 : clampProbability(modeConfig.transformProbability(close)) * 100
909
- };
910
- return transformedPoint;
911
- }).filter((point) => point != null);
912
- if (points.length === 0)
913
- return;
914
- chartSeries.push({
915
- id: `${mode}-${venueData.venue}-${matchingHistory.marketId}`,
916
- venue: venueData.venue,
917
- color: venueData.color,
918
- points,
919
- lineWidth: 2,
920
- lineStyle: "solid"
921
- });
922
- });
923
- return chartSeries;
924
- };
925
- return {
926
- yes: buildSeries("yes"),
927
- no: buildSeries("no")
928
- };
929
- }, [normalizedVenueDataByMode, priceHistoryByVenue, probabilityModeConfigs]);
916
+ data: marketChartData,
917
+ isLoading: isMarketChartLoading,
918
+ error: marketChartError,
919
+ refetch: refetchMarketChart
920
+ } = useMarketChart({
921
+ marketId: (_a = selectedMarket == null ? void 0 : selectedMarket.id) != null ? _a : null,
922
+ venueMarketIds,
923
+ interval: timeRangeToInterval(selectedTimeRange),
924
+ startTs: timeWindow.startTs * 1e3,
925
+ endTs: timeWindow.endTs * 1e3,
926
+ enabled: !!(selectedMarket == null ? void 0 : selectedMarket.id),
927
+ live: enableLiveUpdates
928
+ });
930
929
  const visibleChartSeries = useMemo3(() => {
931
- const modeSeries = chartSeriesByMode[activeProbabilityMode];
930
+ const transformProbability = probabilityModeConfigs[activeProbabilityMode].transformProbability;
931
+ const colorByVenue = new Map(
932
+ normalizedVenueDataByMode[activeProbabilityMode].map((venueData) => [
933
+ venueData.venue,
934
+ venueData.color
935
+ ])
936
+ );
937
+ const series = resolveMarketChartVenueSeries({
938
+ chartData: marketChartData,
939
+ transformProbability
940
+ }).map((seriesItem) => {
941
+ var _a2;
942
+ const resolvedVenue = seriesItem.venue;
943
+ return {
944
+ id: `${activeProbabilityMode}-${resolvedVenue}-${activeCanonicalMarketId != null ? activeCanonicalMarketId : "chart"}`,
945
+ venue: resolvedVenue,
946
+ color: (_a2 = colorByVenue.get(resolvedVenue)) != null ? _a2 : resolveSeriesColor(resolvedVenue, 0),
947
+ points: seriesItem.points,
948
+ lineWidth: 2,
949
+ lineStyle: "solid"
950
+ };
951
+ });
932
952
  if (!selectedVenue)
933
- return modeSeries;
934
- return modeSeries.filter((seriesItem) => seriesItem.venue === selectedVenue);
935
- }, [activeProbabilityMode, chartSeriesByMode, selectedVenue]);
953
+ return series;
954
+ return series.filter((seriesItem) => seriesItem.venue === selectedVenue);
955
+ }, [
956
+ activeCanonicalMarketId,
957
+ activeProbabilityMode,
958
+ marketChartData,
959
+ normalizedVenueDataByMode,
960
+ probabilityModeConfigs,
961
+ selectedVenue
962
+ ]);
963
+ const chartLiveState = useMemo3(() => {
964
+ return resolveMarketChartLiveState({
965
+ chartData: marketChartData,
966
+ selectedVenue,
967
+ transformProbability: probabilityModeConfigs[activeProbabilityMode].transformProbability
968
+ });
969
+ }, [activeProbabilityMode, marketChartData, probabilityModeConfigs, selectedVenue]);
936
970
  const segmentedDisplayItems = useMemo3(() => {
937
971
  return probabilityModeOrder.map((mode) => {
938
972
  const averageProbability = resolveAverageProbability(
@@ -970,31 +1004,22 @@ var EventListItemDetailsGraphSection = ({
970
1004
  return venue;
971
1005
  });
972
1006
  };
973
- const handleRetryPriceHistory = () => {
974
- void Promise.all(priceHistoryResults.map((result) => result.refetch()));
1007
+ const handleRetryMarketChart = () => {
1008
+ void refetchMarketChart();
975
1009
  };
976
- if (priceHistoryError) {
977
- return /* @__PURE__ */ jsx3(
978
- "div",
1010
+ if (marketChartError) {
1011
+ return /* @__PURE__ */ jsx3("div", { className: cn("w-full", classNames == null ? void 0 : classNames.chart), children: /* @__PURE__ */ jsx3(
1012
+ StateMessage,
979
1013
  {
980
- className: cn(
981
- "w-full rounded-agg-xl border border-agg-separator bg-agg-secondary",
982
- classNames == null ? void 0 : classNames.chart
983
- ),
984
- children: /* @__PURE__ */ jsx3(
985
- StateMessage,
986
- {
987
- ariaLabel: labels.eventItemDetails.chartUnavailableAria,
988
- tone: "warning",
989
- title: labels.eventItemDetails.chartUnavailableTitle,
990
- description: labels.eventItemDetails.chartUnavailableDescription,
991
- actionLabel: labels.common.retry,
992
- onAction: handleRetryPriceHistory,
993
- className: "min-h-[300px] px-5 py-10 md:px-10"
994
- }
995
- )
1014
+ tone: "warning",
1015
+ ariaLabel: labels.eventItemDetails.chartUnavailableAria,
1016
+ title: labels.eventItemDetails.chartUnavailableTitle,
1017
+ description: labels.eventItemDetails.chartUnavailableDescription,
1018
+ actionLabel: labels.common.retry,
1019
+ onAction: handleRetryMarketChart,
1020
+ className: "min-h-[300px] px-5 py-10 md:px-10"
996
1021
  }
997
- );
1022
+ ) });
998
1023
  }
999
1024
  return /* @__PURE__ */ jsx3(
1000
1025
  LineChart,
@@ -1002,8 +1027,10 @@ var EventListItemDetailsGraphSection = ({
1002
1027
  classNames: { root: classNames == null ? void 0 : classNames.chart },
1003
1028
  series: visibleChartSeries,
1004
1029
  height: 300,
1005
- isLoading: isPriceHistoryLoading,
1030
+ isLoading: isMarketChartLoading,
1006
1031
  chartType: selectedChartType,
1032
+ liveCandle: selectedChartType === "candlestick" ? (_b = chartLiveState.liveCandle) != null ? _b : void 0 : void 0,
1033
+ lineValue: chartLiveState.lineValue,
1007
1034
  showSeriesControls: activeModeVenueData.length > 0 || segmentedDisplayItems.length > 0,
1008
1035
  renderSeriesControls: () => {
1009
1036
  return /* @__PURE__ */ jsxs2(
@@ -1019,7 +1046,7 @@ var EventListItemDetailsGraphSection = ({
1019
1046
  classNames == null ? void 0 : classNames.outcomeBadges
1020
1047
  ),
1021
1048
  children: activeModeVenueData.map((venueData) => {
1022
- var _a;
1049
+ var _a2;
1023
1050
  const text = venueData.probability == null ? "-" : formatPercent(venueData.probability);
1024
1051
  const isActiveVenue = selectedVenue === venueData.venue;
1025
1052
  return /* @__PURE__ */ jsx3(
@@ -1036,14 +1063,14 @@ var EventListItemDetailsGraphSection = ({
1036
1063
  {
1037
1064
  text,
1038
1065
  size: "large",
1039
- prefix: showVenueLogo ? /* @__PURE__ */ jsx3(
1066
+ prefix: /* @__PURE__ */ jsx3(
1040
1067
  VenueLogo,
1041
1068
  {
1042
1069
  venue: venueData.venue,
1043
1070
  size: "small",
1044
- title: (_a = venueInfo == null ? void 0 : venueInfo[venueData.venue]) == null ? void 0 : _a.label
1071
+ title: (_a2 = venueInfo == null ? void 0 : venueInfo[venueData.venue]) == null ? void 0 : _a2.label
1045
1072
  }
1046
- ) : void 0,
1073
+ ),
1047
1074
  classNames: {
1048
1075
  root: cn("h-9 shrink-0 border-2 px-4 text-agg-base leading-agg-6")
1049
1076
  },
@@ -1084,45 +1111,55 @@ var EventListItemDetailsGraphSection = ({
1084
1111
  };
1085
1112
  var EventListItemDetailsContent = ({
1086
1113
  event,
1087
- title,
1088
- image,
1089
- showVenueLogo = true,
1090
1114
  classNames,
1091
1115
  venueInfo,
1092
1116
  detailsStats,
1093
1117
  ariaLabel,
1094
- defaultTimeRange
1118
+ defaultTimeRange,
1119
+ onClick
1095
1120
  }) => {
1121
+ var _a;
1096
1122
  const config = useSdkUiConfig2();
1097
1123
  const labels = useLabels3();
1098
1124
  const venueMarkets = useMemo3(() => {
1099
- var _a;
1100
- return (_a = event.venueMarkets) != null ? _a : [];
1125
+ var _a2;
1126
+ return (_a2 = event.venueMarkets) != null ? _a2 : [];
1101
1127
  }, [event.venueMarkets]);
1128
+ const [selectedMarket, setSelectedMarket] = useState(venueMarkets[0]);
1129
+ const [selectedOutcome] = useState(
1130
+ (_a = selectedMarket == null ? void 0 : selectedMarket.venueMarketOutcomes.find(
1131
+ (outcome) => outcome.winner
1132
+ )) != null ? _a : selectedMarket == null ? void 0 : selectedMarket.venueMarketOutcomes[0]
1133
+ );
1102
1134
  const primaryVenueMarket = useMemo3(() => {
1103
1135
  return selectPrimaryVenueMarket(venueMarkets);
1104
1136
  }, [venueMarkets]);
1137
+ const filteredVenueMarkets = useMemo3(() => {
1138
+ if (!selectedMarket)
1139
+ return venueMarkets;
1140
+ return venueMarkets.filter(
1141
+ (vm) => vm.question === (selectedMarket == null ? void 0 : selectedMarket.question)
1142
+ );
1143
+ }, [venueMarkets, selectedMarket]);
1105
1144
  const outcomeLabels = useMemo3(() => {
1106
- return resolveOutcomeLabels(venueMarkets);
1107
- }, [venueMarkets]);
1145
+ return resolveOutcomeLabels(filteredVenueMarkets);
1146
+ }, [filteredVenueMarkets]);
1108
1147
  const [selectedOutcomeLabel, setSelectedOutcomeLabel] = useState(() => {
1109
1148
  return resolveDefaultOutcomeLabel(outcomeLabels);
1110
1149
  });
1150
+ const configTimeRange = config.defaultChartTimeRange;
1111
1151
  const [selectedTimeRange, setSelectedTimeRange] = useState(() => {
1112
- return getDefaultSelectedTimeRange(defaultTimeRange);
1152
+ return getDefaultSelectedTimeRange(defaultTimeRange, configTimeRange);
1113
1153
  });
1114
1154
  const [selectedChartType, setSelectedChartType] = useState("line");
1115
1155
  useEffect(() => {
1116
- setSelectedTimeRange(getDefaultSelectedTimeRange(defaultTimeRange));
1117
- }, [defaultTimeRange]);
1118
- const resolvedTitle = resolveTileTitle(event, primaryVenueMarket, title);
1119
- const resolvedImage = resolveTileImage(event, primaryVenueMarket, image);
1156
+ setSelectedTimeRange(getDefaultSelectedTimeRange(defaultTimeRange, configTimeRange));
1157
+ }, [defaultTimeRange, configTimeRange]);
1120
1158
  const isDateOutcomeMarket = outcomeLabels.length > 2 && outcomeLabels.every(isDateLikeLabel);
1121
- const outcomeSelectorLabels = outcomeLabels;
1122
1159
  const probabilityByLabel = useMemo3(() => {
1123
1160
  return new Map(
1124
1161
  outcomeLabels.map((label) => {
1125
- const outcomesByVenue = resolveOutcomesByVenue(venueMarkets, label);
1162
+ const outcomesByVenue = resolveOutcomesByVenue(filteredVenueMarkets, label);
1126
1163
  const probabilities = outcomesByVenue.map((item) => normalizeProbability(item.outcome.price)).filter((value) => value != null);
1127
1164
  if (probabilities.length === 0) {
1128
1165
  return [label, void 0];
@@ -1131,13 +1168,13 @@ var EventListItemDetailsContent = ({
1131
1168
  return [label, averageProbability];
1132
1169
  })
1133
1170
  );
1134
- }, [outcomeLabels, venueMarkets]);
1171
+ }, [outcomeLabels, filteredVenueMarkets]);
1135
1172
  const mainOutcomeLabel = useMemo3(() => {
1136
1173
  if (outcomeLabels.length === 0)
1137
1174
  return void 0;
1138
1175
  return [...outcomeLabels].sort((left, right) => {
1139
- var _a, _b;
1140
- const leftProbability = (_a = probabilityByLabel.get(left)) != null ? _a : -1;
1176
+ var _a2, _b;
1177
+ const leftProbability = (_a2 = probabilityByLabel.get(left)) != null ? _a2 : -1;
1141
1178
  const rightProbability = (_b = probabilityByLabel.get(right)) != null ? _b : -1;
1142
1179
  return rightProbability - leftProbability;
1143
1180
  })[0];
@@ -1154,17 +1191,17 @@ var EventListItemDetailsContent = ({
1154
1191
  setSelectedOutcomeLabel(fallbackOutcomeLabel);
1155
1192
  }, [isDateOutcomeMarket, mainOutcomeLabel, outcomeLabels, selectedOutcomeLabel]);
1156
1193
  const switchLabels = useMemo3(() => {
1157
- var _a, _b;
1194
+ var _a2, _b;
1158
1195
  if (isDateOutcomeMarket) {
1159
1196
  return [labels.eventItemDetails.yes, labels.eventItemDetails.no];
1160
1197
  }
1161
1198
  const sortedOutcomeLabels = [...outcomeLabels].sort((left, right) => {
1162
- var _a2, _b2;
1163
- const leftProbability = (_a2 = probabilityByLabel.get(left)) != null ? _a2 : -1;
1199
+ var _a3, _b2;
1200
+ const leftProbability = (_a3 = probabilityByLabel.get(left)) != null ? _a3 : -1;
1164
1201
  const rightProbability = (_b2 = probabilityByLabel.get(right)) != null ? _b2 : -1;
1165
1202
  return rightProbability - leftProbability;
1166
1203
  });
1167
- const firstLabel = (_a = sortedOutcomeLabels[0]) != null ? _a : labels.eventItemDetails.yes;
1204
+ const firstLabel = (_a2 = sortedOutcomeLabels[0]) != null ? _a2 : labels.eventItemDetails.yes;
1168
1205
  const secondLabel = (_b = sortedOutcomeLabels.find((label) => label !== firstLabel)) != null ? _b : firstLabel;
1169
1206
  return [firstLabel, secondLabel];
1170
1207
  }, [
@@ -1175,34 +1212,44 @@ var EventListItemDetailsContent = ({
1175
1212
  probabilityByLabel
1176
1213
  ]);
1177
1214
  const volumeLabel = useMemo3(() => {
1178
- var _a;
1179
- const resolvedVolume = typeof event.volume === "number" ? event.volume : (_a = primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume) != null ? _a : void 0;
1215
+ var _a2;
1216
+ const resolvedVolume = typeof event.volume === "number" ? event.volume : (_a2 = primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume) != null ? _a2 : void 0;
1180
1217
  if (typeof resolvedVolume !== "number")
1181
1218
  return "";
1182
1219
  return `${config.formatCompactCurrency(resolvedVolume)} ${labels.eventItemDetails.volumeSuffix}`;
1183
1220
  }, [config, event.volume, labels.eventItemDetails.volumeSuffix, primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume]);
1184
1221
  if (!primaryVenueMarket || !selectedOutcomeLabel) {
1185
- return /* @__PURE__ */ jsx3(EventListItemDetailsUnavailableState, { classNames, ariaLabel });
1222
+ return /* @__PURE__ */ jsx3(
1223
+ EventListItemDetailsUnavailableState,
1224
+ {
1225
+ classNames,
1226
+ ariaLabel: ariaLabel != null ? ariaLabel : event.title
1227
+ }
1228
+ );
1186
1229
  }
1187
1230
  return /* @__PURE__ */ jsxs2(
1188
1231
  Card,
1189
1232
  {
1190
1233
  className: cn(detailsBaseCardClassName, classNames == null ? void 0 : classNames.root),
1191
- "aria-label": ariaLabel != null ? ariaLabel : resolvedTitle,
1234
+ "aria-label": ariaLabel != null ? ariaLabel : event.title,
1235
+ onClick: () => {
1236
+ onClick == null ? void 0 : onClick(event);
1237
+ },
1192
1238
  children: [
1193
1239
  /* @__PURE__ */ jsxs2(
1194
1240
  "div",
1195
1241
  {
1196
1242
  className: cn(
1197
1243
  "flex flex-row gap-3 md:gap-4",
1198
- "items-center justify-start",
1244
+ venueMarkets.length > 1 ? "items-start" : "items-center",
1245
+ "justify-start",
1199
1246
  classNames == null ? void 0 : classNames.header
1200
1247
  ),
1201
1248
  children: [
1202
- resolvedImage ? /* @__PURE__ */ jsx3(
1249
+ event.image ? /* @__PURE__ */ jsx3(
1203
1250
  RemoteImage,
1204
1251
  {
1205
- src: resolvedImage,
1252
+ src: event.image,
1206
1253
  alt: "",
1207
1254
  className: "size-10 rounded-agg-lg object-cover md:size-[60px]"
1208
1255
  }
@@ -1217,19 +1264,18 @@ var EventListItemDetailsContent = ({
1217
1264
  "truncate text-wrap wrap-break-word line-clamp-2",
1218
1265
  classNames == null ? void 0 : classNames.title
1219
1266
  ),
1220
- children: resolvedTitle
1267
+ children: event.title
1221
1268
  }
1222
1269
  ),
1223
- outcomeSelectorLabels.length > 2 ? /* @__PURE__ */ jsx3(
1270
+ venueMarkets.length > 1 ? /* @__PURE__ */ jsx3(
1224
1271
  "div",
1225
1272
  {
1226
1273
  className: cn(
1227
- "flex items-center gap-2 overflow-x-auto pb-1 md:flex-wrap md:overflow-visible md:pb-0",
1274
+ "flex flex-row flex-nowrap items-center gap-2 overflow-x-auto pb-1 md:pb-0",
1228
1275
  classNames == null ? void 0 : classNames.headerPills
1229
1276
  ),
1230
- children: outcomeSelectorLabels.map((outcomeSelectorLabel) => {
1231
- const isActive = outcomeSelectorLabel === selectedOutcomeLabel;
1232
- const displayLabel = isDateLikeLabel(outcomeSelectorLabel) ? formatDateLabel(outcomeSelectorLabel) : outcomeSelectorLabel;
1277
+ children: venueMarkets.map((venueMarket) => {
1278
+ const isActive = (selectedMarket == null ? void 0 : selectedMarket.id) === venueMarket.id;
1233
1279
  return /* @__PURE__ */ jsx3(
1234
1280
  Button,
1235
1281
  {
@@ -1241,10 +1287,14 @@ var EventListItemDetailsContent = ({
1241
1287
  "border-2",
1242
1288
  isActive ? "border-agg-primary bg-agg-secondary text-agg-foreground font-agg-bold" : "border-transparent bg-agg-secondary-hover text-agg-foreground font-agg-normal"
1243
1289
  ),
1244
- onClick: () => setSelectedOutcomeLabel(outcomeSelectorLabel),
1245
- children: displayLabel
1290
+ onClick: (e) => {
1291
+ e.stopPropagation();
1292
+ e.preventDefault();
1293
+ setSelectedMarket(venueMarket);
1294
+ },
1295
+ children: venueMarket.question
1246
1296
  },
1247
- outcomeSelectorLabel
1297
+ venueMarket.id
1248
1298
  );
1249
1299
  })
1250
1300
  }
@@ -1273,14 +1323,14 @@ var EventListItemDetailsContent = ({
1273
1323
  /* @__PURE__ */ jsx3(
1274
1324
  EventListItemDetailsGraphSection,
1275
1325
  {
1276
- venueMarkets,
1277
- canonicalMarketId: event.id,
1326
+ selectedOutcome,
1327
+ selectedMarket,
1328
+ venueMarkets: filteredVenueMarkets,
1278
1329
  selectedOutcomeLabel,
1279
1330
  onSelectedOutcomeLabelChange: setSelectedOutcomeLabel,
1280
1331
  switchLabels,
1281
1332
  isDateOutcomeMarket,
1282
1333
  classNames,
1283
- showVenueLogo,
1284
1334
  venueInfo,
1285
1335
  formatPercent: config.formatPercent,
1286
1336
  selectedTimeRange,
@@ -1306,7 +1356,11 @@ var EventListItemDetailsContent = ({
1306
1356
  isActive ? "font-agg-bold! text-agg-foreground!" : "font-agg-normal! text-agg-muted-foreground!"
1307
1357
  ),
1308
1358
  "aria-pressed": isActive,
1309
- onClick: () => setSelectedTimeRange(timeRange),
1359
+ onClick: (e) => {
1360
+ e.stopPropagation();
1361
+ e.preventDefault();
1362
+ setSelectedTimeRange(timeRange);
1363
+ },
1310
1364
  children: timeRange === "ALL" ? labels.eventItemDetails.allTimeRange : timeRange
1311
1365
  },
1312
1366
  timeRange
@@ -1324,19 +1378,20 @@ var EventListItemDetailsByEventId = (_a) => {
1324
1378
  } = _b, rest = __objRest(_b, [
1325
1379
  "eventId"
1326
1380
  ]);
1381
+ const resolvedEventId = eventId != null ? eventId : "";
1327
1382
  const {
1328
1383
  event: fetchedEvent,
1329
1384
  error,
1330
1385
  isError,
1331
1386
  isLoading
1332
1387
  } = useVenueEvent2({
1333
- eventId: eventId != null ? eventId : "",
1334
- enabled: !!eventId
1388
+ eventId: resolvedEventId,
1389
+ enabled: !!resolvedEventId
1335
1390
  });
1336
1391
  const resolvedEvent = useMemo3(() => {
1337
1392
  return resolveEventListItemEvent(fetchedEvent);
1338
1393
  }, [fetchedEvent]);
1339
- if (!eventId) {
1394
+ if (!resolvedEventId) {
1340
1395
  return /* @__PURE__ */ jsx3(
1341
1396
  EventListItemDetailsUnavailableState,
1342
1397
  {
@@ -1375,26 +1430,22 @@ var EventListItemDetails = (props) => {
1375
1430
  }
1376
1431
  if ("eventId" in props && typeof props.eventId === "string") {
1377
1432
  const {
1378
- title: titleOverride,
1379
- image: imageOverride,
1380
- showVenueLogo: showVenueLogoOverride,
1381
1433
  classNames,
1382
1434
  venueInfo,
1383
1435
  detailsStats,
1384
1436
  ariaLabel: ariaLabelOverride,
1385
- defaultTimeRange: defaultTimeRangeOverride
1437
+ defaultTimeRange: defaultTimeRangeOverride,
1438
+ onClick
1386
1439
  } = props;
1387
1440
  const byEventIdProps = {
1388
1441
  eventId: props.eventId,
1389
1442
  isLoading: false,
1390
- title: titleOverride,
1391
- image: imageOverride,
1392
- showVenueLogo: showVenueLogoOverride,
1393
1443
  classNames,
1394
1444
  venueInfo,
1395
1445
  detailsStats,
1396
1446
  ariaLabel: ariaLabelOverride,
1397
- defaultTimeRange: defaultTimeRangeOverride
1447
+ defaultTimeRange: defaultTimeRangeOverride,
1448
+ onClick
1398
1449
  };
1399
1450
  return /* @__PURE__ */ jsx3(EventListItemDetailsByEventId, __spreadValues({}, byEventIdProps));
1400
1451
  }
@@ -1412,10 +1463,11 @@ EventListItemDetails.displayName = "EventListItemDetails";
1412
1463
  import { useEffect as useEffect2, useId, useMemo as useMemo4, useState as useState2 } from "react";
1413
1464
  import {
1414
1465
  useLabels as useLabels4,
1415
- useOrderBook,
1416
- usePriceHistory as usePriceHistory2,
1466
+ useMarketChart as useMarketChart2,
1467
+ useMarketOrderbook,
1468
+ useVenueMarkets,
1417
1469
  useSdkUiConfig as useSdkUiConfig3,
1418
- useVenueEvent as useVenueEvent3
1470
+ timeRangeToInterval as timeRangeToInterval2
1419
1471
  } from "@agg-market/hooks";
1420
1472
 
1421
1473
  // src/events/market-details/market-details.utils.ts
@@ -1447,24 +1499,29 @@ var resolveInitialTab = (defaultTab) => {
1447
1499
  return parsedTab.data;
1448
1500
  return "order-book";
1449
1501
  };
1450
- var resolveMarket = (event, marketId) => {
1451
- var _a, _b, _c, _d, _e;
1452
- if (!event.venueMarkets || event.venueMarkets.length === 0)
1502
+ var resolveMarketFromVenueMarkets = (venueMarkets, marketId) => {
1503
+ var _a, _b;
1504
+ if (!venueMarkets || venueMarkets.length === 0)
1453
1505
  return void 0;
1454
1506
  if (!marketId) {
1507
+ const primary = selectPrimaryVenueMarket(venueMarkets);
1508
+ const totalVolume2 = venueMarkets.reduce((sum, vm) => {
1509
+ return sum + (typeof vm.volume === "number" ? vm.volume : 0);
1510
+ }, 0);
1455
1511
  return {
1456
- id: event.id,
1457
- venueMarkets: event.venueMarkets,
1458
- volume: event.volume,
1459
- status: event.status,
1460
- startDate: event.startDate,
1461
- endDate: event.endDate,
1462
- creationDate: event.creationDate,
1463
- question: event.title
1512
+ id: (_a = primary == null ? void 0 : primary.id) != null ? _a : venueMarkets[0].id,
1513
+ venueMarkets,
1514
+ volume: totalVolume2 || (primary == null ? void 0 : primary.volume),
1515
+ status: primary == null ? void 0 : primary.status,
1516
+ startDate: primary == null ? void 0 : primary.startDate,
1517
+ endDate: primary == null ? void 0 : primary.endDate,
1518
+ creationDate: primary == null ? void 0 : primary.creationDate,
1519
+ question: (_b = primary == null ? void 0 : primary.question) != null ? _b : venueMarkets[0].question
1464
1520
  };
1465
1521
  }
1466
- const venueMarkets = event.venueMarkets;
1467
- const matchedVenueMarket = venueMarkets.find((vm) => vm.id === marketId);
1522
+ const matchedVenueMarket = venueMarkets.find(
1523
+ (vm) => vm.id === marketId || vm.externalIdentifier === marketId
1524
+ );
1468
1525
  if (!matchedVenueMarket)
1469
1526
  return void 0;
1470
1527
  const siblingVenueMarkets = venueMarkets.filter(
@@ -1477,11 +1534,11 @@ var resolveMarket = (event, marketId) => {
1477
1534
  id: matchedVenueMarket.id,
1478
1535
  venueMarkets: siblingVenueMarkets,
1479
1536
  volume: totalVolume || matchedVenueMarket.volume,
1480
- status: (_a = matchedVenueMarket.status) != null ? _a : event.status,
1481
- startDate: (_b = matchedVenueMarket.startDate) != null ? _b : event.startDate,
1482
- endDate: (_c = matchedVenueMarket.endDate) != null ? _c : event.endDate,
1483
- creationDate: (_d = matchedVenueMarket.creationDate) != null ? _d : event.creationDate,
1484
- question: (_e = matchedVenueMarket.question) != null ? _e : event.title
1537
+ status: matchedVenueMarket.status,
1538
+ startDate: matchedVenueMarket.startDate,
1539
+ endDate: matchedVenueMarket.endDate,
1540
+ creationDate: matchedVenueMarket.creationDate,
1541
+ question: matchedVenueMarket.question
1485
1542
  };
1486
1543
  };
1487
1544
  var resolveDisplayOutcomeLabels = (labels) => {
@@ -1550,7 +1607,8 @@ var resolveHeaderOutcomeItems = (venueMarkets, defaultOutcomeLabel) => {
1550
1607
  label,
1551
1608
  probability: probabilityByLabel.get(label),
1552
1609
  tone: resolveOutcomeTone(label, index),
1553
- isDefault: normalizeLabel2(label) === normalizeLabel2((_a = defaultOutcomeLabel != null ? defaultOutcomeLabel : labels[0]) != null ? _a : "")
1610
+ isDefault: normalizeLabel2(label) === normalizeLabel2((_a = defaultOutcomeLabel != null ? defaultOutcomeLabel : labels[0]) != null ? _a : ""),
1611
+ venue: venueMarkets[0].venue
1554
1612
  };
1555
1613
  });
1556
1614
  };
@@ -1641,23 +1699,23 @@ var resolveOtherTabRows = (market, labels) => {
1641
1699
  return rows;
1642
1700
  };
1643
1701
  var buildMarketDetailsModel = ({
1644
- event,
1702
+ venueMarkets,
1645
1703
  marketId,
1646
1704
  title,
1647
1705
  image,
1648
1706
  formatCompactCurrency,
1649
1707
  labels
1650
1708
  }) => {
1651
- var _a;
1652
- const market = resolveMarket(event, marketId);
1709
+ var _a, _b;
1710
+ const market = resolveMarketFromVenueMarkets(venueMarkets, marketId);
1653
1711
  if (!market)
1654
1712
  return void 0;
1655
1713
  const primaryVenueMarket = selectPrimaryVenueMarket(market.venueMarkets);
1656
1714
  if (!primaryVenueMarket)
1657
1715
  return void 0;
1658
- const resolvedTitle = resolveTileTitle(event, primaryVenueMarket, title);
1659
- const resolvedImage = resolveTileImage(event, primaryVenueMarket, image);
1660
- const resolvedVolume = typeof market.volume === "number" ? market.volume : (_a = primaryVenueMarket.volume) != null ? _a : void 0;
1716
+ const resolvedTitle = (title == null ? void 0 : title.trim()) || primaryVenueMarket.question || market.question;
1717
+ const resolvedImage = (_a = typeof image === "string" && image.trim() ? image : void 0) != null ? _a : typeof primaryVenueMarket.image === "string" && primaryVenueMarket.image.trim() ? primaryVenueMarket.image : void 0;
1718
+ const resolvedVolume = typeof market.volume === "number" ? market.volume : (_b = primaryVenueMarket.volume) != null ? _b : void 0;
1661
1719
  const subtitle = resolveSubtitle({
1662
1720
  venueMarkets: market.venueMarkets,
1663
1721
  volume: resolvedVolume,
@@ -1803,7 +1861,7 @@ var getOutcomeButtonClassName = ({
1803
1861
  );
1804
1862
  };
1805
1863
  var MarketDetailsContent = ({
1806
- event,
1864
+ venueMarkets,
1807
1865
  marketId,
1808
1866
  title,
1809
1867
  image,
@@ -1811,29 +1869,29 @@ var MarketDetailsContent = ({
1811
1869
  onOpenChange,
1812
1870
  defaultTab,
1813
1871
  defaultOutcomeLabel,
1814
- defaultTimeRange = "1M",
1872
+ defaultTimeRange,
1815
1873
  orderBookDepth = orderBookRowLimitDefault,
1816
1874
  ariaLabel,
1817
1875
  classNames,
1818
- otherContent,
1819
- liveUpdate = false
1876
+ otherContent
1820
1877
  }) => {
1878
+ var _a, _b, _c, _d;
1821
1879
  const config = useSdkUiConfig3();
1822
1880
  const labels = useLabels4();
1823
1881
  const detailsContentId = useId();
1824
1882
  const model = useMemo4(() => {
1825
1883
  return buildMarketDetailsModel({
1826
- event,
1884
+ venueMarkets,
1827
1885
  marketId,
1828
1886
  title,
1829
1887
  image,
1830
1888
  formatCompactCurrency: config.formatCompactCurrency,
1831
1889
  labels
1832
1890
  });
1833
- }, [config.formatCompactCurrency, event, image, labels, marketId, title]);
1891
+ }, [config.formatCompactCurrency, venueMarkets, image, labels, marketId, title]);
1834
1892
  const resolvedMarket = useMemo4(() => {
1835
- return resolveMarket(event, marketId);
1836
- }, [event, marketId]);
1893
+ return resolveMarketFromVenueMarkets(venueMarkets, marketId);
1894
+ }, [venueMarkets, marketId]);
1837
1895
  const marketDetailsTabs = useMemo4(() => {
1838
1896
  return getMarketDetailsTabs(labels);
1839
1897
  }, [labels]);
@@ -1844,22 +1902,23 @@ var MarketDetailsContent = ({
1844
1902
  useEffect2(() => {
1845
1903
  setSelectedTab(resolveInitialTab(defaultTab));
1846
1904
  }, [defaultTab]);
1847
- const [selectedTimeRange, setSelectedTimeRange] = useState2(defaultTimeRange);
1905
+ const resolvedDefaultTimeRange = (_a = defaultTimeRange != null ? defaultTimeRange : config.defaultChartTimeRange) != null ? _a : "1D";
1906
+ const [selectedTimeRange, setSelectedTimeRange] = useState2(resolvedDefaultTimeRange);
1848
1907
  const [selectedChartType, setSelectedChartType] = useState2("line");
1849
1908
  useEffect2(() => {
1850
- setSelectedTimeRange(defaultTimeRange);
1851
- }, [defaultTimeRange]);
1909
+ setSelectedTimeRange(resolvedDefaultTimeRange);
1910
+ }, [resolvedDefaultTimeRange]);
1852
1911
  const [selectedOutcomeLabel, setSelectedOutcomeLabel] = useState2(
1853
1912
  () => {
1854
- var _a;
1855
- return resolveInitialOutcomeLabel((_a = model == null ? void 0 : model.outcomeLabels) != null ? _a : [], defaultOutcomeLabel);
1913
+ var _a2;
1914
+ return resolveInitialOutcomeLabel((_a2 = model == null ? void 0 : model.outcomeLabels) != null ? _a2 : [], defaultOutcomeLabel);
1856
1915
  }
1857
1916
  );
1858
1917
  const [selectedGraphVenue, setSelectedGraphVenue] = useState2(null);
1859
1918
  useEffect2(() => {
1860
- var _a;
1919
+ var _a2;
1861
1920
  setSelectedOutcomeLabel(
1862
- resolveInitialOutcomeLabel((_a = model == null ? void 0 : model.outcomeLabels) != null ? _a : [], defaultOutcomeLabel)
1921
+ resolveInitialOutcomeLabel((_a2 = model == null ? void 0 : model.outcomeLabels) != null ? _a2 : [], defaultOutcomeLabel)
1863
1922
  );
1864
1923
  }, [defaultOutcomeLabel, model == null ? void 0 : model.outcomeLabels]);
1865
1924
  const headerOutcomeItems = useMemo4(() => {
@@ -1886,52 +1945,66 @@ var MarketDetailsContent = ({
1886
1945
  return outcomesByLabelMap;
1887
1946
  }, [headerOutcomeItems, model]);
1888
1947
  const selectedOutcomesByVenue = useMemo4(() => {
1889
- var _a;
1948
+ var _a2;
1890
1949
  if (!selectedOutcomeLabel)
1891
1950
  return [];
1892
- return (_a = outcomesByLabel.get(selectedOutcomeLabel)) != null ? _a : [];
1951
+ return (_a2 = outcomesByLabel.get(selectedOutcomeLabel)) != null ? _a2 : [];
1893
1952
  }, [outcomesByLabel, selectedOutcomeLabel]);
1953
+ const chartEnabled = isOpened && selectedTab === "graph";
1954
+ const orderBookEnabled = isOpened && selectedTab === "order-book";
1894
1955
  const timeWindow = useMemo4(() => {
1895
1956
  return getTimeWindowByRange(selectedTimeRange);
1896
1957
  }, [selectedTimeRange]);
1897
- const graphOutcomes = useMemo4(() => {
1898
- const uniqueOutcomesByVenueAndId = /* @__PURE__ */ new Map();
1899
- outcomesByLabel.forEach((outcomes) => {
1900
- outcomes.forEach((outcomeByVenue) => {
1901
- uniqueOutcomesByVenueAndId.set(
1902
- `${outcomeByVenue.venue}:${outcomeByVenue.outcome.id}`,
1903
- outcomeByVenue
1904
- );
1905
- });
1906
- });
1907
- return [...uniqueOutcomesByVenueAndId.values()];
1908
- }, [outcomesByLabel]);
1909
- const canonicalMarketIdForHistory = model == null ? void 0 : model.market.id;
1910
- const priceHistoryGroups = useMemo4(() => {
1911
- return buildPriceHistoryGroups(graphOutcomes, canonicalMarketIdForHistory);
1912
- }, [canonicalMarketIdForHistory, graphOutcomes]);
1913
- const { data: priceHistoryData, isLoading: isPriceHistoryLoading } = usePriceHistory2(__spreadProps(__spreadValues({
1914
- groups: priceHistoryGroups
1915
- }, timeWindow), {
1916
- enabled: isOpened && selectedTab === "graph" && priceHistoryGroups.length > 0
1917
- }));
1918
- const orderBookInputs = useMemo4(() => {
1919
- return selectedOutcomesByVenue.map(({ market, outcome }) => ({
1920
- market,
1921
- outcome,
1922
- liveUpdate
1923
- }));
1924
- }, [selectedOutcomesByVenue, liveUpdate]);
1958
+ const primaryVenueMarketId = (_c = (_b = selectedOutcomesByVenue[0]) == null ? void 0 : _b.market.id) != null ? _c : null;
1959
+ const venueMarketIds = useMemo4(() => {
1960
+ return selectedOutcomesByVenue.map((item) => item.market.id);
1961
+ }, [selectedOutcomesByVenue]);
1925
1962
  const {
1926
- data: orderBookData,
1963
+ data: marketChartData,
1964
+ isLoading: isMarketChartLoading,
1965
+ error: marketChartError,
1966
+ refetch: refetchMarketChart
1967
+ } = useMarketChart2({
1968
+ marketId: primaryVenueMarketId,
1969
+ venueMarketIds,
1970
+ interval: timeRangeToInterval2(selectedTimeRange),
1971
+ startTs: timeWindow.startTs * 1e3,
1972
+ endTs: timeWindow.endTs * 1e3,
1973
+ enabled: chartEnabled && !!primaryVenueMarketId
1974
+ });
1975
+ const {
1976
+ data: marketOrderbookData,
1927
1977
  isLoading: isOrderBookLoading,
1928
1978
  error: orderBookError,
1929
- results: orderBookResults
1930
- } = useOrderBook({
1931
- orderbooks: orderBookInputs,
1932
- enabled: isOpened && selectedTab === "order-book" && orderBookInputs.length > 0,
1933
- canonicalMarketId: liveUpdate ? canonicalMarketIdForHistory : void 0
1979
+ refetch: refetchOrderBook
1980
+ } = useMarketOrderbook({
1981
+ marketId: primaryVenueMarketId,
1982
+ enabled: orderBookEnabled && !!primaryVenueMarketId,
1983
+ venueOutcomes: selectedOutcomesByVenue.map((item) => ({
1984
+ venue: item.market.venue,
1985
+ venueMarketOutcomeId: item.outcome.id
1986
+ }))
1934
1987
  });
1988
+ const orderBookData = useMemo4(() => {
1989
+ if (!marketOrderbookData)
1990
+ return void 0;
1991
+ const results = selectedOutcomesByVenue.flatMap(({ market, outcome }) => {
1992
+ const venueOrderbook = marketOrderbookData.venueOrderbooks[market.venue];
1993
+ if (!venueOrderbook)
1994
+ return [];
1995
+ return [
1996
+ {
1997
+ market,
1998
+ outcome,
1999
+ orderbook: {
2000
+ bids: venueOrderbook.bids,
2001
+ asks: venueOrderbook.asks
2002
+ }
2003
+ }
2004
+ ];
2005
+ });
2006
+ return results.length === selectedOutcomesByVenue.length ? results : void 0;
2007
+ }, [marketOrderbookData, selectedOutcomesByVenue]);
1935
2008
  const askRows = useMemo4(() => {
1936
2009
  return resolveOrderBookRows({
1937
2010
  data: orderBookData,
@@ -1944,78 +2017,43 @@ var MarketDetailsContent = ({
1944
2017
  side: "bids"
1945
2018
  });
1946
2019
  }, [orderBookData]);
1947
- const priceHistoryByVenue = useMemo4(() => {
1948
- const historyByVenue = /* @__PURE__ */ new Map();
1949
- if (!(priceHistoryData == null ? void 0 : priceHistoryData.length)) {
1950
- return historyByVenue;
1951
- }
1952
- priceHistoryData.forEach((historyItem) => {
1953
- const venue = historyItem.venue;
1954
- const venueHistory = historyByVenue.get(venue);
1955
- if (venueHistory) {
1956
- venueHistory.push(historyItem);
1957
- return;
1958
- }
1959
- historyByVenue.set(venue, [historyItem]);
1960
- });
1961
- return historyByVenue;
1962
- }, [priceHistoryData]);
1963
- const graphSeriesByOutcomeLabel = useMemo4(() => {
1964
- const seriesByOutcomeLabel = /* @__PURE__ */ new Map();
1965
- const resolveOutcomeCandidateIds2 = (outcomeByVenue) => {
1966
- var _a, _b;
1967
- const marketWithCanonicalId = outcomeByVenue.market;
1968
- return [
1969
- outcomeByVenue.outcome.id,
1970
- (_a = outcomeByVenue.outcome.externalIdentifier) != null ? _a : void 0,
1971
- outcomeByVenue.market.externalIdentifier,
1972
- (_b = marketWithCanonicalId.marketId) != null ? _b : void 0,
1973
- canonicalMarketIdForHistory
1974
- ].filter((value) => typeof value === "string" && value.trim().length > 0);
1975
- };
1976
- headerOutcomeItems.forEach((headerOutcomeItem) => {
1977
- var _a;
1978
- const outcomes = (_a = outcomesByLabel.get(headerOutcomeItem.label)) != null ? _a : [];
1979
- const graphSeries2 = [];
1980
- outcomes.forEach((outcomeByVenue, index) => {
1981
- var _a2;
1982
- const venueHistory = priceHistoryByVenue.get(outcomeByVenue.venue);
1983
- if (!(venueHistory == null ? void 0 : venueHistory.length))
1984
- return;
1985
- const candidateIds = resolveOutcomeCandidateIds2(outcomeByVenue);
1986
- const matchingHistory = (_a2 = venueHistory.find((historyItem) => candidateIds.includes(historyItem.marketId))) != null ? _a2 : venueHistory.length === 1 ? venueHistory[0] : void 0;
1987
- if (!matchingHistory)
1988
- return;
1989
- const points = matchingHistory.points.map((point) => ({
1990
- time: point.timestamp,
1991
- value: point.price * 100,
1992
- open: point.open == null ? void 0 : point.open * 100,
1993
- high: point.high == null ? void 0 : point.high * 100,
1994
- low: point.low == null ? void 0 : point.low * 100,
1995
- close: point.close == null ? void 0 : point.close * 100
1996
- })).filter((point) => Number.isFinite(point.time) && Number.isFinite(point.value));
1997
- if (points.length === 0)
1998
- return;
1999
- graphSeries2.push({
2000
- id: `${headerOutcomeItem.label}-${outcomeByVenue.venue}-${matchingHistory.marketId}`,
2001
- venue: outcomeByVenue.venue,
2002
- color: resolveSeriesColor(outcomeByVenue.venue, index),
2003
- points
2004
- });
2005
- });
2006
- seriesByOutcomeLabel.set(headerOutcomeItem.label, graphSeries2);
2007
- });
2008
- return seriesByOutcomeLabel;
2009
- }, [canonicalMarketIdForHistory, headerOutcomeItems, outcomesByLabel, priceHistoryByVenue]);
2010
2020
  const graphSeries = useMemo4(() => {
2011
- var _a;
2012
- if (!selectedOutcomeLabel)
2013
- return [];
2014
- const seriesForOutcomeLabel = (_a = graphSeriesByOutcomeLabel.get(selectedOutcomeLabel)) != null ? _a : [];
2021
+ const colorByVenue = new Map(
2022
+ selectedOutcomesByVenue.map((item, index) => [
2023
+ item.venue,
2024
+ resolveSeriesColor(item.venue, index)
2025
+ ])
2026
+ );
2027
+ const seriesForOutcomeLabel = resolveMarketChartVenueSeries({
2028
+ chartData: marketChartData,
2029
+ transformProbability: (value) => value
2030
+ }).map((seriesItem) => {
2031
+ var _a2;
2032
+ const resolvedVenue = seriesItem.venue;
2033
+ return {
2034
+ id: `${selectedOutcomeLabel != null ? selectedOutcomeLabel : "graph"}-${resolvedVenue}-${primaryVenueMarketId != null ? primaryVenueMarketId : "chart"}`,
2035
+ venue: resolvedVenue,
2036
+ color: (_a2 = colorByVenue.get(resolvedVenue)) != null ? _a2 : resolveSeriesColor(resolvedVenue, 0),
2037
+ points: seriesItem.points
2038
+ };
2039
+ });
2015
2040
  if (!selectedGraphVenue)
2016
2041
  return seriesForOutcomeLabel;
2017
2042
  return seriesForOutcomeLabel.filter((seriesItem) => seriesItem.venue === selectedGraphVenue);
2018
- }, [graphSeriesByOutcomeLabel, selectedGraphVenue, selectedOutcomeLabel]);
2043
+ }, [
2044
+ primaryVenueMarketId,
2045
+ marketChartData,
2046
+ selectedGraphVenue,
2047
+ selectedOutcomeLabel,
2048
+ selectedOutcomesByVenue
2049
+ ]);
2050
+ const graphLiveState = useMemo4(() => {
2051
+ return resolveMarketChartLiveState({
2052
+ chartData: marketChartData,
2053
+ selectedVenue: selectedGraphVenue,
2054
+ transformProbability: (value) => value
2055
+ });
2056
+ }, [marketChartData, selectedGraphVenue]);
2019
2057
  const otherRows = useMemo4(() => {
2020
2058
  if (!model)
2021
2059
  return [];
@@ -2023,9 +2061,10 @@ var MarketDetailsContent = ({
2023
2061
  }, [labels, model]);
2024
2062
  const isOrderBookNotFound = orderBookError && typeof orderBookError === "object" && "status" in orderBookError && orderBookError.status === 404;
2025
2063
  const hasOrderBookError = !!orderBookError && !isOrderBookNotFound;
2026
- const hasNoOrderBook = isOrderBookNotFound || !isOrderBookLoading && !hasOrderBookError && (orderBookInputs.length === 0 || askRows.length === 0 && bidRows.length === 0);
2064
+ const hasNoOrderBook = isOrderBookNotFound || !isOrderBookLoading && !hasOrderBookError && (selectedOutcomesByVenue.length === 0 || askRows.length === 0 && bidRows.length === 0);
2065
+ const hasChartError = !!marketChartError;
2027
2066
  const handleOutcomeKeyDown = (eventToHandle) => {
2028
- var _a;
2067
+ var _a2;
2029
2068
  if ((eventToHandle == null ? void 0 : eventToHandle.key) !== "ArrowLeft" && (eventToHandle == null ? void 0 : eventToHandle.key) !== "ArrowRight") {
2030
2069
  return;
2031
2070
  }
@@ -2036,14 +2075,14 @@ var MarketDetailsContent = ({
2036
2075
  });
2037
2076
  const direction = eventToHandle.key === "ArrowRight" ? 1 : -1;
2038
2077
  const nextIndex = activeIndex < 0 ? 0 : (activeIndex + direction + headerOutcomeItems.length) % headerOutcomeItems.length;
2039
- setSelectedOutcomeLabel((_a = headerOutcomeItems[nextIndex]) == null ? void 0 : _a.label);
2078
+ setSelectedOutcomeLabel((_a2 = headerOutcomeItems[nextIndex]) == null ? void 0 : _a2.label);
2040
2079
  };
2041
- const handleToggleExpanded = (event2) => {
2042
- if (event2 && "key" in event2 && (event2 == null ? void 0 : event2.key) !== "Enter" && (event2 == null ? void 0 : event2.key) !== " ") {
2080
+ const handleToggleExpanded = (event) => {
2081
+ if (event && "key" in event && (event == null ? void 0 : event.key) !== "Enter" && (event == null ? void 0 : event.key) !== " ") {
2043
2082
  return;
2044
2083
  }
2045
- event2 == null ? void 0 : event2.preventDefault();
2046
- event2 == null ? void 0 : event2.stopPropagation();
2084
+ event == null ? void 0 : event.preventDefault();
2085
+ event == null ? void 0 : event.stopPropagation();
2047
2086
  setIsOpened((prev) => {
2048
2087
  const next = !prev;
2049
2088
  onOpenChange == null ? void 0 : onOpenChange(next);
@@ -2058,7 +2097,10 @@ var MarketDetailsContent = ({
2058
2097
  });
2059
2098
  };
2060
2099
  const handleRetryOrderBook = () => {
2061
- void Promise.all(orderBookResults.map((result) => result.refetch()));
2100
+ void refetchOrderBook();
2101
+ };
2102
+ const handleRetryMarketChart = () => {
2103
+ void refetchMarketChart();
2062
2104
  };
2063
2105
  useEffect2(() => {
2064
2106
  if (!selectedGraphVenue) {
@@ -2101,7 +2143,7 @@ var MarketDetailsContent = ({
2101
2143
  onClick: handleToggleExpanded,
2102
2144
  onKeyDown: handleToggleExpanded,
2103
2145
  children: [
2104
- /* @__PURE__ */ jsxs3("div", { className: "flex min-w-52 items-center gap-3 md:gap-4", children: [
2146
+ /* @__PURE__ */ jsxs3("div", { className: "flex min-w-52 max-w-3/4 items-center gap-3 md:gap-4", children: [
2105
2147
  model.image ? /* @__PURE__ */ jsx4(
2106
2148
  RemoteImage,
2107
2149
  {
@@ -2148,7 +2190,7 @@ var MarketDetailsContent = ({
2148
2190
  /* @__PURE__ */ jsx4(
2149
2191
  VenueLogo,
2150
2192
  {
2151
- venue: isPositive ? "polymarket" : "probable",
2193
+ venue: "polymarket",
2152
2194
  size: "small",
2153
2195
  color: isActiveOutcome ? "var(--agg-color-on-primary)" : void 0
2154
2196
  }
@@ -2255,13 +2297,26 @@ var MarketDetailsContent = ({
2255
2297
  )
2256
2298
  ] }) }) : null,
2257
2299
  selectedTab === "graph" ? /* @__PURE__ */ jsxs3("div", { className: cn("flex flex-col gap-5", classNames == null ? void 0 : classNames.graph), children: [
2258
- /* @__PURE__ */ jsx4(
2300
+ hasChartError ? /* @__PURE__ */ jsx4(
2301
+ StateMessage,
2302
+ {
2303
+ ariaLabel: labels.marketDetails.chartUnavailableAria,
2304
+ tone: "warning",
2305
+ title: labels.marketDetails.chartUnavailableTitle,
2306
+ description: labels.marketDetails.chartUnavailableDescription,
2307
+ actionLabel: labels.common.retry,
2308
+ onAction: handleRetryMarketChart,
2309
+ className: "min-h-[248px] px-5 py-10 md:min-h-[272px]"
2310
+ }
2311
+ ) : /* @__PURE__ */ jsx4(
2259
2312
  LineChart,
2260
2313
  {
2261
2314
  series: graphSeries,
2262
2315
  height: 260,
2263
- isLoading: isPriceHistoryLoading,
2316
+ isLoading: isMarketChartLoading,
2264
2317
  chartType: selectedChartType,
2318
+ liveCandle: selectedChartType === "candlestick" ? (_d = graphLiveState.liveCandle) != null ? _d : void 0 : void 0,
2319
+ lineValue: graphLiveState.lineValue,
2265
2320
  classNames: { root: "w-full" },
2266
2321
  showSeriesControls: selectedOutcomesByVenue.length > 0 || headerOutcomeItems.length > 0,
2267
2322
  renderSeriesControls: () => {
@@ -2385,7 +2440,7 @@ var MarketDetailsContent = ({
2385
2440
  );
2386
2441
  };
2387
2442
  var MarketDetails = (props) => {
2388
- var _a, _b;
2443
+ var _a;
2389
2444
  const [uncontrolledIsOpened, setUncontrolledIsOpened] = useState2(
2390
2445
  (_a = props.defaultIsOpened) != null ? _a : marketDetailsDefaultIsOpened
2391
2446
  );
@@ -2402,15 +2457,6 @@ var MarketDetails = (props) => {
2402
2457
  }
2403
2458
  (_a2 = props.onOpenChange) == null ? void 0 : _a2.call(props, nextIsOpened);
2404
2459
  };
2405
- const hasEventProp = "event" in props && !!props.event;
2406
- const {
2407
- event: fetchedEvent,
2408
- error: eventError,
2409
- isLoading: isFetchingEvent
2410
- } = useVenueEvent3({
2411
- eventId: hasEventProp ? "" : (_b = props.eventId) != null ? _b : "",
2412
- enabled: !props.isLoading && !hasEventProp && !!props.eventId
2413
- });
2414
2460
  if (props.isLoading) {
2415
2461
  return /* @__PURE__ */ jsx4(
2416
2462
  MarketDetailsLoadingState,
@@ -2421,42 +2467,115 @@ var MarketDetails = (props) => {
2421
2467
  }
2422
2468
  );
2423
2469
  }
2424
- if ("event" in props && props.event) {
2470
+ if ("venueMarkets" in props && props.venueMarkets) {
2425
2471
  return /* @__PURE__ */ jsx4(
2426
2472
  MarketDetailsContent,
2427
2473
  __spreadProps(__spreadValues({}, props), {
2428
2474
  isOpened: resolvedIsOpened,
2429
2475
  onOpenChange: handleOpenChange,
2430
- event: props.event
2476
+ venueMarkets: props.venueMarkets
2431
2477
  })
2432
2478
  );
2433
2479
  }
2434
- if (isFetchingEvent) {
2435
- return /* @__PURE__ */ jsx4(
2436
- MarketDetailsLoadingState,
2480
+ const { ariaLabel: fallbackAriaLabel, classNames: fallbackClassNames } = props;
2481
+ return /* @__PURE__ */ jsx4(MarketDetailsUnavailableState, { ariaLabel: fallbackAriaLabel, classNames: fallbackClassNames });
2482
+ };
2483
+ MarketDetails.displayName = "MarketDetails";
2484
+ var resolveInitialExpandedId = (markets, defaultId) => {
2485
+ var _a, _b;
2486
+ if (!markets.length)
2487
+ return null;
2488
+ if (defaultId) {
2489
+ const match = markets.find((m) => m.id === defaultId);
2490
+ if (match)
2491
+ return match.id;
2492
+ }
2493
+ return (_b = (_a = markets[0]) == null ? void 0 : _a.id) != null ? _b : null;
2494
+ };
2495
+ var MarketDetailsList = ({
2496
+ eventId,
2497
+ expandedMarketId,
2498
+ defaultExpandedMarketId,
2499
+ onExpandedMarketChange,
2500
+ defaultTab,
2501
+ defaultTimeRange,
2502
+ classNames,
2503
+ ariaLabel
2504
+ }) => {
2505
+ const labels = useLabels4();
2506
+ const resolvedEventId = eventId || "";
2507
+ const { markets, isLoading, error } = useVenueMarkets({
2508
+ venueEventId: resolvedEventId,
2509
+ enabled: !!resolvedEventId
2510
+ });
2511
+ const [internalExpandedId, setInternalExpandedId] = useState2(
2512
+ () => resolveInitialExpandedId(markets, defaultExpandedMarketId)
2513
+ );
2514
+ useEffect2(() => {
2515
+ if (typeof expandedMarketId !== "undefined")
2516
+ return;
2517
+ setInternalExpandedId((current) => {
2518
+ if (current && markets.some((m) => m.id === current))
2519
+ return current;
2520
+ return resolveInitialExpandedId(markets, defaultExpandedMarketId);
2521
+ });
2522
+ }, [defaultExpandedMarketId, expandedMarketId, markets]);
2523
+ useEffect2(() => {
2524
+ if (typeof expandedMarketId === "undefined")
2525
+ return;
2526
+ setInternalExpandedId(expandedMarketId);
2527
+ }, [expandedMarketId]);
2528
+ const resolvedExpandedId = typeof expandedMarketId === "undefined" ? internalExpandedId : expandedMarketId;
2529
+ const handleToggle = (marketId, isOpened) => {
2530
+ const next = isOpened ? marketId : null;
2531
+ if (typeof expandedMarketId === "undefined") {
2532
+ setInternalExpandedId(next);
2533
+ }
2534
+ onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(next);
2535
+ };
2536
+ if (isLoading) {
2537
+ return /* @__PURE__ */ jsxs3("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.root), "aria-label": ariaLabel, children: [
2538
+ /* @__PURE__ */ jsx4(MarketDetailsLoadingState, { isOpened: true, classNames: { root: classNames == null ? void 0 : classNames.item } }),
2539
+ /* @__PURE__ */ jsx4(MarketDetailsLoadingState, { isOpened: false, classNames: { root: classNames == null ? void 0 : classNames.item } })
2540
+ ] });
2541
+ }
2542
+ if (error) {
2543
+ return /* @__PURE__ */ jsx4(Card, { className: cn(marketDetailsBaseCardClassName, "p-0", classNames == null ? void 0 : classNames.root), children: /* @__PURE__ */ jsx4(
2544
+ StateMessage,
2437
2545
  {
2438
- isOpened: resolvedIsOpened,
2439
- ariaLabel: props.ariaLabel,
2440
- classNames: props.classNames
2546
+ ariaLabel: ariaLabel != null ? ariaLabel : labels.marketDetails.unavailableAria,
2547
+ title: labels.marketDetails.unavailableTitle,
2548
+ description: labels.marketDetails.unavailableDescription,
2549
+ className: "min-h-[280px] md:min-h-[320px]"
2441
2550
  }
2442
- );
2551
+ ) });
2443
2552
  }
2444
- if (!fetchedEvent) {
2445
- if (isErrorWithStatus(eventError, 404)) {
2446
- return /* @__PURE__ */ jsx4(MarketDetailsNotFoundState, { ariaLabel: props.ariaLabel, classNames: props.classNames });
2447
- }
2448
- return /* @__PURE__ */ jsx4(MarketDetailsUnavailableState, { ariaLabel: props.ariaLabel, classNames: props.classNames });
2553
+ if (markets.length === 0) {
2554
+ return /* @__PURE__ */ jsx4(Card, { className: cn(marketDetailsBaseCardClassName, "p-0", classNames == null ? void 0 : classNames.root), children: /* @__PURE__ */ jsx4(
2555
+ StateMessage,
2556
+ {
2557
+ ariaLabel: ariaLabel != null ? ariaLabel : labels.marketDetails.notFoundAria,
2558
+ title: labels.marketDetails.notFoundTitle,
2559
+ description: labels.marketDetails.notFoundDescription,
2560
+ className: "min-h-[280px] md:min-h-[320px]"
2561
+ }
2562
+ ) });
2449
2563
  }
2450
- return /* @__PURE__ */ jsx4(
2451
- MarketDetailsContent,
2452
- __spreadProps(__spreadValues({}, props), {
2453
- isOpened: resolvedIsOpened,
2454
- onOpenChange: handleOpenChange,
2455
- event: fetchedEvent
2456
- })
2457
- );
2564
+ return /* @__PURE__ */ jsx4("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.root), "aria-label": ariaLabel, children: markets.map((market) => /* @__PURE__ */ jsx4(
2565
+ MarketDetails,
2566
+ {
2567
+ venueMarkets: [market],
2568
+ isOpened: resolvedExpandedId === market.id,
2569
+ onOpenChange: (nextIsOpened) => handleToggle(market.id, nextIsOpened),
2570
+ defaultTab,
2571
+ defaultTimeRange,
2572
+ ariaLabel: market.question,
2573
+ classNames: { root: classNames == null ? void 0 : classNames.item }
2574
+ },
2575
+ market.id
2576
+ )) });
2458
2577
  };
2459
- MarketDetails.displayName = "MarketDetails";
2578
+ MarketDetailsList.displayName = "MarketDetailsList";
2460
2579
 
2461
2580
  // src/events/list/index.tsx
2462
2581
  import { useCallback, useEffect as useEffect3, useMemo as useMemo5, useRef, useState as useState3 } from "react";
@@ -2555,11 +2674,11 @@ var estimateTabsWidth = (items) => {
2555
2674
  var EventList = ({
2556
2675
  title,
2557
2676
  maxItemsPerRow = 3,
2558
- limit = 3,
2677
+ limit = 9,
2559
2678
  maxVisibleItems,
2560
- showVenueLogo = true,
2561
2679
  search,
2562
- categoryIds
2680
+ categoryIds,
2681
+ onClick
2563
2682
  }) => {
2564
2683
  var _a, _b;
2565
2684
  const labels = useLabels5();
@@ -2714,10 +2833,10 @@ var EventList = ({
2714
2833
  EventListItem,
2715
2834
  {
2716
2835
  event,
2717
- showVenueLogo,
2718
2836
  classNames: {
2719
2837
  root: "w-full min-w-0 max-w-none"
2720
- }
2838
+ },
2839
+ onClick
2721
2840
  },
2722
2841
  event.id
2723
2842
  )),
@@ -2759,5 +2878,6 @@ export {
2759
2878
  EventListItem,
2760
2879
  EventListItemDetails,
2761
2880
  MarketDetails,
2881
+ MarketDetailsList,
2762
2882
  EventList
2763
2883
  };