@agg-build/ui 4.21.0 → 4.21.1

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/events.js CHANGED
@@ -12792,64 +12792,32 @@ var formatContractChartTime = (timestamp) => {
12792
12792
 
12793
12793
  // src/events/item-details/event-markets-chart.utils.ts
12794
12794
  var import_hooks49 = require("@agg-build/hooks");
12795
- var EVENT_CHART_SERIES_LIMIT = 8;
12796
- function resolveEventChartSelectedOutcome(markets, venue, selectedOutcomeId) {
12797
- var _a, _b;
12798
- if (!selectedOutcomeId) return null;
12799
- const allMarkets = normalizeVenueMarketCluster(markets);
12800
- const market = allMarkets.find(
12801
- (item) => item.venueMarketOutcomes.some((outcome2) => outcome2.id === selectedOutcomeId)
12802
- );
12803
- const outcome = market == null ? void 0 : market.venueMarketOutcomes.find((item) => item.id === selectedOutcomeId);
12804
- if (!market || !outcome) return null;
12805
- return (_b = (_a = collectEligibleVenueOutcomes({
12806
- venueMarkets: normalizeVenueMarketCluster(markets, market.id),
12807
- selectedOutcomeLabel: outcome.label,
12808
- selectedOutcomeId
12809
- }).find((item) => item.venue === venue)) == null ? void 0 : _a.outcomeId) != null ? _b : null;
12810
- }
12811
- function resolveEventChartPage(outcomes, selectedOutcomeId, requestedPage) {
12795
+ var EVENT_CHART_MARKET_LIMIT = 3;
12796
+ var marketVolume = (market) => {
12812
12797
  var _a;
12813
- const pinned = outcomes.find((outcome) => outcome.id === selectedOutcomeId);
12814
- const remaining = outcomes.filter((outcome) => outcome.id !== (pinned == null ? void 0 : pinned.id));
12815
- const pageSize = EVENT_CHART_SERIES_LIMIT - (pinned ? 1 : 0);
12816
- const pageCount = Math.max(1, Math.ceil(remaining.length / pageSize));
12817
- const page = Math.max(0, Math.min(requestedPage, pageCount - 1));
12818
- return {
12819
- page,
12820
- pageCount,
12821
- pinnedId: (_a = pinned == null ? void 0 : pinned.id) != null ? _a : null,
12822
- outcomes: [
12823
- ...pinned ? [pinned] : [],
12824
- ...remaining.slice(page * pageSize, (page + 1) * pageSize)
12825
- ]
12826
- };
12827
- }
12828
- var resolveEventChartOutcomes = (markets, venue, eventEndDate) => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue).sort(
12829
- (left, right) => {
12830
- var _a, _b;
12831
- return ((_a = right.volume) != null ? _a : 0) - ((_b = left.volume) != null ? _b : 0) || left.id.localeCompare(right.id);
12832
- }
12833
- ).flatMap((market) => {
12798
+ return Number.isFinite(market.volume) ? Math.max(0, (_a = market.volume) != null ? _a : 0) : 0;
12799
+ };
12800
+ var resolveTopEventChartMarkets = (markets, venue) => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue && market.venueMarketOutcomes.length > 0).sort(
12801
+ (left, right) => marketVolume(right) - marketVolume(left) || left.id.localeCompare(right.id)
12802
+ ).slice(0, EVENT_CHART_MARKET_LIMIT);
12803
+ var resolveEventChartOutcomes = (markets, venue, eventEndDate) => resolveTopEventChartMarkets(markets, venue).flatMap((market) => {
12834
12804
  var _a, _b, _c;
12835
12805
  const state = (0, import_hooks49.resolveMarketTradingState)(market);
12836
12806
  const hasFinalResult = state.kind === "resolved" && market.venueMarketOutcomes.some((outcome) => outcome.winner === true) && market.venueMarketOutcomes.every((outcome) => outcome.winner != null);
12837
12807
  const settledAt = Date.parse((_c = (_b = (_a = market.resolutionDate) != null ? _a : market.endDate) != null ? _b : eventEndDate) != null ? _c : "") / 1e3;
12838
- const ordered = [...market.venueMarketOutcomes].sort((a, b) => {
12839
- const rank = (label2) => label2.trim().toLowerCase() === "yes" ? 0 : label2.trim().toLowerCase() === "no" ? 1 : 2;
12840
- return rank(a.label) - rank(b.label);
12841
- });
12808
+ const ordered = sortOutcomeSelectorOutcomes(market.venueMarketOutcomes);
12842
12809
  return ordered.map((outcome) => {
12843
- var _a2;
12810
+ var _a2, _b2;
12844
12811
  return {
12845
12812
  id: outcome.id,
12846
12813
  marketId: market.id,
12847
12814
  venue: market.venue,
12848
12815
  side: outcome.label,
12816
+ outcomeLabel: ((_a2 = outcome.title) == null ? void 0 : _a2.trim()) || outcome.label,
12849
12817
  live: !state.isTradingDisabled,
12850
12818
  finalValue: hasFinalResult ? outcome.winner ? 100 : 0 : void 0,
12851
12819
  settledAt: Number.isFinite(settledAt) ? settledAt : void 0,
12852
- label: `${market.question} \xB7 ${((_a2 = outcome.title) == null ? void 0 : _a2.trim()) || outcome.label}`
12820
+ label: `${market.question} \xB7 ${((_b2 = outcome.title) == null ? void 0 : _b2.trim()) || outcome.label}`
12853
12821
  };
12854
12822
  });
12855
12823
  });
@@ -12862,8 +12830,7 @@ var EventMarketsChart = ({
12862
12830
  eventEndDate,
12863
12831
  contractWindow,
12864
12832
  range,
12865
- live,
12866
- selectedOutcomeId
12833
+ live
12867
12834
  }) => {
12868
12835
  var _a, _b, _c, _d, _e, _f, _g;
12869
12836
  const labels = (0, import_hooks50.useLabels)();
@@ -12875,31 +12842,20 @@ var EventMarketsChart = ({
12875
12842
  () => [...new Set(normalizeVenueMarketCluster(markets).map((market) => market.venue))],
12876
12843
  [markets]
12877
12844
  );
12878
- const venue = venues.includes(defaultVenue) ? defaultVenue : (_a = venues[0]) != null ? _a : defaultVenue;
12879
- const outcomes = (0, import_react22.useMemo)(
12880
- () => resolveEventChartOutcomes(markets, venue, eventEndDate),
12881
- [markets, venue, eventEndDate]
12882
- );
12883
12845
  const [selection, setSelection] = (0, import_react22.useState)(() => ({
12884
- venue,
12885
- page: 0,
12846
+ defaultVenue,
12847
+ venue: defaultVenue,
12886
12848
  hidden: /* @__PURE__ */ new Set()
12887
12849
  }));
12888
- const currentSelection = (0, import_react22.useMemo)(
12889
- () => selection.venue === venue ? selection : { venue, page: 0, hidden: /* @__PURE__ */ new Set() },
12890
- [selection, venue]
12891
- );
12892
- const pinnedOutcomeId = (0, import_react22.useMemo)(
12893
- () => resolveEventChartSelectedOutcome(markets, venue, selectedOutcomeId),
12894
- [markets, venue, selectedOutcomeId]
12895
- );
12896
- const page = (0, import_react22.useMemo)(
12897
- () => resolveEventChartPage(outcomes, pinnedOutcomeId, currentSelection.page),
12898
- [outcomes, pinnedOutcomeId, currentSelection.page]
12899
- );
12900
- const activeOutcomes = page.outcomes.filter(
12901
- (outcome) => outcome.id === page.pinnedId || !currentSelection.hidden.has(outcome.id)
12850
+ const requestedVenue = selection.defaultVenue === defaultVenue ? selection.venue : defaultVenue;
12851
+ const venue = venues.includes(requestedVenue) ? requestedVenue : (_a = venues[0]) != null ? _a : defaultVenue;
12852
+ const hidden = selection.defaultVenue === defaultVenue && selection.venue === venue ? selection.hidden : /* @__PURE__ */ new Set();
12853
+ const topMarkets = (0, import_react22.useMemo)(() => resolveTopEventChartMarkets(markets, venue), [markets, venue]);
12854
+ const outcomes = (0, import_react22.useMemo)(
12855
+ () => resolveEventChartOutcomes(topMarkets, venue, eventEndDate),
12856
+ [topMarkets, venue, eventEndDate]
12902
12857
  );
12858
+ const activeOutcomes = outcomes.filter((outcome) => !hidden.has(outcome.id));
12903
12859
  const activeIds = new Set(activeOutcomes.map((outcome) => outcome.id));
12904
12860
  const rollingWindow = (0, import_hooks50.useRollingChartWindow)({
12905
12861
  range,
@@ -12932,10 +12888,10 @@ var EventMarketsChart = ({
12932
12888
  live: live && !windowEnded
12933
12889
  });
12934
12890
  const stableColorIds = (0, import_react22.useMemo)(
12935
- () => [...new Set(outcomes.map((outcome) => outcome.marketId))].sort(),
12936
- [outcomes]
12891
+ () => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue).map((market) => market.id).sort(),
12892
+ [markets, venue]
12937
12893
  );
12938
- const allSeries = page.outcomes.map((outcome) => {
12894
+ const allSeries = outcomes.map((outcome) => {
12939
12895
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h, _i;
12940
12896
  const settledAt = outcome.settledAt == null ? void 0 : contractWindow ? Math.min(outcome.settledAt, contractWindow.to) : outcome.settledAt;
12941
12897
  const outcomeLive = outcome.live && !windowEnded;
@@ -12971,110 +12927,109 @@ var EventMarketsChart = ({
12971
12927
  });
12972
12928
  const visibleSeries = allSeries.filter((series) => activeIds.has(series.id));
12973
12929
  const hasVisibleHistory = visibleSeries.some((series) => series.points.length > 0);
12974
- const volume = (0, import_react22.useMemo)(
12975
- () => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue).reduce((sum, market) => {
12930
+ const volume = topMarkets.reduce(
12931
+ (sum, market) => {
12976
12932
  var _a2;
12977
- return sum + ((_a2 = market.volume) != null ? _a2 : 0);
12978
- }, 0),
12979
- [markets, venue]
12933
+ return sum + (Number.isFinite(market.volume) ? Math.max(0, (_a2 = market.volume) != null ? _a2 : 0) : 0);
12934
+ },
12935
+ 0
12980
12936
  );
12981
12937
  const venueLabel = (_g = labels.venues[venue]) != null ? _g : venue;
12982
12938
  return /* @__PURE__ */ (0, import_jsx_runtime143.jsxs)("div", { className: "agg-event-markets-chart flex flex-col gap-3", children: [
12983
- /* @__PURE__ */ (0, import_jsx_runtime143.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-2 text-agg-sm text-agg-muted-foreground", children: [
12984
- /* @__PURE__ */ (0, import_jsx_runtime143.jsx)("span", { role: "status", children: labels.eventItemDetails.comparisonSeriesCount(activeOutcomes.length, outcomes.length) }),
12985
- page.pageCount > 1 ? /* @__PURE__ */ (0, import_jsx_runtime143.jsxs)("div", { className: "flex items-center gap-2", children: [
12986
- /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
12987
- Button,
12988
- {
12989
- variant: "tertiary",
12990
- size: "small",
12991
- disabled: page.page === 0,
12992
- onClick: (event) => {
12993
- event.stopPropagation();
12994
- setSelection(__spreadProps(__spreadValues({}, currentSelection), { page: page.page - 1 }));
12995
- },
12996
- prefix: /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(Icon, { name: "chevron-left", size: "small" }),
12997
- children: labels.eventItemDetails.comparisonPreviousSeries
12998
- }
12999
- ),
13000
- /* @__PURE__ */ (0, import_jsx_runtime143.jsx)("span", { children: labels.eventItemDetails.comparisonSeriesPage(page.page + 1, page.pageCount) }),
13001
- /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
13002
- Button,
13003
- {
13004
- variant: "tertiary",
13005
- size: "small",
13006
- disabled: page.page + 1 === page.pageCount,
13007
- onClick: (event) => {
13008
- event.stopPropagation();
13009
- setSelection(__spreadProps(__spreadValues({}, currentSelection), { page: page.page + 1 }));
13010
- },
13011
- suffix: /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(Icon, { name: "chevron-right", size: "small" }),
13012
- children: labels.eventItemDetails.comparisonNextSeries
13013
- }
13014
- )
13015
- ] }) : null
13016
- ] }),
13017
- outcomes.length > EVENT_CHART_SERIES_LIMIT ? /* @__PURE__ */ (0, import_jsx_runtime143.jsx)("p", { className: "text-agg-xs text-agg-muted-foreground", children: labels.eventItemDetails.comparisonSeriesBudget(EVENT_CHART_SERIES_LIMIT) }) : null,
12939
+ /* @__PURE__ */ (0, import_jsx_runtime143.jsx)("div", { className: "agg-market-badges flex min-w-0 gap-2 overflow-x-auto pb-1 md:flex-wrap", children: venues.map((item) => {
12940
+ var _a2, _b2;
12941
+ return /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
12942
+ "button",
12943
+ {
12944
+ type: "button",
12945
+ "aria-label": (_a2 = labels.venues[item]) != null ? _a2 : item,
12946
+ "aria-pressed": venue === item,
12947
+ className: "agg-market-badge cursor-pointer rounded-agg-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
12948
+ onClick: (event) => {
12949
+ event.preventDefault();
12950
+ event.stopPropagation();
12951
+ if (item !== venue) setSelection({ defaultVenue, venue: item, hidden: /* @__PURE__ */ new Set() });
12952
+ },
12953
+ children: /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
12954
+ Badge,
12955
+ {
12956
+ text: (_b2 = labels.venues[item]) != null ? _b2 : item,
12957
+ prefix: /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(VenueLogo, { venue: item, size: "small", title: item }),
12958
+ size: "large",
12959
+ isActive: venue === item,
12960
+ classNames: { root: "shrink-0 border px-4 h-8 md:h-9" }
12961
+ }
12962
+ )
12963
+ },
12964
+ item
12965
+ );
12966
+ }) }),
13018
12967
  /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
13019
12968
  "div",
13020
12969
  {
13021
12970
  role: "group",
13022
12971
  "aria-label": labels.eventItemDetails.chartLegend,
13023
- className: "flex flex-wrap gap-x-5 gap-y-2",
13024
- children: allSeries.map((series) => /* @__PURE__ */ (0, import_jsx_runtime143.jsxs)(
13025
- "button",
13026
- {
13027
- type: "button",
13028
- "data-chart-outcome-id": series.id,
13029
- "aria-pressed": activeIds.has(series.id),
13030
- disabled: series.id === page.pinnedId,
13031
- onClick: (event) => {
13032
- event.stopPropagation();
13033
- setSelection(() => {
13034
- const next = new Set(currentSelection.hidden);
13035
- if (next.has(series.id)) next.delete(series.id);
13036
- else next.add(series.id);
13037
- return __spreadProps(__spreadValues({}, currentSelection), { hidden: next });
13038
- });
12972
+ className: "flex flex-col gap-2",
12973
+ children: topMarkets.map((market) => {
12974
+ var _a2;
12975
+ return /* @__PURE__ */ (0, import_jsx_runtime143.jsxs)(
12976
+ "div",
12977
+ {
12978
+ "data-chart-market-id": market.id,
12979
+ className: "flex min-w-0 flex-wrap items-center justify-between gap-x-4 gap-y-1",
12980
+ children: [
12981
+ /* @__PURE__ */ (0, import_jsx_runtime143.jsxs)("span", { className: "flex min-w-0 items-center gap-2 text-agg-sm text-agg-foreground", children: [
12982
+ /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
12983
+ "span",
12984
+ {
12985
+ "aria-hidden": "true",
12986
+ className: "h-0 w-4 shrink-0 border-t-2",
12987
+ style: {
12988
+ borderColor: (_a2 = allSeries.find((series) => series.marketId === market.id)) == null ? void 0 : _a2.color
12989
+ }
12990
+ }
12991
+ ),
12992
+ /* @__PURE__ */ (0, import_jsx_runtime143.jsx)("span", { className: "truncate", title: market.question, children: market.question })
12993
+ ] }),
12994
+ /* @__PURE__ */ (0, import_jsx_runtime143.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) => {
12995
+ const value = !activeIds.has(series.id) ? labels.eventItemDetails.comparisonHiddenSeries : series.pending ? labels.common.loading : series.points.length === 0 ? labels.eventItemDetails.marketHistoryUnavailable : formatDefaultChartValue(
12996
+ series.current != null ? series.current * 100 : series.points.at(-1).value
12997
+ );
12998
+ return /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
12999
+ "button",
13000
+ {
13001
+ type: "button",
13002
+ "data-chart-outcome-id": series.id,
13003
+ "aria-label": `${series.label} ${value}`,
13004
+ "aria-pressed": activeIds.has(series.id),
13005
+ title: `${series.label} ${value}`,
13006
+ className: "cursor-pointer rounded-agg-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
13007
+ onClick: (event) => {
13008
+ event.preventDefault();
13009
+ event.stopPropagation();
13010
+ const next = new Set(hidden);
13011
+ if (next.has(series.id)) next.delete(series.id);
13012
+ else next.add(series.id);
13013
+ setSelection({ defaultVenue, venue, hidden: next });
13014
+ },
13015
+ children: /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
13016
+ Badge,
13017
+ {
13018
+ text: `${series.outcomeLabel} ${value}`,
13019
+ size: "large",
13020
+ isActive: activeIds.has(series.id),
13021
+ classNames: { root: "h-8 w-36 border px-4 tabular-nums md:h-9" }
13022
+ }
13023
+ )
13024
+ },
13025
+ series.id
13026
+ );
13027
+ }) })
13028
+ ]
13039
13029
  },
13040
- 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",
13041
- style: { opacity: activeIds.has(series.id) ? 1 : 0.4 },
13042
- children: [
13043
- /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
13044
- "span",
13045
- {
13046
- "aria-hidden": "true",
13047
- className: "h-0 w-4 shrink-0 border-t-2",
13048
- style: {
13049
- borderColor: series.color,
13050
- borderTopStyle: series.lineStyle === "dashed" ? "dashed" : "solid"
13051
- }
13052
- }
13053
- ),
13054
- /* @__PURE__ */ (0, import_jsx_runtime143.jsx)("span", { className: "min-w-0 text-left [overflow-wrap:anywhere]", children: series.label }),
13055
- series.id === page.pinnedId ? /* @__PURE__ */ (0, import_jsx_runtime143.jsx)("span", { children: labels.eventItemDetails.comparisonSelectedSeries }) : null,
13056
- /* @__PURE__ */ (0, import_jsx_runtime143.jsxs)("span", { className: "inline-grid shrink-0 items-center font-agg-semibold tabular-nums", children: [
13057
- [
13058
- formatDefaultChartValue(100),
13059
- formatDefaultChartValue(99.9),
13060
- labels.common.loading,
13061
- labels.eventItemDetails.comparisonHiddenSeries,
13062
- labels.eventItemDetails.marketHistoryUnavailable
13063
- ].map((value, index) => /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
13064
- "span",
13065
- {
13066
- "aria-hidden": "true",
13067
- className: "invisible col-start-1 row-start-1 select-none",
13068
- children: value
13069
- },
13070
- index
13071
- )),
13072
- /* @__PURE__ */ (0, import_jsx_runtime143.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) })
13073
- ] })
13074
- ]
13075
- },
13076
- series.id
13077
- ))
13030
+ market.id
13031
+ );
13032
+ })
13078
13033
  }
13079
13034
  ),
13080
13035
  visibleSeries.length === 0 && allSeries.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime143.jsx)(
@@ -13576,7 +13531,7 @@ var EventListItemDetailsContent = ({
13576
13531
  recurringMarkets,
13577
13532
  sportsLiveState
13578
13533
  }) => {
13579
- var _a, _b, _c, _d, _e, _f, _g;
13534
+ var _a, _b, _c, _d, _e, _f;
13580
13535
  const [selectedChartType, setSelectedChartType] = (0, import_react23.useState)("line");
13581
13536
  const [chartView, setChartView] = (0, import_react23.useState)(defaultChartView);
13582
13537
  const lastAppliedEventSyncKeyRef = (0, import_react23.useRef)(null);
@@ -13904,7 +13859,6 @@ var EventListItemDetailsContent = ({
13904
13859
  {
13905
13860
  markets: event.venueMarkets,
13906
13861
  defaultVenue: event.venue,
13907
- selectedOutcomeId: (tradingContext == null ? void 0 : tradingContext.selectedEventId) === event.id ? tradingContext.selectedOutcomeId : (_f = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.venueMarketOutcomes[0]) == null ? void 0 : _f.id,
13908
13862
  eventEndDate: event.endDate,
13909
13863
  contractWindow,
13910
13864
  range: chartRangeOverride != null ? chartRangeOverride : config.chart.selectedChartTimeRange,
@@ -13919,7 +13873,7 @@ var EventListItemDetailsContent = ({
13919
13873
  selectedChartType,
13920
13874
  venueInfo,
13921
13875
  venueMarkets,
13922
- selectedMarketId: (_g = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.id) != null ? _g : null,
13876
+ selectedMarketId: (_f = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.id) != null ? _f : null,
13923
13877
  livePrices,
13924
13878
  restMidpoints,
13925
13879
  bestMidpoint,
package/dist/events.mjs CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  EventListItem,
6
6
  EventListItemV2,
7
7
  EventListVenueStrip
8
- } from "./chunk-JLO2BGSF.mjs";
8
+ } from "./chunk-LIB6TLLV.mjs";
9
9
  import {
10
10
  EventListItemDetails,
11
11
  MarketDetails,
@@ -20,7 +20,7 @@ import {
20
20
  orderbookRowLimitDefault,
21
21
  resolveEventDetailsSyncKey,
22
22
  useCenterOrderbookSpread
23
- } from "./chunk-DWPBGMVJ.mjs";
23
+ } from "./chunk-LTFRGJPL.mjs";
24
24
  import {
25
25
  formatProbabilityCents,
26
26
  resolveOrderBookRows,