@agg-build/ui 2.2.0 → 2.2.3

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 (42) hide show
  1. package/dist/{chunk-5MRFY5ZQ.mjs → chunk-4QGZ3FWI.mjs} +1 -1
  2. package/dist/{chunk-73MO7MYG.mjs → chunk-JOZPXDNZ.mjs} +30 -7
  3. package/dist/{chunk-TR7HUVY7.mjs → chunk-LPIAEKSZ.mjs} +82 -2
  4. package/dist/{chunk-BTRFSEPC.mjs → chunk-QM3WWPCV.mjs} +107 -29
  5. package/dist/{chunk-DTOI4V6P.mjs → chunk-TDLI6F55.mjs} +1155 -954
  6. package/dist/{chunk-MIAAL7BL.mjs → chunk-UTXQUOU3.mjs} +98 -4
  7. package/dist/{chunk-HNLA44SY.mjs → chunk-ZRYHWHTD.mjs} +2 -2
  8. package/dist/events.js +277 -31
  9. package/dist/events.mjs +3 -3
  10. package/dist/index.js +2003 -1534
  11. package/dist/index.mjs +9 -7
  12. package/dist/modals.js +2 -2
  13. package/dist/modals.mjs +3 -3
  14. package/dist/pages.js +1375 -908
  15. package/dist/pages.mjs +6 -6
  16. package/dist/primitives.js +4 -3
  17. package/dist/primitives.mjs +1 -1
  18. package/dist/styles.css +1 -1
  19. package/dist/tailwind.css +1 -1
  20. package/dist/trading.js +114 -6
  21. package/dist/trading.mjs +4 -4
  22. package/dist/types/events/item/event-list-item.types.d.mts +4 -0
  23. package/dist/types/events/item/event-list-item.types.d.ts +4 -0
  24. package/dist/types/events/item/event-list-item.utils.d.mts +1 -1
  25. package/dist/types/events/item/event-list-item.utils.d.ts +1 -1
  26. package/dist/types/events/item-details/event-list-item-details.types.d.mts +0 -5
  27. package/dist/types/events/item-details/event-list-item-details.types.d.ts +0 -5
  28. package/dist/types/events/item-details/event-list-item-details.utils.d.mts +9 -0
  29. package/dist/types/events/item-details/event-list-item-details.utils.d.ts +9 -0
  30. package/dist/types/events/shared/event-trading-state.utils.d.mts +4 -2
  31. package/dist/types/events/shared/event-trading-state.utils.d.ts +4 -2
  32. package/dist/types/pages/event-market/sports-event-market.utils.d.mts +1 -1
  33. package/dist/types/pages/event-market/sports-event-market.utils.d.ts +1 -1
  34. package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.mts +8 -0
  35. package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.ts +8 -0
  36. package/dist/types/pages/user-profile/index.d.mts +1 -1
  37. package/dist/types/pages/user-profile/index.d.ts +1 -1
  38. package/dist/types/pages/user-profile/user-profile.types.d.mts +14 -0
  39. package/dist/types/pages/user-profile/user-profile.types.d.ts +14 -0
  40. package/dist/types/shared/utils.d.mts +16 -0
  41. package/dist/types/shared/utils.d.ts +16 -0
  42. package/package.json +3 -3
@@ -3,7 +3,7 @@ import {
3
3
  AGG_TERMS_OF_SERVICE_URL,
4
4
  Icon,
5
5
  cn
6
- } from "./chunk-MIAAL7BL.mjs";
6
+ } from "./chunk-UTXQUOU3.mjs";
7
7
 
8
8
  // src/geo-block-banner/index.tsx
9
9
  import { useLabels } from "@agg-build/hooks";
@@ -8,11 +8,11 @@ import {
8
8
  getTradingValueLabel,
9
9
  getTradingVenueLabel,
10
10
  resolveOrderEligibilityMessage
11
- } from "./chunk-TR7HUVY7.mjs";
11
+ } from "./chunk-LPIAEKSZ.mjs";
12
12
  import {
13
13
  GeoBlockBanner,
14
14
  subscribeAggDepositNotification
15
- } from "./chunk-5MRFY5ZQ.mjs";
15
+ } from "./chunk-4QGZ3FWI.mjs";
16
16
  import {
17
17
  AGG_TERMS_OF_SERVICE_URL,
18
18
  Button,
@@ -41,9 +41,10 @@ import {
41
41
  formatSportsEventTimeEt,
42
42
  formatUsd,
43
43
  getMotionClassName,
44
+ resolveResolvedOutcomeLabel,
44
45
  skeletonViews,
45
46
  useOptionalToast
46
- } from "./chunk-MIAAL7BL.mjs";
47
+ } from "./chunk-UTXQUOU3.mjs";
47
48
 
48
49
  // src/trading/types.ts
49
50
  import { Venue, enumGuard, isFiniteNonNeg, safeParse } from "@agg-build/sdk";
@@ -2785,7 +2786,7 @@ var PlaceOrderResolvedView = ({
2785
2786
  className,
2786
2787
  isSportsEvent = false
2787
2788
  }) => {
2788
- var _a;
2789
+ var _a, _b;
2789
2790
  const labels = useLabels();
2790
2791
  const tradingLabels = labels.trading;
2791
2792
  const resolvingTimestamp = (_a = resolutionTimestamp != null ? resolutionTimestamp : tradingState.resolvesAt) != null ? _a : tradingState.endsAt;
@@ -2863,7 +2864,16 @@ var PlaceOrderResolvedView = ({
2863
2864
  ),
2864
2865
  children: [
2865
2866
  tradingState.market ? /* @__PURE__ */ jsx5(Typography, { variant: "body", className: "text-center", children: tradingState.market.question }) : null,
2866
- tradingState.winningOutcome ? /* @__PURE__ */ jsx5(Typography, { variant: "body-large-strong", children: tradingLabels.outcome(tradingState.winningOutcome.label) }) : null
2867
+ tradingState.winningOutcome ? /* @__PURE__ */ jsx5(Typography, { variant: "body-large-strong", children: tradingLabels.outcome(
2868
+ shouldUseRawResolvedPlaceOrderOutcomeLabel(
2869
+ tradingState.market,
2870
+ tradingState.winningOutcome
2871
+ ) ? tradingState.winningOutcome.label : (_b = resolveResolvedOutcomeLabel({
2872
+ market: tradingState.market,
2873
+ outcome: tradingState.winningOutcome,
2874
+ allowSportsMoneylineMarketFallback: false
2875
+ })) != null ? _b : tradingState.winningOutcome.label
2876
+ ) }) : null
2867
2877
  ]
2868
2878
  }
2869
2879
  )
@@ -2925,6 +2935,16 @@ var renderRouteBreakdownRow = (row) => {
2925
2935
  rowKey
2926
2936
  );
2927
2937
  };
2938
+ var SIDE_NAMED_MONEYLINE_QUESTION_RE = /\s(?:vs\.?|@|at)\s/i;
2939
+ var shouldUseRawResolvedPlaceOrderOutcomeLabel = (market, outcome) => {
2940
+ var _a, _b;
2941
+ if (!market || !outcome) return false;
2942
+ const isSportsMoneylineMarket = (market.sportsMarketType === "moneyline" || market.marketGroup === "game_lines") && (outcome.label.trim().toLowerCase() === "yes" || outcome.label.trim().toLowerCase() === "no");
2943
+ if (!isSportsMoneylineMarket) return false;
2944
+ const marketLabel = ((_b = (_a = market.shortTitle) != null ? _a : market.question) != null ? _b : "").trim();
2945
+ if (!marketLabel) return false;
2946
+ return !SIDE_NAMED_MONEYLINE_QUESTION_RE.test(marketLabel);
2947
+ };
2928
2948
  var renderRouteCard = ({
2929
2949
  card,
2930
2950
  enableAnimations,
@@ -5172,7 +5192,7 @@ function useResolvedMarketClaim(options = {}) {
5172
5192
  }, executionMode === "paper" ? { mode: "paper" } : {}));
5173
5193
  const claimWinnings = useClaimWinnings();
5174
5194
  return useMemo4(() => {
5175
- var _a2, _b, _c;
5195
+ var _a2;
5176
5196
  if (!shouldFetch || !marketId) return void 0;
5177
5197
  const group = positions.find(
5178
5198
  (candidate) => candidate.targetMarketId === marketId
@@ -5184,7 +5204,10 @@ function useResolvedMarketClaim(options = {}) {
5184
5204
  if (winningOutcomes.length === 0) return void 0;
5185
5205
  const totals = computeClosedPositionTotals(group);
5186
5206
  const winningShares = winningOutcomes.reduce((sum, outcome) => sum + outcome.totalSize, 0);
5187
- const winningOutcomeLabel = ((_b = (_a2 = winningOutcomes[0]) == null ? void 0 : _a2.title) == null ? void 0 : _b.trim()) || ((_c = winningOutcomes[0]) == null ? void 0 : _c.label) || "";
5207
+ const winningOutcomeLabel = (_a2 = resolveResolvedOutcomeLabel({
5208
+ market: market != null ? market : group.venueMarket,
5209
+ outcome: winningOutcomes[0]
5210
+ })) != null ? _a2 : "";
5188
5211
  const claimKey = group.targetMarketId;
5189
5212
  const canClaim = group.redeemStatus === "eligible" && totals.winningOutcomeIds.length > 0;
5190
5213
  return {
@@ -13,11 +13,12 @@ import {
13
13
  normalizeProbability,
14
14
  normalizeVenueMarketCluster,
15
15
  resolveOutcomeTitle,
16
+ resolveResolvedOutcomeLabel,
16
17
  resolveVenueLineColor,
17
18
  selectPrimaryVenueMarket,
18
19
  skeletonViews,
19
20
  sortOutcomes
20
- } from "./chunk-MIAAL7BL.mjs";
21
+ } from "./chunk-UTXQUOU3.mjs";
21
22
 
22
23
  // src/trading/trading-context/index.tsx
23
24
  import { useEventTradingContext } from "@agg-build/hooks";
@@ -508,6 +509,79 @@ var isDateLikeLabel = (value) => {
508
509
  if (!value.trim()) return false;
509
510
  return dayjs2(value).isValid();
510
511
  };
512
+ var CHART_RANGE_PRIORITY = ["1H", "6H", "1D", "1W", "1M", "ALL"];
513
+ var RANGE_SECONDS_BY_TIME_RANGE = {
514
+ "1H": 60 * 60,
515
+ "6H": 6 * 60 * 60,
516
+ "1D": 24 * 60 * 60,
517
+ "1W": 7 * 24 * 60 * 60,
518
+ "1M": 30 * 24 * 60 * 60,
519
+ ALL: 6 * 30 * 24 * 60 * 60
520
+ };
521
+ var toUnixTimestamp = (value) => {
522
+ if (!value) return null;
523
+ const parsedValue = dayjs2(value);
524
+ if (!parsedValue.isValid()) return null;
525
+ return parsedValue.unix();
526
+ };
527
+ var isResolvedMarketStatus = (status) => {
528
+ if (!status) return false;
529
+ const normalizedStatus = status.trim().toLowerCase();
530
+ return normalizedStatus.includes("resolved") || normalizedStatus.includes("closed") || normalizedStatus.includes("settled") || normalizedStatus.includes("final");
531
+ };
532
+ var resolveInitialEventDetailsChartRange = ({
533
+ chartData,
534
+ event,
535
+ fallbackRange,
536
+ nowSec = dayjs2().unix(),
537
+ selectedMarket
538
+ }) => {
539
+ var _a, _b;
540
+ const scopedMarkets = selectedMarket ? [selectedMarket] : event.venueMarkets;
541
+ const preferredEventStart = (_a = toUnixTimestamp(event.startDate)) != null ? _a : toUnixTimestamp(event.creationDate);
542
+ const marketStartCandidates = scopedMarkets.map((market) => {
543
+ var _a2;
544
+ return (_a2 = toUnixTimestamp(market.startDate)) != null ? _a2 : toUnixTimestamp(market.creationDate);
545
+ }).filter((value) => value != null);
546
+ const metadataStarts = [preferredEventStart, ...marketStartCandidates].filter(
547
+ (value) => value != null
548
+ );
549
+ const metadataEnds = [
550
+ toUnixTimestamp(event.endDate),
551
+ ...scopedMarkets.flatMap((market) => [
552
+ toUnixTimestamp(market.endDate),
553
+ toUnixTimestamp(market.resolutionDate)
554
+ ])
555
+ ].filter((value) => value != null);
556
+ const historyTimestamps = chartData == null ? [] : Object.values(chartData.venues).flatMap((venueData) => [
557
+ ...venueData.candles.map((candle) => candle.time),
558
+ ...venueData.liveCandle ? [venueData.liveCandle.time] : []
559
+ ]);
560
+ const startCandidates = [...metadataStarts, ...historyTimestamps];
561
+ if (startCandidates.length === 0) {
562
+ return fallbackRange != null ? fallbackRange : null;
563
+ }
564
+ const marketResolved = [event.status, ...scopedMarkets.map((market) => market.status)].some(
565
+ isResolvedMarketStatus
566
+ );
567
+ const isUsingSharedOverlapStart = scopedMarkets.length > 1 && marketStartCandidates.length === scopedMarkets.length;
568
+ const startTs = isUsingSharedOverlapStart ? Math.max(...marketStartCandidates) : Math.min(...startCandidates);
569
+ const endTs = Math.max(
570
+ ...marketResolved && metadataEnds.length > 0 ? [nowSec, ...metadataEnds, ...historyTimestamps] : [nowSec, ...historyTimestamps]
571
+ );
572
+ const spanSeconds = Math.max(0, endTs - startTs);
573
+ if (spanSeconds <= 0) {
574
+ return fallbackRange != null ? fallbackRange : null;
575
+ }
576
+ if (!marketResolved && spanSeconds > RANGE_SECONDS_BY_TIME_RANGE["1M"]) {
577
+ return "1M";
578
+ }
579
+ const requiredSeconds = spanSeconds * (isUsingSharedOverlapStart ? 1 : marketResolved ? 1.05 : 1.2);
580
+ const matchingRange = CHART_RANGE_PRIORITY.find((range) => {
581
+ return RANGE_SECONDS_BY_TIME_RANGE[range] >= requiredSeconds;
582
+ });
583
+ return (_b = matchingRange != null ? matchingRange : fallbackRange) != null ? _b : "ALL";
584
+ };
511
585
  var matchOutcomeByLabel = (outcome, selectedOutcomeLabel) => {
512
586
  const normalizedSelectedLabel = normalizeLabel(selectedOutcomeLabel);
513
587
  const semanticSelectedLabel = toSemanticLabel(selectedOutcomeLabel);
@@ -1122,8 +1196,13 @@ var resolveTradingStateTimestampLabel = (labels, state) => {
1122
1196
  return null;
1123
1197
  };
1124
1198
  var resolveTradingStatePresentation = (labels, state) => {
1199
+ var _a;
1125
1200
  const timestampLabel = resolveTradingStateTimestampLabel(labels, state);
1126
- const winningOutcomeLabel = state.winningOutcome ? labels.eventMarketPage.winningOutcome(state.winningOutcome.label) : null;
1201
+ const resolvedOutcomeLabel = resolveResolvedOutcomeLabel({
1202
+ market: (_a = state.market) != null ? _a : null,
1203
+ outcome: state.winningOutcome
1204
+ });
1205
+ const winningOutcomeLabel = resolvedOutcomeLabel ? labels.eventMarketPage.winningOutcome(resolvedOutcomeLabel) : null;
1127
1206
  if (state.kind === "resolved") {
1128
1207
  return {
1129
1208
  badgeLabel: labels.eventMarketPage.tradingResolvedBadge,
@@ -1211,6 +1290,7 @@ var resolveOrderEligibilityMessage = (labels, reason) => {
1211
1290
  export {
1212
1291
  useEventTradingContext,
1213
1292
  sortOutcomeSelectorOutcomes,
1293
+ resolveInitialEventDetailsChartRange,
1214
1294
  resolveOutcomesByVenue,
1215
1295
  resolveSeriesColor,
1216
1296
  resolveMarketChartVenueSeries,
@@ -7,6 +7,7 @@ import {
7
7
  getDisplayOutcomePrice,
8
8
  getFirstSettlementParagraph,
9
9
  resolveHeaderOutcomeItems,
10
+ resolveInitialEventDetailsChartRange,
10
11
  resolveInitialOutcomeLabel,
11
12
  resolveInitialTab,
12
13
  resolveMarketChartDisplaySeries,
@@ -22,7 +23,7 @@ import {
22
23
  resolveUnifiedOrderBookEntries,
23
24
  sortOutcomeSelectorOutcomes,
24
25
  useEventTradingContext
25
- } from "./chunk-TR7HUVY7.mjs";
26
+ } from "./chunk-LPIAEKSZ.mjs";
26
27
  import {
27
28
  AutocompleteSelect,
28
29
  Badge,
@@ -67,13 +68,14 @@ import {
67
68
  resolveDisplayVolume,
68
69
  resolveEventListItemEvent,
69
70
  resolveOutcomeTitle,
71
+ resolveResolvedOutcomeLabel,
70
72
  resolveTabVenus,
71
73
  resolveVenueLabel,
72
74
  resolveYesOutcome,
73
75
  sortCategoriesForNavigation,
74
76
  sortOutcomes,
75
77
  splitEventsByLifecycle
76
- } from "./chunk-MIAAL7BL.mjs";
78
+ } from "./chunk-UTXQUOU3.mjs";
77
79
 
78
80
  // src/events/item/index.tsx
79
81
  import {
@@ -326,6 +328,24 @@ var buildOutcomeMidpointsByOutcomeId = (midpointRows) => {
326
328
  }
327
329
  return outcomeMidpointsByOutcomeId;
328
330
  };
331
+ var buildArbReturnByVenueMarketId = (midpointRows) => {
332
+ const arbReturnByVenueMarketId = /* @__PURE__ */ new Map();
333
+ const addArbReturn = (value) => {
334
+ var _a, _b;
335
+ if (!value || typeof value !== "object") return;
336
+ const row = value;
337
+ if (row.venueMarketId && !arbReturnByVenueMarketId.has(row.venueMarketId)) {
338
+ arbReturnByVenueMarketId.set(row.venueMarketId, (_a = row.arbReturn) != null ? _a : null);
339
+ }
340
+ for (const matchedRow of (_b = row.matched) != null ? _b : []) {
341
+ addArbReturn(matchedRow);
342
+ }
343
+ };
344
+ for (const row of midpointRows) {
345
+ addArbReturn(row);
346
+ }
347
+ return arbReturnByVenueMarketId;
348
+ };
329
349
  var resolveMarketHrefFromEventHref = (eventHref, marketId, outcomeId) => {
330
350
  if (!eventHref) return void 0;
331
351
  if (typeof window === "undefined") return void 0;
@@ -342,6 +362,9 @@ var EventListItemContent = ({
342
362
  event,
343
363
  classNames,
344
364
  arbitrageByOutcomeId,
365
+ midpointPrices,
366
+ midpointRows: sharedMidpointRows,
367
+ midpointsLoading,
345
368
  onEventClick,
346
369
  onMarketClick,
347
370
  getMarketHref,
@@ -395,6 +418,8 @@ var EventListItemContent = ({
395
418
  if (!isLazyMarketsQueryEnabled || lazyLoadedMarkets.length === 0) return allVenueMarkets;
396
419
  return dedupeVenueMarketsById([...allVenueMarkets, ...lazyLoadedMarkets]);
397
420
  }, [allVenueMarkets, isLazyMarketsQueryEnabled, lazyLoadedMarkets]);
421
+ const hasExpandedMarkets = isLazyMarketsQueryEnabled && lazyLoadedMarkets.length > 0;
422
+ const shouldUseSharedMidpoints = !hasExpandedMarkets && (midpointPrices !== void 0 || sharedMidpointRows !== void 0 || midpointsLoading !== void 0);
398
423
  const midpointVenueMarketIds = useMemo(() => {
399
424
  var _a2;
400
425
  const ids = [];
@@ -406,19 +431,21 @@ var EventListItemContent = ({
406
431
  }
407
432
  return [...new Set(ids)];
408
433
  }, [resolvedOutcomeMarkets]);
409
- const { midpointRows, isLoading: isVenueMarketMidpointsLoading } = useVenueMarketMidpoints({
410
- venueMarketIds: midpointVenueMarketIds,
411
- enabled: midpointVenueMarketIds.length > 0
434
+ const { midpointRows: fetchedMidpointRows, isLoading: isVenueMarketMidpointsLoading } = useVenueMarketMidpoints({
435
+ venueMarketIds: shouldUseSharedMidpoints ? [] : midpointVenueMarketIds,
436
+ enabled: !shouldUseSharedMidpoints && midpointVenueMarketIds.length > 0
412
437
  });
413
- const { prices: displayMidpointsByOutcomeId, isLoading: isOutcomeMidpointsLoading } = useMidpoints(resolvedOutcomeMarkets);
414
- const isAwaitingMidpoints = isOutcomeMidpointsLoading || midpointVenueMarketIds.length > 0 && isVenueMarketMidpointsLoading;
438
+ const { prices: displayMidpointsByOutcomeId, isLoading: isOutcomeMidpointsLoading } = useMidpoints(shouldUseSharedMidpoints ? [] : resolvedOutcomeMarkets);
439
+ const resolvedMidpointRows = shouldUseSharedMidpoints ? sharedMidpointRows != null ? sharedMidpointRows : [] : fetchedMidpointRows;
440
+ const resolvedDisplayMidpointsByOutcomeId = shouldUseSharedMidpoints ? midpointPrices != null ? midpointPrices : /* @__PURE__ */ new Map() : displayMidpointsByOutcomeId;
441
+ const isAwaitingMidpoints = midpointsLoading != null ? midpointsLoading : isOutcomeMidpointsLoading || midpointVenueMarketIds.length > 0 && isVenueMarketMidpointsLoading;
415
442
  const displayPriceByOutcomeId = useMemo(() => {
416
- const priceByOutcomeId = new Map(displayMidpointsByOutcomeId);
417
- for (const [outcomeId, price] of buildOutcomeMidpointsByOutcomeId(midpointRows)) {
443
+ const priceByOutcomeId = new Map(resolvedDisplayMidpointsByOutcomeId);
444
+ for (const [outcomeId, price] of buildOutcomeMidpointsByOutcomeId(resolvedMidpointRows)) {
418
445
  priceByOutcomeId.set(outcomeId, price);
419
446
  }
420
447
  return priceByOutcomeId;
421
- }, [displayMidpointsByOutcomeId, midpointRows]);
448
+ }, [resolvedDisplayMidpointsByOutcomeId, resolvedMidpointRows]);
422
449
  const comparison = useMemo(() => {
423
450
  return normalizeEventListItemV2Comparison({
424
451
  venueMarkets: resolvedOutcomeMarkets,
@@ -429,6 +456,9 @@ var EventListItemContent = ({
429
456
  const gapsByVenueMarketId = useMemo(() => {
430
457
  return computePriceGapsFromComparisonRows(comparison.rows);
431
458
  }, [comparison.rows]);
459
+ const arbReturnByVenueMarketId = useMemo(() => {
460
+ return buildArbReturnByVenueMarketId(resolvedMidpointRows);
461
+ }, [resolvedMidpointRows]);
432
462
  const shouldRenderLoadingOutcomeRow = shouldEnableLazyMarketLoading && (!isLazyMarketsQueryEnabled || isLoadingLazyMarkets || isFetchingNextLazyMarketsPage || hasNextLazyMarketsPage);
433
463
  const resolvedVolume = (_a = resolveDisplayVolume(event.volume, allVenueMarkets)) != null ? _a : 0;
434
464
  const volumeLabel = `${config.formatting.formatCompactCurrency(resolvedVolume)} ${labels.eventItem.volumeSuffix}`;
@@ -560,10 +590,10 @@ var EventListItemContent = ({
560
590
  )
561
591
  ] });
562
592
  };
563
- const renderPriceGapPill = (value) => {
593
+ const renderPriceGapPill = (value, source = "percent") => {
564
594
  if (!config.features.enablePriceGap) return null;
565
595
  if (isAwaitingMidpoints) return null;
566
- const formattedPriceGap = formatPriceGapPercent(value);
596
+ const formattedPriceGap = formatPriceGapPercent(value, source);
567
597
  if (!formattedPriceGap) return null;
568
598
  return /* @__PURE__ */ jsxs(
569
599
  "span",
@@ -699,7 +729,9 @@ var EventListItemContent = ({
699
729
  comparison.rows.map((row) => {
700
730
  var _a2;
701
731
  const arbitragePercent = (_a2 = arbitrageByOutcomeId == null ? void 0 : arbitrageByOutcomeId[row.outcome.id]) != null ? _a2 : arbitrageByOutcomeId == null ? void 0 : arbitrageByOutcomeId[row.market.id];
702
- const priceGapPercent = gapsByVenueMarketId.get(row.market.id);
732
+ const arbReturn = arbReturnByVenueMarketId.get(row.market.id);
733
+ const priceGapPercent = arbReturn == null ? gapsByVenueMarketId.get(row.market.id) : arbReturn;
734
+ const priceGapSource = arbReturn == null ? "percent" : "fraction";
703
735
  return /* @__PURE__ */ jsxs(
704
736
  "div",
705
737
  {
@@ -719,7 +751,7 @@ var EventListItemContent = ({
719
751
  ) }),
720
752
  /* @__PURE__ */ jsxs("div", { className: "agg-outcome-meta flex shrink-0 flex-row items-center justify-end gap-2", children: [
721
753
  renderArbitrage(arbitragePercent),
722
- renderPriceGapPill(priceGapPercent),
754
+ renderPriceGapPill(priceGapPercent, priceGapSource),
723
755
  /* @__PURE__ */ jsx("div", { className: "agg-outcome-price-strip relative flex shrink-0 items-center justify-end", children: isAwaitingMidpoints ? renderPriceStripSkeleton(row.prices.length) : row.prices.map(
724
756
  (price, priceIndex) => renderComparisonPriceBadge(row, price, priceIndex)
725
757
  ) })
@@ -2093,7 +2125,6 @@ var EventListItemDetailsGraphSection = ({
2093
2125
  venueMarkets,
2094
2126
  selectedMarketId,
2095
2127
  livePrices,
2096
- wsLivePrices,
2097
2128
  restMidpoints,
2098
2129
  bestMidpoint,
2099
2130
  bestPrices,
@@ -2287,7 +2318,7 @@ var EventListItemDetailsGraphSection = ({
2287
2318
  {
2288
2319
  classNames: { root: cn("agg-chart-region", classNames == null ? void 0 : classNames.chart) },
2289
2320
  series: visibleChartSeries,
2290
- height: 300,
2321
+ height: 200,
2291
2322
  isLoading: isScopedMarketChartLoading,
2292
2323
  chartType: selectedChartType,
2293
2324
  liveCandle: selectedChartType === "candlestick" ? (_m = chartLiveState.liveCandle) != null ? _m : void 0 : void 0,
@@ -2316,7 +2347,7 @@ var EventListItemDetailsGraphSection = ({
2316
2347
  ),
2317
2348
  children: chartAvailableVenueOutcomes.map((item) => {
2318
2349
  var _a3, _b3;
2319
- const percentage = (_b3 = (_a3 = resolvedOutcomePriceByMarketId.get(item.market.id)) == null ? void 0 : _a3.get(item.outcome.id)) != null ? _b3 : wsLivePrices.get(item.outcome.id);
2350
+ const percentage = (_b3 = (_a3 = resolvedOutcomePriceByMarketId.get(item.market.id)) == null ? void 0 : _a3.get(item.outcome.id)) != null ? _b3 : livePrices.get(item.outcome.id);
2320
2351
  const text = formatMarketProbabilityPercent(percentage, formatPercent);
2321
2352
  const seriesId = `${item.venue}-chart`;
2322
2353
  const isActiveVenue = activeGraphVenue === item.venue;
@@ -2324,6 +2355,7 @@ var EventListItemDetailsGraphSection = ({
2324
2355
  "button",
2325
2356
  {
2326
2357
  type: "button",
2358
+ "data-id": item.outcome.id,
2327
2359
  "aria-label": `${item.venue} ${text}`,
2328
2360
  "aria-pressed": isActiveVenue,
2329
2361
  className: cn(
@@ -2414,6 +2446,7 @@ var EventListItemDetailsContent = ({
2414
2446
  detailsStats,
2415
2447
  eventTradingState,
2416
2448
  ariaLabel,
2449
+ defaultTimeRange,
2417
2450
  onClick,
2418
2451
  midpointsResult
2419
2452
  }) => {
@@ -2422,9 +2455,6 @@ var EventListItemDetailsContent = ({
2422
2455
  const lastAppliedEventSyncKeyRef = useRef2(null);
2423
2456
  const lastAppliedDefaultRef = useRef2(null);
2424
2457
  const [chartRangeOverride, setChartRangeOverride] = useState3(null);
2425
- useEffect2(() => {
2426
- setChartRangeOverride(null);
2427
- }, [event.id]);
2428
2458
  const config = useSdkUiConfig2();
2429
2459
  const labels = useLabels5();
2430
2460
  const tradingContext = useEventTradingContext();
@@ -2433,13 +2463,20 @@ var EventListItemDetailsContent = ({
2433
2463
  return eventTradingState != null ? eventTradingState : resolveEventTradingState(event);
2434
2464
  }, [event, eventTradingState]);
2435
2465
  const scopedSelectedMarket = (tradingContext == null ? void 0 : tradingContext.selectedEventId) === event.id ? (_a = tradingContext.selectedMarket) != null ? _a : resolvedEventTradingState.primaryMarket : resolvedEventTradingState.primaryMarket;
2466
+ const venueMarkets = useMemo5(
2467
+ () => resolvedEventTradingState.displayMarkets,
2468
+ [resolvedEventTradingState.displayMarkets]
2469
+ );
2470
+ const eventDetailVenueMarkets = useMemo5(() => {
2471
+ return normalizeVenueMarketCluster(venueMarkets);
2472
+ }, [venueMarkets]);
2436
2473
  const scopedSelectedMarketId = (tradingContext == null ? void 0 : tradingContext.selectedEventId) === event.id ? tradingContext.selectedMarketId : null;
2437
2474
  useEventOrderbookData(
2438
2475
  resolvedEventTradingState.isTradingDisabled ? [] : resolvedEventTradingState.displayMarkets,
2439
2476
  scopedSelectedMarketId
2440
2477
  );
2441
- const wsLivePrices = useLiveOutcomePrices(resolvedEventTradingState.displayMarkets);
2442
- const wsBestPrices = useLiveBestPrices(resolvedEventTradingState.displayMarkets);
2478
+ const wsLivePrices = useLiveOutcomePrices(eventDetailVenueMarkets);
2479
+ const wsBestPrices = useLiveBestPrices(eventDetailVenueMarkets);
2443
2480
  const resolvedMidpointsResult = midpointsResult != null ? midpointsResult : {
2444
2481
  prices: /* @__PURE__ */ new Map(),
2445
2482
  bestMidpointsByOutcomeId: /* @__PURE__ */ new Map(),
@@ -2464,6 +2501,16 @@ var EventListItemDetailsContent = ({
2464
2501
  for (const [k, v] of wsLivePrices) merged.set(k, v);
2465
2502
  return merged;
2466
2503
  }, [restMidpoints, wsLivePrices]);
2504
+ const initialChartTimeRange = useMemo5(() => {
2505
+ return resolveInitialEventDetailsChartRange({
2506
+ event,
2507
+ selectedMarket: scopedSelectedMarket,
2508
+ fallbackRange: defaultTimeRange != null ? defaultTimeRange : config.chart.selectedChartTimeRange
2509
+ });
2510
+ }, [config.chart.selectedChartTimeRange, defaultTimeRange, event, scopedSelectedMarket]);
2511
+ useEffect2(() => {
2512
+ setChartRangeOverride(initialChartTimeRange);
2513
+ }, [event.id, initialChartTimeRange, scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.id]);
2467
2514
  useEffect2(() => {
2468
2515
  if (!tradingContext) return;
2469
2516
  if (lastAppliedEventSyncKeyRef.current === eventSyncKey) return;
@@ -2501,10 +2548,6 @@ var EventListItemDetailsContent = ({
2501
2548
  tradingContext,
2502
2549
  tradingContext == null ? void 0 : tradingContext.selectedEventId
2503
2550
  ]);
2504
- const venueMarkets = useMemo5(
2505
- () => resolvedEventTradingState.displayMarkets,
2506
- [resolvedEventTradingState.displayMarkets]
2507
- );
2508
2551
  const marketOptions = useMemo5(
2509
2552
  () => venueMarkets.map((vm) => ({
2510
2553
  value: vm.id,
@@ -2626,7 +2669,6 @@ var EventListItemDetailsContent = ({
2626
2669
  venueMarkets,
2627
2670
  selectedMarketId: (_d = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.id) != null ? _d : null,
2628
2671
  livePrices,
2629
- wsLivePrices,
2630
2672
  restMidpoints,
2631
2673
  bestMidpoint,
2632
2674
  bestPrices,
@@ -3970,6 +4012,10 @@ var MarketDetailsContent = ({
3970
4012
  const isOutcomeSelectionLocked = marketTradingState.isTradingDisabled;
3971
4013
  const isUpcomingMarket = marketTradingState.kind === "unopened";
3972
4014
  const marketStatePresentation = resolveTradingStatePresentation(labels, marketTradingState);
4015
+ const resolvedWinningOutcomeLabel = resolveResolvedOutcomeLabel({
4016
+ market: scopedMarketForCard,
4017
+ outcome: marketTradingState.winningOutcome
4018
+ });
3973
4019
  const marketDetailsTabs = useMemo7(() => {
3974
4020
  return getMarketDetailsTabs(labels);
3975
4021
  }, [labels]);
@@ -4406,7 +4452,9 @@ var MarketDetailsContent = ({
4406
4452
  )
4407
4453
  }
4408
4454
  ),
4409
- /* @__PURE__ */ jsx10(Typography, { variant: "body", children: labels.eventMarketPage.resolvedOutcome(marketTradingState.winningOutcome.label) })
4455
+ /* @__PURE__ */ jsx10(Typography, { variant: "body", children: labels.eventMarketPage.resolvedOutcome(
4456
+ resolvedWinningOutcomeLabel != null ? resolvedWinningOutcomeLabel : marketTradingState.winningOutcome.label
4457
+ ) })
4410
4458
  ]
4411
4459
  }
4412
4460
  ) }) : isUpcomingMarket ? /* @__PURE__ */ jsx10("div", { className: "agg-outcomes flex w-full items-center justify-end md:w-auto md:shrink-0", children: /* @__PURE__ */ jsxs8(
@@ -4883,7 +4931,8 @@ import {
4883
4931
  useCategoryChildren,
4884
4932
  useLabels as useLabels9,
4885
4933
  useSdkUiConfig as useSdkUiConfig5,
4886
- useVenueEvents
4934
+ useVenueEvents,
4935
+ useVenueMarketMidpoints as useVenueMarketMidpoints2
4887
4936
  } from "@agg-build/hooks";
4888
4937
  import { VENUES } from "@agg-build/sdk";
4889
4938
  import * as Dialog from "@radix-ui/react-dialog";
@@ -5252,6 +5301,23 @@ var resolveSortQueryParams = (value) => {
5252
5301
  }
5253
5302
  return { sortBy: "volume24hr", sortDir: "desc" };
5254
5303
  };
5304
+ var collectEventListVenueMarkets = (events) => {
5305
+ return events.flatMap((event) => {
5306
+ var _a;
5307
+ return (_a = event.venueMarkets) != null ? _a : [];
5308
+ });
5309
+ };
5310
+ var collectMidpointVenueMarketIds = (venueMarkets) => {
5311
+ var _a;
5312
+ const ids = [];
5313
+ for (const market of venueMarkets) {
5314
+ ids.push(market.id);
5315
+ for (const sibling of (_a = market.matchedVenueMarkets) != null ? _a : []) {
5316
+ ids.push(sibling.id);
5317
+ }
5318
+ }
5319
+ return [...new Set(ids)];
5320
+ };
5255
5321
  var EventList = ({
5256
5322
  title,
5257
5323
  limit = DEFAULT_EVENTS_LIMIT,
@@ -5466,6 +5532,16 @@ var EventList = ({
5466
5532
  if (resolvedMaxVisibleItems == null) return normalizedEvents;
5467
5533
  return normalizedEvents.slice(0, resolvedMaxVisibleItems);
5468
5534
  }, [orderedEvents, resolvedMaxVisibleItems]);
5535
+ const visibleVenueMarkets = useMemo10(() => {
5536
+ return collectEventListVenueMarkets(tileEvents);
5537
+ }, [tileEvents]);
5538
+ const visibleMidpointVenueMarketIds = useMemo10(() => {
5539
+ return collectMidpointVenueMarketIds(visibleVenueMarkets);
5540
+ }, [visibleVenueMarkets]);
5541
+ const { midpointRows: sharedMidpointRows, isLoading: isSharedMidpointsLoading } = useVenueMarketMidpoints2({
5542
+ venueMarketIds: visibleMidpointVenueMarketIds,
5543
+ enabled: visibleMidpointVenueMarketIds.length > 0
5544
+ });
5469
5545
  const shouldRenderLoadingState = isLoading && !isPlaceholderData && tileEvents.length === 0;
5470
5546
  const shouldRenderEmptyState = !isLoading && !isError && tileEvents.length === 0;
5471
5547
  const shouldRenderPaginationLoadingItems = shouldPaginate && hasNextPage;
@@ -5634,6 +5710,8 @@ var EventList = ({
5634
5710
  EventListItem,
5635
5711
  {
5636
5712
  event,
5713
+ midpointRows: sharedMidpointRows,
5714
+ midpointsLoading: isSharedMidpointsLoading,
5637
5715
  classNames: {
5638
5716
  root: "agg-event-list-item w-full min-w-0! max-w-none justify-between!"
5639
5717
  },