@agg-build/ui 2.5.3 → 2.7.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.
package/dist/pages.js CHANGED
@@ -18331,7 +18331,7 @@ var buildLiveRouteCards = ({
18331
18331
  };
18332
18332
  }
18333
18333
  const avgPrice = sq.avgPrice;
18334
- const soloQuoteData = __spreadProps(__spreadValues({}, quoteData), {
18334
+ const soloQuoteData = __spreadValues(__spreadProps(__spreadValues({}, quoteData), {
18335
18335
  // Preview-only solos intentionally carry no executable quoteId; the card
18336
18336
  // should still render for comparison, while the CTA stays disabled until
18337
18337
  // the user is funded and requotes.
@@ -18344,7 +18344,7 @@ var buildLiveRouteCards = ({
18344
18344
  returnPct: sq.returnPct,
18345
18345
  // venueSoloQuotes stripped on solo card's quoteData (only the primary needs them)
18346
18346
  venueSoloQuotes: void 0
18347
- });
18347
+ }), sq.quoteId ? { status: "ok", error: void 0 } : null);
18348
18348
  return {
18349
18349
  id: `live-solo-${sq.venue}`,
18350
18350
  hint: labels.averagePrice(avgPrice),
@@ -18400,6 +18400,17 @@ var buildLiveRouteCards = ({
18400
18400
  })() : [];
18401
18401
  return [...baseCards, ...unavailableCards, ...warningOnlyUnavailableCards];
18402
18402
  };
18403
+ var resolveDefaultRouteCardId = (routeCards, primaryStatus) => {
18404
+ var _a, _b, _c, _d;
18405
+ if (routeCards.length === 0) return null;
18406
+ if (primaryStatus === "insufficient_balance") {
18407
+ const executableCard = routeCards.find(
18408
+ (card) => !card.isUnavailable && card.quoteData.status === "ok" && card.quoteData.quoteId
18409
+ );
18410
+ if (executableCard) return executableCard.id;
18411
+ }
18412
+ return (_d = (_c = (_a = routeCards.find((card) => !card.isUnavailable)) == null ? void 0 : _a.id) != null ? _c : (_b = routeCards[0]) == null ? void 0 : _b.id) != null ? _d : null;
18413
+ };
18403
18414
  var sellSharesToAtomicUnits = (shares) => {
18404
18415
  if (!Number.isFinite(shares) || shares <= 0) return BigInt(0);
18405
18416
  const [whole = "0", fraction = ""] = shares.toFixed(12).split(".");
@@ -20334,7 +20345,7 @@ var PlaceOrder = ({
20334
20345
  resolvedClaim,
20335
20346
  midpointsResult
20336
20347
  }) => {
20337
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X;
20348
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y;
20338
20349
  const {
20339
20350
  enableDebug: isExecutionDebugEnabled,
20340
20351
  features: { enableAnimations, showFeesBreakdown, showLimitOrders },
@@ -20765,13 +20776,13 @@ var PlaceOrder = ({
20765
20776
  venueSellQuotes.quotes
20766
20777
  ]);
20767
20778
  const resolvedSelectedRouteCardId = (0, import_react36.useMemo)(() => {
20768
- var _a2, _b2, _c2, _d2;
20779
+ var _a2;
20769
20780
  if (routeCards.length === 0) return null;
20770
20781
  if (selectedRouteCardId && routeCards.some((card) => card.id === selectedRouteCardId && !card.isUnavailable)) {
20771
20782
  return selectedRouteCardId;
20772
20783
  }
20773
- return (_d2 = (_c2 = (_a2 = routeCards.find((card) => !card.isUnavailable)) == null ? void 0 : _a2.id) != null ? _c2 : (_b2 = routeCards[0]) == null ? void 0 : _b2.id) != null ? _d2 : null;
20774
- }, [routeCards, selectedRouteCardId]);
20784
+ return resolveDefaultRouteCardId(routeCards, isSell ? void 0 : (_a2 = smartRoute.data) == null ? void 0 : _a2.status);
20785
+ }, [routeCards, selectedRouteCardId, isSell, (_w = smartRoute.data) == null ? void 0 : _w.status]);
20775
20786
  (0, import_react36.useEffect)(() => {
20776
20787
  if (routeCards.length === 0) {
20777
20788
  setSelectedRouteCardId(null);
@@ -20811,14 +20822,14 @@ var PlaceOrder = ({
20811
20822
  setLimitPriceInputError(null);
20812
20823
  }, [executionType, scopedSelectedOutcomeId, selectedOutcomeDisplayPrice]);
20813
20824
  const orderedRouteCards = routeCards;
20814
- const selectedRouteCard = (_x = (_w = orderedRouteCards.find((card) => card.id === resolvedSelectedRouteCardId)) != null ? _w : orderedRouteCards[0]) != null ? _x : null;
20825
+ const selectedRouteCard = (_y = (_x = orderedRouteCards.find((card) => card.id === resolvedSelectedRouteCardId)) != null ? _x : orderedRouteCards[0]) != null ? _y : null;
20815
20826
  const isKalshiRoute = (0, import_react36.useMemo)(() => {
20816
20827
  if (selectedRouteCard) {
20817
20828
  return selectedRouteCard.venue === "kalshi" || selectedRouteCard.quoteData.fills.some((f) => f.venue === "kalshi");
20818
20829
  }
20819
20830
  return (scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.venue) === "kalshi";
20820
20831
  }, [selectedRouteCard, scopedSelectedMarket]);
20821
- const displayedBalance = isPaperMode ? paperTotalBalance : isKalshiRoute ? (_y = liveBalanceState.kalshiBalance) != null ? _y : 0 : liveAvailableBalance;
20832
+ const displayedBalance = isPaperMode ? paperTotalBalance : isKalshiRoute ? (_z = liveBalanceState.kalshiBalance) != null ? _z : 0 : liveAvailableBalance;
20822
20833
  const legacyKalshiAccount = (0, import_react36.useMemo)(
20823
20834
  () => {
20824
20835
  var _a2;
@@ -20826,8 +20837,8 @@ var PlaceOrder = ({
20826
20837
  },
20827
20838
  [user == null ? void 0 : user.venueAccounts]
20828
20839
  );
20829
- const isKalshiAccountActive = (_z = kalshiKeyStatus == null ? void 0 : kalshiKeyStatus.connected) != null ? _z : (legacyKalshiAccount == null ? void 0 : legacyKalshiAccount.status) === "active";
20830
- const isKalshiVerified = ((_A = kalshiKeyStatus == null ? void 0 : kalshiKeyStatus.kycStatus) != null ? _A : legacyKalshiAccount == null ? void 0 : legacyKalshiAccount.kycStatus) === "verified";
20840
+ const isKalshiAccountActive = (_A = kalshiKeyStatus == null ? void 0 : kalshiKeyStatus.connected) != null ? _A : (legacyKalshiAccount == null ? void 0 : legacyKalshiAccount.status) === "active";
20841
+ const isKalshiVerified = ((_B = kalshiKeyStatus == null ? void 0 : kalshiKeyStatus.kycStatus) != null ? _B : legacyKalshiAccount == null ? void 0 : legacyKalshiAccount.kycStatus) === "verified";
20831
20842
  const hasKalshiConnectionState = kalshiKeyStatus !== void 0 || (user == null ? void 0 : user.venueAccounts) != null;
20832
20843
  const isKalshiAvailable = (0, import_hooks60.getVenueAvailabilityState)({
20833
20844
  venueId: "kalshi",
@@ -20854,7 +20865,7 @@ var PlaceOrder = ({
20854
20865
  [aggClient, onConnectKalshi, refetchKalshiKeyStatus]
20855
20866
  );
20856
20867
  const needsKycVerification = isAuthenticated && hasKalshiConnectionState && isKalshiRoute && isKalshiAccountActive && !isKalshiVerified;
20857
- const verifyKalshiConnectionLabel = (_E = (_D = (_C = (_B = labels.onboarding) == null ? void 0 : _B.connectKalshiModal) == null ? void 0 : _C.actions) == null ? void 0 : _D.verifyConnection) != null ? _E : tradingLabels.kycRequired;
20868
+ const verifyKalshiConnectionLabel = (_F = (_E = (_D = (_C = labels.onboarding) == null ? void 0 : _C.connectKalshiModal) == null ? void 0 : _D.actions) == null ? void 0 : _E.verifyConnection) != null ? _F : tradingLabels.kycRequired;
20858
20869
  const handleRouteCardSelect = (0, import_react36.useCallback)(
20859
20870
  (cardId) => {
20860
20871
  if (cardId === resolvedSelectedRouteCardId) {
@@ -20869,15 +20880,15 @@ var PlaceOrder = ({
20869
20880
  [resolvedSelectedRouteCardId, routeCards]
20870
20881
  );
20871
20882
  const executionProgress = (0, import_hooks60.useExecutionProgress)({
20872
- orderIds: (_F = submissionProgressState == null ? void 0 : submissionProgressState.orderIds) != null ? _F : null,
20873
- quoteId: (_G = submissionProgressState == null ? void 0 : submissionProgressState.quoteId) != null ? _G : null,
20883
+ orderIds: (_G = submissionProgressState == null ? void 0 : submissionProgressState.orderIds) != null ? _G : null,
20884
+ quoteId: (_H = submissionProgressState == null ? void 0 : submissionProgressState.quoteId) != null ? _H : null,
20874
20885
  mode: isPaperMode ? "paper" : void 0,
20875
- enabled: ((submissionProgressState == null ? void 0 : submissionProgressState.phase) === "submitting" || (submissionProgressState == null ? void 0 : submissionProgressState.phase) === "executing") && !!((_H = submissionProgressState == null ? void 0 : submissionProgressState.orderIds) == null ? void 0 : _H.length)
20886
+ enabled: ((submissionProgressState == null ? void 0 : submissionProgressState.phase) === "submitting" || (submissionProgressState == null ? void 0 : submissionProgressState.phase) === "executing") && !!((_I = submissionProgressState == null ? void 0 : submissionProgressState.orderIds) == null ? void 0 : _I.length)
20876
20887
  });
20877
- const selectedOutcomeLabel = (_K = (_J = (_I = outcomes.find((outcome) => outcome.id === scopedSelectedOutcomeId)) == null ? void 0 : _I.label) != null ? _J : scopedSelectedOutcome == null ? void 0 : scopedSelectedOutcome.label) != null ? _K : "";
20878
- const headerImage = (_M = (_L = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.image) != null ? _L : scopedSelectedEvent == null ? void 0 : scopedSelectedEvent.image) != null ? _M : null;
20879
- const headerTitle = (_O = (_N = scopedSelectedEvent == null ? void 0 : scopedSelectedEvent.title) != null ? _N : scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.question) != null ? _O : "";
20880
- const headerSubtitle = (_P = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.question) != null ? _P : "";
20888
+ const selectedOutcomeLabel = (_L = (_K = (_J = outcomes.find((outcome) => outcome.id === scopedSelectedOutcomeId)) == null ? void 0 : _J.label) != null ? _K : scopedSelectedOutcome == null ? void 0 : scopedSelectedOutcome.label) != null ? _L : "";
20889
+ const headerImage = (_N = (_M = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.image) != null ? _M : scopedSelectedEvent == null ? void 0 : scopedSelectedEvent.image) != null ? _N : null;
20890
+ const headerTitle = (_P = (_O = scopedSelectedEvent == null ? void 0 : scopedSelectedEvent.title) != null ? _O : scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.question) != null ? _P : "";
20891
+ const headerSubtitle = (_Q = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.question) != null ? _Q : "";
20881
20892
  const buildExecutionSummary = (0, import_react36.useCallback)(
20882
20893
  (quoteData, executionVenue, orderId, partialFillSummary) => {
20883
20894
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2;
@@ -21175,19 +21186,19 @@ var PlaceOrder = ({
21175
21186
  queryClient,
21176
21187
  submissionProgressState
21177
21188
  ]);
21178
- const activeQuoteData = (_R = (_Q = selectedRouteCard == null ? void 0 : selectedRouteCard.quoteData) != null ? _Q : smartRoute.data) != null ? _R : null;
21189
+ const activeQuoteData = (_S = (_R = selectedRouteCard == null ? void 0 : selectedRouteCard.quoteData) != null ? _R : smartRoute.data) != null ? _S : null;
21179
21190
  const visibleRouteCards = orderedRouteCards.length > PLACE_ORDER_ROUTE_COLLAPSED_CARD_COUNT && !isRoutesExpanded ? orderedRouteCards.slice(0, PLACE_ORDER_ROUTE_COLLAPSED_CARD_COUNT) : orderedRouteCards;
21180
21191
  const hasEnteredAmount = internalAmount > 0;
21181
21192
  const isQuoteLoading = !isLimitOrder && hasEnteredAmount && (smartRoute.isFetching || smartRoute.isLoading || isSell && (venueSellQuotes.isFetching || venueSellQuotes.isLoading));
21182
21193
  const routeLoadingMessage = isQuoteLoading ? smartRoute.loadingReason === "updating-route" ? tradingLabels.updatingRoute : smartRoute.loadingReason === "refreshing-quotes" ? tradingLabels.refreshingQuotes : tradingLabels.findingBestOdds : null;
21183
- const selectedRouteFills = (_S = selectedRouteCard == null ? void 0 : selectedRouteCard.quoteData.fills) != null ? _S : [];
21194
+ const selectedRouteFills = (_T = selectedRouteCard == null ? void 0 : selectedRouteCard.quoteData.fills) != null ? _T : [];
21184
21195
  const isKalshiOnlyRoute = isKalshiRoute && ((selectedRouteCard == null ? void 0 : selectedRouteCard.venue) === import_sdk22.Venue.kalshi || selectedRouteFills.length > 0 && selectedRouteFills.every((fill) => fill.venue === import_sdk22.Venue.kalshi));
21185
21196
  const isOnchainOnlyRoute = !isKalshiRoute || selectedRouteFills.length > 0 && selectedRouteFills.every((fill) => fill.venue !== import_sdk22.Venue.kalshi);
21186
21197
  const kalshiRequiredAmount = isSell ? 0 : selectedRouteFills.filter((fill) => fill.venue === import_sdk22.Venue.kalshi).reduce((total, fill) => total + fill.venueQty * fill.avgPrice, 0);
21187
21198
  const onchainRequiredAmount = isSell ? 0 : selectedRouteFills.filter((fill) => fill.venue !== import_sdk22.Venue.kalshi).reduce((total, fill) => total + fill.venueQty * fill.avgPrice, 0);
21188
21199
  const resolvedKalshiRequiredAmount = isKalshiOnlyRoute || isKalshiRoute && selectedRouteFills.length === 0 ? internalAmount : kalshiRequiredAmount;
21189
21200
  const resolvedOnchainRequiredAmount = isOnchainOnlyRoute || !isKalshiRoute && selectedRouteFills.length === 0 ? internalAmount : onchainRequiredAmount;
21190
- const isKalshiBalanceInsufficient = !isPaperMode && isKalshiRoute && resolvedKalshiRequiredAmount > ((_T = liveBalanceState.kalshiBalance) != null ? _T : 0);
21201
+ const isKalshiBalanceInsufficient = !isPaperMode && isKalshiRoute && resolvedKalshiRequiredAmount > ((_U = liveBalanceState.kalshiBalance) != null ? _U : 0);
21191
21202
  const isOnchainBalanceInsufficient = resolvedOnchainRequiredAmount > liveAvailableBalance;
21192
21203
  const isInsufficientBalance = !isSell && isAuthenticated && hasEnteredAmount && !isBalanceLoading && (isLimitOrder ? internalAmount > totalBalance : isPaperMode ? internalAmount > paperTotalBalance : isKalshiBalanceInsufficient || isOnchainBalanceInsufficient);
21193
21204
  const isQuoteInsufficientBalance = !isLimitOrder && (activeQuoteData == null ? void 0 : activeQuoteData.status) === "insufficient_balance";
@@ -21281,7 +21292,7 @@ var PlaceOrder = ({
21281
21292
  }
21282
21293
  return (_d2 = selectedRouteCard.hint) != null ? _d2 : "";
21283
21294
  }, [selectedRouteCard, tradingLabels]);
21284
- const displayedToWinValue = (_U = selectedRouteCard == null ? void 0 : selectedRouteCard.numericValue) != null ? _U : 0;
21295
+ const displayedToWinValue = (_V = selectedRouteCard == null ? void 0 : selectedRouteCard.numericValue) != null ? _V : 0;
21285
21296
  const limitOrderPayload = (0, import_react36.useMemo)(() => {
21286
21297
  if (!scopedSelectedMarket || !scopedSelectedOutcomeId || internalAmount <= 0) return null;
21287
21298
  if (limitPriceInputError) return null;
@@ -21400,13 +21411,13 @@ var PlaceOrder = ({
21400
21411
  ];
21401
21412
  }, [activeFeeBreakdown, tradingLabels]);
21402
21413
  const isActionLoading = isPrimaryActionLoading || executeManaged.isPending || placeLimitOrder.isPending || isBeforeActionPending;
21403
- const selectedRouteGeoBlocked = (_V = selectedRouteCard == null ? void 0 : selectedRouteCard.isUnavailable) != null ? _V : false;
21414
+ const selectedRouteGeoBlocked = (_W = selectedRouteCard == null ? void 0 : selectedRouteCard.isUnavailable) != null ? _W : false;
21404
21415
  const geoBlockedVenuesFromWarnings = (0, import_react36.useMemo)(
21405
21416
  () => {
21406
21417
  var _a2;
21407
21418
  return extractGeoBlockedVenues((_a2 = smartRoute.data) == null ? void 0 : _a2.warnings);
21408
21419
  },
21409
- [(_W = smartRoute.data) == null ? void 0 : _W.warnings]
21420
+ [(_X = smartRoute.data) == null ? void 0 : _X.warnings]
21410
21421
  );
21411
21422
  const isPrimaryVenueGeoBlocked = (0, import_react36.useMemo)(() => {
21412
21423
  var _a2, _b2;
@@ -22064,7 +22075,7 @@ var PlaceOrder = ({
22064
22075
  PlaceOrderResolvedView,
22065
22076
  {
22066
22077
  tradingState: resolvedReadOnlyTradingState,
22067
- resolutionTimestamp: (_X = resolvedEventTradingState.resolvesAt) != null ? _X : resolvedReadOnlyTradingState.resolvesAt,
22078
+ resolutionTimestamp: (_Y = resolvedEventTradingState.resolvesAt) != null ? _Y : resolvedReadOnlyTradingState.resolvesAt,
22068
22079
  resolvedClaim,
22069
22080
  classNames,
22070
22081
  className,
@@ -23497,64 +23508,15 @@ var SPORTS_LEGACY_PROP_CATEGORY_KEY_SET = /* @__PURE__ */ new Set([
23497
23508
  "assists",
23498
23509
  "shots"
23499
23510
  ]);
23500
- var SPORTS_CATEGORY_OVERRIDE_TAB_KEY_SET = /* @__PURE__ */ new Set([
23501
- "exact_score",
23502
- ...SPORTS_LEGACY_PROP_CATEGORY_KEY_SET
23503
- ]);
23504
- var SPORTS_MARKET_GROUP_TO_TAB = {
23505
- game_lines: "game_lines",
23506
- spreads: "game_lines",
23507
- totals: "game_lines",
23508
- period_lines: "halves",
23509
- exact_score: "exact_score",
23510
- team_props: "other",
23511
- player_props: "other",
23512
- specials: "other",
23513
- completion: "other",
23514
- other: "other"
23515
- };
23516
- var SPORTS_SECTION_TAB_DEFINITIONS = [
23517
- {
23518
- key: "game_lines",
23519
- // NO sportsMarketType filter: spread/total markets on some sports (e.g.
23520
- // esports "Map 1 Rounds Handicap"/"Total Rounds") are sportsMarketType="other"
23521
- // with marketGroup=spreads/totals; AND-ing the game-line types would drop them
23522
- // and leave only the moneyline. marketGroup already scopes the tab. (Safe now
23523
- // that classify_market no longer mis-groups prop/to-score-first/extra-innings
23524
- // markets into game_lines/totals — see agg-venue-core market_group.rs.)
23525
- marketGroup: ["game_lines", "spreads", "totals"]
23526
- // No server-side period filter: many regular-time game-line markets arrive
23527
- // with period=null (moneyline sides, team totals, BTTS), and a
23528
- // period=["full"] filter would drop them server-side. The Game Lines tab
23529
- // narrows to the regular-time group client-side instead (see SportsMarkets).
23530
- },
23531
- { key: "exact_score", marketGroup: ["exact_score"] },
23532
- {
23533
- key: "halves",
23534
- // NO sportsMarketType filter: half-result legs ("France leading at halftime?")
23535
- // are sportsMarketType="other"; AND-ing the game-line types would drop them.
23536
- // marketGroup=period_lines + period already scope the tab.
23537
- marketGroup: ["period_lines"],
23538
- period: ["1h", "2h"]
23539
- },
23540
- { key: "corners", marketCategory: "corners" },
23541
- { key: "goals", marketCategory: "goals" },
23542
- { key: "assists", marketCategory: "assists" },
23543
- { key: "shots", marketCategory: "shots" },
23544
- {
23545
- key: "other",
23546
- // `player_props` is deliberately NOT fetched here: goals/assists/shots/corners
23547
- // props already have dedicated tabs (resolveMarketSectionTabKey routes them
23548
- // there by category), so including the group would re-fetch hundreds of props
23549
- // already shown elsewhere. The handful with no stat category (e.g. "saves")
23550
- // are back-filled from the game-wide set in resolveSportsSectionMarkets.
23551
- marketGroup: ["other", "team_props", "specials", "completion"]
23552
- }
23511
+ var SPORTS_GAME_LINE_GROUPS = [
23512
+ "game_lines",
23513
+ "spreads",
23514
+ "totals",
23515
+ "team_props",
23516
+ "specials",
23517
+ "completion"
23553
23518
  ];
23554
- var SPORTS_NON_STANDARD_VISIBLE_TAB_KEYS = ["game_lines", "other"];
23555
- var SPORTS_NON_STANDARD_VISIBLE_TAB_KEY_SET = new Set(
23556
- SPORTS_NON_STANDARD_VISIBLE_TAB_KEYS
23557
- );
23519
+ var SPORTS_GENERIC_STAT = "player_props";
23558
23520
  var ESPORTS_CATEGORY_TOKENS = /* @__PURE__ */ new Set([
23559
23521
  "esports",
23560
23522
  "video games",
@@ -23565,9 +23527,6 @@ var ESPORTS_CATEGORY_TOKENS = /* @__PURE__ */ new Set([
23565
23527
  ]);
23566
23528
  var ESPORTS_TITLE_PATTERN = /\b(?:esports?|valorant|counter-strike|cs2|league of legends|lol|dota|rocket league|overwatch|rainbow six|starcraft|call of duty)\b/i;
23567
23529
  var SERIES_SCOPE_PATTERN = /\b(?:bo[1-9]|best of \d+|map \d+|game \d+)\b/i;
23568
- var SPORTS_SECTION_TAB_BY_KEY = new Map(
23569
- SPORTS_SECTION_TAB_DEFINITIONS.map((definition) => [definition.key, definition])
23570
- );
23571
23530
  var SPORTS_PERIOD_ORDER = [
23572
23531
  "full",
23573
23532
  "1h",
@@ -23632,12 +23591,13 @@ var getSportsMarketTypeOrderIndex = (sportsMarketType) => {
23632
23591
  const marketTypeIndex = SPORTS_MARKET_TYPE_ORDER.indexOf(sportsMarketType);
23633
23592
  return marketTypeIndex >= 0 ? marketTypeIndex : SPORTS_MARKET_TYPE_ORDER.length;
23634
23593
  };
23635
- var resolveSportsSectionDefinition = (key) => {
23636
- const resolvedDefinition = SPORTS_SECTION_TAB_BY_KEY.get(key);
23637
- if (!resolvedDefinition) {
23638
- return SPORTS_SECTION_TAB_DEFINITIONS[0];
23639
- }
23640
- return resolvedDefinition;
23594
+ var resolveSportsPeriodFamily = (period) => {
23595
+ if (period === "1h" || period === "2h") return "halves";
23596
+ if (period === "q1" || period === "q2" || period === "q3" || period === "q4") return "quarters";
23597
+ if (/^inning_\d{1,2}$/.test(period)) return "innings";
23598
+ if (/^set_\d{1,2}$/.test(period)) return "sets";
23599
+ if (/^(?:map|game)_\d{1,2}$/.test(period)) return "maps";
23600
+ return period;
23641
23601
  };
23642
23602
  var normalizeSportsPeriod = (value) => {
23643
23603
  const resolvedValue = toTrimmedString(value).toLowerCase();
@@ -23682,34 +23642,134 @@ var resolveFallbackSportsMarketCategory = (market) => {
23682
23642
  if (question.includes("goal")) return "goals";
23683
23643
  return null;
23684
23644
  };
23645
+ var resolveSportsStatToken = (market) => {
23646
+ const subtype = toTrimmedString(market.marketSubtype).toLowerCase();
23647
+ const playerMatch = /_player_(.+)$/.exec(subtype);
23648
+ if (playerMatch) return playerMatch[1];
23649
+ const category = normalizeSportsMarketCategory(market.marketCategory);
23650
+ if (category && SPORTS_LEGACY_PROP_CATEGORY_KEY_SET.has(category)) return category;
23651
+ return null;
23652
+ };
23685
23653
  var resolveMarketSectionTabKey = (market) => {
23654
+ var _a;
23686
23655
  if (normalizeSportsMarketType(market.sportsMarketType) === "to_advance") {
23687
23656
  return "game_lines";
23688
23657
  }
23689
23658
  const normalizedCategory = normalizeSportsMarketCategory(market.marketCategory);
23690
23659
  const fallbackCategory = !normalizedCategory || normalizedCategory === "other" ? resolveFallbackSportsMarketCategory(market) : null;
23691
23660
  const category = fallbackCategory != null ? fallbackCategory : normalizedCategory;
23692
- if (category && SPORTS_CATEGORY_OVERRIDE_TAB_KEY_SET.has(category)) {
23693
- return category;
23694
- }
23661
+ if (category && SPORTS_LEGACY_PROP_CATEGORY_KEY_SET.has(category)) return `stat:${category}`;
23662
+ if (category === "exact_score") return "exact_score";
23695
23663
  const group = normalizeSportsMarketGroup(market.marketGroup);
23696
- if (group) return SPORTS_MARKET_GROUP_TO_TAB[group];
23664
+ if (group === "exact_score") return "exact_score";
23665
+ if (group === "player_props") {
23666
+ return `stat:${(_a = resolveSportsStatToken(market)) != null ? _a : SPORTS_GENERIC_STAT}`;
23667
+ }
23668
+ if (group === "period_lines") {
23669
+ return `period:${resolveSportsPeriodFamily(normalizeSportsPeriod(market.period))}`;
23670
+ }
23671
+ if (group === "other") return "other";
23672
+ if (group) return "game_lines";
23697
23673
  if (category === "game_lines") return "game_lines";
23698
23674
  if (category === "other") return "other";
23699
23675
  return null;
23700
23676
  };
23701
- var resolveSportsSectionFilters = (key) => {
23702
- var _a;
23703
- const resolvedDefinition = resolveSportsSectionDefinition(key);
23704
- const useMarketGroup = !!((_a = resolvedDefinition.marketGroup) == null ? void 0 : _a.length);
23677
+ var resolveVisibleSportsSectionTabs = (event) => {
23678
+ var _a, _b, _c;
23679
+ const periodsByFamily = /* @__PURE__ */ new Map();
23680
+ const statVolume = /* @__PURE__ */ new Map();
23681
+ let hasGameLines = false;
23682
+ let hasExactScore = false;
23683
+ let hasOther = false;
23684
+ for (const market of event.venueMarkets) {
23685
+ const key = resolveMarketSectionTabKey(market);
23686
+ if (!key) continue;
23687
+ if (key === "game_lines") hasGameLines = true;
23688
+ else if (key === "exact_score") hasExactScore = true;
23689
+ else if (key === "other") hasOther = true;
23690
+ else if (key.startsWith("period:")) {
23691
+ const family = key.slice("period:".length);
23692
+ const periods = (_a = periodsByFamily.get(family)) != null ? _a : /* @__PURE__ */ new Set();
23693
+ periods.add(normalizeSportsPeriod(market.period));
23694
+ periodsByFamily.set(family, periods);
23695
+ } else if (key.startsWith("stat:")) {
23696
+ const stat = key.slice("stat:".length);
23697
+ statVolume.set(stat, ((_b = statVolume.get(stat)) != null ? _b : 0) + ((_c = market.volume) != null ? _c : 0));
23698
+ }
23699
+ }
23700
+ const tabs = [];
23701
+ if (hasGameLines) tabs.push({ key: "game_lines", kind: "game_lines" });
23702
+ const periodTabs = Array.from(periodsByFamily.entries()).map(([periodFamily, periods]) => ({
23703
+ key: `period:${periodFamily}`,
23704
+ kind: "period",
23705
+ periodFamily,
23706
+ periods: Array.from(periods).sort(
23707
+ (left, right) => getSportsPeriodOrderIndex(left) - getSportsPeriodOrderIndex(right)
23708
+ )
23709
+ })).sort(
23710
+ (left, right) => getSportsPeriodOrderIndex(left.periods[0]) - getSportsPeriodOrderIndex(right.periods[0])
23711
+ );
23712
+ tabs.push(...periodTabs);
23713
+ const statTabs = Array.from(statVolume.entries()).sort((left, right) => {
23714
+ if (left[0] === SPORTS_GENERIC_STAT !== (right[0] === SPORTS_GENERIC_STAT)) {
23715
+ return left[0] === SPORTS_GENERIC_STAT ? 1 : -1;
23716
+ }
23717
+ return right[1] - left[1];
23718
+ }).map(([stat]) => ({ key: `stat:${stat}`, kind: "stat", stat }));
23719
+ tabs.push(...statTabs);
23720
+ if (hasExactScore) tabs.push({ key: "exact_score", kind: "exact_score" });
23721
+ if (hasOther) tabs.push({ key: "other", kind: "other" });
23722
+ if (isNonStandardSportsLikeEvent(event)) {
23723
+ return tabs.filter((tab) => tab.kind === "game_lines" || tab.kind === "other");
23724
+ }
23725
+ return tabs;
23726
+ };
23727
+ var resolveSportsSectionFilters = (tab) => {
23728
+ if (tab.kind === "period") {
23729
+ return {
23730
+ marketGroup: ["period_lines"],
23731
+ marketCategory: void 0,
23732
+ sportsMarketType: void 0,
23733
+ period: tab.periods ? [...tab.periods] : void 0
23734
+ };
23735
+ }
23736
+ if (tab.kind === "stat") {
23737
+ const legacyCategory = SPORTS_LEGACY_PROP_CATEGORY_KEY_SET.has(
23738
+ tab.stat
23739
+ ) ? tab.stat : null;
23740
+ return legacyCategory ? {
23741
+ marketGroup: void 0,
23742
+ marketCategory: [legacyCategory],
23743
+ sportsMarketType: void 0,
23744
+ period: void 0
23745
+ } : {
23746
+ marketGroup: ["player_props"],
23747
+ marketCategory: void 0,
23748
+ sportsMarketType: void 0,
23749
+ period: void 0
23750
+ };
23751
+ }
23752
+ if (tab.kind === "exact_score") {
23753
+ return {
23754
+ marketGroup: ["exact_score"],
23755
+ marketCategory: void 0,
23756
+ sportsMarketType: void 0,
23757
+ period: void 0
23758
+ };
23759
+ }
23760
+ if (tab.kind === "other") {
23761
+ return {
23762
+ marketGroup: ["other"],
23763
+ marketCategory: void 0,
23764
+ sportsMarketType: void 0,
23765
+ period: void 0
23766
+ };
23767
+ }
23705
23768
  return {
23706
- marketGroup: useMarketGroup ? [...resolvedDefinition.marketGroup] : void 0,
23707
- // Only fall back to the deprecated marketCategory filter when the tab has no
23708
- // marketGroup mapping. Sending both would AND them server-side and drop
23709
- // markets that carry only one of the two.
23710
- marketCategory: !useMarketGroup && resolvedDefinition.marketCategory ? [resolvedDefinition.marketCategory] : void 0,
23711
- sportsMarketType: resolvedDefinition.sportsMarketType ? [...resolvedDefinition.sportsMarketType] : void 0,
23712
- period: resolvedDefinition.period ? [...resolvedDefinition.period] : void 0
23769
+ marketGroup: [...SPORTS_GAME_LINE_GROUPS],
23770
+ marketCategory: void 0,
23771
+ sportsMarketType: void 0,
23772
+ period: void 0
23713
23773
  };
23714
23774
  };
23715
23775
  var hasTeamTitledOutcomes = (market) => {
@@ -23723,28 +23783,41 @@ var isClusterRelation = (left, right) => {
23723
23783
  var _a, _b;
23724
23784
  return ((_a = left.matchedVenueMarkets) != null ? _a : []).some((market) => market.id === right.id) || ((_b = right.matchedVenueMarkets) != null ? _b : []).some((market) => market.id === left.id);
23725
23785
  };
23726
- var dropDecomposedLegsMergedIntoSingle = (markets) => markets.filter(
23727
- (market) => hasTeamTitledOutcomes(market) || !markets.some(
23728
- (other) => other !== market && hasTeamTitledOutcomes(other) && isClusterRelation(market, other)
23729
- )
23730
- );
23786
+ var isDecomposedLeg = (market) => {
23787
+ var _a;
23788
+ const labels = ((_a = market.venueMarketOutcomes) != null ? _a : []).map(
23789
+ (outcome) => toTrimmedString(outcome.label).toLowerCase()
23790
+ );
23791
+ return labels.length === 2 && labels.every((label2) => YES_NO_LABELS.has(label2)) && !hasTeamTitledOutcomes(market);
23792
+ };
23793
+ var dropDecomposedLegsMergedIntoSingle = (markets) => {
23794
+ const legs = markets.filter((market) => isDecomposedLeg(market));
23795
+ if (legs.length === 0) return markets;
23796
+ const hasMergedSingle = markets.some(
23797
+ (market) => {
23798
+ var _a, _b;
23799
+ return hasTeamTitledOutcomes(market) && ((_b = (_a = market.venueMarketOutcomes) == null ? void 0 : _a.length) != null ? _b : 0) >= legs.length && markets.some((other) => other !== market && isClusterRelation(market, other));
23800
+ }
23801
+ );
23802
+ return hasMergedSingle ? markets.filter((market) => !isDecomposedLeg(market)) : markets;
23803
+ };
23731
23804
  var resolveSportsSectionMarkets = ({
23732
- tabKey,
23805
+ tab,
23733
23806
  eventMarkets,
23734
23807
  sectionMarkets
23735
23808
  }) => {
23736
- const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter((market) => resolveMarketSectionTabKey(market) === tabKey);
23809
+ const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter((market) => resolveMarketSectionTabKey(market) === tab.key);
23737
23810
  const filteredSectionMarkets = effectiveSectionMarkets.filter(
23738
- (market) => resolveMarketSectionTabKey(market) === tabKey
23811
+ (market) => resolveMarketSectionTabKey(market) === tab.key
23739
23812
  );
23740
- if (tabKey === "other") {
23813
+ if (tab.key === "other" || tab.key === `stat:${SPORTS_GENERIC_STAT}`) {
23741
23814
  const seenIds = new Set(filteredSectionMarkets.map((market) => market.id));
23742
- const strayOtherMarkets = eventMarkets.filter(
23743
- (market) => !seenIds.has(market.id) && resolveMarketSectionTabKey(market) === "other"
23815
+ const strayMarkets = eventMarkets.filter(
23816
+ (market) => !seenIds.has(market.id) && resolveMarketSectionTabKey(market) === tab.key
23744
23817
  );
23745
- return [...filteredSectionMarkets, ...strayOtherMarkets];
23818
+ return [...filteredSectionMarkets, ...strayMarkets];
23746
23819
  }
23747
- if (tabKey !== "game_lines") return filteredSectionMarkets;
23820
+ if (tab.kind !== "game_lines") return filteredSectionMarkets;
23748
23821
  const dedupeEventMarketsOfType = (type) => {
23749
23822
  const dedupedMarkets = [];
23750
23823
  const seenKeys = /* @__PURE__ */ new Set();
@@ -23844,7 +23917,9 @@ var resolveSpreadOutcomeTeamNames = (activeMarket, groupMarkets) => {
23844
23917
  return toTrimmedString((_b = (_a = market.venueMarketOutcomes) == null ? void 0 : _a[index]) == null ? void 0 : _b.title);
23845
23918
  }).filter((title2) => isSpreadTeamTitle(title2));
23846
23919
  if (cleanTitles.length === 0) return null;
23847
- return cleanTitles.reduce((longest, title2) => title2.length > longest.length ? title2 : longest);
23920
+ return cleanTitles.reduce(
23921
+ (longest, title2) => title2.length > longest.length ? title2 : longest
23922
+ );
23848
23923
  };
23849
23924
  return { favored: pickName(0), dog: pickName(1) };
23850
23925
  };
@@ -23853,9 +23928,7 @@ var resolveCombinedMoneylineLegLabel = (market) => {
23853
23928
  return toTrimmedString(typedMarket.shortTitle) || toTrimmedString(market.question);
23854
23929
  };
23855
23930
  var areCombinedMoneylineLegsDistinct = (markets) => {
23856
- const labels = markets.map(
23857
- (market) => resolveCombinedMoneylineLegLabel(market).toLowerCase()
23858
- );
23931
+ const labels = markets.map((market) => resolveCombinedMoneylineLegLabel(market).toLowerCase());
23859
23932
  return labels.every((label2) => label2.length > 0) && new Set(labels).size === labels.length;
23860
23933
  };
23861
23934
  var resolveDisplayGroupFamilyKey = (market) => {
@@ -24140,6 +24213,15 @@ var buildSportsSlideFromGroup = (group) => {
24140
24213
  defaultStopIndex
24141
24214
  };
24142
24215
  };
24216
+ var formatSportsPeriodGrammarLabel = (period) => {
24217
+ const grammarMatch = SPORTS_PERIOD_GRAMMAR_PATTERN.exec(period);
24218
+ if (!grammarMatch) return null;
24219
+ if (grammarMatch[1]) {
24220
+ const family = grammarMatch[1].charAt(0).toUpperCase() + grammarMatch[1].slice(1);
24221
+ return `${family} ${Number(grammarMatch[2])}`;
24222
+ }
24223
+ return `First ${Number(grammarMatch[3])} Innings`;
24224
+ };
24143
24225
  var resolveSportsCategoryTokens = (event) => {
24144
24226
  return new Set(
24145
24227
  event.categories.flatMap((entry) => {
@@ -24162,39 +24244,20 @@ var isNonStandardSportsLikeEvent = (event) => {
24162
24244
  return ESPORTS_TITLE_PATTERN.test(question) || SERIES_SCOPE_PATTERN.test(question);
24163
24245
  });
24164
24246
  };
24165
- var resolveVisibleSportsSectionTabDefinitions = (event) => {
24166
- const presentTabKeys = /* @__PURE__ */ new Set();
24167
- for (const market of event.venueMarkets) {
24168
- const tabKey = resolveMarketSectionTabKey(market);
24169
- if (tabKey) presentTabKeys.add(tabKey);
24170
- }
24171
- let definitions = SPORTS_SECTION_TAB_DEFINITIONS.filter(
24172
- (definition) => presentTabKeys.has(definition.key)
24173
- );
24174
- if (isNonStandardSportsLikeEvent(event)) {
24175
- definitions = definitions.filter(
24176
- (definition) => SPORTS_NON_STANDARD_VISIBLE_TAB_KEY_SET.has(definition.key)
24177
- );
24178
- }
24179
- return definitions;
24180
- };
24181
24247
  var mergeSportsSectionMarketsIntoEvent = ({
24182
24248
  event,
24183
24249
  sectionMarketsByKey
24184
24250
  }) => {
24185
- var _a;
24186
24251
  const orderedVenueMarkets = [...event.venueMarkets];
24187
24252
  const seenMarketIds = new Set(orderedVenueMarkets.map((market) => market.id));
24188
- for (const sectionKey of SPORTS_SECTION_TAB_DEFINITIONS.map((definition) => definition.key)) {
24189
- for (const market of (_a = sectionMarketsByKey[sectionKey]) != null ? _a : []) {
24253
+ for (const markets of Object.values(sectionMarketsByKey)) {
24254
+ for (const market of markets != null ? markets : []) {
24190
24255
  if (seenMarketIds.has(market.id)) continue;
24191
24256
  seenMarketIds.add(market.id);
24192
24257
  orderedVenueMarkets.push(market);
24193
24258
  }
24194
24259
  }
24195
- return __spreadProps(__spreadValues({}, event), {
24196
- venueMarkets: orderedVenueMarkets
24197
- });
24260
+ return __spreadProps(__spreadValues({}, event), { venueMarkets: orderedVenueMarkets });
24198
24261
  };
24199
24262
 
24200
24263
  // src/pages/event-market/sports-market-card.tsx
@@ -24677,24 +24740,48 @@ SportsMarketCard.displayName = "SportsMarketCard";
24677
24740
 
24678
24741
  // src/pages/event-market/sports-markets.tsx
24679
24742
  var import_jsx_runtime162 = require("react/jsx-runtime");
24680
- var resolveSportsSectionLabel = (labels, key) => {
24681
- switch (key) {
24743
+ var STAT_LABEL_OVERRIDES = {
24744
+ rbis: "RBIs",
24745
+ hits_runs_rbis: "Hits + Runs + RBIs",
24746
+ ot: "OT"
24747
+ };
24748
+ var formatStatLabel = (stat) => {
24749
+ var _a;
24750
+ return (_a = STAT_LABEL_OVERRIDES[stat]) != null ? _a : stat.split("_").filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
24751
+ };
24752
+ var LEGACY_STAT_LABEL_KEYS = {
24753
+ corners: "cornersTab",
24754
+ goals: "goalsTab",
24755
+ assists: "assistsTab",
24756
+ shots: "shotsTab"
24757
+ };
24758
+ var resolveSportsSectionLabel = (labels, tab) => {
24759
+ var _a, _b, _c, _d, _e;
24760
+ const sports = labels.eventMarketPage.sports;
24761
+ switch (tab.kind) {
24682
24762
  case "game_lines":
24683
- return labels.eventMarketPage.sports.gameLinesTab;
24684
- case "halves":
24685
- return labels.eventMarketPage.sports.halvesTab;
24763
+ return sports.gameLinesTab;
24686
24764
  case "exact_score":
24687
- return labels.eventMarketPage.sports.exactScoreTab;
24688
- case "corners":
24689
- return labels.eventMarketPage.sports.cornersTab;
24690
- case "goals":
24691
- return labels.eventMarketPage.sports.goalsTab;
24692
- case "assists":
24693
- return labels.eventMarketPage.sports.assistsTab;
24694
- case "shots":
24695
- return labels.eventMarketPage.sports.shotsTab;
24765
+ return sports.exactScoreTab;
24696
24766
  case "other":
24697
- return labels.eventMarketPage.sports.otherTab;
24767
+ return sports.otherTab;
24768
+ case "stat": {
24769
+ if (tab.stat === "player_props") return sports.playerPropsTab;
24770
+ const legacyLabelKey = tab.stat ? LEGACY_STAT_LABEL_KEYS[tab.stat] : void 0;
24771
+ return legacyLabelKey ? sports[legacyLabelKey] : formatStatLabel((_a = tab.stat) != null ? _a : "");
24772
+ }
24773
+ case "period": {
24774
+ switch (tab.periodFamily) {
24775
+ case "halves":
24776
+ return sports.halvesTab;
24777
+ case "quarters":
24778
+ return sports.quartersTab;
24779
+ case "sets":
24780
+ return sports.setsTab;
24781
+ default:
24782
+ return (_e = (_c = formatSportsPeriodGrammarLabel((_b = tab.periodFamily) != null ? _b : "")) == null ? void 0 : _c.replace(/^First /, "")) != null ? _e : formatStatLabel((_d = tab.periodFamily) != null ? _d : "");
24783
+ }
24784
+ }
24698
24785
  }
24699
24786
  };
24700
24787
  var SportsTabButton = ({
@@ -24782,18 +24869,23 @@ var SportsMarkets = ({
24782
24869
  }
24783
24870
  return merged;
24784
24871
  }, [event.venueMarkets, gameMarkets]);
24785
- const visibleSectionDefinitions = (0, import_react41.useMemo)(
24786
- () => resolveVisibleSportsSectionTabDefinitions(__spreadProps(__spreadValues({}, event), { venueMarkets: tabSourceMarkets })),
24872
+ const visibleTabs = (0, import_react41.useMemo)(
24873
+ () => resolveVisibleSportsSectionTabs(__spreadProps(__spreadValues({}, event), { venueMarkets: tabSourceMarkets })),
24787
24874
  [event, tabSourceMarkets]
24788
24875
  );
24789
- const shouldRenderTabs = visibleSectionDefinitions.length > 1 && tabSourceMarkets.length > 1;
24790
- const [activeTabKey, setActiveTabKey] = (0, import_react41.useState)(
24791
- (_b = (_a = visibleSectionDefinitions[0]) == null ? void 0 : _a.key) != null ? _b : "game_lines"
24876
+ const shouldRenderTabs = visibleTabs.length > 1 && tabSourceMarkets.length > 1;
24877
+ const [activeTabKey, setActiveTabKey] = (0, import_react41.useState)((_b = (_a = visibleTabs[0]) == null ? void 0 : _a.key) != null ? _b : "game_lines");
24878
+ const activeTab = (0, import_react41.useMemo)(
24879
+ () => {
24880
+ var _a2, _b2;
24881
+ return (_b2 = (_a2 = visibleTabs.find((tab) => tab.key === activeTabKey)) != null ? _a2 : visibleTabs[0]) != null ? _b2 : { key: "game_lines", kind: "game_lines" };
24882
+ },
24883
+ [visibleTabs, activeTabKey]
24792
24884
  );
24793
24885
  const [expandedGroupId, setExpandedGroupId] = (0, import_react41.useState)(null);
24794
24886
  const [stableMarketsByTab, setStableMarketsByTab] = (0, import_react41.useState)({});
24795
- const activeTabLabel = resolveSportsSectionLabel(labels, activeTabKey);
24796
- const sectionFilters = resolveSportsSectionFilters(activeTabKey);
24887
+ const activeTabLabel = resolveSportsSectionLabel(labels, activeTab);
24888
+ const sectionFilters = resolveSportsSectionFilters(activeTab);
24797
24889
  const sectionMarketsQuery = (0, import_hooks65.useVenueMarkets)({
24798
24890
  aggKey: event.aggKey ? [event.aggKey] : void 0,
24799
24891
  sportsMarketType: sectionFilters.sportsMarketType,
@@ -24816,26 +24908,25 @@ var SportsMarkets = ({
24816
24908
  } = sectionMarketsQuery;
24817
24909
  const resolvedSectionMarkets = (0, import_react41.useMemo)(
24818
24910
  () => resolveSportsSectionMarkets({
24819
- tabKey: activeTabKey,
24911
+ tab: activeTab,
24820
24912
  eventMarkets: tabSourceMarkets,
24821
24913
  sectionMarkets
24822
24914
  }),
24823
- [activeTabKey, tabSourceMarkets, sectionMarkets]
24915
+ [activeTab, tabSourceMarkets, sectionMarkets]
24824
24916
  );
24825
24917
  const isSectionSettled = !isSectionLoading && !hasNextPage && !isFetchingNextPage;
24826
24918
  const stableSectionMarkets = stableMarketsByTab[activeTabKey];
24827
- const displayedSectionMarkets = stableSectionMarkets != null ? stableSectionMarkets : isSectionSettled ? resolvedSectionMarkets : [];
24919
+ const displayedSectionMarkets = (0, import_react41.useMemo)(
24920
+ () => stableSectionMarkets != null ? stableSectionMarkets : isSectionSettled ? resolvedSectionMarkets : [],
24921
+ [stableSectionMarkets, isSectionSettled, resolvedSectionMarkets]
24922
+ );
24828
24923
  const periodGroups = (0, import_react41.useMemo)(
24829
24924
  () => groupSportsMarketsByPeriod(displayedSectionMarkets),
24830
24925
  [displayedSectionMarkets]
24831
24926
  );
24832
- const displayedPeriodGroups = (0, import_react41.useMemo)(
24833
- () => activeTabKey === "game_lines" ? periodGroups.filter((periodGroup) => periodGroup.key === "full") : periodGroups,
24834
- [activeTabKey, periodGroups]
24835
- );
24836
24927
  const allGroups = (0, import_react41.useMemo)(
24837
- () => displayedPeriodGroups.flatMap((periodGroup) => periodGroup.groups),
24838
- [displayedPeriodGroups]
24928
+ () => periodGroups.flatMap((periodGroup) => periodGroup.groups),
24929
+ [periodGroups]
24839
24930
  );
24840
24931
  (0, import_react41.useEffect)(() => {
24841
24932
  if (hasNextPage && !isFetchingNextPage) {
@@ -24869,9 +24960,9 @@ var SportsMarkets = ({
24869
24960
  }, [activeTabKey, displayedSectionMarkets, hasAggKey, onSectionMarketsChange]);
24870
24961
  (0, import_react41.useEffect)(() => {
24871
24962
  var _a2, _b2;
24872
- if (visibleSectionDefinitions.some((definition) => definition.key === activeTabKey)) return;
24873
- setActiveTabKey((_b2 = (_a2 = visibleSectionDefinitions[0]) == null ? void 0 : _a2.key) != null ? _b2 : "game_lines");
24874
- }, [activeTabKey, visibleSectionDefinitions]);
24963
+ if (visibleTabs.some((tab) => tab.key === activeTabKey)) return;
24964
+ setActiveTabKey((_b2 = (_a2 = visibleTabs[0]) == null ? void 0 : _a2.key) != null ? _b2 : "game_lines");
24965
+ }, [activeTabKey, visibleTabs]);
24875
24966
  const lastActiveTabRef = (0, import_react41.useRef)(null);
24876
24967
  (0, import_react41.useEffect)(() => {
24877
24968
  if (allGroups.length === 0) return;
@@ -24918,14 +25009,14 @@ var SportsMarkets = ({
24918
25009
  role: "tablist",
24919
25010
  "aria-label": labels.eventMarketPage.sports.sectionTabsAria,
24920
25011
  className: "flex flex-nowrap items-center gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
24921
- children: visibleSectionDefinitions.map((definition) => /* @__PURE__ */ (0, import_jsx_runtime162.jsx)(
25012
+ children: visibleTabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime162.jsx)(
24922
25013
  SportsTabButton,
24923
25014
  {
24924
- isActive: definition.key === activeTabKey,
24925
- label: resolveSportsSectionLabel(labels, definition.key),
24926
- onClick: () => setActiveTabKey(definition.key)
25015
+ isActive: tab.key === activeTabKey,
25016
+ label: resolveSportsSectionLabel(labels, tab),
25017
+ onClick: () => setActiveTabKey(tab.key)
24927
25018
  },
24928
- definition.key
25019
+ tab.key
24929
25020
  ))
24930
25021
  }
24931
25022
  ) : null,
@@ -24939,7 +25030,7 @@ var SportsMarkets = ({
24939
25030
  classNames: { root: "min-h-[220px]" }
24940
25031
  }
24941
25032
  ) : null,
24942
- displayedPeriodGroups.map((periodGroup) => {
25033
+ periodGroups.map((periodGroup) => {
24943
25034
  return /* @__PURE__ */ (0, import_jsx_runtime162.jsx)(
24944
25035
  "section",
24945
25036
  {
@@ -24996,7 +25087,7 @@ var SportsEventMarketPage = ({
24996
25087
  }, [event, sectionMarketsByKey]);
24997
25088
  const eventTradingState = (0, import_react42.useMemo)(() => (0, import_hooks66.resolveEventTradingState)(composedEvent), [composedEvent]);
24998
25089
  const hasSportsSections = (0, import_react42.useMemo)(
24999
- () => resolveVisibleSportsSectionTabDefinitions(event).length > 0,
25090
+ () => resolveVisibleSportsSectionTabs(event).length > 0,
25000
25091
  [event]
25001
25092
  );
25002
25093
  const stickyOrderPanelState = resolveEventMarketPageStickyState({