@agg-build/ui 2.7.1 → 2.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1068,6 +1068,17 @@ var matchesSelectedOutcomeLabel = (outcome, selectedOutcomeLabel) => {
1068
1068
  return normalizedCandidate === normalizedSelectedLabel || toSemanticOutcomeLabel(candidate) === semanticSelectedLabel;
1069
1069
  });
1070
1070
  };
1071
+ var isTeamFramedMarket = (market) => {
1072
+ var _a;
1073
+ const outcomes = (_a = market.venueMarketOutcomes) != null ? _a : [];
1074
+ if (outcomes.length < 2) return false;
1075
+ return outcomes.every(
1076
+ (outcome) => getOutcomeLabelCandidates(outcome).some((candidate) => {
1077
+ const semanticCandidate = toSemanticOutcomeLabel(candidate);
1078
+ return semanticCandidate !== "" && semanticCandidate !== "yes" && semanticCandidate !== "no";
1079
+ })
1080
+ );
1081
+ };
1071
1082
  var isValidLevel = (level) => {
1072
1083
  return level != null && Number.isFinite(level.price) && Number.isFinite(level.size) && level.price >= 0 && level.price <= 1 && level.size > 0;
1073
1084
  };
@@ -1212,6 +1223,7 @@ var collectEligibleVenueOutcomes = ({
1212
1223
  const seenMarketIds = /* @__PURE__ */ new Set();
1213
1224
  const seenOutcomeIds = /* @__PURE__ */ new Set();
1214
1225
  const result = [];
1226
+ let selectedAnchorMarket = null;
1215
1227
  if (selectedOutcomeId) {
1216
1228
  for (const market of venueMarkets) {
1217
1229
  const outcome = market.venueMarketOutcomes.find((o) => o.id === selectedOutcomeId);
@@ -1265,6 +1277,16 @@ var collectEligibleVenueOutcomes = ({
1265
1277
  });
1266
1278
  return result;
1267
1279
  }
1280
+ selectedAnchorMarket = market;
1281
+ seenMarketIds.add(market.id);
1282
+ seenOutcomeIds.add(outcome.id);
1283
+ result.push({
1284
+ venue: market.venue,
1285
+ market,
1286
+ outcome,
1287
+ outcomeId: outcome.id,
1288
+ semanticLabel
1289
+ });
1268
1290
  break;
1269
1291
  }
1270
1292
  }
@@ -1307,10 +1329,18 @@ var collectEligibleVenueOutcomes = ({
1307
1329
  }
1308
1330
  for (const market of venueMarkets) {
1309
1331
  if (seenMarketIds.has(market.id)) continue;
1332
+ if (selectedAnchorMarket && result.some(
1333
+ (entry) => entry.venue === market.venue && entry.market.question.trim() !== market.question.trim()
1334
+ )) {
1335
+ continue;
1336
+ }
1310
1337
  const matchedOutcome = sortOutcomes(market.venueMarketOutcomes).find(
1311
1338
  (outcome) => matchesSelectedOutcomeLabel(outcome, selectedOutcomeLabel)
1312
1339
  );
1313
1340
  if (!matchedOutcome || seenOutcomeIds.has(matchedOutcome.id)) continue;
1341
+ if (selectedAnchorMarket && isTeamFramedMarket(market) !== isTeamFramedMarket(selectedAnchorMarket)) {
1342
+ continue;
1343
+ }
1314
1344
  const candidateRefs = (_c = matchedOutcome.matchedVenueMarketOutcomes) != null ? _c : [];
1315
1345
  if (candidateRefs.length > 0) {
1316
1346
  const sharesAnchor = candidateRefs.some(
@@ -4911,7 +4941,10 @@ var MarketDetailsList = ({
4911
4941
  status: MarketStatus.open,
4912
4942
  // Keep in lockstep with useEnrichedVenueEvent: limit is part of the React
4913
4943
  // Query key, so a mismatch would fork the shared cache into two requests.
4914
- limit: 40
4944
+ // fetchAll drains every page — events can exceed any single-page limit
4945
+ // (e.g. 80 open markets on one staging event).
4946
+ limit: 100,
4947
+ fetchAll: true
4915
4948
  // No explicit sortBy: event-scoped /venue-markets sorts by the event's
4916
4949
  // type-aware order (structureOrderBy), matching the home-card top-3 and the
4917
4950
  // markets-under-an-event ordering. Passing sortBy here would override it.
@@ -10,7 +10,7 @@ import {
10
10
  isErrorWithStatus,
11
11
  useEventListTabs,
12
12
  useEventListTabsHeaderOverflow
13
- } from "./chunk-BVNXMHSL.mjs";
13
+ } from "./chunk-7DM45TMO.mjs";
14
14
  import {
15
15
  DEPOSIT_MODAL_OPEN_EVENT,
16
16
  PlaceOrder,
@@ -790,14 +790,21 @@ var resolveSportsSectionMarkets = ({
790
790
  if (tab.kind !== "game_lines") return filteredSectionMarkets;
791
791
  const dedupeEventMarketsOfType = (type) => {
792
792
  const dedupedMarkets = [];
793
- const seenKeys = /* @__PURE__ */ new Set();
793
+ const keptIndexByKey = /* @__PURE__ */ new Map();
794
794
  for (const market of eventMarkets) {
795
795
  if (normalizeSportsMarketType(market.sportsMarketType) !== type || resolveMarketSectionTabKey(market) !== "game_lines") {
796
796
  continue;
797
797
  }
798
798
  const key = resolveSportsMarketAggKey(market) || market.id;
799
- if (seenKeys.has(key)) continue;
800
- 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);
801
808
  dedupedMarkets.push(market);
802
809
  }
803
810
  return dropDecomposedLegsMergedIntoSingle(dedupedMarkets);
package/dist/events.js CHANGED
@@ -9251,6 +9251,17 @@ var matchesSelectedOutcomeLabel = (outcome, selectedOutcomeLabel) => {
9251
9251
  return normalizedCandidate === normalizedSelectedLabel || toSemanticOutcomeLabel(candidate) === semanticSelectedLabel;
9252
9252
  });
9253
9253
  };
9254
+ var isTeamFramedMarket = (market) => {
9255
+ var _a;
9256
+ const outcomes = (_a = market.venueMarketOutcomes) != null ? _a : [];
9257
+ if (outcomes.length < 2) return false;
9258
+ return outcomes.every(
9259
+ (outcome) => getOutcomeLabelCandidates(outcome).some((candidate) => {
9260
+ const semanticCandidate = toSemanticOutcomeLabel(candidate);
9261
+ return semanticCandidate !== "" && semanticCandidate !== "yes" && semanticCandidate !== "no";
9262
+ })
9263
+ );
9264
+ };
9254
9265
  var isValidLevel = (level) => {
9255
9266
  return level != null && Number.isFinite(level.price) && Number.isFinite(level.size) && level.price >= 0 && level.price <= 1 && level.size > 0;
9256
9267
  };
@@ -9395,6 +9406,7 @@ var collectEligibleVenueOutcomes = ({
9395
9406
  const seenMarketIds = /* @__PURE__ */ new Set();
9396
9407
  const seenOutcomeIds = /* @__PURE__ */ new Set();
9397
9408
  const result = [];
9409
+ let selectedAnchorMarket = null;
9398
9410
  if (selectedOutcomeId) {
9399
9411
  for (const market of venueMarkets) {
9400
9412
  const outcome = market.venueMarketOutcomes.find((o) => o.id === selectedOutcomeId);
@@ -9448,6 +9460,16 @@ var collectEligibleVenueOutcomes = ({
9448
9460
  });
9449
9461
  return result;
9450
9462
  }
9463
+ selectedAnchorMarket = market;
9464
+ seenMarketIds.add(market.id);
9465
+ seenOutcomeIds.add(outcome.id);
9466
+ result.push({
9467
+ venue: market.venue,
9468
+ market,
9469
+ outcome,
9470
+ outcomeId: outcome.id,
9471
+ semanticLabel
9472
+ });
9451
9473
  break;
9452
9474
  }
9453
9475
  }
@@ -9490,10 +9512,18 @@ var collectEligibleVenueOutcomes = ({
9490
9512
  }
9491
9513
  for (const market of venueMarkets) {
9492
9514
  if (seenMarketIds.has(market.id)) continue;
9515
+ if (selectedAnchorMarket && result.some(
9516
+ (entry) => entry.venue === market.venue && entry.market.question.trim() !== market.question.trim()
9517
+ )) {
9518
+ continue;
9519
+ }
9493
9520
  const matchedOutcome = sortOutcomes(market.venueMarketOutcomes).find(
9494
9521
  (outcome) => matchesSelectedOutcomeLabel(outcome, selectedOutcomeLabel)
9495
9522
  );
9496
9523
  if (!matchedOutcome || seenOutcomeIds.has(matchedOutcome.id)) continue;
9524
+ if (selectedAnchorMarket && isTeamFramedMarket(market) !== isTeamFramedMarket(selectedAnchorMarket)) {
9525
+ continue;
9526
+ }
9497
9527
  const candidateRefs = (_c = matchedOutcome.matchedVenueMarketOutcomes) != null ? _c : [];
9498
9528
  if (candidateRefs.length > 0) {
9499
9529
  const sharesAnchor = candidateRefs.some(
@@ -13709,7 +13739,10 @@ var MarketDetailsList = ({
13709
13739
  status: import_hooks43.MarketStatus.open,
13710
13740
  // Keep in lockstep with useEnrichedVenueEvent: limit is part of the React
13711
13741
  // Query key, so a mismatch would fork the shared cache into two requests.
13712
- limit: 40
13742
+ // fetchAll drains every page — events can exceed any single-page limit
13743
+ // (e.g. 80 open markets on one staging event).
13744
+ limit: 100,
13745
+ fetchAll: true
13713
13746
  // No explicit sortBy: event-scoped /venue-markets sorts by the event's
13714
13747
  // type-aware order (structureOrderBy), matching the home-card top-3 and the
13715
13748
  // 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-BVNXMHSL.mjs";
19
+ } from "./chunk-7DM45TMO.mjs";
20
20
  import {
21
21
  formatProbabilityCents,
22
22
  resolveOrderBookRows,
package/dist/index.js CHANGED
@@ -13134,6 +13134,17 @@ var matchesSelectedOutcomeLabel = (outcome, selectedOutcomeLabel) => {
13134
13134
  return normalizedCandidate === normalizedSelectedLabel || toSemanticOutcomeLabel(candidate) === semanticSelectedLabel;
13135
13135
  });
13136
13136
  };
13137
+ var isTeamFramedMarket = (market) => {
13138
+ var _a;
13139
+ const outcomes = (_a = market.venueMarketOutcomes) != null ? _a : [];
13140
+ if (outcomes.length < 2) return false;
13141
+ return outcomes.every(
13142
+ (outcome) => getOutcomeLabelCandidates(outcome).some((candidate) => {
13143
+ const semanticCandidate = toSemanticOutcomeLabel(candidate);
13144
+ return semanticCandidate !== "" && semanticCandidate !== "yes" && semanticCandidate !== "no";
13145
+ })
13146
+ );
13147
+ };
13137
13148
  var isValidLevel = (level) => {
13138
13149
  return level != null && Number.isFinite(level.price) && Number.isFinite(level.size) && level.price >= 0 && level.price <= 1 && level.size > 0;
13139
13150
  };
@@ -13278,6 +13289,7 @@ var collectEligibleVenueOutcomes = ({
13278
13289
  const seenMarketIds = /* @__PURE__ */ new Set();
13279
13290
  const seenOutcomeIds = /* @__PURE__ */ new Set();
13280
13291
  const result = [];
13292
+ let selectedAnchorMarket = null;
13281
13293
  if (selectedOutcomeId) {
13282
13294
  for (const market of venueMarkets) {
13283
13295
  const outcome = market.venueMarketOutcomes.find((o) => o.id === selectedOutcomeId);
@@ -13331,6 +13343,16 @@ var collectEligibleVenueOutcomes = ({
13331
13343
  });
13332
13344
  return result;
13333
13345
  }
13346
+ selectedAnchorMarket = market;
13347
+ seenMarketIds.add(market.id);
13348
+ seenOutcomeIds.add(outcome.id);
13349
+ result.push({
13350
+ venue: market.venue,
13351
+ market,
13352
+ outcome,
13353
+ outcomeId: outcome.id,
13354
+ semanticLabel
13355
+ });
13334
13356
  break;
13335
13357
  }
13336
13358
  }
@@ -13373,10 +13395,18 @@ var collectEligibleVenueOutcomes = ({
13373
13395
  }
13374
13396
  for (const market of venueMarkets) {
13375
13397
  if (seenMarketIds.has(market.id)) continue;
13398
+ if (selectedAnchorMarket && result.some(
13399
+ (entry) => entry.venue === market.venue && entry.market.question.trim() !== market.question.trim()
13400
+ )) {
13401
+ continue;
13402
+ }
13376
13403
  const matchedOutcome = sortOutcomes(market.venueMarketOutcomes).find(
13377
13404
  (outcome) => matchesSelectedOutcomeLabel(outcome, selectedOutcomeLabel)
13378
13405
  );
13379
13406
  if (!matchedOutcome || seenOutcomeIds.has(matchedOutcome.id)) continue;
13407
+ if (selectedAnchorMarket && isTeamFramedMarket(market) !== isTeamFramedMarket(selectedAnchorMarket)) {
13408
+ continue;
13409
+ }
13380
13410
  const candidateRefs = (_c = matchedOutcome.matchedVenueMarketOutcomes) != null ? _c : [];
13381
13411
  if (candidateRefs.length > 0) {
13382
13412
  const sharesAnchor = candidateRefs.some(
@@ -17651,7 +17681,10 @@ var MarketDetailsList = ({
17651
17681
  status: import_hooks51.MarketStatus.open,
17652
17682
  // Keep in lockstep with useEnrichedVenueEvent: limit is part of the React
17653
17683
  // Query key, so a mismatch would fork the shared cache into two requests.
17654
- limit: 40
17684
+ // fetchAll drains every page — events can exceed any single-page limit
17685
+ // (e.g. 80 open markets on one staging event).
17686
+ limit: 100,
17687
+ fetchAll: true
17655
17688
  // No explicit sortBy: event-scoped /venue-markets sorts by the event's
17656
17689
  // type-aware order (structureOrderBy), matching the home-card top-3 and the
17657
17690
  // markets-under-an-event ordering. Passing sortBy here would override it.
@@ -26073,14 +26106,21 @@ var resolveSportsSectionMarkets = ({
26073
26106
  if (tab.kind !== "game_lines") return filteredSectionMarkets;
26074
26107
  const dedupeEventMarketsOfType = (type) => {
26075
26108
  const dedupedMarkets = [];
26076
- const seenKeys = /* @__PURE__ */ new Set();
26109
+ const keptIndexByKey = /* @__PURE__ */ new Map();
26077
26110
  for (const market of eventMarkets) {
26078
26111
  if (normalizeSportsMarketType(market.sportsMarketType) !== type || resolveMarketSectionTabKey(market) !== "game_lines") {
26079
26112
  continue;
26080
26113
  }
26081
26114
  const key = resolveSportsMarketAggKey(market) || market.id;
26082
- if (seenKeys.has(key)) continue;
26083
- seenKeys.add(key);
26115
+ const keptIndex = keptIndexByKey.get(key);
26116
+ if (keptIndex !== void 0) {
26117
+ const kept = dedupedMarkets[keptIndex];
26118
+ if (!hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market)) {
26119
+ dedupedMarkets[keptIndex] = market;
26120
+ }
26121
+ continue;
26122
+ }
26123
+ keptIndexByKey.set(key, dedupedMarkets.length);
26084
26124
  dedupedMarkets.push(market);
26085
26125
  }
26086
26126
  return dropDecomposedLegsMergedIntoSingle(dedupedMarkets);
package/dist/index.mjs CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  UserProfilePage,
12
12
  buildAggTxExplorerHref,
13
13
  useHomePageModals
14
- } from "./chunk-KFNTS2TV.mjs";
14
+ } from "./chunk-MZBYIXYA.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-BVNXMHSL.mjs";
31
+ } from "./chunk-7DM45TMO.mjs";
32
32
  import {
33
33
  CARD_NETWORK_OPTIONS,
34
34
  DepositModal,
package/dist/pages.js CHANGED
@@ -11722,6 +11722,17 @@ var matchesSelectedOutcomeLabel = (outcome, selectedOutcomeLabel) => {
11722
11722
  return normalizedCandidate === normalizedSelectedLabel || toSemanticOutcomeLabel(candidate) === semanticSelectedLabel;
11723
11723
  });
11724
11724
  };
11725
+ var isTeamFramedMarket = (market) => {
11726
+ var _a;
11727
+ const outcomes = (_a = market.venueMarketOutcomes) != null ? _a : [];
11728
+ if (outcomes.length < 2) return false;
11729
+ return outcomes.every(
11730
+ (outcome) => getOutcomeLabelCandidates(outcome).some((candidate) => {
11731
+ const semanticCandidate = toSemanticOutcomeLabel(candidate);
11732
+ return semanticCandidate !== "" && semanticCandidate !== "yes" && semanticCandidate !== "no";
11733
+ })
11734
+ );
11735
+ };
11725
11736
  var isValidLevel = (level) => {
11726
11737
  return level != null && Number.isFinite(level.price) && Number.isFinite(level.size) && level.price >= 0 && level.price <= 1 && level.size > 0;
11727
11738
  };
@@ -11866,6 +11877,7 @@ var collectEligibleVenueOutcomes = ({
11866
11877
  const seenMarketIds = /* @__PURE__ */ new Set();
11867
11878
  const seenOutcomeIds = /* @__PURE__ */ new Set();
11868
11879
  const result = [];
11880
+ let selectedAnchorMarket = null;
11869
11881
  if (selectedOutcomeId) {
11870
11882
  for (const market of venueMarkets) {
11871
11883
  const outcome = market.venueMarketOutcomes.find((o) => o.id === selectedOutcomeId);
@@ -11919,6 +11931,16 @@ var collectEligibleVenueOutcomes = ({
11919
11931
  });
11920
11932
  return result;
11921
11933
  }
11934
+ selectedAnchorMarket = market;
11935
+ seenMarketIds.add(market.id);
11936
+ seenOutcomeIds.add(outcome.id);
11937
+ result.push({
11938
+ venue: market.venue,
11939
+ market,
11940
+ outcome,
11941
+ outcomeId: outcome.id,
11942
+ semanticLabel
11943
+ });
11922
11944
  break;
11923
11945
  }
11924
11946
  }
@@ -11961,10 +11983,18 @@ var collectEligibleVenueOutcomes = ({
11961
11983
  }
11962
11984
  for (const market of venueMarkets) {
11963
11985
  if (seenMarketIds.has(market.id)) continue;
11986
+ if (selectedAnchorMarket && result.some(
11987
+ (entry) => entry.venue === market.venue && entry.market.question.trim() !== market.question.trim()
11988
+ )) {
11989
+ continue;
11990
+ }
11964
11991
  const matchedOutcome = sortOutcomes(market.venueMarketOutcomes).find(
11965
11992
  (outcome) => matchesSelectedOutcomeLabel(outcome, selectedOutcomeLabel)
11966
11993
  );
11967
11994
  if (!matchedOutcome || seenOutcomeIds.has(matchedOutcome.id)) continue;
11995
+ if (selectedAnchorMarket && isTeamFramedMarket(market) !== isTeamFramedMarket(selectedAnchorMarket)) {
11996
+ continue;
11997
+ }
11968
11998
  const candidateRefs = (_c = matchedOutcome.matchedVenueMarketOutcomes) != null ? _c : [];
11969
11999
  if (candidateRefs.length > 0) {
11970
12000
  const sharesAnchor = candidateRefs.some(
@@ -16216,7 +16246,10 @@ var MarketDetailsList = ({
16216
16246
  status: import_hooks49.MarketStatus.open,
16217
16247
  // Keep in lockstep with useEnrichedVenueEvent: limit is part of the React
16218
16248
  // Query key, so a mismatch would fork the shared cache into two requests.
16219
- limit: 40
16249
+ // fetchAll drains every page — events can exceed any single-page limit
16250
+ // (e.g. 80 open markets on one staging event).
16251
+ limit: 100,
16252
+ fetchAll: true
16220
16253
  // No explicit sortBy: event-scoped /venue-markets sorts by the event's
16221
16254
  // type-aware order (structureOrderBy), matching the home-card top-3 and the
16222
16255
  // markets-under-an-event ordering. Passing sortBy here would override it.
@@ -23852,14 +23885,21 @@ var resolveSportsSectionMarkets = ({
23852
23885
  if (tab.kind !== "game_lines") return filteredSectionMarkets;
23853
23886
  const dedupeEventMarketsOfType = (type) => {
23854
23887
  const dedupedMarkets = [];
23855
- const seenKeys = /* @__PURE__ */ new Set();
23888
+ const keptIndexByKey = /* @__PURE__ */ new Map();
23856
23889
  for (const market of eventMarkets) {
23857
23890
  if (normalizeSportsMarketType(market.sportsMarketType) !== type || resolveMarketSectionTabKey(market) !== "game_lines") {
23858
23891
  continue;
23859
23892
  }
23860
23893
  const key = resolveSportsMarketAggKey(market) || market.id;
23861
- if (seenKeys.has(key)) continue;
23862
- seenKeys.add(key);
23894
+ const keptIndex = keptIndexByKey.get(key);
23895
+ if (keptIndex !== void 0) {
23896
+ const kept = dedupedMarkets[keptIndex];
23897
+ if (!hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market)) {
23898
+ dedupedMarkets[keptIndex] = market;
23899
+ }
23900
+ continue;
23901
+ }
23902
+ keptIndexByKey.set(key, dedupedMarkets.length);
23863
23903
  dedupedMarkets.push(market);
23864
23904
  }
23865
23905
  return dropDecomposedLegsMergedIntoSingle(dedupedMarkets);
package/dist/pages.mjs CHANGED
@@ -8,8 +8,8 @@ import {
8
8
  UserProfilePage,
9
9
  buildAggTxExplorerHref,
10
10
  useHomePageModals
11
- } from "./chunk-KFNTS2TV.mjs";
12
- import "./chunk-BVNXMHSL.mjs";
11
+ } from "./chunk-MZBYIXYA.mjs";
12
+ import "./chunk-7DM45TMO.mjs";
13
13
  import {
14
14
  DEPOSIT_MODAL_OPEN_EVENT,
15
15
  WITHDRAW_MODAL_OPEN_EVENT,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agg-build/ui",
3
- "version": "2.7.1",
3
+ "version": "2.7.3",
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,8 +100,8 @@
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",
104
- "@agg-build/sdk": "^2.5.1"
103
+ "@agg-build/sdk": "^2.5.1",
104
+ "@agg-build/hooks": "^2.7.2"
105
105
  },
106
106
  "dependencies": {
107
107
  "@number-flow/react": "^0.6.0",