@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/index.js CHANGED
@@ -20552,7 +20552,7 @@ var buildLiveRouteCards = ({
20552
20552
  };
20553
20553
  }
20554
20554
  const avgPrice = sq.avgPrice;
20555
- const soloQuoteData = __spreadProps(__spreadValues({}, quoteData), {
20555
+ const soloQuoteData = __spreadValues(__spreadProps(__spreadValues({}, quoteData), {
20556
20556
  // Preview-only solos intentionally carry no executable quoteId; the card
20557
20557
  // should still render for comparison, while the CTA stays disabled until
20558
20558
  // the user is funded and requotes.
@@ -20565,7 +20565,7 @@ var buildLiveRouteCards = ({
20565
20565
  returnPct: sq.returnPct,
20566
20566
  // venueSoloQuotes stripped on solo card's quoteData (only the primary needs them)
20567
20567
  venueSoloQuotes: void 0
20568
- });
20568
+ }), sq.quoteId ? { status: "ok", error: void 0 } : null);
20569
20569
  return {
20570
20570
  id: `live-solo-${sq.venue}`,
20571
20571
  hint: labels.averagePrice(avgPrice),
@@ -20621,6 +20621,17 @@ var buildLiveRouteCards = ({
20621
20621
  })() : [];
20622
20622
  return [...baseCards, ...unavailableCards, ...warningOnlyUnavailableCards];
20623
20623
  };
20624
+ var resolveDefaultRouteCardId = (routeCards, primaryStatus) => {
20625
+ var _a, _b, _c, _d;
20626
+ if (routeCards.length === 0) return null;
20627
+ if (primaryStatus === "insufficient_balance") {
20628
+ const executableCard = routeCards.find(
20629
+ (card) => !card.isUnavailable && card.quoteData.status === "ok" && card.quoteData.quoteId
20630
+ );
20631
+ if (executableCard) return executableCard.id;
20632
+ }
20633
+ 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;
20634
+ };
20624
20635
  var sellSharesToAtomicUnits = (shares) => {
20625
20636
  if (!Number.isFinite(shares) || shares <= 0) return BigInt(0);
20626
20637
  const [whole = "0", fraction = ""] = shares.toFixed(12).split(".");
@@ -22555,7 +22566,7 @@ var PlaceOrder = ({
22555
22566
  resolvedClaim,
22556
22567
  midpointsResult
22557
22568
  }) => {
22558
- 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;
22569
+ 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;
22559
22570
  const {
22560
22571
  enableDebug: isExecutionDebugEnabled,
22561
22572
  features: { enableAnimations, showFeesBreakdown, showLimitOrders },
@@ -22986,13 +22997,13 @@ var PlaceOrder = ({
22986
22997
  venueSellQuotes.quotes
22987
22998
  ]);
22988
22999
  const resolvedSelectedRouteCardId = (0, import_react39.useMemo)(() => {
22989
- var _a2, _b2, _c2, _d2;
23000
+ var _a2;
22990
23001
  if (routeCards.length === 0) return null;
22991
23002
  if (selectedRouteCardId && routeCards.some((card) => card.id === selectedRouteCardId && !card.isUnavailable)) {
22992
23003
  return selectedRouteCardId;
22993
23004
  }
22994
- 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;
22995
- }, [routeCards, selectedRouteCardId]);
23005
+ return resolveDefaultRouteCardId(routeCards, isSell ? void 0 : (_a2 = smartRoute.data) == null ? void 0 : _a2.status);
23006
+ }, [routeCards, selectedRouteCardId, isSell, (_w = smartRoute.data) == null ? void 0 : _w.status]);
22996
23007
  (0, import_react39.useEffect)(() => {
22997
23008
  if (routeCards.length === 0) {
22998
23009
  setSelectedRouteCardId(null);
@@ -23032,14 +23043,14 @@ var PlaceOrder = ({
23032
23043
  setLimitPriceInputError(null);
23033
23044
  }, [executionType, scopedSelectedOutcomeId, selectedOutcomeDisplayPrice]);
23034
23045
  const orderedRouteCards = routeCards;
23035
- const selectedRouteCard = (_x = (_w = orderedRouteCards.find((card) => card.id === resolvedSelectedRouteCardId)) != null ? _w : orderedRouteCards[0]) != null ? _x : null;
23046
+ const selectedRouteCard = (_y = (_x = orderedRouteCards.find((card) => card.id === resolvedSelectedRouteCardId)) != null ? _x : orderedRouteCards[0]) != null ? _y : null;
23036
23047
  const isKalshiRoute = (0, import_react39.useMemo)(() => {
23037
23048
  if (selectedRouteCard) {
23038
23049
  return selectedRouteCard.venue === "kalshi" || selectedRouteCard.quoteData.fills.some((f) => f.venue === "kalshi");
23039
23050
  }
23040
23051
  return (scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.venue) === "kalshi";
23041
23052
  }, [selectedRouteCard, scopedSelectedMarket]);
23042
- const displayedBalance = isPaperMode ? paperTotalBalance : isKalshiRoute ? (_y = liveBalanceState.kalshiBalance) != null ? _y : 0 : liveAvailableBalance;
23053
+ const displayedBalance = isPaperMode ? paperTotalBalance : isKalshiRoute ? (_z = liveBalanceState.kalshiBalance) != null ? _z : 0 : liveAvailableBalance;
23043
23054
  const legacyKalshiAccount = (0, import_react39.useMemo)(
23044
23055
  () => {
23045
23056
  var _a2;
@@ -23047,8 +23058,8 @@ var PlaceOrder = ({
23047
23058
  },
23048
23059
  [user == null ? void 0 : user.venueAccounts]
23049
23060
  );
23050
- const isKalshiAccountActive = (_z = kalshiKeyStatus == null ? void 0 : kalshiKeyStatus.connected) != null ? _z : (legacyKalshiAccount == null ? void 0 : legacyKalshiAccount.status) === "active";
23051
- const isKalshiVerified = ((_A = kalshiKeyStatus == null ? void 0 : kalshiKeyStatus.kycStatus) != null ? _A : legacyKalshiAccount == null ? void 0 : legacyKalshiAccount.kycStatus) === "verified";
23061
+ const isKalshiAccountActive = (_A = kalshiKeyStatus == null ? void 0 : kalshiKeyStatus.connected) != null ? _A : (legacyKalshiAccount == null ? void 0 : legacyKalshiAccount.status) === "active";
23062
+ const isKalshiVerified = ((_B = kalshiKeyStatus == null ? void 0 : kalshiKeyStatus.kycStatus) != null ? _B : legacyKalshiAccount == null ? void 0 : legacyKalshiAccount.kycStatus) === "verified";
23052
23063
  const hasKalshiConnectionState = kalshiKeyStatus !== void 0 || (user == null ? void 0 : user.venueAccounts) != null;
23053
23064
  const isKalshiAvailable = (0, import_hooks63.getVenueAvailabilityState)({
23054
23065
  venueId: "kalshi",
@@ -23075,7 +23086,7 @@ var PlaceOrder = ({
23075
23086
  [aggClient, onConnectKalshi, refetchKalshiKeyStatus]
23076
23087
  );
23077
23088
  const needsKycVerification = isAuthenticated && hasKalshiConnectionState && isKalshiRoute && isKalshiAccountActive && !isKalshiVerified;
23078
- 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;
23089
+ 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;
23079
23090
  const handleRouteCardSelect = (0, import_react39.useCallback)(
23080
23091
  (cardId) => {
23081
23092
  if (cardId === resolvedSelectedRouteCardId) {
@@ -23090,15 +23101,15 @@ var PlaceOrder = ({
23090
23101
  [resolvedSelectedRouteCardId, routeCards]
23091
23102
  );
23092
23103
  const executionProgress = (0, import_hooks63.useExecutionProgress)({
23093
- orderIds: (_F = submissionProgressState == null ? void 0 : submissionProgressState.orderIds) != null ? _F : null,
23094
- quoteId: (_G = submissionProgressState == null ? void 0 : submissionProgressState.quoteId) != null ? _G : null,
23104
+ orderIds: (_G = submissionProgressState == null ? void 0 : submissionProgressState.orderIds) != null ? _G : null,
23105
+ quoteId: (_H = submissionProgressState == null ? void 0 : submissionProgressState.quoteId) != null ? _H : null,
23095
23106
  mode: isPaperMode ? "paper" : void 0,
23096
- 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)
23107
+ 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)
23097
23108
  });
23098
- 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 : "";
23099
- const headerImage = (_M = (_L = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.image) != null ? _L : scopedSelectedEvent == null ? void 0 : scopedSelectedEvent.image) != null ? _M : null;
23100
- const headerTitle = (_O = (_N = scopedSelectedEvent == null ? void 0 : scopedSelectedEvent.title) != null ? _N : scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.question) != null ? _O : "";
23101
- const headerSubtitle = (_P = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.question) != null ? _P : "";
23109
+ 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 : "";
23110
+ const headerImage = (_N = (_M = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.image) != null ? _M : scopedSelectedEvent == null ? void 0 : scopedSelectedEvent.image) != null ? _N : null;
23111
+ const headerTitle = (_P = (_O = scopedSelectedEvent == null ? void 0 : scopedSelectedEvent.title) != null ? _O : scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.question) != null ? _P : "";
23112
+ const headerSubtitle = (_Q = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.question) != null ? _Q : "";
23102
23113
  const buildExecutionSummary = (0, import_react39.useCallback)(
23103
23114
  (quoteData, executionVenue, orderId, partialFillSummary) => {
23104
23115
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2;
@@ -23396,19 +23407,19 @@ var PlaceOrder = ({
23396
23407
  queryClient,
23397
23408
  submissionProgressState
23398
23409
  ]);
23399
- const activeQuoteData = (_R = (_Q = selectedRouteCard == null ? void 0 : selectedRouteCard.quoteData) != null ? _Q : smartRoute.data) != null ? _R : null;
23410
+ const activeQuoteData = (_S = (_R = selectedRouteCard == null ? void 0 : selectedRouteCard.quoteData) != null ? _R : smartRoute.data) != null ? _S : null;
23400
23411
  const visibleRouteCards = orderedRouteCards.length > PLACE_ORDER_ROUTE_COLLAPSED_CARD_COUNT && !isRoutesExpanded ? orderedRouteCards.slice(0, PLACE_ORDER_ROUTE_COLLAPSED_CARD_COUNT) : orderedRouteCards;
23401
23412
  const hasEnteredAmount = internalAmount > 0;
23402
23413
  const isQuoteLoading = !isLimitOrder && hasEnteredAmount && (smartRoute.isFetching || smartRoute.isLoading || isSell && (venueSellQuotes.isFetching || venueSellQuotes.isLoading));
23403
23414
  const routeLoadingMessage = isQuoteLoading ? smartRoute.loadingReason === "updating-route" ? tradingLabels.updatingRoute : smartRoute.loadingReason === "refreshing-quotes" ? tradingLabels.refreshingQuotes : tradingLabels.findingBestOdds : null;
23404
- const selectedRouteFills = (_S = selectedRouteCard == null ? void 0 : selectedRouteCard.quoteData.fills) != null ? _S : [];
23415
+ const selectedRouteFills = (_T = selectedRouteCard == null ? void 0 : selectedRouteCard.quoteData.fills) != null ? _T : [];
23405
23416
  const isKalshiOnlyRoute = isKalshiRoute && ((selectedRouteCard == null ? void 0 : selectedRouteCard.venue) === import_sdk23.Venue.kalshi || selectedRouteFills.length > 0 && selectedRouteFills.every((fill) => fill.venue === import_sdk23.Venue.kalshi));
23406
23417
  const isOnchainOnlyRoute = !isKalshiRoute || selectedRouteFills.length > 0 && selectedRouteFills.every((fill) => fill.venue !== import_sdk23.Venue.kalshi);
23407
23418
  const kalshiRequiredAmount = isSell ? 0 : selectedRouteFills.filter((fill) => fill.venue === import_sdk23.Venue.kalshi).reduce((total, fill) => total + fill.venueQty * fill.avgPrice, 0);
23408
23419
  const onchainRequiredAmount = isSell ? 0 : selectedRouteFills.filter((fill) => fill.venue !== import_sdk23.Venue.kalshi).reduce((total, fill) => total + fill.venueQty * fill.avgPrice, 0);
23409
23420
  const resolvedKalshiRequiredAmount = isKalshiOnlyRoute || isKalshiRoute && selectedRouteFills.length === 0 ? internalAmount : kalshiRequiredAmount;
23410
23421
  const resolvedOnchainRequiredAmount = isOnchainOnlyRoute || !isKalshiRoute && selectedRouteFills.length === 0 ? internalAmount : onchainRequiredAmount;
23411
- const isKalshiBalanceInsufficient = !isPaperMode && isKalshiRoute && resolvedKalshiRequiredAmount > ((_T = liveBalanceState.kalshiBalance) != null ? _T : 0);
23422
+ const isKalshiBalanceInsufficient = !isPaperMode && isKalshiRoute && resolvedKalshiRequiredAmount > ((_U = liveBalanceState.kalshiBalance) != null ? _U : 0);
23412
23423
  const isOnchainBalanceInsufficient = resolvedOnchainRequiredAmount > liveAvailableBalance;
23413
23424
  const isInsufficientBalance = !isSell && isAuthenticated && hasEnteredAmount && !isBalanceLoading && (isLimitOrder ? internalAmount > totalBalance : isPaperMode ? internalAmount > paperTotalBalance : isKalshiBalanceInsufficient || isOnchainBalanceInsufficient);
23414
23425
  const isQuoteInsufficientBalance = !isLimitOrder && (activeQuoteData == null ? void 0 : activeQuoteData.status) === "insufficient_balance";
@@ -23502,7 +23513,7 @@ var PlaceOrder = ({
23502
23513
  }
23503
23514
  return (_d2 = selectedRouteCard.hint) != null ? _d2 : "";
23504
23515
  }, [selectedRouteCard, tradingLabels]);
23505
- const displayedToWinValue = (_U = selectedRouteCard == null ? void 0 : selectedRouteCard.numericValue) != null ? _U : 0;
23516
+ const displayedToWinValue = (_V = selectedRouteCard == null ? void 0 : selectedRouteCard.numericValue) != null ? _V : 0;
23506
23517
  const limitOrderPayload = (0, import_react39.useMemo)(() => {
23507
23518
  if (!scopedSelectedMarket || !scopedSelectedOutcomeId || internalAmount <= 0) return null;
23508
23519
  if (limitPriceInputError) return null;
@@ -23621,13 +23632,13 @@ var PlaceOrder = ({
23621
23632
  ];
23622
23633
  }, [activeFeeBreakdown, tradingLabels]);
23623
23634
  const isActionLoading = isPrimaryActionLoading || executeManaged.isPending || placeLimitOrder.isPending || isBeforeActionPending;
23624
- const selectedRouteGeoBlocked = (_V = selectedRouteCard == null ? void 0 : selectedRouteCard.isUnavailable) != null ? _V : false;
23635
+ const selectedRouteGeoBlocked = (_W = selectedRouteCard == null ? void 0 : selectedRouteCard.isUnavailable) != null ? _W : false;
23625
23636
  const geoBlockedVenuesFromWarnings = (0, import_react39.useMemo)(
23626
23637
  () => {
23627
23638
  var _a2;
23628
23639
  return extractGeoBlockedVenues((_a2 = smartRoute.data) == null ? void 0 : _a2.warnings);
23629
23640
  },
23630
- [(_W = smartRoute.data) == null ? void 0 : _W.warnings]
23641
+ [(_X = smartRoute.data) == null ? void 0 : _X.warnings]
23631
23642
  );
23632
23643
  const isPrimaryVenueGeoBlocked = (0, import_react39.useMemo)(() => {
23633
23644
  var _a2, _b2;
@@ -24285,7 +24296,7 @@ var PlaceOrder = ({
24285
24296
  PlaceOrderResolvedView,
24286
24297
  {
24287
24298
  tradingState: resolvedReadOnlyTradingState,
24288
- resolutionTimestamp: (_X = resolvedEventTradingState.resolvesAt) != null ? _X : resolvedReadOnlyTradingState.resolvesAt,
24299
+ resolutionTimestamp: (_Y = resolvedEventTradingState.resolvesAt) != null ? _Y : resolvedReadOnlyTradingState.resolvesAt,
24289
24300
  resolvedClaim,
24290
24301
  classNames,
24291
24302
  className,
@@ -25718,64 +25729,15 @@ var SPORTS_LEGACY_PROP_CATEGORY_KEY_SET = /* @__PURE__ */ new Set([
25718
25729
  "assists",
25719
25730
  "shots"
25720
25731
  ]);
25721
- var SPORTS_CATEGORY_OVERRIDE_TAB_KEY_SET = /* @__PURE__ */ new Set([
25722
- "exact_score",
25723
- ...SPORTS_LEGACY_PROP_CATEGORY_KEY_SET
25724
- ]);
25725
- var SPORTS_MARKET_GROUP_TO_TAB = {
25726
- game_lines: "game_lines",
25727
- spreads: "game_lines",
25728
- totals: "game_lines",
25729
- period_lines: "halves",
25730
- exact_score: "exact_score",
25731
- team_props: "other",
25732
- player_props: "other",
25733
- specials: "other",
25734
- completion: "other",
25735
- other: "other"
25736
- };
25737
- var SPORTS_SECTION_TAB_DEFINITIONS = [
25738
- {
25739
- key: "game_lines",
25740
- // NO sportsMarketType filter: spread/total markets on some sports (e.g.
25741
- // esports "Map 1 Rounds Handicap"/"Total Rounds") are sportsMarketType="other"
25742
- // with marketGroup=spreads/totals; AND-ing the game-line types would drop them
25743
- // and leave only the moneyline. marketGroup already scopes the tab. (Safe now
25744
- // that classify_market no longer mis-groups prop/to-score-first/extra-innings
25745
- // markets into game_lines/totals — see agg-venue-core market_group.rs.)
25746
- marketGroup: ["game_lines", "spreads", "totals"]
25747
- // No server-side period filter: many regular-time game-line markets arrive
25748
- // with period=null (moneyline sides, team totals, BTTS), and a
25749
- // period=["full"] filter would drop them server-side. The Game Lines tab
25750
- // narrows to the regular-time group client-side instead (see SportsMarkets).
25751
- },
25752
- { key: "exact_score", marketGroup: ["exact_score"] },
25753
- {
25754
- key: "halves",
25755
- // NO sportsMarketType filter: half-result legs ("France leading at halftime?")
25756
- // are sportsMarketType="other"; AND-ing the game-line types would drop them.
25757
- // marketGroup=period_lines + period already scope the tab.
25758
- marketGroup: ["period_lines"],
25759
- period: ["1h", "2h"]
25760
- },
25761
- { key: "corners", marketCategory: "corners" },
25762
- { key: "goals", marketCategory: "goals" },
25763
- { key: "assists", marketCategory: "assists" },
25764
- { key: "shots", marketCategory: "shots" },
25765
- {
25766
- key: "other",
25767
- // `player_props` is deliberately NOT fetched here: goals/assists/shots/corners
25768
- // props already have dedicated tabs (resolveMarketSectionTabKey routes them
25769
- // there by category), so including the group would re-fetch hundreds of props
25770
- // already shown elsewhere. The handful with no stat category (e.g. "saves")
25771
- // are back-filled from the game-wide set in resolveSportsSectionMarkets.
25772
- marketGroup: ["other", "team_props", "specials", "completion"]
25773
- }
25732
+ var SPORTS_GAME_LINE_GROUPS = [
25733
+ "game_lines",
25734
+ "spreads",
25735
+ "totals",
25736
+ "team_props",
25737
+ "specials",
25738
+ "completion"
25774
25739
  ];
25775
- var SPORTS_NON_STANDARD_VISIBLE_TAB_KEYS = ["game_lines", "other"];
25776
- var SPORTS_NON_STANDARD_VISIBLE_TAB_KEY_SET = new Set(
25777
- SPORTS_NON_STANDARD_VISIBLE_TAB_KEYS
25778
- );
25740
+ var SPORTS_GENERIC_STAT = "player_props";
25779
25741
  var ESPORTS_CATEGORY_TOKENS = /* @__PURE__ */ new Set([
25780
25742
  "esports",
25781
25743
  "video games",
@@ -25786,9 +25748,6 @@ var ESPORTS_CATEGORY_TOKENS = /* @__PURE__ */ new Set([
25786
25748
  ]);
25787
25749
  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;
25788
25750
  var SERIES_SCOPE_PATTERN = /\b(?:bo[1-9]|best of \d+|map \d+|game \d+)\b/i;
25789
- var SPORTS_SECTION_TAB_BY_KEY = new Map(
25790
- SPORTS_SECTION_TAB_DEFINITIONS.map((definition) => [definition.key, definition])
25791
- );
25792
25751
  var SPORTS_PERIOD_ORDER = [
25793
25752
  "full",
25794
25753
  "1h",
@@ -25853,12 +25812,13 @@ var getSportsMarketTypeOrderIndex = (sportsMarketType) => {
25853
25812
  const marketTypeIndex = SPORTS_MARKET_TYPE_ORDER.indexOf(sportsMarketType);
25854
25813
  return marketTypeIndex >= 0 ? marketTypeIndex : SPORTS_MARKET_TYPE_ORDER.length;
25855
25814
  };
25856
- var resolveSportsSectionDefinition = (key) => {
25857
- const resolvedDefinition = SPORTS_SECTION_TAB_BY_KEY.get(key);
25858
- if (!resolvedDefinition) {
25859
- return SPORTS_SECTION_TAB_DEFINITIONS[0];
25860
- }
25861
- return resolvedDefinition;
25815
+ var resolveSportsPeriodFamily = (period) => {
25816
+ if (period === "1h" || period === "2h") return "halves";
25817
+ if (period === "q1" || period === "q2" || period === "q3" || period === "q4") return "quarters";
25818
+ if (/^inning_\d{1,2}$/.test(period)) return "innings";
25819
+ if (/^set_\d{1,2}$/.test(period)) return "sets";
25820
+ if (/^(?:map|game)_\d{1,2}$/.test(period)) return "maps";
25821
+ return period;
25862
25822
  };
25863
25823
  var normalizeSportsPeriod = (value) => {
25864
25824
  const resolvedValue = toTrimmedString(value).toLowerCase();
@@ -25903,34 +25863,134 @@ var resolveFallbackSportsMarketCategory = (market) => {
25903
25863
  if (question.includes("goal")) return "goals";
25904
25864
  return null;
25905
25865
  };
25866
+ var resolveSportsStatToken = (market) => {
25867
+ const subtype = toTrimmedString(market.marketSubtype).toLowerCase();
25868
+ const playerMatch = /_player_(.+)$/.exec(subtype);
25869
+ if (playerMatch) return playerMatch[1];
25870
+ const category = normalizeSportsMarketCategory(market.marketCategory);
25871
+ if (category && SPORTS_LEGACY_PROP_CATEGORY_KEY_SET.has(category)) return category;
25872
+ return null;
25873
+ };
25906
25874
  var resolveMarketSectionTabKey = (market) => {
25875
+ var _a;
25907
25876
  if (normalizeSportsMarketType(market.sportsMarketType) === "to_advance") {
25908
25877
  return "game_lines";
25909
25878
  }
25910
25879
  const normalizedCategory = normalizeSportsMarketCategory(market.marketCategory);
25911
25880
  const fallbackCategory = !normalizedCategory || normalizedCategory === "other" ? resolveFallbackSportsMarketCategory(market) : null;
25912
25881
  const category = fallbackCategory != null ? fallbackCategory : normalizedCategory;
25913
- if (category && SPORTS_CATEGORY_OVERRIDE_TAB_KEY_SET.has(category)) {
25914
- return category;
25915
- }
25882
+ if (category && SPORTS_LEGACY_PROP_CATEGORY_KEY_SET.has(category)) return `stat:${category}`;
25883
+ if (category === "exact_score") return "exact_score";
25916
25884
  const group = normalizeSportsMarketGroup(market.marketGroup);
25917
- if (group) return SPORTS_MARKET_GROUP_TO_TAB[group];
25885
+ if (group === "exact_score") return "exact_score";
25886
+ if (group === "player_props") {
25887
+ return `stat:${(_a = resolveSportsStatToken(market)) != null ? _a : SPORTS_GENERIC_STAT}`;
25888
+ }
25889
+ if (group === "period_lines") {
25890
+ return `period:${resolveSportsPeriodFamily(normalizeSportsPeriod(market.period))}`;
25891
+ }
25892
+ if (group === "other") return "other";
25893
+ if (group) return "game_lines";
25918
25894
  if (category === "game_lines") return "game_lines";
25919
25895
  if (category === "other") return "other";
25920
25896
  return null;
25921
25897
  };
25922
- var resolveSportsSectionFilters = (key) => {
25923
- var _a;
25924
- const resolvedDefinition = resolveSportsSectionDefinition(key);
25925
- const useMarketGroup = !!((_a = resolvedDefinition.marketGroup) == null ? void 0 : _a.length);
25898
+ var resolveVisibleSportsSectionTabs = (event) => {
25899
+ var _a, _b, _c;
25900
+ const periodsByFamily = /* @__PURE__ */ new Map();
25901
+ const statVolume = /* @__PURE__ */ new Map();
25902
+ let hasGameLines = false;
25903
+ let hasExactScore = false;
25904
+ let hasOther = false;
25905
+ for (const market of event.venueMarkets) {
25906
+ const key = resolveMarketSectionTabKey(market);
25907
+ if (!key) continue;
25908
+ if (key === "game_lines") hasGameLines = true;
25909
+ else if (key === "exact_score") hasExactScore = true;
25910
+ else if (key === "other") hasOther = true;
25911
+ else if (key.startsWith("period:")) {
25912
+ const family = key.slice("period:".length);
25913
+ const periods = (_a = periodsByFamily.get(family)) != null ? _a : /* @__PURE__ */ new Set();
25914
+ periods.add(normalizeSportsPeriod(market.period));
25915
+ periodsByFamily.set(family, periods);
25916
+ } else if (key.startsWith("stat:")) {
25917
+ const stat = key.slice("stat:".length);
25918
+ statVolume.set(stat, ((_b = statVolume.get(stat)) != null ? _b : 0) + ((_c = market.volume) != null ? _c : 0));
25919
+ }
25920
+ }
25921
+ const tabs = [];
25922
+ if (hasGameLines) tabs.push({ key: "game_lines", kind: "game_lines" });
25923
+ const periodTabs = Array.from(periodsByFamily.entries()).map(([periodFamily, periods]) => ({
25924
+ key: `period:${periodFamily}`,
25925
+ kind: "period",
25926
+ periodFamily,
25927
+ periods: Array.from(periods).sort(
25928
+ (left, right) => getSportsPeriodOrderIndex(left) - getSportsPeriodOrderIndex(right)
25929
+ )
25930
+ })).sort(
25931
+ (left, right) => getSportsPeriodOrderIndex(left.periods[0]) - getSportsPeriodOrderIndex(right.periods[0])
25932
+ );
25933
+ tabs.push(...periodTabs);
25934
+ const statTabs = Array.from(statVolume.entries()).sort((left, right) => {
25935
+ if (left[0] === SPORTS_GENERIC_STAT !== (right[0] === SPORTS_GENERIC_STAT)) {
25936
+ return left[0] === SPORTS_GENERIC_STAT ? 1 : -1;
25937
+ }
25938
+ return right[1] - left[1];
25939
+ }).map(([stat]) => ({ key: `stat:${stat}`, kind: "stat", stat }));
25940
+ tabs.push(...statTabs);
25941
+ if (hasExactScore) tabs.push({ key: "exact_score", kind: "exact_score" });
25942
+ if (hasOther) tabs.push({ key: "other", kind: "other" });
25943
+ if (isNonStandardSportsLikeEvent(event)) {
25944
+ return tabs.filter((tab) => tab.kind === "game_lines" || tab.kind === "other");
25945
+ }
25946
+ return tabs;
25947
+ };
25948
+ var resolveSportsSectionFilters = (tab) => {
25949
+ if (tab.kind === "period") {
25950
+ return {
25951
+ marketGroup: ["period_lines"],
25952
+ marketCategory: void 0,
25953
+ sportsMarketType: void 0,
25954
+ period: tab.periods ? [...tab.periods] : void 0
25955
+ };
25956
+ }
25957
+ if (tab.kind === "stat") {
25958
+ const legacyCategory = SPORTS_LEGACY_PROP_CATEGORY_KEY_SET.has(
25959
+ tab.stat
25960
+ ) ? tab.stat : null;
25961
+ return legacyCategory ? {
25962
+ marketGroup: void 0,
25963
+ marketCategory: [legacyCategory],
25964
+ sportsMarketType: void 0,
25965
+ period: void 0
25966
+ } : {
25967
+ marketGroup: ["player_props"],
25968
+ marketCategory: void 0,
25969
+ sportsMarketType: void 0,
25970
+ period: void 0
25971
+ };
25972
+ }
25973
+ if (tab.kind === "exact_score") {
25974
+ return {
25975
+ marketGroup: ["exact_score"],
25976
+ marketCategory: void 0,
25977
+ sportsMarketType: void 0,
25978
+ period: void 0
25979
+ };
25980
+ }
25981
+ if (tab.kind === "other") {
25982
+ return {
25983
+ marketGroup: ["other"],
25984
+ marketCategory: void 0,
25985
+ sportsMarketType: void 0,
25986
+ period: void 0
25987
+ };
25988
+ }
25926
25989
  return {
25927
- marketGroup: useMarketGroup ? [...resolvedDefinition.marketGroup] : void 0,
25928
- // Only fall back to the deprecated marketCategory filter when the tab has no
25929
- // marketGroup mapping. Sending both would AND them server-side and drop
25930
- // markets that carry only one of the two.
25931
- marketCategory: !useMarketGroup && resolvedDefinition.marketCategory ? [resolvedDefinition.marketCategory] : void 0,
25932
- sportsMarketType: resolvedDefinition.sportsMarketType ? [...resolvedDefinition.sportsMarketType] : void 0,
25933
- period: resolvedDefinition.period ? [...resolvedDefinition.period] : void 0
25990
+ marketGroup: [...SPORTS_GAME_LINE_GROUPS],
25991
+ marketCategory: void 0,
25992
+ sportsMarketType: void 0,
25993
+ period: void 0
25934
25994
  };
25935
25995
  };
25936
25996
  var hasTeamTitledOutcomes = (market) => {
@@ -25944,28 +26004,41 @@ var isClusterRelation = (left, right) => {
25944
26004
  var _a, _b;
25945
26005
  return ((_a = left.matchedVenueMarkets) != null ? _a : []).some((market) => market.id === right.id) || ((_b = right.matchedVenueMarkets) != null ? _b : []).some((market) => market.id === left.id);
25946
26006
  };
25947
- var dropDecomposedLegsMergedIntoSingle = (markets) => markets.filter(
25948
- (market) => hasTeamTitledOutcomes(market) || !markets.some(
25949
- (other) => other !== market && hasTeamTitledOutcomes(other) && isClusterRelation(market, other)
25950
- )
25951
- );
26007
+ var isDecomposedLeg = (market) => {
26008
+ var _a;
26009
+ const labels = ((_a = market.venueMarketOutcomes) != null ? _a : []).map(
26010
+ (outcome) => toTrimmedString(outcome.label).toLowerCase()
26011
+ );
26012
+ return labels.length === 2 && labels.every((label2) => YES_NO_LABELS.has(label2)) && !hasTeamTitledOutcomes(market);
26013
+ };
26014
+ var dropDecomposedLegsMergedIntoSingle = (markets) => {
26015
+ const legs = markets.filter((market) => isDecomposedLeg(market));
26016
+ if (legs.length === 0) return markets;
26017
+ const hasMergedSingle = markets.some(
26018
+ (market) => {
26019
+ var _a, _b;
26020
+ 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));
26021
+ }
26022
+ );
26023
+ return hasMergedSingle ? markets.filter((market) => !isDecomposedLeg(market)) : markets;
26024
+ };
25952
26025
  var resolveSportsSectionMarkets = ({
25953
- tabKey,
26026
+ tab,
25954
26027
  eventMarkets,
25955
26028
  sectionMarkets
25956
26029
  }) => {
25957
- const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter((market) => resolveMarketSectionTabKey(market) === tabKey);
26030
+ const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter((market) => resolveMarketSectionTabKey(market) === tab.key);
25958
26031
  const filteredSectionMarkets = effectiveSectionMarkets.filter(
25959
- (market) => resolveMarketSectionTabKey(market) === tabKey
26032
+ (market) => resolveMarketSectionTabKey(market) === tab.key
25960
26033
  );
25961
- if (tabKey === "other") {
26034
+ if (tab.key === "other" || tab.key === `stat:${SPORTS_GENERIC_STAT}`) {
25962
26035
  const seenIds = new Set(filteredSectionMarkets.map((market) => market.id));
25963
- const strayOtherMarkets = eventMarkets.filter(
25964
- (market) => !seenIds.has(market.id) && resolveMarketSectionTabKey(market) === "other"
26036
+ const strayMarkets = eventMarkets.filter(
26037
+ (market) => !seenIds.has(market.id) && resolveMarketSectionTabKey(market) === tab.key
25965
26038
  );
25966
- return [...filteredSectionMarkets, ...strayOtherMarkets];
26039
+ return [...filteredSectionMarkets, ...strayMarkets];
25967
26040
  }
25968
- if (tabKey !== "game_lines") return filteredSectionMarkets;
26041
+ if (tab.kind !== "game_lines") return filteredSectionMarkets;
25969
26042
  const dedupeEventMarketsOfType = (type) => {
25970
26043
  const dedupedMarkets = [];
25971
26044
  const seenKeys = /* @__PURE__ */ new Set();
@@ -26065,7 +26138,9 @@ var resolveSpreadOutcomeTeamNames = (activeMarket, groupMarkets) => {
26065
26138
  return toTrimmedString((_b = (_a = market.venueMarketOutcomes) == null ? void 0 : _a[index]) == null ? void 0 : _b.title);
26066
26139
  }).filter((title2) => isSpreadTeamTitle(title2));
26067
26140
  if (cleanTitles.length === 0) return null;
26068
- return cleanTitles.reduce((longest, title2) => title2.length > longest.length ? title2 : longest);
26141
+ return cleanTitles.reduce(
26142
+ (longest, title2) => title2.length > longest.length ? title2 : longest
26143
+ );
26069
26144
  };
26070
26145
  return { favored: pickName(0), dog: pickName(1) };
26071
26146
  };
@@ -26074,9 +26149,7 @@ var resolveCombinedMoneylineLegLabel = (market) => {
26074
26149
  return toTrimmedString(typedMarket.shortTitle) || toTrimmedString(market.question);
26075
26150
  };
26076
26151
  var areCombinedMoneylineLegsDistinct = (markets) => {
26077
- const labels = markets.map(
26078
- (market) => resolveCombinedMoneylineLegLabel(market).toLowerCase()
26079
- );
26152
+ const labels = markets.map((market) => resolveCombinedMoneylineLegLabel(market).toLowerCase());
26080
26153
  return labels.every((label2) => label2.length > 0) && new Set(labels).size === labels.length;
26081
26154
  };
26082
26155
  var resolveDisplayGroupFamilyKey = (market) => {
@@ -26361,6 +26434,15 @@ var buildSportsSlideFromGroup = (group) => {
26361
26434
  defaultStopIndex
26362
26435
  };
26363
26436
  };
26437
+ var formatSportsPeriodGrammarLabel = (period) => {
26438
+ const grammarMatch = SPORTS_PERIOD_GRAMMAR_PATTERN.exec(period);
26439
+ if (!grammarMatch) return null;
26440
+ if (grammarMatch[1]) {
26441
+ const family = grammarMatch[1].charAt(0).toUpperCase() + grammarMatch[1].slice(1);
26442
+ return `${family} ${Number(grammarMatch[2])}`;
26443
+ }
26444
+ return `First ${Number(grammarMatch[3])} Innings`;
26445
+ };
26364
26446
  var resolveSportsCategoryTokens = (event) => {
26365
26447
  return new Set(
26366
26448
  event.categories.flatMap((entry) => {
@@ -26383,39 +26465,20 @@ var isNonStandardSportsLikeEvent = (event) => {
26383
26465
  return ESPORTS_TITLE_PATTERN.test(question) || SERIES_SCOPE_PATTERN.test(question);
26384
26466
  });
26385
26467
  };
26386
- var resolveVisibleSportsSectionTabDefinitions = (event) => {
26387
- const presentTabKeys = /* @__PURE__ */ new Set();
26388
- for (const market of event.venueMarkets) {
26389
- const tabKey = resolveMarketSectionTabKey(market);
26390
- if (tabKey) presentTabKeys.add(tabKey);
26391
- }
26392
- let definitions = SPORTS_SECTION_TAB_DEFINITIONS.filter(
26393
- (definition) => presentTabKeys.has(definition.key)
26394
- );
26395
- if (isNonStandardSportsLikeEvent(event)) {
26396
- definitions = definitions.filter(
26397
- (definition) => SPORTS_NON_STANDARD_VISIBLE_TAB_KEY_SET.has(definition.key)
26398
- );
26399
- }
26400
- return definitions;
26401
- };
26402
26468
  var mergeSportsSectionMarketsIntoEvent = ({
26403
26469
  event,
26404
26470
  sectionMarketsByKey
26405
26471
  }) => {
26406
- var _a;
26407
26472
  const orderedVenueMarkets = [...event.venueMarkets];
26408
26473
  const seenMarketIds = new Set(orderedVenueMarkets.map((market) => market.id));
26409
- for (const sectionKey of SPORTS_SECTION_TAB_DEFINITIONS.map((definition) => definition.key)) {
26410
- for (const market of (_a = sectionMarketsByKey[sectionKey]) != null ? _a : []) {
26474
+ for (const markets of Object.values(sectionMarketsByKey)) {
26475
+ for (const market of markets != null ? markets : []) {
26411
26476
  if (seenMarketIds.has(market.id)) continue;
26412
26477
  seenMarketIds.add(market.id);
26413
26478
  orderedVenueMarkets.push(market);
26414
26479
  }
26415
26480
  }
26416
- return __spreadProps(__spreadValues({}, event), {
26417
- venueMarkets: orderedVenueMarkets
26418
- });
26481
+ return __spreadProps(__spreadValues({}, event), { venueMarkets: orderedVenueMarkets });
26419
26482
  };
26420
26483
 
26421
26484
  // src/pages/event-market/sports-market-card.tsx
@@ -26898,24 +26961,48 @@ SportsMarketCard.displayName = "SportsMarketCard";
26898
26961
 
26899
26962
  // src/pages/event-market/sports-markets.tsx
26900
26963
  var import_jsx_runtime170 = require("react/jsx-runtime");
26901
- var resolveSportsSectionLabel = (labels, key) => {
26902
- switch (key) {
26964
+ var STAT_LABEL_OVERRIDES = {
26965
+ rbis: "RBIs",
26966
+ hits_runs_rbis: "Hits + Runs + RBIs",
26967
+ ot: "OT"
26968
+ };
26969
+ var formatStatLabel = (stat) => {
26970
+ var _a;
26971
+ return (_a = STAT_LABEL_OVERRIDES[stat]) != null ? _a : stat.split("_").filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
26972
+ };
26973
+ var LEGACY_STAT_LABEL_KEYS = {
26974
+ corners: "cornersTab",
26975
+ goals: "goalsTab",
26976
+ assists: "assistsTab",
26977
+ shots: "shotsTab"
26978
+ };
26979
+ var resolveSportsSectionLabel = (labels, tab) => {
26980
+ var _a, _b, _c, _d, _e;
26981
+ const sports = labels.eventMarketPage.sports;
26982
+ switch (tab.kind) {
26903
26983
  case "game_lines":
26904
- return labels.eventMarketPage.sports.gameLinesTab;
26905
- case "halves":
26906
- return labels.eventMarketPage.sports.halvesTab;
26984
+ return sports.gameLinesTab;
26907
26985
  case "exact_score":
26908
- return labels.eventMarketPage.sports.exactScoreTab;
26909
- case "corners":
26910
- return labels.eventMarketPage.sports.cornersTab;
26911
- case "goals":
26912
- return labels.eventMarketPage.sports.goalsTab;
26913
- case "assists":
26914
- return labels.eventMarketPage.sports.assistsTab;
26915
- case "shots":
26916
- return labels.eventMarketPage.sports.shotsTab;
26986
+ return sports.exactScoreTab;
26917
26987
  case "other":
26918
- return labels.eventMarketPage.sports.otherTab;
26988
+ return sports.otherTab;
26989
+ case "stat": {
26990
+ if (tab.stat === "player_props") return sports.playerPropsTab;
26991
+ const legacyLabelKey = tab.stat ? LEGACY_STAT_LABEL_KEYS[tab.stat] : void 0;
26992
+ return legacyLabelKey ? sports[legacyLabelKey] : formatStatLabel((_a = tab.stat) != null ? _a : "");
26993
+ }
26994
+ case "period": {
26995
+ switch (tab.periodFamily) {
26996
+ case "halves":
26997
+ return sports.halvesTab;
26998
+ case "quarters":
26999
+ return sports.quartersTab;
27000
+ case "sets":
27001
+ return sports.setsTab;
27002
+ default:
27003
+ return (_e = (_c = formatSportsPeriodGrammarLabel((_b = tab.periodFamily) != null ? _b : "")) == null ? void 0 : _c.replace(/^First /, "")) != null ? _e : formatStatLabel((_d = tab.periodFamily) != null ? _d : "");
27004
+ }
27005
+ }
26919
27006
  }
26920
27007
  };
26921
27008
  var SportsTabButton = ({
@@ -27003,18 +27090,23 @@ var SportsMarkets = ({
27003
27090
  }
27004
27091
  return merged;
27005
27092
  }, [event.venueMarkets, gameMarkets]);
27006
- const visibleSectionDefinitions = (0, import_react44.useMemo)(
27007
- () => resolveVisibleSportsSectionTabDefinitions(__spreadProps(__spreadValues({}, event), { venueMarkets: tabSourceMarkets })),
27093
+ const visibleTabs = (0, import_react44.useMemo)(
27094
+ () => resolveVisibleSportsSectionTabs(__spreadProps(__spreadValues({}, event), { venueMarkets: tabSourceMarkets })),
27008
27095
  [event, tabSourceMarkets]
27009
27096
  );
27010
- const shouldRenderTabs = visibleSectionDefinitions.length > 1 && tabSourceMarkets.length > 1;
27011
- const [activeTabKey, setActiveTabKey] = (0, import_react44.useState)(
27012
- (_b = (_a = visibleSectionDefinitions[0]) == null ? void 0 : _a.key) != null ? _b : "game_lines"
27097
+ const shouldRenderTabs = visibleTabs.length > 1 && tabSourceMarkets.length > 1;
27098
+ const [activeTabKey, setActiveTabKey] = (0, import_react44.useState)((_b = (_a = visibleTabs[0]) == null ? void 0 : _a.key) != null ? _b : "game_lines");
27099
+ const activeTab = (0, import_react44.useMemo)(
27100
+ () => {
27101
+ var _a2, _b2;
27102
+ return (_b2 = (_a2 = visibleTabs.find((tab) => tab.key === activeTabKey)) != null ? _a2 : visibleTabs[0]) != null ? _b2 : { key: "game_lines", kind: "game_lines" };
27103
+ },
27104
+ [visibleTabs, activeTabKey]
27013
27105
  );
27014
27106
  const [expandedGroupId, setExpandedGroupId] = (0, import_react44.useState)(null);
27015
27107
  const [stableMarketsByTab, setStableMarketsByTab] = (0, import_react44.useState)({});
27016
- const activeTabLabel = resolveSportsSectionLabel(labels, activeTabKey);
27017
- const sectionFilters = resolveSportsSectionFilters(activeTabKey);
27108
+ const activeTabLabel = resolveSportsSectionLabel(labels, activeTab);
27109
+ const sectionFilters = resolveSportsSectionFilters(activeTab);
27018
27110
  const sectionMarketsQuery = (0, import_hooks68.useVenueMarkets)({
27019
27111
  aggKey: event.aggKey ? [event.aggKey] : void 0,
27020
27112
  sportsMarketType: sectionFilters.sportsMarketType,
@@ -27037,26 +27129,25 @@ var SportsMarkets = ({
27037
27129
  } = sectionMarketsQuery;
27038
27130
  const resolvedSectionMarkets = (0, import_react44.useMemo)(
27039
27131
  () => resolveSportsSectionMarkets({
27040
- tabKey: activeTabKey,
27132
+ tab: activeTab,
27041
27133
  eventMarkets: tabSourceMarkets,
27042
27134
  sectionMarkets
27043
27135
  }),
27044
- [activeTabKey, tabSourceMarkets, sectionMarkets]
27136
+ [activeTab, tabSourceMarkets, sectionMarkets]
27045
27137
  );
27046
27138
  const isSectionSettled = !isSectionLoading && !hasNextPage && !isFetchingNextPage;
27047
27139
  const stableSectionMarkets = stableMarketsByTab[activeTabKey];
27048
- const displayedSectionMarkets = stableSectionMarkets != null ? stableSectionMarkets : isSectionSettled ? resolvedSectionMarkets : [];
27140
+ const displayedSectionMarkets = (0, import_react44.useMemo)(
27141
+ () => stableSectionMarkets != null ? stableSectionMarkets : isSectionSettled ? resolvedSectionMarkets : [],
27142
+ [stableSectionMarkets, isSectionSettled, resolvedSectionMarkets]
27143
+ );
27049
27144
  const periodGroups = (0, import_react44.useMemo)(
27050
27145
  () => groupSportsMarketsByPeriod(displayedSectionMarkets),
27051
27146
  [displayedSectionMarkets]
27052
27147
  );
27053
- const displayedPeriodGroups = (0, import_react44.useMemo)(
27054
- () => activeTabKey === "game_lines" ? periodGroups.filter((periodGroup) => periodGroup.key === "full") : periodGroups,
27055
- [activeTabKey, periodGroups]
27056
- );
27057
27148
  const allGroups = (0, import_react44.useMemo)(
27058
- () => displayedPeriodGroups.flatMap((periodGroup) => periodGroup.groups),
27059
- [displayedPeriodGroups]
27149
+ () => periodGroups.flatMap((periodGroup) => periodGroup.groups),
27150
+ [periodGroups]
27060
27151
  );
27061
27152
  (0, import_react44.useEffect)(() => {
27062
27153
  if (hasNextPage && !isFetchingNextPage) {
@@ -27090,9 +27181,9 @@ var SportsMarkets = ({
27090
27181
  }, [activeTabKey, displayedSectionMarkets, hasAggKey, onSectionMarketsChange]);
27091
27182
  (0, import_react44.useEffect)(() => {
27092
27183
  var _a2, _b2;
27093
- if (visibleSectionDefinitions.some((definition) => definition.key === activeTabKey)) return;
27094
- setActiveTabKey((_b2 = (_a2 = visibleSectionDefinitions[0]) == null ? void 0 : _a2.key) != null ? _b2 : "game_lines");
27095
- }, [activeTabKey, visibleSectionDefinitions]);
27184
+ if (visibleTabs.some((tab) => tab.key === activeTabKey)) return;
27185
+ setActiveTabKey((_b2 = (_a2 = visibleTabs[0]) == null ? void 0 : _a2.key) != null ? _b2 : "game_lines");
27186
+ }, [activeTabKey, visibleTabs]);
27096
27187
  const lastActiveTabRef = (0, import_react44.useRef)(null);
27097
27188
  (0, import_react44.useEffect)(() => {
27098
27189
  if (allGroups.length === 0) return;
@@ -27139,14 +27230,14 @@ var SportsMarkets = ({
27139
27230
  role: "tablist",
27140
27231
  "aria-label": labels.eventMarketPage.sports.sectionTabsAria,
27141
27232
  className: "flex flex-nowrap items-center gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
27142
- children: visibleSectionDefinitions.map((definition) => /* @__PURE__ */ (0, import_jsx_runtime170.jsx)(
27233
+ children: visibleTabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime170.jsx)(
27143
27234
  SportsTabButton,
27144
27235
  {
27145
- isActive: definition.key === activeTabKey,
27146
- label: resolveSportsSectionLabel(labels, definition.key),
27147
- onClick: () => setActiveTabKey(definition.key)
27236
+ isActive: tab.key === activeTabKey,
27237
+ label: resolveSportsSectionLabel(labels, tab),
27238
+ onClick: () => setActiveTabKey(tab.key)
27148
27239
  },
27149
- definition.key
27240
+ tab.key
27150
27241
  ))
27151
27242
  }
27152
27243
  ) : null,
@@ -27160,7 +27251,7 @@ var SportsMarkets = ({
27160
27251
  classNames: { root: "min-h-[220px]" }
27161
27252
  }
27162
27253
  ) : null,
27163
- displayedPeriodGroups.map((periodGroup) => {
27254
+ periodGroups.map((periodGroup) => {
27164
27255
  return /* @__PURE__ */ (0, import_jsx_runtime170.jsx)(
27165
27256
  "section",
27166
27257
  {
@@ -27217,7 +27308,7 @@ var SportsEventMarketPage = ({
27217
27308
  }, [event, sectionMarketsByKey]);
27218
27309
  const eventTradingState = (0, import_react45.useMemo)(() => (0, import_hooks69.resolveEventTradingState)(composedEvent), [composedEvent]);
27219
27310
  const hasSportsSections = (0, import_react45.useMemo)(
27220
- () => resolveVisibleSportsSectionTabDefinitions(event).length > 0,
27311
+ () => resolveVisibleSportsSectionTabs(event).length > 0,
27221
27312
  [event]
27222
27313
  );
27223
27314
  const stickyOrderPanelState = resolveEventMarketPageStickyState({