@agg-build/ui 2.7.0 → 2.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@ import {
10
10
  isErrorWithStatus,
11
11
  useEventListTabs,
12
12
  useEventListTabsHeaderOverflow
13
- } from "./chunk-XAG432PJ.mjs";
13
+ } from "./chunk-EKUH3265.mjs";
14
14
  import {
15
15
  DEPOSIT_MODAL_OPEN_EVENT,
16
16
  PlaceOrder,
@@ -480,9 +480,9 @@ var SPORTS_PERIOD_ORDER = [
480
480
  "first_inning",
481
481
  "second_inning",
482
482
  "third_inning",
483
- "first_5_innings",
484
483
  "other"
485
484
  ];
485
+ var FIRST_N_INNINGS_PATTERN = /^first_(\d{1,2})_innings$/;
486
486
  var SPORTS_MARKET_TYPE_ORDER = [
487
487
  "to_advance",
488
488
  "moneyline",
@@ -513,6 +513,10 @@ var stripLineValueFromQuestion = (question) => {
513
513
  var SPORTS_PERIOD_FAMILY_ORDER = ["period", "inning", "set", "map", "game"];
514
514
  var getSportsPeriodOrderIndex = (period) => {
515
515
  var _a, _b;
516
+ const inningsMatch = FIRST_N_INNINGS_PATTERN.exec(period);
517
+ if (inningsMatch) {
518
+ return SPORTS_PERIOD_ORDER.indexOf("third_inning") + 1 + Number(inningsMatch[1]) / 100;
519
+ }
516
520
  const periodIndex = SPORTS_PERIOD_ORDER.indexOf(period);
517
521
  if (periodIndex >= 0) {
518
522
  return period === "other" ? Number.MAX_SAFE_INTEGER : periodIndex;
@@ -615,6 +619,28 @@ var resolveMarketSectionTabKey = (market) => {
615
619
  if (category === "other") return "other";
616
620
  return null;
617
621
  };
622
+ var SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS = {
623
+ halves: /* @__PURE__ */ new Set(["soccer", "basketball", "american_football", "rugby", "aussie_rules"]),
624
+ quarters: /* @__PURE__ */ new Set(["basketball", "american_football", "lacrosse", "aussie_rules"]),
625
+ innings: /* @__PURE__ */ new Set(["baseball"]),
626
+ sets: /* @__PURE__ */ new Set(["tennis", "table_tennis", "volleyball"]),
627
+ maps: /* @__PURE__ */ new Set(["esports"]),
628
+ ot: /* @__PURE__ */ new Set(["basketball", "american_football", "hockey", "soccer"])
629
+ };
630
+ var PERIOD_N_FAMILY_PATTERN = /^period_\d{1,2}$/;
631
+ var isPeriodFamilyAllowedForSport = (family, sport) => {
632
+ if (!sport || sport === "other_sport") return true;
633
+ if (PERIOD_N_FAMILY_PATTERN.test(family)) return sport === "hockey";
634
+ const normalizedFamily = FIRST_N_INNINGS_PATTERN.test(family) ? "innings" : family;
635
+ const allowedSports = SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS[normalizedFamily];
636
+ return !allowedSports || allowedSports.has(sport);
637
+ };
638
+ var resolveEffectiveMarketSectionTabKey = (market, sport) => {
639
+ const key = resolveMarketSectionTabKey(market);
640
+ if (!key || !key.startsWith("period:")) return key;
641
+ const family = key.slice("period:".length);
642
+ return isPeriodFamilyAllowedForSport(family, sport) ? key : "other";
643
+ };
618
644
  var resolveVisibleSportsSectionTabs = (event) => {
619
645
  var _a, _b, _c;
620
646
  const periodsByFamily = /* @__PURE__ */ new Map();
@@ -623,7 +649,7 @@ var resolveVisibleSportsSectionTabs = (event) => {
623
649
  let hasExactScore = false;
624
650
  let hasOther = false;
625
651
  for (const market of event.venueMarkets) {
626
- const key = resolveMarketSectionTabKey(market);
652
+ const key = resolveEffectiveMarketSectionTabKey(market, event.sport);
627
653
  if (!key) continue;
628
654
  if (key === "game_lines") hasGameLines = true;
629
655
  else if (key === "exact_score") hasExactScore = true;
@@ -745,30 +771,40 @@ var dropDecomposedLegsMergedIntoSingle = (markets) => {
745
771
  var resolveSportsSectionMarkets = ({
746
772
  tab,
747
773
  eventMarkets,
748
- sectionMarkets
774
+ sectionMarkets,
775
+ sport
749
776
  }) => {
750
- const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter((market) => resolveMarketSectionTabKey(market) === tab.key);
777
+ const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter(
778
+ (market) => resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
779
+ );
751
780
  const filteredSectionMarkets = effectiveSectionMarkets.filter(
752
- (market) => resolveMarketSectionTabKey(market) === tab.key
781
+ (market) => resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
753
782
  );
754
783
  if (tab.key === "other" || tab.key === `stat:${SPORTS_GENERIC_STAT}`) {
755
784
  const seenIds = new Set(filteredSectionMarkets.map((market) => market.id));
756
785
  const strayMarkets = eventMarkets.filter(
757
- (market) => !seenIds.has(market.id) && resolveMarketSectionTabKey(market) === tab.key
786
+ (market) => !seenIds.has(market.id) && resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
758
787
  );
759
788
  return [...filteredSectionMarkets, ...strayMarkets];
760
789
  }
761
790
  if (tab.kind !== "game_lines") return filteredSectionMarkets;
762
791
  const dedupeEventMarketsOfType = (type) => {
763
792
  const dedupedMarkets = [];
764
- const seenKeys = /* @__PURE__ */ new Set();
793
+ const keptIndexByKey = /* @__PURE__ */ new Map();
765
794
  for (const market of eventMarkets) {
766
795
  if (normalizeSportsMarketType(market.sportsMarketType) !== type || resolveMarketSectionTabKey(market) !== "game_lines") {
767
796
  continue;
768
797
  }
769
798
  const key = resolveSportsMarketAggKey(market) || market.id;
770
- if (seenKeys.has(key)) continue;
771
- seenKeys.add(key);
799
+ const keptIndex = keptIndexByKey.get(key);
800
+ if (keptIndex !== void 0) {
801
+ const kept = dedupedMarkets[keptIndex];
802
+ if (!hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market)) {
803
+ dedupedMarkets[keptIndex] = market;
804
+ }
805
+ continue;
806
+ }
807
+ keptIndexByKey.set(key, dedupedMarkets.length);
772
808
  dedupedMarkets.push(market);
773
809
  }
774
810
  return dropDecomposedLegsMergedIntoSingle(dedupedMarkets);
@@ -1857,9 +1893,10 @@ var SportsMarkets = ({
1857
1893
  () => resolveSportsSectionMarkets({
1858
1894
  tab: activeTab,
1859
1895
  eventMarkets: tabSourceMarkets,
1860
- sectionMarkets
1896
+ sectionMarkets,
1897
+ sport: event.sport
1861
1898
  }),
1862
- [activeTab, tabSourceMarkets, sectionMarkets]
1899
+ [activeTab, tabSourceMarkets, sectionMarkets, event.sport]
1863
1900
  );
1864
1901
  const isSectionSettled = !isSectionLoading && !hasNextPage && !isFetchingNextPage;
1865
1902
  const stableSectionMarkets = stableMarketsByTab[activeTabKey];
@@ -4908,7 +4908,13 @@ var MarketDetailsList = ({
4908
4908
  } = useVenueMarkets2({
4909
4909
  venueEventId: resolvedEventId,
4910
4910
  enabled: !providedMarkets && !!resolvedEventId,
4911
- status: MarketStatus.open
4911
+ status: MarketStatus.open,
4912
+ // Keep in lockstep with useEnrichedVenueEvent: limit is part of the React
4913
+ // Query key, so a mismatch would fork the shared cache into two requests.
4914
+ // fetchAll drains every page — events can exceed any single-page limit
4915
+ // (e.g. 80 open markets on one staging event).
4916
+ limit: 100,
4917
+ fetchAll: true
4912
4918
  // No explicit sortBy: event-scoped /venue-markets sorts by the event's
4913
4919
  // type-aware order (structureOrderBy), matching the home-card top-3 and the
4914
4920
  // markets-under-an-event ordering. Passing sortBy here would override it.
package/dist/events.js CHANGED
@@ -13706,7 +13706,13 @@ var MarketDetailsList = ({
13706
13706
  } = (0, import_hooks43.useVenueMarkets)({
13707
13707
  venueEventId: resolvedEventId,
13708
13708
  enabled: !providedMarkets && !!resolvedEventId,
13709
- status: import_hooks43.MarketStatus.open
13709
+ status: import_hooks43.MarketStatus.open,
13710
+ // Keep in lockstep with useEnrichedVenueEvent: limit is part of the React
13711
+ // Query key, so a mismatch would fork the shared cache into two requests.
13712
+ // fetchAll drains every page — events can exceed any single-page limit
13713
+ // (e.g. 80 open markets on one staging event).
13714
+ limit: 100,
13715
+ fetchAll: true
13710
13716
  // No explicit sortBy: event-scoped /venue-markets sorts by the event's
13711
13717
  // type-aware order (structureOrderBy), matching the home-card top-3 and the
13712
13718
  // markets-under-an-event ordering. Passing sortBy here would override it.
package/dist/events.mjs CHANGED
@@ -16,7 +16,7 @@ import {
16
16
  orderbookRowLimitDefault,
17
17
  resolveEventDetailsSyncKey,
18
18
  useCenterOrderbookSpread
19
- } from "./chunk-XAG432PJ.mjs";
19
+ } from "./chunk-EKUH3265.mjs";
20
20
  import {
21
21
  formatProbabilityCents,
22
22
  resolveOrderBookRows,
package/dist/index.js CHANGED
@@ -17648,7 +17648,13 @@ var MarketDetailsList = ({
17648
17648
  } = (0, import_hooks51.useVenueMarkets)({
17649
17649
  venueEventId: resolvedEventId,
17650
17650
  enabled: !providedMarkets && !!resolvedEventId,
17651
- status: import_hooks51.MarketStatus.open
17651
+ status: import_hooks51.MarketStatus.open,
17652
+ // Keep in lockstep with useEnrichedVenueEvent: limit is part of the React
17653
+ // Query key, so a mismatch would fork the shared cache into two requests.
17654
+ // fetchAll drains every page — events can exceed any single-page limit
17655
+ // (e.g. 80 open markets on one staging event).
17656
+ limit: 100,
17657
+ fetchAll: true
17652
17658
  // No explicit sortBy: event-scoped /venue-markets sorts by the event's
17653
17659
  // type-aware order (structureOrderBy), matching the home-card top-3 and the
17654
17660
  // markets-under-an-event ordering. Passing sortBy here would override it.
@@ -25760,9 +25766,9 @@ var SPORTS_PERIOD_ORDER = [
25760
25766
  "first_inning",
25761
25767
  "second_inning",
25762
25768
  "third_inning",
25763
- "first_5_innings",
25764
25769
  "other"
25765
25770
  ];
25771
+ var FIRST_N_INNINGS_PATTERN = /^first_(\d{1,2})_innings$/;
25766
25772
  var SPORTS_MARKET_TYPE_ORDER = [
25767
25773
  "to_advance",
25768
25774
  "moneyline",
@@ -25793,6 +25799,10 @@ var stripLineValueFromQuestion = (question) => {
25793
25799
  var SPORTS_PERIOD_FAMILY_ORDER = ["period", "inning", "set", "map", "game"];
25794
25800
  var getSportsPeriodOrderIndex = (period) => {
25795
25801
  var _a, _b;
25802
+ const inningsMatch = FIRST_N_INNINGS_PATTERN.exec(period);
25803
+ if (inningsMatch) {
25804
+ return SPORTS_PERIOD_ORDER.indexOf("third_inning") + 1 + Number(inningsMatch[1]) / 100;
25805
+ }
25796
25806
  const periodIndex = SPORTS_PERIOD_ORDER.indexOf(period);
25797
25807
  if (periodIndex >= 0) {
25798
25808
  return period === "other" ? Number.MAX_SAFE_INTEGER : periodIndex;
@@ -25895,6 +25905,28 @@ var resolveMarketSectionTabKey = (market) => {
25895
25905
  if (category === "other") return "other";
25896
25906
  return null;
25897
25907
  };
25908
+ var SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS = {
25909
+ halves: /* @__PURE__ */ new Set(["soccer", "basketball", "american_football", "rugby", "aussie_rules"]),
25910
+ quarters: /* @__PURE__ */ new Set(["basketball", "american_football", "lacrosse", "aussie_rules"]),
25911
+ innings: /* @__PURE__ */ new Set(["baseball"]),
25912
+ sets: /* @__PURE__ */ new Set(["tennis", "table_tennis", "volleyball"]),
25913
+ maps: /* @__PURE__ */ new Set(["esports"]),
25914
+ ot: /* @__PURE__ */ new Set(["basketball", "american_football", "hockey", "soccer"])
25915
+ };
25916
+ var PERIOD_N_FAMILY_PATTERN = /^period_\d{1,2}$/;
25917
+ var isPeriodFamilyAllowedForSport = (family, sport) => {
25918
+ if (!sport || sport === "other_sport") return true;
25919
+ if (PERIOD_N_FAMILY_PATTERN.test(family)) return sport === "hockey";
25920
+ const normalizedFamily = FIRST_N_INNINGS_PATTERN.test(family) ? "innings" : family;
25921
+ const allowedSports = SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS[normalizedFamily];
25922
+ return !allowedSports || allowedSports.has(sport);
25923
+ };
25924
+ var resolveEffectiveMarketSectionTabKey = (market, sport) => {
25925
+ const key = resolveMarketSectionTabKey(market);
25926
+ if (!key || !key.startsWith("period:")) return key;
25927
+ const family = key.slice("period:".length);
25928
+ return isPeriodFamilyAllowedForSport(family, sport) ? key : "other";
25929
+ };
25898
25930
  var resolveVisibleSportsSectionTabs = (event) => {
25899
25931
  var _a, _b, _c;
25900
25932
  const periodsByFamily = /* @__PURE__ */ new Map();
@@ -25903,7 +25935,7 @@ var resolveVisibleSportsSectionTabs = (event) => {
25903
25935
  let hasExactScore = false;
25904
25936
  let hasOther = false;
25905
25937
  for (const market of event.venueMarkets) {
25906
- const key = resolveMarketSectionTabKey(market);
25938
+ const key = resolveEffectiveMarketSectionTabKey(market, event.sport);
25907
25939
  if (!key) continue;
25908
25940
  if (key === "game_lines") hasGameLines = true;
25909
25941
  else if (key === "exact_score") hasExactScore = true;
@@ -26025,30 +26057,40 @@ var dropDecomposedLegsMergedIntoSingle = (markets) => {
26025
26057
  var resolveSportsSectionMarkets = ({
26026
26058
  tab,
26027
26059
  eventMarkets,
26028
- sectionMarkets
26060
+ sectionMarkets,
26061
+ sport
26029
26062
  }) => {
26030
- const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter((market) => resolveMarketSectionTabKey(market) === tab.key);
26063
+ const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter(
26064
+ (market) => resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
26065
+ );
26031
26066
  const filteredSectionMarkets = effectiveSectionMarkets.filter(
26032
- (market) => resolveMarketSectionTabKey(market) === tab.key
26067
+ (market) => resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
26033
26068
  );
26034
26069
  if (tab.key === "other" || tab.key === `stat:${SPORTS_GENERIC_STAT}`) {
26035
26070
  const seenIds = new Set(filteredSectionMarkets.map((market) => market.id));
26036
26071
  const strayMarkets = eventMarkets.filter(
26037
- (market) => !seenIds.has(market.id) && resolveMarketSectionTabKey(market) === tab.key
26072
+ (market) => !seenIds.has(market.id) && resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
26038
26073
  );
26039
26074
  return [...filteredSectionMarkets, ...strayMarkets];
26040
26075
  }
26041
26076
  if (tab.kind !== "game_lines") return filteredSectionMarkets;
26042
26077
  const dedupeEventMarketsOfType = (type) => {
26043
26078
  const dedupedMarkets = [];
26044
- const seenKeys = /* @__PURE__ */ new Set();
26079
+ const keptIndexByKey = /* @__PURE__ */ new Map();
26045
26080
  for (const market of eventMarkets) {
26046
26081
  if (normalizeSportsMarketType(market.sportsMarketType) !== type || resolveMarketSectionTabKey(market) !== "game_lines") {
26047
26082
  continue;
26048
26083
  }
26049
26084
  const key = resolveSportsMarketAggKey(market) || market.id;
26050
- if (seenKeys.has(key)) continue;
26051
- seenKeys.add(key);
26085
+ const keptIndex = keptIndexByKey.get(key);
26086
+ if (keptIndex !== void 0) {
26087
+ const kept = dedupedMarkets[keptIndex];
26088
+ if (!hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market)) {
26089
+ dedupedMarkets[keptIndex] = market;
26090
+ }
26091
+ continue;
26092
+ }
26093
+ keptIndexByKey.set(key, dedupedMarkets.length);
26052
26094
  dedupedMarkets.push(market);
26053
26095
  }
26054
26096
  return dropDecomposedLegsMergedIntoSingle(dedupedMarkets);
@@ -27131,9 +27173,10 @@ var SportsMarkets = ({
27131
27173
  () => resolveSportsSectionMarkets({
27132
27174
  tab: activeTab,
27133
27175
  eventMarkets: tabSourceMarkets,
27134
- sectionMarkets
27176
+ sectionMarkets,
27177
+ sport: event.sport
27135
27178
  }),
27136
- [activeTab, tabSourceMarkets, sectionMarkets]
27179
+ [activeTab, tabSourceMarkets, sectionMarkets, event.sport]
27137
27180
  );
27138
27181
  const isSectionSettled = !isSectionLoading && !hasNextPage && !isFetchingNextPage;
27139
27182
  const stableSectionMarkets = stableMarketsByTab[activeTabKey];
package/dist/index.mjs CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  UserProfilePage,
12
12
  buildAggTxExplorerHref,
13
13
  useHomePageModals
14
- } from "./chunk-C247AYH7.mjs";
14
+ } from "./chunk-7R2SMMAG.mjs";
15
15
  import {
16
16
  EventList,
17
17
  EventListItem,
@@ -28,7 +28,7 @@ import {
28
28
  orderbookRowLimitDefault,
29
29
  resolveEventDetailsSyncKey,
30
30
  useCenterOrderbookSpread
31
- } from "./chunk-XAG432PJ.mjs";
31
+ } from "./chunk-EKUH3265.mjs";
32
32
  import {
33
33
  CARD_NETWORK_OPTIONS,
34
34
  DepositModal,
package/dist/pages.js CHANGED
@@ -16213,7 +16213,13 @@ var MarketDetailsList = ({
16213
16213
  } = (0, import_hooks49.useVenueMarkets)({
16214
16214
  venueEventId: resolvedEventId,
16215
16215
  enabled: !providedMarkets && !!resolvedEventId,
16216
- status: import_hooks49.MarketStatus.open
16216
+ status: import_hooks49.MarketStatus.open,
16217
+ // Keep in lockstep with useEnrichedVenueEvent: limit is part of the React
16218
+ // Query key, so a mismatch would fork the shared cache into two requests.
16219
+ // fetchAll drains every page — events can exceed any single-page limit
16220
+ // (e.g. 80 open markets on one staging event).
16221
+ limit: 100,
16222
+ fetchAll: true
16217
16223
  // No explicit sortBy: event-scoped /venue-markets sorts by the event's
16218
16224
  // type-aware order (structureOrderBy), matching the home-card top-3 and the
16219
16225
  // markets-under-an-event ordering. Passing sortBy here would override it.
@@ -23539,9 +23545,9 @@ var SPORTS_PERIOD_ORDER = [
23539
23545
  "first_inning",
23540
23546
  "second_inning",
23541
23547
  "third_inning",
23542
- "first_5_innings",
23543
23548
  "other"
23544
23549
  ];
23550
+ var FIRST_N_INNINGS_PATTERN = /^first_(\d{1,2})_innings$/;
23545
23551
  var SPORTS_MARKET_TYPE_ORDER = [
23546
23552
  "to_advance",
23547
23553
  "moneyline",
@@ -23572,6 +23578,10 @@ var stripLineValueFromQuestion = (question) => {
23572
23578
  var SPORTS_PERIOD_FAMILY_ORDER = ["period", "inning", "set", "map", "game"];
23573
23579
  var getSportsPeriodOrderIndex = (period) => {
23574
23580
  var _a, _b;
23581
+ const inningsMatch = FIRST_N_INNINGS_PATTERN.exec(period);
23582
+ if (inningsMatch) {
23583
+ return SPORTS_PERIOD_ORDER.indexOf("third_inning") + 1 + Number(inningsMatch[1]) / 100;
23584
+ }
23575
23585
  const periodIndex = SPORTS_PERIOD_ORDER.indexOf(period);
23576
23586
  if (periodIndex >= 0) {
23577
23587
  return period === "other" ? Number.MAX_SAFE_INTEGER : periodIndex;
@@ -23674,6 +23684,28 @@ var resolveMarketSectionTabKey = (market) => {
23674
23684
  if (category === "other") return "other";
23675
23685
  return null;
23676
23686
  };
23687
+ var SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS = {
23688
+ halves: /* @__PURE__ */ new Set(["soccer", "basketball", "american_football", "rugby", "aussie_rules"]),
23689
+ quarters: /* @__PURE__ */ new Set(["basketball", "american_football", "lacrosse", "aussie_rules"]),
23690
+ innings: /* @__PURE__ */ new Set(["baseball"]),
23691
+ sets: /* @__PURE__ */ new Set(["tennis", "table_tennis", "volleyball"]),
23692
+ maps: /* @__PURE__ */ new Set(["esports"]),
23693
+ ot: /* @__PURE__ */ new Set(["basketball", "american_football", "hockey", "soccer"])
23694
+ };
23695
+ var PERIOD_N_FAMILY_PATTERN = /^period_\d{1,2}$/;
23696
+ var isPeriodFamilyAllowedForSport = (family, sport) => {
23697
+ if (!sport || sport === "other_sport") return true;
23698
+ if (PERIOD_N_FAMILY_PATTERN.test(family)) return sport === "hockey";
23699
+ const normalizedFamily = FIRST_N_INNINGS_PATTERN.test(family) ? "innings" : family;
23700
+ const allowedSports = SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS[normalizedFamily];
23701
+ return !allowedSports || allowedSports.has(sport);
23702
+ };
23703
+ var resolveEffectiveMarketSectionTabKey = (market, sport) => {
23704
+ const key = resolveMarketSectionTabKey(market);
23705
+ if (!key || !key.startsWith("period:")) return key;
23706
+ const family = key.slice("period:".length);
23707
+ return isPeriodFamilyAllowedForSport(family, sport) ? key : "other";
23708
+ };
23677
23709
  var resolveVisibleSportsSectionTabs = (event) => {
23678
23710
  var _a, _b, _c;
23679
23711
  const periodsByFamily = /* @__PURE__ */ new Map();
@@ -23682,7 +23714,7 @@ var resolveVisibleSportsSectionTabs = (event) => {
23682
23714
  let hasExactScore = false;
23683
23715
  let hasOther = false;
23684
23716
  for (const market of event.venueMarkets) {
23685
- const key = resolveMarketSectionTabKey(market);
23717
+ const key = resolveEffectiveMarketSectionTabKey(market, event.sport);
23686
23718
  if (!key) continue;
23687
23719
  if (key === "game_lines") hasGameLines = true;
23688
23720
  else if (key === "exact_score") hasExactScore = true;
@@ -23804,30 +23836,40 @@ var dropDecomposedLegsMergedIntoSingle = (markets) => {
23804
23836
  var resolveSportsSectionMarkets = ({
23805
23837
  tab,
23806
23838
  eventMarkets,
23807
- sectionMarkets
23839
+ sectionMarkets,
23840
+ sport
23808
23841
  }) => {
23809
- const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter((market) => resolveMarketSectionTabKey(market) === tab.key);
23842
+ const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter(
23843
+ (market) => resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
23844
+ );
23810
23845
  const filteredSectionMarkets = effectiveSectionMarkets.filter(
23811
- (market) => resolveMarketSectionTabKey(market) === tab.key
23846
+ (market) => resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
23812
23847
  );
23813
23848
  if (tab.key === "other" || tab.key === `stat:${SPORTS_GENERIC_STAT}`) {
23814
23849
  const seenIds = new Set(filteredSectionMarkets.map((market) => market.id));
23815
23850
  const strayMarkets = eventMarkets.filter(
23816
- (market) => !seenIds.has(market.id) && resolveMarketSectionTabKey(market) === tab.key
23851
+ (market) => !seenIds.has(market.id) && resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
23817
23852
  );
23818
23853
  return [...filteredSectionMarkets, ...strayMarkets];
23819
23854
  }
23820
23855
  if (tab.kind !== "game_lines") return filteredSectionMarkets;
23821
23856
  const dedupeEventMarketsOfType = (type) => {
23822
23857
  const dedupedMarkets = [];
23823
- const seenKeys = /* @__PURE__ */ new Set();
23858
+ const keptIndexByKey = /* @__PURE__ */ new Map();
23824
23859
  for (const market of eventMarkets) {
23825
23860
  if (normalizeSportsMarketType(market.sportsMarketType) !== type || resolveMarketSectionTabKey(market) !== "game_lines") {
23826
23861
  continue;
23827
23862
  }
23828
23863
  const key = resolveSportsMarketAggKey(market) || market.id;
23829
- if (seenKeys.has(key)) continue;
23830
- seenKeys.add(key);
23864
+ const keptIndex = keptIndexByKey.get(key);
23865
+ if (keptIndex !== void 0) {
23866
+ const kept = dedupedMarkets[keptIndex];
23867
+ if (!hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market)) {
23868
+ dedupedMarkets[keptIndex] = market;
23869
+ }
23870
+ continue;
23871
+ }
23872
+ keptIndexByKey.set(key, dedupedMarkets.length);
23831
23873
  dedupedMarkets.push(market);
23832
23874
  }
23833
23875
  return dropDecomposedLegsMergedIntoSingle(dedupedMarkets);
@@ -24910,9 +24952,10 @@ var SportsMarkets = ({
24910
24952
  () => resolveSportsSectionMarkets({
24911
24953
  tab: activeTab,
24912
24954
  eventMarkets: tabSourceMarkets,
24913
- sectionMarkets
24955
+ sectionMarkets,
24956
+ sport: event.sport
24914
24957
  }),
24915
- [activeTab, tabSourceMarkets, sectionMarkets]
24958
+ [activeTab, tabSourceMarkets, sectionMarkets, event.sport]
24916
24959
  );
24917
24960
  const isSectionSettled = !isSectionLoading && !hasNextPage && !isFetchingNextPage;
24918
24961
  const stableSectionMarkets = stableMarketsByTab[activeTabKey];
package/dist/pages.mjs CHANGED
@@ -8,8 +8,8 @@ import {
8
8
  UserProfilePage,
9
9
  buildAggTxExplorerHref,
10
10
  useHomePageModals
11
- } from "./chunk-C247AYH7.mjs";
12
- import "./chunk-XAG432PJ.mjs";
11
+ } from "./chunk-7R2SMMAG.mjs";
12
+ import "./chunk-EKUH3265.mjs";
13
13
  import {
14
14
  DEPOSIT_MODAL_OPEN_EVENT,
15
15
  WITHDRAW_MODAL_OPEN_EVENT,
@@ -44,6 +44,7 @@ export type SportsPeriodGroup = {
44
44
  markets: VenueMarket[];
45
45
  groups: SportsMarketDisplayGroup[];
46
46
  };
47
+ export declare const getSportsPeriodOrderIndex: (period: SportsPeriodKey) => number;
47
48
  /**
48
49
  * Collapse a period into its display FAMILY, so one tab covers the periods a
49
50
  * viewer thinks of together: soccer's 1h+2h are a single "Halves" tab (as
@@ -73,17 +74,26 @@ export declare const resolveSportsStatToken: (market: Pick<VenueMarket, "marketS
73
74
  * ungrouped market list instead of inventing an empty tab.
74
75
  */
75
76
  export declare const resolveMarketSectionTabKey: (market: Pick<VenueMarket, "marketGroup" | "marketCategory" | "marketSubtype" | "question" | "sportsMarketType" | "period">) => string | null;
76
- export declare const resolveVisibleSportsSectionTabs: (event: Pick<VenueEventWithMarkets, "categories" | "title" | "venueMarkets">) => SportsSectionTab[];
77
+ /**
78
+ * `resolveMarketSectionTabKey`, sport-gated: a "period:<family>" key whose
79
+ * family isn't plausible for the event's sport demotes to "other" so the
80
+ * market surfaces under the Other tab instead of a nonsense period tab. Used
81
+ * by both the visible-tabs builder and the section-market filter so a
82
+ * demoted market is never silently dropped from either.
83
+ */
84
+ export declare const resolveEffectiveMarketSectionTabKey: (market: Parameters<typeof resolveMarketSectionTabKey>[0], sport?: string | null) => string | null;
85
+ export declare const resolveVisibleSportsSectionTabs: (event: Pick<VenueEventWithMarkets, "categories" | "title" | "venueMarkets" | "sport">) => SportsSectionTab[];
77
86
  export declare const resolveSportsSectionFilters: (tab: SportsSectionTab) => {
78
87
  marketGroup?: SportsMarketGroupKey[];
79
88
  marketCategory?: SportsMarketCategoryKey[];
80
89
  sportsMarketType?: SportsMarketTypeKey[];
81
90
  period?: SportsPeriodKey[];
82
91
  };
83
- export declare const resolveSportsSectionMarkets: ({ tab, eventMarkets, sectionMarkets, }: {
92
+ export declare const resolveSportsSectionMarkets: ({ tab, eventMarkets, sectionMarkets, sport, }: {
84
93
  tab: SportsSectionTab;
85
94
  eventMarkets: VenueMarket[];
86
95
  sectionMarkets: VenueMarket[];
96
+ sport?: string | null;
87
97
  }) => VenueMarket[];
88
98
  export declare const resolveSportsMarketCardVariant: (market: VenueMarket) => SportsMarketCardVariant;
89
99
  export declare const isBinarySportsMoneylineMarket: (market: VenueMarket) => boolean;
@@ -44,6 +44,7 @@ export type SportsPeriodGroup = {
44
44
  markets: VenueMarket[];
45
45
  groups: SportsMarketDisplayGroup[];
46
46
  };
47
+ export declare const getSportsPeriodOrderIndex: (period: SportsPeriodKey) => number;
47
48
  /**
48
49
  * Collapse a period into its display FAMILY, so one tab covers the periods a
49
50
  * viewer thinks of together: soccer's 1h+2h are a single "Halves" tab (as
@@ -73,17 +74,26 @@ export declare const resolveSportsStatToken: (market: Pick<VenueMarket, "marketS
73
74
  * ungrouped market list instead of inventing an empty tab.
74
75
  */
75
76
  export declare const resolveMarketSectionTabKey: (market: Pick<VenueMarket, "marketGroup" | "marketCategory" | "marketSubtype" | "question" | "sportsMarketType" | "period">) => string | null;
76
- export declare const resolveVisibleSportsSectionTabs: (event: Pick<VenueEventWithMarkets, "categories" | "title" | "venueMarkets">) => SportsSectionTab[];
77
+ /**
78
+ * `resolveMarketSectionTabKey`, sport-gated: a "period:<family>" key whose
79
+ * family isn't plausible for the event's sport demotes to "other" so the
80
+ * market surfaces under the Other tab instead of a nonsense period tab. Used
81
+ * by both the visible-tabs builder and the section-market filter so a
82
+ * demoted market is never silently dropped from either.
83
+ */
84
+ export declare const resolveEffectiveMarketSectionTabKey: (market: Parameters<typeof resolveMarketSectionTabKey>[0], sport?: string | null) => string | null;
85
+ export declare const resolveVisibleSportsSectionTabs: (event: Pick<VenueEventWithMarkets, "categories" | "title" | "venueMarkets" | "sport">) => SportsSectionTab[];
77
86
  export declare const resolveSportsSectionFilters: (tab: SportsSectionTab) => {
78
87
  marketGroup?: SportsMarketGroupKey[];
79
88
  marketCategory?: SportsMarketCategoryKey[];
80
89
  sportsMarketType?: SportsMarketTypeKey[];
81
90
  period?: SportsPeriodKey[];
82
91
  };
83
- export declare const resolveSportsSectionMarkets: ({ tab, eventMarkets, sectionMarkets, }: {
92
+ export declare const resolveSportsSectionMarkets: ({ tab, eventMarkets, sectionMarkets, sport, }: {
84
93
  tab: SportsSectionTab;
85
94
  eventMarkets: VenueMarket[];
86
95
  sectionMarkets: VenueMarket[];
96
+ sport?: string | null;
87
97
  }) => VenueMarket[];
88
98
  export declare const resolveSportsMarketCardVariant: (market: VenueMarket) => SportsMarketCardVariant;
89
99
  export declare const isBinarySportsMoneylineMarket: (market: VenueMarket) => boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agg-build/ui",
3
- "version": "2.7.0",
3
+ "version": "2.7.2",
4
4
  "description": "Pre-built React component library for the AGG prediction market aggregator. Tailwind-based, themeable, with primitives, event surfaces, trading flows, full pages, and modals.",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",
@@ -100,7 +100,7 @@
100
100
  "liveline": "^0.0.7",
101
101
  "react": "^18.0.0 || ^19.0.0",
102
102
  "react-dom": "^18.0.0 || ^19.0.0",
103
- "@agg-build/hooks": "^2.7.0",
103
+ "@agg-build/hooks": "^2.7.2",
104
104
  "@agg-build/sdk": "^2.5.1"
105
105
  },
106
106
  "dependencies": {