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