@agg-build/ui 4.18.1 → 4.19.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.
Files changed (52) hide show
  1. package/README.md +1 -0
  2. package/dist/{chunk-ZNOAKSPT.mjs → chunk-47CCGQH6.mjs} +2 -2
  3. package/dist/{chunk-2OBJ7DYT.mjs → chunk-5YHKIJ23.mjs} +21 -10
  4. package/dist/{chunk-2UPO6G3S.mjs → chunk-DWPBGMVJ.mjs} +50 -6
  5. package/dist/{chunk-VUZ72Q7H.mjs → chunk-DXASFSVL.mjs} +3 -2
  6. package/dist/{chunk-YXMDEUHP.mjs → chunk-GT3DCFIT.mjs} +494 -41
  7. package/dist/{chunk-HFL3CEWG.mjs → chunk-NSQQ62QK.mjs} +4 -4
  8. package/dist/{chunk-NRPS2D3Q.mjs → chunk-ROA5K67W.mjs} +1 -1
  9. package/dist/{chunk-JJ3VVCEP.mjs → chunk-WOCZ4TVT.mjs} +12 -8
  10. package/dist/{chunk-WIGSRHUG.mjs → chunk-XZVGHKMW.mjs} +3 -2
  11. package/dist/{event-market-GX24AP2H.mjs → event-market-2BAMDM5I.mjs} +6 -6
  12. package/dist/events.js +60 -11
  13. package/dist/events.mjs +4 -4
  14. package/dist/index.js +1148 -621
  15. package/dist/index.mjs +17 -9
  16. package/dist/modals.js +3 -2
  17. package/dist/modals.mjs +3 -3
  18. package/dist/pages.js +580 -53
  19. package/dist/pages.mjs +16 -8
  20. package/dist/primitives.js +3 -2
  21. package/dist/primitives.mjs +1 -1
  22. package/dist/styles.css +1 -1
  23. package/dist/tailwind.css +1 -1
  24. package/dist/trading.js +21 -9
  25. package/dist/trading.mjs +4 -4
  26. package/dist/types/pages/index.d.mts +1 -0
  27. package/dist/types/pages/index.d.ts +1 -0
  28. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.mts +7 -0
  29. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.ts +7 -0
  30. package/dist/types/pages/leaderboard/components/leaderboard-row.d.mts +7 -0
  31. package/dist/types/pages/leaderboard/components/leaderboard-row.d.ts +7 -0
  32. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.mts +3 -0
  33. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.ts +3 -0
  34. package/dist/types/pages/leaderboard/components/segmented-control.d.mts +18 -0
  35. package/dist/types/pages/leaderboard/components/segmented-control.d.ts +18 -0
  36. package/dist/types/pages/leaderboard/index.d.mts +28 -0
  37. package/dist/types/pages/leaderboard/index.d.ts +28 -0
  38. package/dist/types/pages/leaderboard/leaderboard.constants.d.mts +8 -0
  39. package/dist/types/pages/leaderboard/leaderboard.constants.d.ts +8 -0
  40. package/dist/types/pages/leaderboard/leaderboard.types.d.mts +11 -0
  41. package/dist/types/pages/leaderboard/leaderboard.types.d.ts +11 -0
  42. package/dist/types/pages/user-profile/position-view-model.d.mts +2 -4
  43. package/dist/types/pages/user-profile/position-view-model.d.ts +2 -4
  44. package/dist/types/primitives/remote-image/index.d.mts +1 -1
  45. package/dist/types/primitives/remote-image/index.d.ts +1 -1
  46. package/dist/types/primitives/remote-image/remote-image.types.d.mts +6 -0
  47. package/dist/types/primitives/remote-image/remote-image.types.d.ts +6 -0
  48. package/dist/types/shared/pnl-format.d.mts +20 -0
  49. package/dist/types/shared/pnl-format.d.ts +20 -0
  50. package/package.json +3 -3
  51. /package/dist/types/{pages/user-profile/components → shared}/default-avatar.d.mts +0 -0
  52. /package/dist/types/{pages/user-profile/components → shared}/default-avatar.d.ts +0 -0
package/README.md CHANGED
@@ -233,6 +233,7 @@ export function Home() {
233
233
  | `HomePage` | Full home page with tabs, search, grid |
234
234
  | `EventMarketPage` | Full event/market detail page |
235
235
  | `UserProfilePage` | User profile page with tabs |
236
+ | `LeaderboardPage` | Trader leaderboard by P&L or volume |
236
237
 
237
238
  ### Modals — `@agg-build/ui/modals`
238
239
 
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  ConnectKalshiModal,
4
4
  dispatchAggDepositNotification
5
- } from "./chunk-NRPS2D3Q.mjs";
5
+ } from "./chunk-ROA5K67W.mjs";
6
6
  import {
7
7
  BoltIcon,
8
8
  Button,
@@ -36,7 +36,7 @@ import {
36
36
  shortenAddress,
37
37
  useOptionalToast,
38
38
  venueLogoLabels
39
- } from "./chunk-WIGSRHUG.mjs";
39
+ } from "./chunk-XZVGHKMW.mjs";
40
40
 
41
41
  // src/deposit/index.tsx
42
42
  import { useAggAuthState, useAggUiConfig, useDepositAddresses, useLabels as useLabels11 } from "@agg-build/hooks";
@@ -9,14 +9,14 @@ import {
9
9
  getTradingVenueLabel,
10
10
  prepareSettlementDifferences,
11
11
  resolveOrderEligibilityMessage
12
- } from "./chunk-JJ3VVCEP.mjs";
12
+ } from "./chunk-WOCZ4TVT.mjs";
13
13
  import {
14
14
  ConnectKalshiModal,
15
15
  ConnectProphetxModal,
16
16
  GeoBlockBanner,
17
17
  SharedKycModal,
18
18
  subscribeAggDepositNotification
19
- } from "./chunk-NRPS2D3Q.mjs";
19
+ } from "./chunk-ROA5K67W.mjs";
20
20
  import {
21
21
  AGG_TERMS_OF_SERVICE_URL,
22
22
  Button,
@@ -60,7 +60,7 @@ import {
60
60
  resolveResolvedOutcomeLabel,
61
61
  skeletonViews,
62
62
  useOptionalToast
63
- } from "./chunk-WIGSRHUG.mjs";
63
+ } from "./chunk-XZVGHKMW.mjs";
64
64
 
65
65
  // src/trading/types.ts
66
66
  import { Venue, enumGuard, isFiniteNonNeg, safeParse } from "@agg-build/sdk";
@@ -1983,7 +1983,7 @@ var resolvePlaceOrderQuoteStatus = ({
1983
1983
  selectedMarket,
1984
1984
  tradeSide = "buy"
1985
1985
  }) => {
1986
- var _a, _b, _c, _d, _e;
1986
+ var _a, _b, _c, _d, _e, _f;
1987
1987
  if (!selectedMarket) {
1988
1988
  return {
1989
1989
  tone: "warning",
@@ -2003,7 +2003,15 @@ var resolvePlaceOrderQuoteStatus = ({
2003
2003
  };
2004
2004
  }
2005
2005
  if (quoteData.status === "no_orderbooks") {
2006
- const serverError = (_a = quoteData.error) == null ? void 0 : _a.trim();
2006
+ const warnings = (_a = quoteData.warnings) != null ? _a : [];
2007
+ if (warnings.length > 0 && warnings.every((warning) => warning.reason === "hosted_cash_unavailable")) {
2008
+ return {
2009
+ tone: "warning",
2010
+ message: labels.betdexBalanceUnavailable,
2011
+ placement: "above-action"
2012
+ };
2013
+ }
2014
+ const serverError = (_b = quoteData.error) == null ? void 0 : _b.trim();
2007
2015
  return {
2008
2016
  tone: "error",
2009
2017
  message: serverError || labels.noOrderbooks,
@@ -2020,24 +2028,24 @@ var resolvePlaceOrderQuoteStatus = ({
2020
2028
  if (quoteData.status === "insufficient_input_amount") {
2021
2029
  return {
2022
2030
  tone: "error",
2023
- message: (_b = quoteData.message) != null ? _b : labels.insufficientInputAmount,
2031
+ message: (_c = quoteData.message) != null ? _c : labels.insufficientInputAmount,
2024
2032
  placement: "above-action"
2025
2033
  };
2026
2034
  }
2027
2035
  if (quoteData.status === "invalid_input") {
2028
2036
  return {
2029
2037
  tone: "error",
2030
- message: (_c = quoteData.message) != null ? _c : labels.quoteUnavailable,
2038
+ message: (_d = quoteData.message) != null ? _d : labels.quoteUnavailable,
2031
2039
  placement: "above-action"
2032
2040
  };
2033
2041
  }
2034
2042
  if (quoteData.status === "insufficient_position") {
2035
- const total = (_d = quoteData.positionAvailability) == null ? void 0 : _d.totalSellableShares;
2043
+ const total = (_e = quoteData.positionAvailability) == null ? void 0 : _e.totalSellableShares;
2036
2044
  const message = total != null ? labels.insufficientPosition(total) : labels.insufficientPositionGeneric;
2037
2045
  return { tone: "error", message, placement: "above-action" };
2038
2046
  }
2039
2047
  if (quoteData.status === "insufficient_depth") {
2040
- const serverError = (_e = quoteData.error) == null ? void 0 : _e.trim();
2048
+ const serverError = (_f = quoteData.error) == null ? void 0 : _f.trim();
2041
2049
  return {
2042
2050
  tone: "error",
2043
2051
  message: tradeSide === "sell" ? serverError || labels.insufficientSellDepth : serverError || labels.insufficientLiquidity,
@@ -4625,6 +4633,7 @@ var renderCardHeader = ({
4625
4633
  headerSubtitle,
4626
4634
  headerImage,
4627
4635
  headerTitle,
4636
+ headerVenue,
4628
4637
  onClose
4629
4638
  }) => {
4630
4639
  if (!headerTitle) return null;
@@ -4635,6 +4644,7 @@ var renderCardHeader = ({
4635
4644
  {
4636
4645
  src: headerImage,
4637
4646
  alt: "",
4647
+ fallback: headerVenue ? /* @__PURE__ */ jsx11(VenueLogo, { venue: headerVenue, size: "large" }) : void 0,
4638
4648
  className: "agg-order-market-image h-12 w-12 shrink-0 overflow-hidden rounded-agg-lg object-cover"
4639
4649
  }
4640
4650
  ),
@@ -4961,7 +4971,7 @@ var PlaceOrder = ({
4961
4971
  showResolvingState = false,
4962
4972
  midpointsResult
4963
4973
  }) => {
4964
- 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, _Z, __, _$, _aa, _ba, _ca, _da, _ea, _fa, _ga, _ha;
4974
+ 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, _Z, __, _$, _aa, _ba, _ca, _da, _ea, _fa, _ga, _ha, _ia;
4965
4975
  const {
4966
4976
  enableDebug: isExecutionDebugEnabled,
4967
4977
  features: { enableAnimations, showFeesBreakdown, showLimitOrders: limitOrdersFeature },
@@ -7247,6 +7257,7 @@ var PlaceOrder = ({
7247
7257
  headerSubtitle,
7248
7258
  headerImage,
7249
7259
  headerTitle,
7260
+ headerVenue: (_ia = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.venue) != null ? _ia : scopedSelectedEvent == null ? void 0 : scopedSelectedEvent.venue,
7250
7261
  onClose
7251
7262
  }),
7252
7263
  /* @__PURE__ */ jsxs11("div", { className: cn("agg-order-panel-content flex flex-col gap-6", classNames == null ? void 0 : classNames.content), children: [
@@ -23,7 +23,7 @@ import {
23
23
  resolveUnifiedOrderBookEntries,
24
24
  sortOutcomeSelectorOutcomes,
25
25
  useEventTradingContext
26
- } from "./chunk-JJ3VVCEP.mjs";
26
+ } from "./chunk-WOCZ4TVT.mjs";
27
27
  import {
28
28
  AutocompleteSelect,
29
29
  Badge,
@@ -63,7 +63,7 @@ import {
63
63
  resolveResolvedOutcomeLabel,
64
64
  resolveYesOutcome,
65
65
  sortOutcomes
66
- } from "./chunk-WIGSRHUG.mjs";
66
+ } from "./chunk-XZVGHKMW.mjs";
67
67
 
68
68
  // src/shared/query-error.ts
69
69
  var getErrorStatus = (error) => {
@@ -803,6 +803,7 @@ import {
803
803
  useLiveBestPrices,
804
804
  useLiveOutcomePrices,
805
805
  useMarketChart,
806
+ useMarketOrderbook as useMarketOrderbook2,
806
807
  useRollingChartWindow as useRollingChartWindow2,
807
808
  useSdkUiConfig as useSdkUiConfig4,
808
809
  useVenueEvent
@@ -2461,6 +2462,20 @@ var EventListItemDetailsContent = ({
2461
2462
  resolvedEventTradingState.isTradingDisabled ? [] : resolvedEventTradingState.displayMarkets,
2462
2463
  scopedSelectedMarketId
2463
2464
  );
2465
+ const selectedBetdexOutcomes = useMemo6(
2466
+ () => eventDetailVenueMarkets.filter((market) => market.venue === "betdex").flatMap(
2467
+ (market) => market.venueMarketOutcomes.map((outcome) => ({
2468
+ venue: market.venue,
2469
+ venueMarketOutcomeId: outcome.id
2470
+ }))
2471
+ ),
2472
+ [eventDetailVenueMarkets]
2473
+ );
2474
+ useMarketOrderbook2({
2475
+ venueOutcomes: selectedBetdexOutcomes,
2476
+ enabled: !resolvedEventTradingState.isTradingDisabled && selectedBetdexOutcomes.length > 0,
2477
+ live: false
2478
+ });
2464
2479
  const wsLivePrices = useLiveOutcomePrices(eventDetailVenueMarkets);
2465
2480
  const wsBestPrices = useLiveBestPrices(eventDetailVenueMarkets);
2466
2481
  const resolvedMidpointsResult = midpointsResult != null ? midpointsResult : {
@@ -2598,6 +2613,7 @@ var EventListItemDetailsContent = ({
2598
2613
  src: optimizedImageUrl(event.image, 60),
2599
2614
  retinaSrc: retinaImageUrl(event.image, 60),
2600
2615
  alt: "",
2616
+ fallback: event.venue ? /* @__PURE__ */ jsx7(VenueLogo, { venue: event.venue, size: "large" }) : void 0,
2601
2617
  className: "agg-event-image size-10 rounded-agg-lg object-cover md:size-[60px]"
2602
2618
  }
2603
2619
  ),
@@ -2749,7 +2765,7 @@ var EventListItemDetailsContent = ({
2749
2765
  selectedOutcomeId: (tradingContext == null ? void 0 : tradingContext.selectedEventId) === event.id ? tradingContext.selectedOutcomeId : (_f = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.venueMarketOutcomes[0]) == null ? void 0 : _f.id,
2750
2766
  eventEndDate: event.endDate,
2751
2767
  contractWindow,
2752
- range: config.chart.selectedChartTimeRange,
2768
+ range: chartRangeOverride != null ? chartRangeOverride : config.chart.selectedChartTimeRange,
2753
2769
  live: !resolvedEventTradingState.isTradingDisabled && config.features.enableLiveUpdates
2754
2770
  },
2755
2771
  event.id
@@ -2799,7 +2815,7 @@ var EventListItemDetailsContent = ({
2799
2815
  ) : null,
2800
2816
  !contractWindow ? /* @__PURE__ */ jsx7("span", { "aria-hidden": "true", className: "hidden h-4 w-px bg-agg-separator md:block" }) : null,
2801
2817
  !contractWindow && CHART_TIME_RANGES.map((timeRange) => {
2802
- const effectiveRange = chartView === "all" ? config.chart.selectedChartTimeRange : chartRangeOverride != null ? chartRangeOverride : config.chart.selectedChartTimeRange;
2818
+ const effectiveRange = chartRangeOverride != null ? chartRangeOverride : config.chart.selectedChartTimeRange;
2803
2819
  const isActive = timeRange === effectiveRange;
2804
2820
  return /* @__PURE__ */ jsx7(
2805
2821
  Button,
@@ -3419,7 +3435,7 @@ import {
3419
3435
  useLiveBestPrices as useLiveBestPrices2,
3420
3436
  useLiveBestPriceCandidates,
3421
3437
  useLiveOutcomePrices as useLiveOutcomePrices2,
3422
- useMarketOrderbook as useMarketOrderbook2,
3438
+ useMarketOrderbook as useMarketOrderbook3,
3423
3439
  useMidpoints,
3424
3440
  useSdkUiConfig as useSdkUiConfig6,
3425
3441
  useVenueMarkets,
@@ -4180,6 +4196,13 @@ var MarketDetailsContent = ({
4180
4196
  labels
4181
4197
  });
4182
4198
  }, [config.formatting.formatCompactCurrency, venueMarkets, image, labels, marketId, title]);
4199
+ const primaryVenue = useMemo9(
4200
+ () => {
4201
+ var _a2, _b2;
4202
+ return (_b2 = (_a2 = venueMarkets.find((venueMarket) => venueMarket.id === marketId)) != null ? _a2 : venueMarkets[0]) == null ? void 0 : _b2.venue;
4203
+ },
4204
+ [venueMarkets, marketId]
4205
+ );
4183
4206
  const livePrices = useMemo9(() => {
4184
4207
  const merged = /* @__PURE__ */ new Map();
4185
4208
  if (midpointsFallback == null ? void 0 : midpointsFallback.size) {
@@ -4386,12 +4409,32 @@ var MarketDetailsContent = ({
4386
4409
  });
4387
4410
  }, [model, selectedOutcomeLabel, selectedOutcomeId]);
4388
4411
  const orderBookEnabled = isOpened && effectiveSelectedTab === "order-book" && !marketTradingState.isTradingDisabled;
4412
+ const betdexSeedOutcomes = useMemo9(
4413
+ () => {
4414
+ var _a2;
4415
+ return ((_a2 = model == null ? void 0 : model.market.venueMarkets) != null ? _a2 : []).filter((venueMarket) => venueMarket.venue === "betdex").flatMap(
4416
+ (venueMarket) => {
4417
+ var _a3;
4418
+ return ((_a3 = venueMarket.venueMarketOutcomes) != null ? _a3 : []).map((outcome) => ({
4419
+ venue: venueMarket.venue,
4420
+ venueMarketOutcomeId: outcome.id
4421
+ }));
4422
+ }
4423
+ );
4424
+ },
4425
+ [model]
4426
+ );
4427
+ useMarketOrderbook3({
4428
+ venueOutcomes: betdexSeedOutcomes,
4429
+ enabled: !orderBookEnabled && !marketTradingState.isTradingDisabled && betdexSeedOutcomes.length > 0,
4430
+ live: false
4431
+ });
4389
4432
  const selectedVenueOutcome = selectedOutcomesByVenue.find(
4390
4433
  (item) => item.outcomeId === selectedOutcomeId
4391
4434
  );
4392
4435
  const orderbookOutcomeLabel = (selectedVenueOutcome == null ? void 0 : selectedVenueOutcome.venue) === "betdex" ? ((_f = selectedVenueOutcome.outcome.title) == null ? void 0 : _f.trim()) || selectedOutcomeLabel : selectedOutcomeLabel;
4393
4436
  const primaryOutcomeId = (_h = (_g = selectedOutcomesByVenue[0]) == null ? void 0 : _g.outcome.id) != null ? _h : null;
4394
- const marketOrderbookResult = useMarketOrderbook2({
4437
+ const marketOrderbookResult = useMarketOrderbook3({
4395
4438
  venueMarketOutcomeId: primaryOutcomeId,
4396
4439
  enabled: orderBookEnabled && !!primaryOutcomeId,
4397
4440
  venueOutcomes: selectedOutcomesByVenue.map((item) => ({
@@ -4580,6 +4623,7 @@ var MarketDetailsContent = ({
4580
4623
  src: optimizedImageUrl2(model.image, 60),
4581
4624
  retinaSrc: retinaImageUrl2(model.image, 60),
4582
4625
  alt: "",
4626
+ fallback: primaryVenue ? /* @__PURE__ */ jsx12(VenueLogo, { venue: primaryVenue, size: "large" }) : void 0,
4583
4627
  className: "agg-market-image size-12 rounded-agg-lg object-cover md:size-[60px]"
4584
4628
  }
4585
4629
  ) : null,
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  isErrorWithStatus
4
- } from "./chunk-2UPO6G3S.mjs";
4
+ } from "./chunk-DWPBGMVJ.mjs";
5
5
  import {
6
6
  Badge,
7
7
  Card,
@@ -40,7 +40,7 @@ import {
40
40
  sortOutcomes,
41
41
  splitEventsByLifecycle,
42
42
  validateSubcategoryPath
43
- } from "./chunk-WIGSRHUG.mjs";
43
+ } from "./chunk-XZVGHKMW.mjs";
44
44
 
45
45
  // src/events/item/index.tsx
46
46
  import {
@@ -747,6 +747,7 @@ var EventListItemContent = ({
747
747
  src: optimizedImageUrl(resolvedImage, 40),
748
748
  retinaSrc: retinaImageUrl(resolvedImage, 40),
749
749
  alt: "",
750
+ fallback: event.venue ? /* @__PURE__ */ jsx(VenueLogo, { venue: event.venue, size: "medium" }) : void 0,
750
751
  classNames: {
751
752
  root: "agg-event-image h-10 w-10 shrink-0 rounded-agg-lg object-cover",
752
753
  image: "transition-transform duration-300 group-hover/agg-event-card:scale-110"