@agg-build/ui 4.21.0 → 4.22.2

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/pages.js CHANGED
@@ -15792,71 +15792,39 @@ var init_event_chart_window = __esm({
15792
15792
  });
15793
15793
 
15794
15794
  // src/events/item-details/event-markets-chart.utils.ts
15795
- function resolveEventChartSelectedOutcome(markets, venue, selectedOutcomeId) {
15796
- var _a, _b;
15797
- if (!selectedOutcomeId) return null;
15798
- const allMarkets = normalizeVenueMarketCluster(markets);
15799
- const market = allMarkets.find(
15800
- (item) => item.venueMarketOutcomes.some((outcome2) => outcome2.id === selectedOutcomeId)
15801
- );
15802
- const outcome = market == null ? void 0 : market.venueMarketOutcomes.find((item) => item.id === selectedOutcomeId);
15803
- if (!market || !outcome) return null;
15804
- return (_b = (_a = collectEligibleVenueOutcomes({
15805
- venueMarkets: normalizeVenueMarketCluster(markets, market.id),
15806
- selectedOutcomeLabel: outcome.label,
15807
- selectedOutcomeId
15808
- }).find((item) => item.venue === venue)) == null ? void 0 : _a.outcomeId) != null ? _b : null;
15809
- }
15810
- function resolveEventChartPage(outcomes, selectedOutcomeId, requestedPage) {
15811
- var _a;
15812
- const pinned = outcomes.find((outcome) => outcome.id === selectedOutcomeId);
15813
- const remaining = outcomes.filter((outcome) => outcome.id !== (pinned == null ? void 0 : pinned.id));
15814
- const pageSize = EVENT_CHART_SERIES_LIMIT - (pinned ? 1 : 0);
15815
- const pageCount = Math.max(1, Math.ceil(remaining.length / pageSize));
15816
- const page = Math.max(0, Math.min(requestedPage, pageCount - 1));
15817
- return {
15818
- page,
15819
- pageCount,
15820
- pinnedId: (_a = pinned == null ? void 0 : pinned.id) != null ? _a : null,
15821
- outcomes: [
15822
- ...pinned ? [pinned] : [],
15823
- ...remaining.slice(page * pageSize, (page + 1) * pageSize)
15824
- ]
15825
- };
15826
- }
15827
- var import_hooks57, EVENT_CHART_SERIES_LIMIT, resolveEventChartOutcomes;
15795
+ var import_hooks57, EVENT_CHART_MARKET_LIMIT, marketVolume, resolveTopEventChartMarkets, resolveEventChartOutcomes;
15828
15796
  var init_event_markets_chart_utils = __esm({
15829
15797
  "src/events/item-details/event-markets-chart.utils.ts"() {
15830
15798
  "use strict";
15831
15799
  import_hooks57 = require("@agg-build/hooks");
15832
15800
  init_venue_market_cluster();
15833
- init_orderbook_aggregation();
15834
- EVENT_CHART_SERIES_LIMIT = 8;
15835
- resolveEventChartOutcomes = (markets, venue, eventEndDate) => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue).sort(
15836
- (left, right) => {
15837
- var _a, _b;
15838
- return ((_a = right.volume) != null ? _a : 0) - ((_b = left.volume) != null ? _b : 0) || left.id.localeCompare(right.id);
15839
- }
15840
- ).flatMap((market) => {
15801
+ init_event_list_item_details_utils();
15802
+ EVENT_CHART_MARKET_LIMIT = 3;
15803
+ marketVolume = (market) => {
15804
+ var _a;
15805
+ return Number.isFinite(market.volume) ? Math.max(0, (_a = market.volume) != null ? _a : 0) : 0;
15806
+ };
15807
+ resolveTopEventChartMarkets = (markets, venue) => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue && market.venueMarketOutcomes.length > 0).sort(
15808
+ (left, right) => marketVolume(right) - marketVolume(left) || left.id.localeCompare(right.id)
15809
+ ).slice(0, EVENT_CHART_MARKET_LIMIT);
15810
+ resolveEventChartOutcomes = (markets, venue, eventEndDate) => resolveTopEventChartMarkets(markets, venue).flatMap((market) => {
15841
15811
  var _a, _b, _c;
15842
15812
  const state = (0, import_hooks57.resolveMarketTradingState)(market);
15843
15813
  const hasFinalResult = state.kind === "resolved" && market.venueMarketOutcomes.some((outcome) => outcome.winner === true) && market.venueMarketOutcomes.every((outcome) => outcome.winner != null);
15844
15814
  const settledAt = Date.parse((_c = (_b = (_a = market.resolutionDate) != null ? _a : market.endDate) != null ? _b : eventEndDate) != null ? _c : "") / 1e3;
15845
- const ordered = [...market.venueMarketOutcomes].sort((a, b) => {
15846
- const rank = (label2) => label2.trim().toLowerCase() === "yes" ? 0 : label2.trim().toLowerCase() === "no" ? 1 : 2;
15847
- return rank(a.label) - rank(b.label);
15848
- });
15815
+ const ordered = sortOutcomeSelectorOutcomes(market.venueMarketOutcomes);
15849
15816
  return ordered.map((outcome) => {
15850
- var _a2;
15817
+ var _a2, _b2;
15851
15818
  return {
15852
15819
  id: outcome.id,
15853
15820
  marketId: market.id,
15854
15821
  venue: market.venue,
15855
15822
  side: outcome.label,
15823
+ outcomeLabel: ((_a2 = outcome.title) == null ? void 0 : _a2.trim()) || outcome.label,
15856
15824
  live: !state.isTradingDisabled,
15857
15825
  finalValue: hasFinalResult ? outcome.winner ? 100 : 0 : void 0,
15858
15826
  settledAt: Number.isFinite(settledAt) ? settledAt : void 0,
15859
- label: `${market.question} \xB7 ${((_a2 = outcome.title) == null ? void 0 : _a2.trim()) || outcome.label}`
15827
+ label: `${market.question} \xB7 ${((_b2 = outcome.title) == null ? void 0 : _b2.trim()) || outcome.label}`
15860
15828
  };
15861
15829
  });
15862
15830
  });
@@ -15872,8 +15840,8 @@ var init_event_markets_chart = __esm({
15872
15840
  import_react35 = require("react");
15873
15841
  import_hooks58 = require("@agg-build/hooks");
15874
15842
  init_chart();
15875
- init_button();
15876
- init_icon();
15843
+ init_badge();
15844
+ init_venue_logo();
15877
15845
  init_chart_utils();
15878
15846
  init_venue_market_cluster();
15879
15847
  init_event_list_item_details_utils();
@@ -15886,8 +15854,7 @@ var init_event_markets_chart = __esm({
15886
15854
  eventEndDate,
15887
15855
  contractWindow,
15888
15856
  range,
15889
- live,
15890
- selectedOutcomeId
15857
+ live
15891
15858
  }) => {
15892
15859
  var _a, _b, _c, _d, _e, _f, _g;
15893
15860
  const labels = (0, import_hooks58.useLabels)();
@@ -15899,31 +15866,20 @@ var init_event_markets_chart = __esm({
15899
15866
  () => [...new Set(normalizeVenueMarketCluster(markets).map((market) => market.venue))],
15900
15867
  [markets]
15901
15868
  );
15902
- const venue = venues.includes(defaultVenue) ? defaultVenue : (_a = venues[0]) != null ? _a : defaultVenue;
15903
- const outcomes = (0, import_react35.useMemo)(
15904
- () => resolveEventChartOutcomes(markets, venue, eventEndDate),
15905
- [markets, venue, eventEndDate]
15906
- );
15907
15869
  const [selection, setSelection] = (0, import_react35.useState)(() => ({
15908
- venue,
15909
- page: 0,
15870
+ defaultVenue,
15871
+ venue: defaultVenue,
15910
15872
  hidden: /* @__PURE__ */ new Set()
15911
15873
  }));
15912
- const currentSelection = (0, import_react35.useMemo)(
15913
- () => selection.venue === venue ? selection : { venue, page: 0, hidden: /* @__PURE__ */ new Set() },
15914
- [selection, venue]
15915
- );
15916
- const pinnedOutcomeId = (0, import_react35.useMemo)(
15917
- () => resolveEventChartSelectedOutcome(markets, venue, selectedOutcomeId),
15918
- [markets, venue, selectedOutcomeId]
15919
- );
15920
- const page = (0, import_react35.useMemo)(
15921
- () => resolveEventChartPage(outcomes, pinnedOutcomeId, currentSelection.page),
15922
- [outcomes, pinnedOutcomeId, currentSelection.page]
15923
- );
15924
- const activeOutcomes = page.outcomes.filter(
15925
- (outcome) => outcome.id === page.pinnedId || !currentSelection.hidden.has(outcome.id)
15874
+ const requestedVenue = selection.defaultVenue === defaultVenue ? selection.venue : defaultVenue;
15875
+ const venue = venues.includes(requestedVenue) ? requestedVenue : (_a = venues[0]) != null ? _a : defaultVenue;
15876
+ const hidden = selection.defaultVenue === defaultVenue && selection.venue === venue ? selection.hidden : /* @__PURE__ */ new Set();
15877
+ const topMarkets = (0, import_react35.useMemo)(() => resolveTopEventChartMarkets(markets, venue), [markets, venue]);
15878
+ const outcomes = (0, import_react35.useMemo)(
15879
+ () => resolveEventChartOutcomes(topMarkets, venue, eventEndDate),
15880
+ [topMarkets, venue, eventEndDate]
15926
15881
  );
15882
+ const activeOutcomes = outcomes.filter((outcome) => !hidden.has(outcome.id));
15927
15883
  const activeIds = new Set(activeOutcomes.map((outcome) => outcome.id));
15928
15884
  const rollingWindow = (0, import_hooks58.useRollingChartWindow)({
15929
15885
  range,
@@ -15956,10 +15912,10 @@ var init_event_markets_chart = __esm({
15956
15912
  live: live && !windowEnded
15957
15913
  });
15958
15914
  const stableColorIds = (0, import_react35.useMemo)(
15959
- () => [...new Set(outcomes.map((outcome) => outcome.marketId))].sort(),
15960
- [outcomes]
15915
+ () => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue).map((market) => market.id).sort(),
15916
+ [markets, venue]
15961
15917
  );
15962
- const allSeries = page.outcomes.map((outcome) => {
15918
+ const allSeries = outcomes.map((outcome) => {
15963
15919
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h, _i;
15964
15920
  const settledAt = outcome.settledAt == null ? void 0 : contractWindow ? Math.min(outcome.settledAt, contractWindow.to) : outcome.settledAt;
15965
15921
  const outcomeLive = outcome.live && !windowEnded;
@@ -15995,110 +15951,109 @@ var init_event_markets_chart = __esm({
15995
15951
  });
15996
15952
  const visibleSeries = allSeries.filter((series) => activeIds.has(series.id));
15997
15953
  const hasVisibleHistory = visibleSeries.some((series) => series.points.length > 0);
15998
- const volume = (0, import_react35.useMemo)(
15999
- () => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue).reduce((sum, market) => {
15954
+ const volume = topMarkets.reduce(
15955
+ (sum, market) => {
16000
15956
  var _a2;
16001
- return sum + ((_a2 = market.volume) != null ? _a2 : 0);
16002
- }, 0),
16003
- [markets, venue]
15957
+ return sum + (Number.isFinite(market.volume) ? Math.max(0, (_a2 = market.volume) != null ? _a2 : 0) : 0);
15958
+ },
15959
+ 0
16004
15960
  );
16005
15961
  const venueLabel = (_g = labels.venues[venue]) != null ? _g : venue;
16006
15962
  return /* @__PURE__ */ (0, import_jsx_runtime159.jsxs)("div", { className: "agg-event-markets-chart flex flex-col gap-3", children: [
16007
- /* @__PURE__ */ (0, import_jsx_runtime159.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-2 text-agg-sm text-agg-muted-foreground", children: [
16008
- /* @__PURE__ */ (0, import_jsx_runtime159.jsx)("span", { role: "status", children: labels.eventItemDetails.comparisonSeriesCount(activeOutcomes.length, outcomes.length) }),
16009
- page.pageCount > 1 ? /* @__PURE__ */ (0, import_jsx_runtime159.jsxs)("div", { className: "flex items-center gap-2", children: [
16010
- /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
16011
- Button,
16012
- {
16013
- variant: "tertiary",
16014
- size: "small",
16015
- disabled: page.page === 0,
16016
- onClick: (event) => {
16017
- event.stopPropagation();
16018
- setSelection(__spreadProps(__spreadValues({}, currentSelection), { page: page.page - 1 }));
16019
- },
16020
- prefix: /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(Icon, { name: "chevron-left", size: "small" }),
16021
- children: labels.eventItemDetails.comparisonPreviousSeries
16022
- }
16023
- ),
16024
- /* @__PURE__ */ (0, import_jsx_runtime159.jsx)("span", { children: labels.eventItemDetails.comparisonSeriesPage(page.page + 1, page.pageCount) }),
16025
- /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
16026
- Button,
16027
- {
16028
- variant: "tertiary",
16029
- size: "small",
16030
- disabled: page.page + 1 === page.pageCount,
16031
- onClick: (event) => {
16032
- event.stopPropagation();
16033
- setSelection(__spreadProps(__spreadValues({}, currentSelection), { page: page.page + 1 }));
16034
- },
16035
- suffix: /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(Icon, { name: "chevron-right", size: "small" }),
16036
- children: labels.eventItemDetails.comparisonNextSeries
16037
- }
16038
- )
16039
- ] }) : null
16040
- ] }),
16041
- outcomes.length > EVENT_CHART_SERIES_LIMIT ? /* @__PURE__ */ (0, import_jsx_runtime159.jsx)("p", { className: "text-agg-xs text-agg-muted-foreground", children: labels.eventItemDetails.comparisonSeriesBudget(EVENT_CHART_SERIES_LIMIT) }) : null,
15963
+ /* @__PURE__ */ (0, import_jsx_runtime159.jsx)("div", { className: "agg-market-badges flex min-w-0 gap-2 overflow-x-auto pb-1 md:flex-wrap", children: venues.map((item) => {
15964
+ var _a2, _b2;
15965
+ return /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
15966
+ "button",
15967
+ {
15968
+ type: "button",
15969
+ "aria-label": (_a2 = labels.venues[item]) != null ? _a2 : item,
15970
+ "aria-pressed": venue === item,
15971
+ className: "agg-market-badge cursor-pointer rounded-agg-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
15972
+ onClick: (event) => {
15973
+ event.preventDefault();
15974
+ event.stopPropagation();
15975
+ if (item !== venue) setSelection({ defaultVenue, venue: item, hidden: /* @__PURE__ */ new Set() });
15976
+ },
15977
+ children: /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
15978
+ Badge,
15979
+ {
15980
+ text: (_b2 = labels.venues[item]) != null ? _b2 : item,
15981
+ prefix: /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(VenueLogo, { venue: item, size: "small", title: item }),
15982
+ size: "large",
15983
+ isActive: venue === item,
15984
+ classNames: { root: "shrink-0 border px-4 h-8 md:h-9" }
15985
+ }
15986
+ )
15987
+ },
15988
+ item
15989
+ );
15990
+ }) }),
16042
15991
  /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
16043
15992
  "div",
16044
15993
  {
16045
15994
  role: "group",
16046
15995
  "aria-label": labels.eventItemDetails.chartLegend,
16047
- className: "flex flex-wrap gap-x-5 gap-y-2",
16048
- children: allSeries.map((series) => /* @__PURE__ */ (0, import_jsx_runtime159.jsxs)(
16049
- "button",
16050
- {
16051
- type: "button",
16052
- "data-chart-outcome-id": series.id,
16053
- "aria-pressed": activeIds.has(series.id),
16054
- disabled: series.id === page.pinnedId,
16055
- onClick: (event) => {
16056
- event.stopPropagation();
16057
- setSelection(() => {
16058
- const next = new Set(currentSelection.hidden);
16059
- if (next.has(series.id)) next.delete(series.id);
16060
- else next.add(series.id);
16061
- return __spreadProps(__spreadValues({}, currentSelection), { hidden: next });
16062
- });
15996
+ className: "flex flex-col gap-2",
15997
+ children: topMarkets.map((market) => {
15998
+ var _a2;
15999
+ return /* @__PURE__ */ (0, import_jsx_runtime159.jsxs)(
16000
+ "div",
16001
+ {
16002
+ "data-chart-market-id": market.id,
16003
+ className: "flex min-w-0 flex-wrap items-center justify-between gap-x-4 gap-y-1",
16004
+ children: [
16005
+ /* @__PURE__ */ (0, import_jsx_runtime159.jsxs)("span", { className: "flex min-w-0 items-center gap-2 text-agg-sm text-agg-foreground", children: [
16006
+ /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
16007
+ "span",
16008
+ {
16009
+ "aria-hidden": "true",
16010
+ className: "h-0 w-4 shrink-0 border-t-2",
16011
+ style: {
16012
+ borderColor: (_a2 = allSeries.find((series) => series.marketId === market.id)) == null ? void 0 : _a2.color
16013
+ }
16014
+ }
16015
+ ),
16016
+ /* @__PURE__ */ (0, import_jsx_runtime159.jsx)("span", { className: "truncate", title: market.question, children: market.question })
16017
+ ] }),
16018
+ /* @__PURE__ */ (0, import_jsx_runtime159.jsx)("div", { className: "agg-outcome-switch flex max-w-full flex-wrap gap-1 rounded-agg-full bg-agg-secondary", children: allSeries.filter((series) => series.marketId === market.id).map((series) => {
16019
+ const value = !activeIds.has(series.id) ? labels.eventItemDetails.comparisonHiddenSeries : series.pending ? labels.common.loading : series.points.length === 0 ? labels.eventItemDetails.marketHistoryUnavailable : formatDefaultChartValue(
16020
+ series.current != null ? series.current * 100 : series.points.at(-1).value
16021
+ );
16022
+ return /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
16023
+ "button",
16024
+ {
16025
+ type: "button",
16026
+ "data-chart-outcome-id": series.id,
16027
+ "aria-label": `${series.label} ${value}`,
16028
+ "aria-pressed": activeIds.has(series.id),
16029
+ title: `${series.label} ${value}`,
16030
+ className: "cursor-pointer rounded-agg-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
16031
+ onClick: (event) => {
16032
+ event.preventDefault();
16033
+ event.stopPropagation();
16034
+ const next = new Set(hidden);
16035
+ if (next.has(series.id)) next.delete(series.id);
16036
+ else next.add(series.id);
16037
+ setSelection({ defaultVenue, venue, hidden: next });
16038
+ },
16039
+ children: /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
16040
+ Badge,
16041
+ {
16042
+ text: `${series.outcomeLabel} ${value}`,
16043
+ size: "large",
16044
+ isActive: activeIds.has(series.id),
16045
+ classNames: { root: "h-8 w-36 border px-4 tabular-nums md:h-9" }
16046
+ }
16047
+ )
16048
+ },
16049
+ series.id
16050
+ );
16051
+ }) })
16052
+ ]
16063
16053
  },
16064
- className: "flex max-w-full cursor-pointer items-center gap-2 rounded-agg-sm py-1 text-agg-sm text-agg-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary disabled:cursor-default disabled:opacity-50",
16065
- style: { opacity: activeIds.has(series.id) ? 1 : 0.4 },
16066
- children: [
16067
- /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
16068
- "span",
16069
- {
16070
- "aria-hidden": "true",
16071
- className: "h-0 w-4 shrink-0 border-t-2",
16072
- style: {
16073
- borderColor: series.color,
16074
- borderTopStyle: series.lineStyle === "dashed" ? "dashed" : "solid"
16075
- }
16076
- }
16077
- ),
16078
- /* @__PURE__ */ (0, import_jsx_runtime159.jsx)("span", { className: "min-w-0 text-left [overflow-wrap:anywhere]", children: series.label }),
16079
- series.id === page.pinnedId ? /* @__PURE__ */ (0, import_jsx_runtime159.jsx)("span", { children: labels.eventItemDetails.comparisonSelectedSeries }) : null,
16080
- /* @__PURE__ */ (0, import_jsx_runtime159.jsxs)("span", { className: "inline-grid shrink-0 items-center font-agg-semibold tabular-nums", children: [
16081
- [
16082
- formatDefaultChartValue(100),
16083
- formatDefaultChartValue(99.9),
16084
- labels.common.loading,
16085
- labels.eventItemDetails.comparisonHiddenSeries,
16086
- labels.eventItemDetails.marketHistoryUnavailable
16087
- ].map((value, index) => /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
16088
- "span",
16089
- {
16090
- "aria-hidden": "true",
16091
- className: "invisible col-start-1 row-start-1 select-none",
16092
- children: value
16093
- },
16094
- index
16095
- )),
16096
- /* @__PURE__ */ (0, import_jsx_runtime159.jsx)("span", { className: "col-start-1 row-start-1", children: !activeIds.has(series.id) ? labels.eventItemDetails.comparisonHiddenSeries : series.pending ? labels.common.loading : series.points.length === 0 ? labels.eventItemDetails.marketHistoryUnavailable : series.current != null ? formatDefaultChartValue(series.current * 100) : formatDefaultChartValue(series.points.at(-1).value) })
16097
- ] })
16098
- ]
16099
- },
16100
- series.id
16101
- ))
16054
+ market.id
16055
+ );
16056
+ })
16102
16057
  }
16103
16058
  ),
16104
16059
  visibleSeries.length === 0 && allSeries.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime159.jsx)(
@@ -16634,7 +16589,7 @@ var init_item_details = __esm({
16634
16589
  recurringMarkets,
16635
16590
  sportsLiveState
16636
16591
  }) => {
16637
- var _a, _b, _c, _d, _e, _f, _g;
16592
+ var _a, _b, _c, _d, _e, _f;
16638
16593
  const [selectedChartType, setSelectedChartType] = (0, import_react36.useState)("line");
16639
16594
  const [chartView, setChartView] = (0, import_react36.useState)(defaultChartView);
16640
16595
  const lastAppliedEventSyncKeyRef = (0, import_react36.useRef)(null);
@@ -16962,7 +16917,6 @@ var init_item_details = __esm({
16962
16917
  {
16963
16918
  markets: event.venueMarkets,
16964
16919
  defaultVenue: event.venue,
16965
- selectedOutcomeId: (tradingContext == null ? void 0 : tradingContext.selectedEventId) === event.id ? tradingContext.selectedOutcomeId : (_f = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.venueMarketOutcomes[0]) == null ? void 0 : _f.id,
16966
16920
  eventEndDate: event.endDate,
16967
16921
  contractWindow,
16968
16922
  range: chartRangeOverride != null ? chartRangeOverride : config.chart.selectedChartTimeRange,
@@ -16977,7 +16931,7 @@ var init_item_details = __esm({
16977
16931
  selectedChartType,
16978
16932
  venueInfo,
16979
16933
  venueMarkets,
16980
- selectedMarketId: (_g = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.id) != null ? _g : null,
16934
+ selectedMarketId: (_f = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.id) != null ? _f : null,
16981
16935
  livePrices,
16982
16936
  restMidpoints,
16983
16937
  bestMidpoint,
@@ -31275,7 +31229,7 @@ var init_event_market_shared = __esm({
31275
31229
  });
31276
31230
 
31277
31231
  // src/pages/event-market/sports-event-market.utils.ts
31278
- var SPORTS_MARKET_TYPE_KEYS, SPORTS_PERIOD_KEYS, SPORTS_PERIOD_GRAMMAR_PATTERN, SPORTS_MARKET_CATEGORY_KEYS, SPORTS_MARKET_GROUP_KEYS, SPORTS_PERIOD_KEY_SET, SPORTS_MARKET_TYPE_KEY_SET, SPORTS_MARKET_CATEGORY_KEY_SET, SPORTS_MARKET_GROUP_KEY_SET, SPORTS_LEGACY_PROP_CATEGORY_KEY_SET, SPORTS_GAME_LINE_GROUPS, SPORTS_GENERIC_STAT, ESPORTS_CATEGORY_TOKENS, ESPORTS_TITLE_PATTERN, SERIES_SCOPE_PATTERN, SPORTS_PERIOD_ORDER, FIRST_N_INNINGS_PATTERN, SPORTS_MARKET_TYPE_ORDER, YES_NO_LABELS, LINE_MARKET_TYPES, PLAYER_PROP_COUNT_PATTERN, REG_TIME_TITLE_PATTERN, toTrimmedString, resolveSportsMarketAggKey, sanitizeFamilyValue, stripLineValueFromQuestion, SPORTS_PERIOD_FAMILY_ORDER, getSportsPeriodOrderIndex, getSportsMarketTypeOrderIndex, resolveSportsPeriodFamily, normalizeSportsPeriod, normalizeSportsMarketType, normalizeSportsMarketCategory, normalizeSportsMarketGroup, resolveFallbackSportsMarketCategory, resolveSportsStatToken, resolveMarketSectionTabKey, SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS, PERIOD_N_FAMILY_PATTERN, isPeriodFamilyAllowedForSport, resolveEffectiveMarketSectionTabKey, resolveVisibleSportsSectionTabs, resolveSportsSectionFilters, hasTeamTitledOutcomes, isClusterRelation, isDecomposedLeg, singleEnumeratesLegs, dropDecomposedLegsMergedIntoSingle, resolveSportsSectionMarkets, resolveSportsMarketCardVariant, isBinarySportsMoneylineMarket, AGGKEY_LINE_TOKEN_PATTERN, resolveSportsLineFamilyKey, resolveSpreadFamilyKey, SPREAD_KEY_LEG_PATTERN, resolveSpreadKeyLeg, isSpreadUnderdogLeg, resolveSpreadAnchorToken, SPREAD_NON_TEAM_TITLE_PATTERN, isSpreadTeamTitle, resolveSpreadOutcomeTeamNames, resolveCombinedMoneylineLegLabel, normalizeSportsSubtypeToken, SPORTS_LEG_GROUPABLE_GROUPS, resolveDisplayGroupFamilyKey, resolveMarketOwnCardKey, LEG_GROUP_KEY_MARKER, TOTAL_STAT_UNITS, resolveTotalStatUnit, SPORTS_LEG_TITLE_OVERRIDES, SPORTS_LEG_TITLE_SMALL_WORDS, formatSportsLegTitle, resolveDisplayGroupTitle, sortMarketsByLineValue, buildSportsMarketDisplayGroups, groupSportsMarketsByPeriod, resolveSelectedSportsLineValue, collectVenueNames, resolveTotalGroupVolume, resolveSportsExpandedMarkets, resolveSportsExpandedMarketsVolume, resolveHighestVolumeIndex, resolveSportsCombinedLegs, resolveSlideKind, aggregateSportsLineStops, escapeRegExp, resolveSportsLadderTitle, buildSportsSlideFromGroup, formatSportsPeriodGrammarLabel, resolveSportsCategoryTokens, isNonStandardSportsLikeEvent, mergeSportsSectionMarketsIntoEvent;
31232
+ var SPORTS_MARKET_TYPE_KEYS, SPORTS_PERIOD_KEYS, SPORTS_PERIOD_GRAMMAR_PATTERN, SPORTS_MARKET_CATEGORY_KEYS, SPORTS_MARKET_GROUP_KEYS, SPORTS_PERIOD_KEY_SET, SPORTS_MARKET_TYPE_KEY_SET, SPORTS_MARKET_CATEGORY_KEY_SET, SPORTS_MARKET_GROUP_KEY_SET, SPORTS_LEGACY_PROP_CATEGORY_KEY_SET, SPORTS_GAME_LINE_GROUPS, SPORTS_GENERIC_STAT, ESPORTS_CATEGORY_TOKENS, ESPORTS_TITLE_PATTERN, SERIES_SCOPE_PATTERN, SPORTS_PERIOD_ORDER, FIRST_N_INNINGS_PATTERN, SPORTS_MARKET_TYPE_ORDER, YES_NO_LABELS, LINE_MARKET_TYPES, PLAYER_PROP_COUNT_PATTERN, REG_TIME_TITLE_PATTERN, toTrimmedString, resolveSportsMarketAggKey, sanitizeFamilyValue, stripLineValueFromQuestion, SPORTS_PERIOD_FAMILY_ORDER, getSportsPeriodOrderIndex, getSportsMarketTypeOrderIndex, resolveSportsPeriodFamily, normalizeSportsPeriod, normalizeSportsMarketType, normalizeSportsMarketCategory, normalizeSportsMarketGroup, resolveFallbackSportsMarketCategory, resolveSportsStatToken, resolveMarketSectionTabKey, SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS, PERIOD_N_FAMILY_PATTERN, isPeriodFamilyAllowedForSport, resolveEffectiveMarketSectionTabKey, resolveVisibleSportsSectionTabs, resolveSportsSectionFilters, hasTeamTitledOutcomes, isClusterRelation, isDecomposedLeg, singleEnumeratesLegs, dropDecomposedLegsMergedIntoSingle, resolveSportsSectionMarkets, resolveSportsMarketCardVariant, isBinarySportsMoneylineMarket, AGGKEY_LINE_TOKEN_PATTERN, resolveSportsLineFamilyKey, resolveSpreadFamilyKey, SPREAD_KEY_LEG_PATTERN, resolveSpreadKeyLeg, isSpreadUnderdogLeg, resolveSpreadAnchorToken, SPREAD_NON_TEAM_TITLE_PATTERN, isSpreadTeamTitle, resolveSpreadOutcomeTeamNames, resolveCombinedMoneylineLegLabel, normalizeSportsSubtypeToken, SPORTS_LEG_GROUPABLE_GROUPS, DRAW_OUTCOME_TITLE_PATTERN, isThreeWayMoneylineHub, resolveDisplayGroupFamilyKey, resolveMarketOwnCardKey, LEG_GROUP_KEY_MARKER, TOTAL_STAT_UNITS, resolveTotalStatUnit, SPORTS_LEG_TITLE_OVERRIDES, SPORTS_LEG_TITLE_SMALL_WORDS, formatSportsLegTitle, resolveDisplayGroupTitle, sortMarketsByLineValue, buildSportsMarketDisplayGroups, groupSportsMarketsByPeriod, resolveSelectedSportsLineValue, collectVenueNames, resolveTotalGroupVolume, resolveSportsExpandedMarkets, resolveSportsExpandedMarketsVolume, resolveHighestVolumeIndex, resolveSportsCombinedLegs, resolveSlideKind, aggregateSportsLineStops, escapeRegExp, resolveSportsLadderTitle, resolveDistanceFromEvenMoney, buildSportsSlideFromGroup, formatSportsPeriodGrammarLabel, resolveSportsCategoryTokens, isNonStandardSportsLikeEvent, mergeSportsSectionMarketsIntoEvent;
31279
31233
  var init_sports_event_market_utils = __esm({
31280
31234
  "src/pages/event-market/sports-event-market.utils.ts"() {
31281
31235
  "use strict";
@@ -31686,6 +31640,7 @@ var init_sports_event_market_utils = __esm({
31686
31640
  }
31687
31641
  if (tab.kind !== "game_lines") return filteredSectionMarkets;
31688
31642
  const dedupeEventMarketsOfType = (type) => {
31643
+ var _a, _b, _c, _d;
31689
31644
  const dedupedMarkets = [];
31690
31645
  const keptIndexByKey = /* @__PURE__ */ new Map();
31691
31646
  for (const market of eventMarkets) {
@@ -31696,6 +31651,10 @@ var init_sports_event_market_utils = __esm({
31696
31651
  const keptIndex = keptIndexByKey.get(key);
31697
31652
  if (keptIndex !== void 0) {
31698
31653
  const kept = dedupedMarkets[keptIndex];
31654
+ if (hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market) && ((_b = (_a = kept.venueMarketOutcomes) == null ? void 0 : _a.length) != null ? _b : 0) !== ((_d = (_c = market.venueMarketOutcomes) == null ? void 0 : _c.length) != null ? _d : 0)) {
31655
+ dedupedMarkets.push(market);
31656
+ continue;
31657
+ }
31699
31658
  if (!hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market)) {
31700
31659
  dedupedMarkets[keptIndex] = market;
31701
31660
  }
@@ -31825,6 +31784,12 @@ var init_sports_event_market_utils = __esm({
31825
31784
  "specials",
31826
31785
  "completion"
31827
31786
  ]);
31787
+ DRAW_OUTCOME_TITLE_PATTERN = /\b(draw|tie)\b/i;
31788
+ isThreeWayMoneylineHub = (market) => {
31789
+ var _a, _b;
31790
+ const outcomes = (_a = market.venueMarketOutcomes) != null ? _a : [];
31791
+ return normalizeSportsMarketType(market.sportsMarketType) === "moneyline" && normalizeSportsMarketGroup(market.marketGroup) === "game_lines" && normalizeSportsPeriod(market.period) === "full" && outcomes.length === 3 && outcomes.filter((outcome) => DRAW_OUTCOME_TITLE_PATTERN.test(toTrimmedString(outcome.title))).length === 1 && ((_b = market.matchedVenueMarkets) != null ? _b : []).length > 0;
31792
+ };
31828
31793
  resolveDisplayGroupFamilyKey = (market, sport) => {
31829
31794
  var _a, _b, _c;
31830
31795
  const normalizedQuestion = sanitizeFamilyValue(toTrimmedString(market.question));
@@ -31834,7 +31799,7 @@ var init_sports_event_market_utils = __esm({
31834
31799
  const sportsMarketType = (_b = normalizeSportsMarketType(market.sportsMarketType)) != null ? _b : "other";
31835
31800
  const period = normalizeSportsPeriod(market.period);
31836
31801
  const marketCategory = (_c = normalizeSportsMarketCategory(market.marketCategory)) != null ? _c : "other";
31837
- if (isBinarySportsMoneylineMarket(market)) {
31802
+ if (isBinarySportsMoneylineMarket(market) || isThreeWayMoneylineHub(market)) {
31838
31803
  return `${period}|moneyline|${marketCategory}`;
31839
31804
  }
31840
31805
  if (sportsMarketType === "to_advance") {
@@ -31898,7 +31863,7 @@ var init_sports_event_market_utils = __esm({
31898
31863
  resolveDisplayGroupTitle = (market, groupMarkets = [market], sport, isCombinedLegGroup = false) => {
31899
31864
  const sportsMarketType = normalizeSportsMarketType(market.sportsMarketType);
31900
31865
  const question = toTrimmedString(market.question);
31901
- if (isBinarySportsMoneylineMarket(market)) return "Moneyline";
31866
+ if (isBinarySportsMoneylineMarket(market) || isThreeWayMoneylineHub(market)) return "Moneyline";
31902
31867
  if (sportsMarketType === "to_advance") return "Team to Advance";
31903
31868
  if (sportsMarketType === "spread") return "Spreads";
31904
31869
  if (isCombinedLegGroup) {
@@ -32221,7 +32186,11 @@ var init_sports_event_market_utils = __esm({
32221
32186
  const pattern = new RegExp(`(^|[^\\d.])${escapeRegExp(anchorDisplay)}(?![\\d.])`);
32222
32187
  return pattern.test(group.title) ? group.title.replace(pattern, (_match, prefix) => `${prefix}${selectedLineDisplay}`) : group.title;
32223
32188
  };
32224
- buildSportsSlideFromGroup = (group) => {
32189
+ resolveDistanceFromEvenMoney = (market, prices) => {
32190
+ const price = market.venueMarketOutcomes.map((outcome) => prices == null ? void 0 : prices.get(outcome.id)).find((value) => value != null);
32191
+ return price == null ? Number.POSITIVE_INFINITY : Math.abs(price - 0.5);
32192
+ };
32193
+ buildSportsSlideFromGroup = (group, prices) => {
32225
32194
  const lineStops = group.hasLineVariants ? aggregateSportsLineStops(group.markets, group.sportsMarketType === "spread") : [];
32226
32195
  const hasLadder = lineStops.length > 1;
32227
32196
  const stops = hasLadder ? lineStops.map((lineStop) => ({
@@ -32229,10 +32198,16 @@ var init_sports_event_market_utils = __esm({
32229
32198
  venues: lineStop.venues,
32230
32199
  market: lineStop.representative
32231
32200
  })) : [];
32232
- const defaultStopIndex = hasLadder ? lineStops.reduce(
32233
- (bestIndex, lineStop, index) => lineStop.volume > lineStops[bestIndex].volume ? index : bestIndex,
32234
- 0
32235
- ) : 0;
32201
+ const evenMoneyDistances = lineStops.map(
32202
+ (lineStop) => resolveDistanceFromEvenMoney(lineStop.representative, prices)
32203
+ );
32204
+ const defaultStopIndex = hasLadder ? lineStops.reduce((bestIndex, lineStop, index) => {
32205
+ const best = lineStops[bestIndex];
32206
+ if (lineStop.volume !== best.volume) {
32207
+ return lineStop.volume > best.volume ? index : bestIndex;
32208
+ }
32209
+ return evenMoneyDistances[index] < evenMoneyDistances[bestIndex] ? index : bestIndex;
32210
+ }, 0) : 0;
32236
32211
  return {
32237
32212
  id: group.id,
32238
32213
  kind: resolveSlideKind(group),
@@ -32658,14 +32633,18 @@ var init_sports_market_card = __esm({
32658
32633
  midpointsFallbackVenues,
32659
32634
  midpointsResult
32660
32635
  }) => {
32661
- var _a, _b, _c, _d, _e, _f, _g, _h;
32636
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
32662
32637
  const labels = (0, import_hooks93.useLabels)();
32663
32638
  const {
32664
32639
  formatting: { formatCompactCurrency }
32665
32640
  } = (0, import_hooks93.useSdkUiConfig)();
32666
32641
  const tradingContext = (0, import_hooks93.useEventTradingContext)();
32667
- const slide = (0, import_react65.useMemo)(() => buildSportsSlideFromGroup(group), [group]);
32642
+ const linePrices = (_a = midpointsResult == null ? void 0 : midpointsResult.bestMidpointsByOutcomeId) != null ? _a : midpointsResult == null ? void 0 : midpointsResult.prices;
32643
+ const slide = (0, import_react65.useMemo)(() => buildSportsSlideFromGroup(group, linePrices), [group, linePrices]);
32668
32644
  const [selectedLineIndex, setSelectedLineIndex] = (0, import_react65.useState)(slide.defaultStopIndex);
32645
+ const userPickedLineRef = (0, import_react65.useRef)(false);
32646
+ const autoLineIndexRef = (0, import_react65.useRef)(slide.defaultStopIndex);
32647
+ const autoSelectedMarketIdRef = (0, import_react65.useRef)(null);
32669
32648
  const combinedLegs = (0, import_react65.useMemo)(() => resolveSportsCombinedLegs(group), [group]);
32670
32649
  const isCombinedLegGroup = combinedLegs != null;
32671
32650
  const combinedLegMarkets = (0, import_react65.useMemo)(
@@ -32694,11 +32673,30 @@ var init_sports_market_card = __esm({
32694
32673
  const matchedIndex = slide.stops.findIndex((stop) => stop.market.id === tradingMarketId);
32695
32674
  if (matchedIndex >= 0) setSelectedLineIndex(matchedIndex);
32696
32675
  }, [slide.hasLadder, slide.stops, tradingContext == null ? void 0 : tradingContext.selectedMarketId]);
32697
- const activeLegMarket = isCombinedLegGroup ? preferredResolvedLegMarket != null ? preferredResolvedLegMarket : (tradingContext == null ? void 0 : tradingContext.selectedMarketId) ? (_a = group.markets.find((market) => market.id === tradingContext.selectedMarketId)) != null ? _a : null : null : null;
32698
- const activeMarket = slide.hasLadder ? (_d = (_c = (_b = slide.stops[selectedLineIndex]) == null ? void 0 : _b.market) != null ? _c : group.markets[0]) != null ? _d : null : (_f = (_e = activeLegMarket != null ? activeLegMarket : combinedLegMarkets[0]) != null ? _e : group.markets[0]) != null ? _f : null;
32699
- const activeDefaultOutcome = isCombinedLegGroup && activeMarket ? (_g = activeMarket.venueMarketOutcomes.find(
32676
+ (0, import_react65.useEffect)(() => {
32677
+ var _a2;
32678
+ if (!slide.hasLadder || userPickedLineRef.current) return;
32679
+ const nextIndex = slide.defaultStopIndex;
32680
+ if (nextIndex === autoLineIndexRef.current) return;
32681
+ const tradingIndex = slide.stops.findIndex(
32682
+ (stop) => stop.market.id === (tradingContext == null ? void 0 : tradingContext.selectedMarketId)
32683
+ );
32684
+ if (tradingIndex >= 0 && (tradingContext == null ? void 0 : tradingContext.selectedMarketId) !== autoSelectedMarketIdRef.current) {
32685
+ return;
32686
+ }
32687
+ autoLineIndexRef.current = nextIndex;
32688
+ setSelectedLineIndex(nextIndex);
32689
+ const nextMarket = (_a2 = slide.stops[nextIndex]) == null ? void 0 : _a2.market;
32690
+ if (tradingIndex >= 0 && nextMarket) {
32691
+ autoSelectedMarketIdRef.current = nextMarket.id;
32692
+ tradingContext == null ? void 0 : tradingContext.selectMarket(nextMarket.id, nextMarket);
32693
+ }
32694
+ }, [slide.hasLadder, slide.defaultStopIndex, slide.stops, tradingContext]);
32695
+ const activeLegMarket = isCombinedLegGroup ? preferredResolvedLegMarket != null ? preferredResolvedLegMarket : (tradingContext == null ? void 0 : tradingContext.selectedMarketId) ? (_b = group.markets.find((market) => market.id === tradingContext.selectedMarketId)) != null ? _b : null : null : null;
32696
+ const activeMarket = slide.hasLadder ? (_e = (_d = (_c = slide.stops[selectedLineIndex]) == null ? void 0 : _c.market) != null ? _d : group.markets[0]) != null ? _e : null : (_g = (_f = activeLegMarket != null ? activeLegMarket : combinedLegMarkets[0]) != null ? _f : group.markets[0]) != null ? _g : null;
32697
+ const activeDefaultOutcome = isCombinedLegGroup && activeMarket ? (_h = activeMarket.venueMarketOutcomes.find(
32700
32698
  (outcome) => outcome.label.trim().toLowerCase() === "yes"
32701
- )) != null ? _g : activeMarket.venueMarketOutcomes[0] : activeMarket == null ? void 0 : activeMarket.venueMarketOutcomes[0];
32699
+ )) != null ? _h : activeMarket.venueMarketOutcomes[0] : activeMarket == null ? void 0 : activeMarket.venueMarketOutcomes[0];
32702
32700
  const wasExpandedRef = (0, import_react65.useRef)(isExpanded);
32703
32701
  (0, import_react65.useEffect)(() => {
32704
32702
  const justOpened = isExpanded && !wasExpandedRef.current;
@@ -32710,6 +32708,7 @@ var init_sports_market_card = __esm({
32710
32708
  if (hasInScopeOutcome) return;
32711
32709
  const firstOutcome = activeDefaultOutcome;
32712
32710
  if (firstOutcome) {
32711
+ autoSelectedMarketIdRef.current = activeMarket.id;
32713
32712
  tradingContext == null ? void 0 : tradingContext.selectMarketAndOutcome(activeMarket.id, firstOutcome.id);
32714
32713
  }
32715
32714
  }, [activeDefaultOutcome, isExpanded, activeMarket, tradingContext]);
@@ -32751,9 +32750,9 @@ var init_sports_market_card = __esm({
32751
32750
  if (!activeMarket) return null;
32752
32751
  const selectedStop = slide.hasLadder ? slide.stops[selectedLineIndex] : void 0;
32753
32752
  const cardTitle = selectedStop ? resolveSportsLadderTitle(group, selectedStop.value) : group.title;
32754
- const activeOutcome = (_h = activeMarket.venueMarketOutcomes.find(
32753
+ const activeOutcome = (_i = activeMarket.venueMarketOutcomes.find(
32755
32754
  (outcome) => outcome.id === (tradingContext == null ? void 0 : tradingContext.selectedOutcomeId)
32756
- )) != null ? _h : activeDefaultOutcome;
32755
+ )) != null ? _i : activeDefaultOutcome;
32757
32756
  const activeOutcomeVenueCount = (() => {
32758
32757
  var _a2, _b2;
32759
32758
  if (!activeOutcome) return collectVenueNames(activeMarket).length;
@@ -32795,6 +32794,7 @@ var init_sports_market_card = __esm({
32795
32794
  useSpreadOverride: slide.kind === "spread"
32796
32795
  });
32797
32796
  const nextOutcome = resolveOutcomeBySide(targetDisplayedOutcomes, selectedSide != null ? selectedSide : "left");
32797
+ userPickedLineRef.current = true;
32798
32798
  setSelectedLineIndex(index);
32799
32799
  if (nextOutcome) {
32800
32800
  tradingContext == null ? void 0 : tradingContext.selectMarketAndOutcome(targetMarket.id, nextOutcome.id);
package/dist/pages.mjs CHANGED
@@ -13,16 +13,16 @@ import {
13
13
  buildAggTxExplorerHref,
14
14
  formatShareAmount,
15
15
  useHomePageModals
16
- } from "./chunk-5PA5KLXN.mjs";
17
- import "./chunk-JLO2BGSF.mjs";
16
+ } from "./chunk-4IO5CRSG.mjs";
17
+ import "./chunk-LIB6TLLV.mjs";
18
18
  import {
19
19
  EventMarketPage,
20
20
  EventOpenOrders,
21
21
  EventOpenOrdersCard,
22
22
  formatRecurringCountdown,
23
23
  useEventOpenOrders
24
- } from "./chunk-DONMO42Q.mjs";
25
- import "./chunk-DWPBGMVJ.mjs";
24
+ } from "./chunk-NDD5IHAU.mjs";
25
+ import "./chunk-LTFRGJPL.mjs";
26
26
  import {
27
27
  DEPOSIT_MODAL_OPEN_EVENT,
28
28
  WITHDRAW_MODAL_OPEN_EVENT,