@agg-market/ui 9.0.0 → 11.0.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 (76) hide show
  1. package/dist/{chunk-6CRY27SQ.mjs → chunk-2KGE5AJQ.mjs} +670 -659
  2. package/dist/{chunk-N7U7QCSB.mjs → chunk-5FSWOXEG.mjs} +807 -358
  3. package/dist/{chunk-HJ4UPYM7.mjs → chunk-HMUMJUIL.mjs} +539 -405
  4. package/dist/{chunk-3G7C6WEC.mjs → chunk-IUJXJEDQ.mjs} +1340 -664
  5. package/dist/{chunk-3U4VHAP6.mjs → chunk-UONHGMFI.mjs} +12 -4
  6. package/dist/events.js +1267 -1035
  7. package/dist/events.mjs +6 -4
  8. package/dist/index.js +4443 -3205
  9. package/dist/index.mjs +18 -7
  10. package/dist/modals.js +1207 -379
  11. package/dist/modals.mjs +4 -2
  12. package/dist/pages.js +2942 -1689
  13. package/dist/pages.mjs +4 -4
  14. package/dist/primitives.js +1317 -657
  15. package/dist/primitives.mjs +5 -1
  16. package/dist/styles.css +1 -1
  17. package/dist/tailwind.css +1 -1
  18. package/dist/trading.js +274 -190
  19. package/dist/trading.mjs +2 -2
  20. package/dist/types/events/item/event-list-item.types.d.mts +1 -2
  21. package/dist/types/events/item/event-list-item.types.d.ts +1 -2
  22. package/dist/types/events/item-details/event-list-item-details.types.d.mts +1 -4
  23. package/dist/types/events/item-details/event-list-item-details.types.d.ts +1 -4
  24. package/dist/types/events/item-details/event-list-item-details.utils.d.mts +42 -3
  25. package/dist/types/events/item-details/event-list-item-details.utils.d.ts +42 -3
  26. package/dist/types/events/list/event-list.types.d.mts +3 -2
  27. package/dist/types/events/list/event-list.types.d.ts +3 -2
  28. package/dist/types/events/list/index.d.mts +1 -1
  29. package/dist/types/events/list/index.d.ts +1 -1
  30. package/dist/types/events/market-details/index.d.mts +7 -3
  31. package/dist/types/events/market-details/index.d.ts +7 -3
  32. package/dist/types/events/market-details/market-details.types.d.mts +30 -10
  33. package/dist/types/events/market-details/market-details.types.d.ts +30 -10
  34. package/dist/types/events/market-details/market-details.utils.d.mts +15 -10
  35. package/dist/types/events/market-details/market-details.utils.d.ts +15 -10
  36. package/dist/types/modals/index.d.mts +1 -0
  37. package/dist/types/modals/index.d.ts +1 -0
  38. package/dist/types/pages/event-market/event-market.types.d.mts +2 -0
  39. package/dist/types/pages/event-market/event-market.types.d.ts +2 -0
  40. package/dist/types/pages/home/home.constants.d.mts +1 -3
  41. package/dist/types/pages/home/home.constants.d.ts +1 -3
  42. package/dist/types/pages/home/home.types.d.mts +0 -2
  43. package/dist/types/pages/home/home.types.d.ts +0 -2
  44. package/dist/types/pages/home/home.utils.d.mts +4 -0
  45. package/dist/types/pages/home/home.utils.d.ts +4 -0
  46. package/dist/types/pages/home/index.d.mts +1 -1
  47. package/dist/types/pages/home/index.d.ts +1 -1
  48. package/dist/types/primitives/agg-logo/index.d.mts +6 -0
  49. package/dist/types/primitives/agg-logo/index.d.ts +6 -0
  50. package/dist/types/primitives/chart/index.d.mts +9 -1
  51. package/dist/types/primitives/chart/index.d.ts +9 -1
  52. package/dist/types/primitives/header/agg-logo.d.mts +2 -0
  53. package/dist/types/primitives/header/agg-logo.d.ts +2 -0
  54. package/dist/types/primitives/header/header.constants.d.mts +3 -0
  55. package/dist/types/primitives/header/header.constants.d.ts +3 -0
  56. package/dist/types/primitives/header/header.types.d.mts +28 -0
  57. package/dist/types/primitives/header/header.types.d.ts +28 -0
  58. package/dist/types/primitives/header/index.d.mts +7 -0
  59. package/dist/types/primitives/header/index.d.ts +7 -0
  60. package/dist/types/primitives/index.d.mts +2 -0
  61. package/dist/types/primitives/index.d.ts +2 -0
  62. package/dist/types/primitives/search/index.d.mts +1 -1
  63. package/dist/types/primitives/search/index.d.ts +1 -1
  64. package/dist/types/primitives/search/search.types.d.mts +9 -59
  65. package/dist/types/primitives/search/search.types.d.ts +9 -59
  66. package/dist/types/primitives/search/search.utils.d.mts +4 -0
  67. package/dist/types/primitives/search/search.utils.d.ts +4 -0
  68. package/dist/types/primitives/skeleton/skeleton.types.d.mts +1 -0
  69. package/dist/types/primitives/skeleton/skeleton.types.d.ts +1 -0
  70. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.mts +5 -0
  71. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.ts +5 -0
  72. package/dist/types/primitives/venue-logo/index.d.mts +1 -1
  73. package/dist/types/primitives/venue-logo/index.d.ts +1 -1
  74. package/dist/types/trading/types.d.mts +2 -2
  75. package/dist/types/trading/types.d.ts +2 -2
  76. package/package.json +4 -4
@@ -1,18 +1,25 @@
1
1
  import {
2
2
  EventList,
3
+ EventListItem,
3
4
  EventListItemDetails,
4
5
  MarketDetails,
5
- isErrorWithStatus
6
- } from "./chunk-6CRY27SQ.mjs";
6
+ MarketDetailsList,
7
+ getDefaultEventListTabs,
8
+ isErrorWithStatus,
9
+ resolveTabVenus
10
+ } from "./chunk-2KGE5AJQ.mjs";
7
11
  import {
8
12
  PlaceOrder,
9
13
  Settlement
10
- } from "./chunk-3U4VHAP6.mjs";
14
+ } from "./chunk-UONHGMFI.mjs";
11
15
  import {
12
16
  Button,
13
17
  Card,
18
+ Header,
14
19
  Icon,
20
+ Modal,
15
21
  RemoteImage,
22
+ Skeleton,
16
23
  StateMessage,
17
24
  Tabs,
18
25
  Typography,
@@ -20,106 +27,333 @@ import {
20
27
  __spreadProps,
21
28
  __spreadValues,
22
29
  cn
23
- } from "./chunk-3G7C6WEC.mjs";
30
+ } from "./chunk-IUJXJEDQ.mjs";
24
31
 
25
32
  // src/pages/home/index.tsx
26
- import { useEffect, useMemo, useState } from "react";
27
- import { useCategories, useLabels } from "@agg-market/hooks";
33
+ import { useEffect as useEffect2, useMemo as useMemo2, useRef, useState as useState2 } from "react";
34
+ import { useCategories, useLabels as useLabels2, useSdkUiConfig, useVenueEvents } from "@agg-market/hooks";
28
35
 
29
- // src/pages/home/home.constants.ts
30
- var ALL_CATEGORIES_TAB_VALUE = "trending";
31
- var DEFAULT_CATEGORIES_LIMIT = 100;
32
- var DEFAULT_ALL_CATEGORY_TAB_LABEL = "Trending";
33
- var CATEGORY_TAB_NAME_ORDER = [
34
- "crypto",
35
- "economy",
36
- "entertainment",
37
- "finance",
38
- "geopolitics",
39
- "health",
40
- "mentions",
41
- "politics",
42
- "science",
43
- "sports",
44
- "technology",
45
- "weather",
46
- "world"
47
- ];
48
- var getDefaultHomePageTabs = (allCategoryTabLabel) => {
49
- return [
36
+ // src/pages/event-market/index.tsx
37
+ import { useMemo, useState } from "react";
38
+ import { useVenueEvent, useLabels } from "@agg-market/hooks";
39
+ import dayjs from "dayjs";
40
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
41
+ var resolveHeroMarketId = (event, heroMarketId) => {
42
+ var _a, _b;
43
+ if (!((_a = event == null ? void 0 : event.venueMarkets) == null ? void 0 : _a.length))
44
+ return void 0;
45
+ if (heroMarketId) {
46
+ const matchingHeroMarket = event.venueMarkets.find(
47
+ (market) => market.id === heroMarketId
48
+ );
49
+ if (matchingHeroMarket)
50
+ return matchingHeroMarket.id;
51
+ }
52
+ return (_b = event.venueMarkets[0]) == null ? void 0 : _b.id;
53
+ };
54
+ var buildHeroEvent = (event, heroMarketId) => {
55
+ if (!heroMarketId)
56
+ return void 0;
57
+ const heroMarket = event.venueMarkets.find((market) => market.id === heroMarketId);
58
+ if (!heroMarket)
59
+ return void 0;
60
+ return __spreadProps(__spreadValues({}, event), {
61
+ venueMarkets: [heroMarket]
62
+ });
63
+ };
64
+ var EventMarketPageMobileTrade = ({
65
+ placeOrder,
66
+ classNames
67
+ }) => {
68
+ const [isOpen, setIsOpen] = useState(false);
69
+ const handleOpen = () => {
70
+ setIsOpen(true);
71
+ };
72
+ const handleOpenChange = (nextOpen) => {
73
+ setIsOpen(nextOpen);
74
+ };
75
+ const handleClose = () => {
76
+ setIsOpen(false);
77
+ };
78
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
79
+ /* @__PURE__ */ jsx(
80
+ "div",
81
+ {
82
+ className: cn(
83
+ "fixed inset-x-0 bottom-0 z-20 flex justify-end p-4 lg:hidden",
84
+ classNames == null ? void 0 : classNames.mobileTradeCta
85
+ ),
86
+ children: /* @__PURE__ */ jsx(
87
+ Button,
88
+ {
89
+ size: "large",
90
+ className: "min-w-[168px] shadow-agg-modal",
91
+ "aria-label": placeOrder.actionLabel,
92
+ "data-testid": "event-market-page-mobile-trade-cta",
93
+ onClick: (e) => {
94
+ e.stopPropagation();
95
+ e.preventDefault();
96
+ handleOpen();
97
+ },
98
+ children: placeOrder.actionLabel
99
+ }
100
+ )
101
+ }
102
+ ),
103
+ /* @__PURE__ */ jsx(Modal, { open: isOpen, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsx(
104
+ Modal.Container,
105
+ {
106
+ "aria-label": placeOrder.title,
107
+ maxWidth: "420px",
108
+ classNames: {
109
+ content: "items-end p-0 sm:items-center sm:p-4",
110
+ container: cn(
111
+ "w-full max-w-[420px] border-0 bg-transparent shadow-none",
112
+ classNames == null ? void 0 : classNames.mobileTradeModal
113
+ )
114
+ },
115
+ children: /* @__PURE__ */ jsx(
116
+ PlaceOrder,
117
+ __spreadProps(__spreadValues({}, placeOrder), {
118
+ isDismissible: true,
119
+ className: cn("w-full rounded-t-agg-2xl sm:rounded-agg-xl", classNames == null ? void 0 : classNames.mobileTrade),
120
+ onClose: handleClose
121
+ })
122
+ )
123
+ }
124
+ ) })
125
+ ] });
126
+ };
127
+ var EventMarketPageUnavailableState = ({
128
+ ariaLabel
129
+ }) => {
130
+ const labels = useLabels();
131
+ return /* @__PURE__ */ jsx(
132
+ Card,
50
133
  {
51
- value: ALL_CATEGORIES_TAB_VALUE,
52
- label: allCategoryTabLabel,
53
- iconName: "arrow-trend-up"
54
- },
55
- { value: "crypto", label: "crypto", categoryIds: ["crypto"] },
56
- { value: "economy", label: "economy", categoryIds: ["economy"] },
134
+ className: "rounded-agg-xl border border-agg-separator bg-agg-secondary p-6 shadow-none hover:shadow-none",
135
+ role: "status",
136
+ "aria-label": ariaLabel != null ? ariaLabel : labels.eventMarketPage.unavailableAria,
137
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
138
+ /* @__PURE__ */ jsx(Typography, { variant: "body-large-strong", children: labels.eventMarketPage.unavailableTitle }),
139
+ /* @__PURE__ */ jsx(Typography, { variant: "label", className: "text-agg-muted-foreground", children: labels.eventMarketPage.unavailableDescription })
140
+ ] })
141
+ }
142
+ );
143
+ };
144
+ var EventMarketPageNotFoundState = ({
145
+ ariaLabel
146
+ }) => {
147
+ const labels = useLabels();
148
+ return /* @__PURE__ */ jsx(Card, { className: "overflow-hidden rounded-agg-xl border border-agg-separator bg-agg-secondary p-0 shadow-none hover:shadow-none", children: /* @__PURE__ */ jsx(
149
+ StateMessage,
57
150
  {
58
- value: "entertainment",
59
- label: "entertainment",
60
- categoryIds: ["entertainment"]
61
- },
62
- { value: "finance", label: "finance", categoryIds: ["finance"] },
151
+ ariaLabel: ariaLabel != null ? ariaLabel : labels.eventItemDetails.notFoundAria,
152
+ title: labels.eventItemDetails.notFoundTitle,
153
+ description: labels.eventItemDetails.notFoundDescription,
154
+ className: "min-h-[320px] md:min-h-[360px]"
155
+ }
156
+ ) });
157
+ };
158
+ var EventMarketPageLoadingState = ({
159
+ placeOrder,
160
+ settlement,
161
+ classNames
162
+ }) => {
163
+ const labels = useLabels();
164
+ const fallbackSettlement = settlement != null ? settlement : {
165
+ sectionLabel: labels.trading.settlementSection,
166
+ question: labels.eventMarketPage.loadingSettlementQuestion,
167
+ differencesTitle: labels.eventMarketPage.loadingSettlementDifferencesTitle,
168
+ differences: [labels.eventMarketPage.loadingSettlementPlaceholder],
169
+ venues: [
170
+ {
171
+ venue: "polymarket",
172
+ description: labels.eventMarketPage.loadingSettlementPlaceholder
173
+ }
174
+ ]
175
+ };
176
+ return /* @__PURE__ */ jsxs("section", { className: cn("w-full pb-24 lg:pb-0", classNames == null ? void 0 : classNames.root), children: [
177
+ /* @__PURE__ */ jsxs(
178
+ "div",
179
+ {
180
+ className: cn(
181
+ "mx-auto flex w-full max-w-[1200px] flex-col gap-6 px-3 py-3 md:px-6 md:py-6 lg:flex-row lg:items-start lg:gap-8",
182
+ classNames == null ? void 0 : classNames.content
183
+ ),
184
+ children: [
185
+ /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-1 flex-col gap-6", classNames == null ? void 0 : classNames.main), children: [
186
+ /* @__PURE__ */ jsx(
187
+ EventListItemDetails,
188
+ {
189
+ isLoading: true,
190
+ classNames: {
191
+ root: classNames == null ? void 0 : classNames.hero
192
+ }
193
+ }
194
+ ),
195
+ /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.markets), children: [
196
+ /* @__PURE__ */ jsx(MarketDetails, { isLoading: true, isOpened: true, classNames: { root: "w-full" } }),
197
+ /* @__PURE__ */ jsx(MarketDetails, { isLoading: true, isOpened: false, classNames: { root: "w-full" } }),
198
+ /* @__PURE__ */ jsx(MarketDetails, { isLoading: true, isOpened: false, classNames: { root: "w-full" } })
199
+ ] }),
200
+ /* @__PURE__ */ jsx("div", { className: "md:hidden", children: /* @__PURE__ */ jsx(Settlement, __spreadProps(__spreadValues({}, fallbackSettlement), { isLoading: true, className: classNames == null ? void 0 : classNames.settlement })) }),
201
+ /* @__PURE__ */ jsx("div", { className: "hidden md:block", children: /* @__PURE__ */ jsx(Settlement, __spreadProps(__spreadValues({}, fallbackSettlement), { isLoading: true, className: classNames == null ? void 0 : classNames.settlement })) })
202
+ ] }),
203
+ placeOrder ? /* @__PURE__ */ jsx(
204
+ "aside",
205
+ {
206
+ className: cn(
207
+ "hidden w-full shrink-0 lg:sticky lg:top-6 lg:block lg:w-[343px]",
208
+ classNames == null ? void 0 : classNames.sidebar
209
+ ),
210
+ children: /* @__PURE__ */ jsx(PlaceOrder, __spreadProps(__spreadValues({}, placeOrder), { isLoading: true, className: classNames == null ? void 0 : classNames.trade }))
211
+ }
212
+ ) : null
213
+ ]
214
+ }
215
+ ),
216
+ placeOrder ? /* @__PURE__ */ jsx(
217
+ "div",
218
+ {
219
+ className: cn(
220
+ "fixed inset-x-0 bottom-0 z-20 flex justify-end p-4 lg:hidden",
221
+ classNames == null ? void 0 : classNames.mobileTradeCta
222
+ ),
223
+ children: /* @__PURE__ */ jsx(
224
+ Button,
225
+ {
226
+ size: "large",
227
+ className: "min-w-[168px] shadow-agg-modal",
228
+ "aria-label": placeOrder.actionLabel,
229
+ disabled: true,
230
+ children: placeOrder.actionLabel
231
+ }
232
+ )
233
+ }
234
+ ) : null
235
+ ] });
236
+ };
237
+ var EventMarketPageContent = ({
238
+ event,
239
+ heroMarketId,
240
+ defaultExpandedMarketId,
241
+ expandedMarketId,
242
+ heroDefaultTimeRange,
243
+ placeOrder,
244
+ settlement,
245
+ classNames,
246
+ ariaLabel
247
+ }) => {
248
+ const resolvedHeroMarketId = useMemo(() => {
249
+ return resolveHeroMarketId(event, heroMarketId);
250
+ }, [event, heroMarketId]);
251
+ const heroEvent = useMemo(() => {
252
+ return buildHeroEvent(event, resolvedHeroMarketId);
253
+ }, [event, resolvedHeroMarketId]);
254
+ if (!heroEvent || !event.venueMarkets.length) {
255
+ return /* @__PURE__ */ jsx(EventMarketPageUnavailableState, { ariaLabel });
256
+ }
257
+ return /* @__PURE__ */ jsxs(
258
+ "section",
63
259
  {
64
- value: "geopolitics",
65
- label: "geopolitics",
66
- categoryIds: ["geopolitics"]
67
- },
68
- { value: "health", label: "health", categoryIds: ["health"] },
69
- { value: "mentions", label: "mentions", categoryIds: ["mentions"] },
70
- { value: "politics", label: "politics", categoryIds: ["politics"] },
71
- { value: "science", label: "science", categoryIds: ["science"] },
72
- { value: "sports", label: "sports", categoryIds: ["sports"] },
73
- { value: "technology", label: "technology", categoryIds: ["technology"] },
74
- { value: "weather", label: "weather", categoryIds: ["weather"] },
75
- { value: "world", label: "world", categoryIds: ["world"] }
76
- ];
260
+ className: cn("w-full pb-24 lg:pb-0", classNames == null ? void 0 : classNames.root),
261
+ "aria-label": ariaLabel != null ? ariaLabel : event.title,
262
+ children: [
263
+ /* @__PURE__ */ jsxs(
264
+ "div",
265
+ {
266
+ className: cn(
267
+ "mx-auto flex w-full max-w-[1200px] flex-row gap-6 px-3 py-3 md:px-6 md:py-6 lg:flex-row lg:items-start lg:gap-8",
268
+ classNames == null ? void 0 : classNames.content
269
+ ),
270
+ children: [
271
+ /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-1 flex-col gap-6", classNames == null ? void 0 : classNames.main), children: [
272
+ /* @__PURE__ */ jsx(
273
+ EventListItemDetails,
274
+ {
275
+ event: heroEvent,
276
+ defaultTimeRange: heroDefaultTimeRange,
277
+ classNames: {
278
+ root: classNames == null ? void 0 : classNames.hero
279
+ }
280
+ }
281
+ ),
282
+ /* @__PURE__ */ jsx(MarketDetailsList, { eventId: event.id }),
283
+ settlement ? /* @__PURE__ */ jsx("div", { className: "md:hidden", children: /* @__PURE__ */ jsx(Settlement, __spreadProps(__spreadValues({}, settlement), { className: classNames == null ? void 0 : classNames.settlement })) }) : null,
284
+ settlement ? /* @__PURE__ */ jsx("div", { className: "hidden md:block", children: /* @__PURE__ */ jsx(Settlement, __spreadProps(__spreadValues({}, settlement), { className: classNames == null ? void 0 : classNames.settlement })) }) : null
285
+ ] }),
286
+ placeOrder ? /* @__PURE__ */ jsx(
287
+ "aside",
288
+ {
289
+ className: cn("hidden w-full lg:block lg:max-w-[360px]", classNames == null ? void 0 : classNames.sidebar),
290
+ "data-testid": "event-market-page-desktop-trade",
291
+ children: /* @__PURE__ */ jsx(PlaceOrder, __spreadProps(__spreadValues({}, placeOrder), { className: classNames == null ? void 0 : classNames.trade }))
292
+ }
293
+ ) : null
294
+ ]
295
+ }
296
+ ),
297
+ placeOrder ? /* @__PURE__ */ jsx(EventMarketPageMobileTrade, { placeOrder, classNames }) : null
298
+ ]
299
+ }
300
+ );
301
+ };
302
+ var EventMarketPage = (props) => {
303
+ var _a;
304
+ const hasEventProp = "event" in props && !!props.event;
305
+ const {
306
+ event: fetchedEvent,
307
+ error: eventError,
308
+ isLoading: isFetchingEvent
309
+ } = useVenueEvent({
310
+ eventId: hasEventProp ? "" : (_a = props.eventId) != null ? _a : "",
311
+ enabled: !props.isLoading && !hasEventProp && !!props.eventId
312
+ });
313
+ if (props.isLoading) {
314
+ return /* @__PURE__ */ jsx(EventMarketPageLoadingState, { placeOrder: props.placeOrder, settlement: props.settlement });
315
+ }
316
+ if ("event" in props && props.event) {
317
+ return /* @__PURE__ */ jsx(EventMarketPageContent, __spreadProps(__spreadValues({}, props), { event: props.event }));
318
+ }
319
+ if (isFetchingEvent) {
320
+ return /* @__PURE__ */ jsx(
321
+ EventMarketPageLoadingState,
322
+ {
323
+ placeOrder: props.placeOrder,
324
+ settlement: props.settlement,
325
+ classNames: props.classNames
326
+ }
327
+ );
328
+ }
329
+ if (!fetchedEvent) {
330
+ if (isErrorWithStatus(eventError, 404)) {
331
+ return /* @__PURE__ */ jsx(EventMarketPageNotFoundState, { ariaLabel: props.ariaLabel });
332
+ }
333
+ return /* @__PURE__ */ jsx(EventMarketPageUnavailableState, { ariaLabel: props.ariaLabel });
334
+ }
335
+ return /* @__PURE__ */ jsx(EventMarketPageContent, __spreadProps(__spreadValues({}, props), { event: fetchedEvent }));
77
336
  };
337
+ EventMarketPage.displayName = "EventMarketPage";
338
+
339
+ // src/pages/home/home.constants.ts
340
+ var ALL_CATEGORIES_TAB_VALUE = "trending";
341
+ var DEFAULT_CATEGORIES_LIMIT = 100;
342
+ var DEFAULT_ALL_CATEGORY_TAB_LABEL = "Trending";
78
343
  var getDefaultEventSectionItems = (labels) => {
79
344
  return [
80
345
  {
81
346
  id: "top-markets",
82
347
  title: labels.home.topMarkets,
83
348
  maxItemsPerRow: 3,
84
- limit: 3,
85
- maxVisibleItems: 3
86
- },
87
- {
88
- id: "new-markets",
89
- title: labels.home.newMarkets,
90
- maxItemsPerRow: 3,
91
- limit: 3,
92
- maxVisibleItems: 3
349
+ limit: 9,
350
+ maxVisibleItems: 9
93
351
  }
94
352
  ];
95
353
  };
96
354
 
97
355
  // src/pages/home/home.utils.ts
98
- var categoryOrderMap = CATEGORY_TAB_NAME_ORDER.reduce(
99
- (accumulator, name, index) => {
100
- accumulator.set(name, index);
101
- return accumulator;
102
- },
103
- /* @__PURE__ */ new Map()
104
- );
105
- var normalizeCategoryName = (name) => {
106
- return name.trim().toLowerCase();
107
- };
108
356
  var resolveCategoryTabs = (categories, allCategoryTabLabel) => {
109
- const sortedCategories = [...categories].sort((left, right) => {
110
- const leftName = normalizeCategoryName(left.name);
111
- const rightName = normalizeCategoryName(right.name);
112
- const leftOrder = categoryOrderMap.get(leftName);
113
- const rightOrder = categoryOrderMap.get(rightName);
114
- if (leftOrder != null && rightOrder != null) {
115
- return leftOrder - rightOrder;
116
- }
117
- if (leftOrder != null)
118
- return -1;
119
- if (rightOrder != null)
120
- return 1;
121
- return leftName.localeCompare(rightName);
122
- });
123
357
  const seenCategoryIds = /* @__PURE__ */ new Set();
124
358
  const tabs = [
125
359
  {
@@ -128,13 +362,13 @@ var resolveCategoryTabs = (categories, allCategoryTabLabel) => {
128
362
  iconName: "arrow-trend-up"
129
363
  }
130
364
  ];
131
- for (const category of sortedCategories) {
365
+ for (const category of categories) {
132
366
  if (seenCategoryIds.has(category.id))
133
367
  continue;
134
368
  seenCategoryIds.add(category.id);
135
369
  tabs.push({
136
370
  value: category.id,
137
- label: normalizeCategoryName(category.name),
371
+ label: category.name.trim().toLowerCase(),
138
372
  categoryIds: [category.id]
139
373
  });
140
374
  }
@@ -147,44 +381,211 @@ var resolveInitialTabValue = (tabs, defaultActiveTab) => {
147
381
  if (hasDefaultTab)
148
382
  return defaultActiveTab;
149
383
  }
150
- return (_b = (_a = tabs[0]) == null ? void 0 : _a.value) != null ? _b : "trending";
384
+ return (_b = (_a = tabs[0]) == null ? void 0 : _a.value) != null ? _b : ALL_CATEGORIES_TAB_VALUE;
151
385
  };
152
386
 
153
387
  // src/pages/home/index.tsx
154
- import { jsx, jsxs } from "react/jsx-runtime";
388
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
389
+ var MIN_SEARCH_LENGTH = 3;
390
+ var SEARCH_DEBOUNCE_MS = 300;
391
+ var SEARCH_RESULTS_LIMIT = 9;
392
+ var HomeSearchResults = ({
393
+ activeTabValue,
394
+ onTabChange,
395
+ query,
396
+ tabs,
397
+ resolvedTabs,
398
+ className
399
+ }) => {
400
+ const labels = useLabels2();
401
+ const { search: searchConfig } = useSdkUiConfig();
402
+ const [activeVenueTabValue, setActiveVenueTabValue] = useState2("matched");
403
+ const eventListTabs = useMemo2(() => {
404
+ return getDefaultEventListTabs(labels);
405
+ }, [labels]);
406
+ const activeVenueTab = useMemo2(() => {
407
+ return eventListTabs.find((tab) => tab.value === activeVenueTabValue);
408
+ }, [activeVenueTabValue, eventListTabs]);
409
+ const activeCategoryTab = useMemo2(() => {
410
+ return resolvedTabs.find((tab) => tab.value === activeTabValue);
411
+ }, [activeTabValue, resolvedTabs]);
412
+ const { events, isLoading, isError, fetchNextPage, hasNextPage, isFetchingNextPage } = useVenueEvents({
413
+ queryKeyScope: "home-search-results",
414
+ search: query,
415
+ categoryIds: activeTabValue === ALL_CATEGORIES_TAB_VALUE ? void 0 : activeCategoryTab == null ? void 0 : activeCategoryTab.categoryIds,
416
+ venues: resolveTabVenus(activeVenueTab),
417
+ limit: SEARCH_RESULTS_LIMIT
418
+ });
419
+ const loadMoreRef = useRef(null);
420
+ useEffect2(() => {
421
+ if (!hasNextPage)
422
+ return;
423
+ const target = loadMoreRef.current;
424
+ if (!target)
425
+ return;
426
+ const observer = new IntersectionObserver(
427
+ (entries) => {
428
+ const entry = entries[0];
429
+ if (!(entry == null ? void 0 : entry.isIntersecting))
430
+ return;
431
+ if (isLoading || isFetchingNextPage || !hasNextPage)
432
+ return;
433
+ void fetchNextPage();
434
+ },
435
+ {
436
+ rootMargin: "320px 0px"
437
+ }
438
+ );
439
+ observer.observe(target);
440
+ return () => {
441
+ observer.disconnect();
442
+ };
443
+ }, [fetchNextPage, hasNextPage, isFetchingNextPage, isLoading]);
444
+ const resultsTitle = labels.search.resultsSummary(
445
+ hasNextPage ? `${events.length}+` : `${events.length}`,
446
+ query
447
+ );
448
+ const searchResultTabs = useMemo2(() => {
449
+ return eventListTabs.map((tab) => {
450
+ const isActive = tab.value === activeVenueTabValue;
451
+ return {
452
+ value: tab.value,
453
+ label: tab.label,
454
+ icon: tab.iconName ? /* @__PURE__ */ jsx2(
455
+ Icon,
456
+ {
457
+ name: tab.iconName,
458
+ size: "small",
459
+ color: isActive ? "var(--agg-color-primary)" : "var(--agg-color-foreground)"
460
+ }
461
+ ) : tab.venueLogo ? /* @__PURE__ */ jsx2(
462
+ VenueLogo,
463
+ {
464
+ venue: tab.venueLogo,
465
+ size: "small",
466
+ className: cn(isActive ? "text-agg-primary" : "text-agg-foreground")
467
+ }
468
+ ) : void 0,
469
+ disabled: tab.disabled
470
+ };
471
+ });
472
+ }, [activeVenueTabValue, eventListTabs]);
473
+ const loadingPlaceholderCount = isFetchingNextPage ? 3 : 0;
474
+ if (isLoading) {
475
+ return /* @__PURE__ */ jsx2(Skeleton, { view: "event-list", ariaLabel: labels.search.loadingResults, className });
476
+ }
477
+ return /* @__PURE__ */ jsxs2("section", { className: cn("flex w-full flex-col gap-5", className), children: [
478
+ /* @__PURE__ */ jsx2("header", { className: "flex flex-col gap-5", children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between", children: [
479
+ /* @__PURE__ */ jsx2(Typography, { as: "h2", variant: "title", className: "min-w-0", children: resultsTitle }),
480
+ /* @__PURE__ */ jsx2(
481
+ Tabs,
482
+ {
483
+ ariaLabel: labels.eventList.tabsAria(resultsTitle),
484
+ items: searchResultTabs,
485
+ value: activeVenueTabValue,
486
+ onChange: setActiveVenueTabValue
487
+ }
488
+ )
489
+ ] }) }),
490
+ /* @__PURE__ */ jsxs2("div", { className: "grid grid-cols-1 gap-5 md:grid-cols-3", children: [
491
+ events.map((event) => /* @__PURE__ */ jsx2(
492
+ EventListItem,
493
+ {
494
+ event,
495
+ classNames: {
496
+ root: "w-full min-w-0 max-w-none"
497
+ },
498
+ onClick: (selectedEvent) => {
499
+ if (!selectedEvent)
500
+ return;
501
+ searchConfig.onSelect(selectedEvent);
502
+ }
503
+ },
504
+ event.id
505
+ )),
506
+ Array.from({ length: loadingPlaceholderCount }).map((_, index) => /* @__PURE__ */ jsx2(
507
+ EventListItem,
508
+ {
509
+ isLoading: true,
510
+ classNames: {
511
+ root: "w-full min-w-0 max-w-none"
512
+ }
513
+ },
514
+ `search-results-loading-${index}`
515
+ )),
516
+ !isError && events.length === 0 ? /* @__PURE__ */ jsx2(Card, { className: "col-span-full overflow-hidden shadow-none hover:shadow-none p-0! border-none! bg-transparent!", children: /* @__PURE__ */ jsx2(
517
+ StateMessage,
518
+ {
519
+ ariaLabel: labels.eventList.emptyAria,
520
+ title: labels.eventList.emptyTitle,
521
+ description: labels.eventList.emptyDescription
522
+ }
523
+ ) }) : null,
524
+ isError ? /* @__PURE__ */ jsx2(
525
+ Typography,
526
+ {
527
+ variant: "body",
528
+ className: "col-span-full flex h-32 w-full items-center justify-center",
529
+ children: labels.eventList.error
530
+ }
531
+ ) : null
532
+ ] }),
533
+ hasNextPage ? /* @__PURE__ */ jsx2("div", { ref: loadMoreRef, className: "h-px w-full", "aria-hidden": true }) : null
534
+ ] });
535
+ };
155
536
  var HomePage = ({
156
537
  tabs,
157
538
  defaultActiveTab,
158
539
  onTabChange,
159
540
  eventSectionItems,
160
541
  classNames,
161
- useCategoriesTabs = true,
162
542
  categoriesLimit = DEFAULT_CATEGORIES_LIMIT,
163
543
  allCategoryTabLabel = DEFAULT_ALL_CATEGORY_TAB_LABEL
164
544
  }) => {
165
- const labels = useLabels();
545
+ const labels = useLabels2();
546
+ const {
547
+ search: {
548
+ value: searchValue,
549
+ result: selectedEvent,
550
+ isShowingAllResults,
551
+ onSelect: onSelectEvent
552
+ }
553
+ } = useSdkUiConfig();
166
554
  const hasCustomTabs = !!tabs && tabs.length > 0;
167
- const shouldUseCategoriesTabs = !hasCustomTabs && useCategoriesTabs;
555
+ const normalizedSearchValue = searchValue.trim();
556
+ const [debouncedSearchValue, setDebouncedSearchValue] = useState2(() => {
557
+ return normalizedSearchValue.length >= MIN_SEARCH_LENGTH ? normalizedSearchValue : "";
558
+ });
559
+ useEffect2(() => {
560
+ if (normalizedSearchValue.length < MIN_SEARCH_LENGTH) {
561
+ setDebouncedSearchValue("");
562
+ return;
563
+ }
564
+ const timeoutId = window.setTimeout(() => {
565
+ setDebouncedSearchValue(normalizedSearchValue);
566
+ }, SEARCH_DEBOUNCE_MS);
567
+ return () => {
568
+ window.clearTimeout(timeoutId);
569
+ };
570
+ }, [normalizedSearchValue]);
168
571
  const resolvedAllCategoryTabLabel = allCategoryTabLabel === DEFAULT_ALL_CATEGORY_TAB_LABEL ? labels.home.trending : allCategoryTabLabel;
169
- const { categories } = useCategories({
572
+ const { categories, isLoading: isCategoriesLoading } = useCategories({
170
573
  limit: categoriesLimit,
171
- enabled: shouldUseCategoriesTabs
574
+ enabled: !hasCustomTabs
172
575
  });
173
- const categoryTabs = useMemo(() => {
576
+ const categoryTabs = useMemo2(() => {
174
577
  return resolveCategoryTabs(categories, resolvedAllCategoryTabLabel);
175
578
  }, [categories, resolvedAllCategoryTabLabel]);
176
- const resolvedTabs = useMemo(() => {
579
+ const resolvedTabs = useMemo2(() => {
177
580
  if (hasCustomTabs && tabs)
178
581
  return tabs;
179
- if (shouldUseCategoriesTabs)
180
- return categoryTabs;
181
- return getDefaultHomePageTabs(resolvedAllCategoryTabLabel);
182
- }, [categoryTabs, hasCustomTabs, resolvedAllCategoryTabLabel, shouldUseCategoriesTabs, tabs]);
582
+ return categoryTabs;
583
+ }, [categoryTabs, hasCustomTabs, tabs]);
183
584
  const resolvedEventSectionItems = eventSectionItems && eventSectionItems.length > 0 ? eventSectionItems : getDefaultEventSectionItems(labels);
184
- const [activeTabValue, setActiveTabValue] = useState(() => {
585
+ const [activeTabValue, setActiveTabValue] = useState2(() => {
185
586
  return resolveInitialTabValue(resolvedTabs, defaultActiveTab);
186
587
  });
187
- useEffect(() => {
588
+ useEffect2(() => {
188
589
  setActiveTabValue((currentValue) => {
189
590
  const hasCurrentValue = resolvedTabs.some((tab) => tab.value === currentValue);
190
591
  if (hasCurrentValue)
@@ -192,13 +593,13 @@ var HomePage = ({
192
593
  return resolveInitialTabValue(resolvedTabs, defaultActiveTab);
193
594
  });
194
595
  }, [defaultActiveTab, resolvedTabs]);
195
- const tabsItems = useMemo(() => {
596
+ const tabsItems = useMemo2(() => {
196
597
  return resolvedTabs.map((tab) => {
197
598
  const isActive = tab.value === activeTabValue;
198
599
  return {
199
600
  value: tab.value,
200
601
  label: tab.label,
201
- icon: tab.iconName ? /* @__PURE__ */ jsx(
602
+ icon: tab.iconName ? /* @__PURE__ */ jsx2(
202
603
  Icon,
203
604
  {
204
605
  name: tab.iconName,
@@ -210,26 +611,24 @@ var HomePage = ({
210
611
  };
211
612
  });
212
613
  }, [activeTabValue, resolvedTabs]);
213
- const activeTab = useMemo(() => {
614
+ const activeTab = useMemo2(() => {
214
615
  return resolvedTabs.find((tab) => tab.value === activeTabValue);
215
616
  }, [activeTabValue, resolvedTabs]);
216
- const resolvedSectionItems = useMemo(() => {
217
- var _a, _b, _c, _d, _e;
617
+ const resolvedSectionItems = useMemo2(() => {
618
+ var _a, _b, _c, _d;
218
619
  if (activeTabValue === ALL_CATEGORIES_TAB_VALUE) {
219
620
  return resolvedEventSectionItems;
220
621
  }
221
622
  const maxItemsPerRow = (_b = (_a = resolvedEventSectionItems[0]) == null ? void 0 : _a.maxItemsPerRow) != null ? _b : 3;
222
- const showVenueLogo = (_c = resolvedEventSectionItems[0]) == null ? void 0 : _c.showVenueLogo;
223
- const firstSectionLimit = (_d = resolvedEventSectionItems[0]) == null ? void 0 : _d.limit;
623
+ const firstSectionLimit = (_c = resolvedEventSectionItems[0]) == null ? void 0 : _c.limit;
224
624
  const limit = firstSectionLimit && Number.isFinite(firstSectionLimit) ? Math.max(9, Math.floor(firstSectionLimit)) : 9;
225
625
  return [
226
626
  {
227
627
  id: `${activeTabValue}-markets`,
228
- title: (_e = activeTab == null ? void 0 : activeTab.label) != null ? _e : activeTabValue,
628
+ title: (_d = activeTab == null ? void 0 : activeTab.label) != null ? _d : activeTabValue,
229
629
  maxItemsPerRow,
230
630
  limit,
231
631
  maxVisibleItems: void 0,
232
- showVenueLogo,
233
632
  search: activeTab == null ? void 0 : activeTab.search,
234
633
  categoryIds: activeTab == null ? void 0 : activeTab.categoryIds
235
634
  }
@@ -239,12 +638,16 @@ var HomePage = ({
239
638
  setActiveTabValue(value);
240
639
  onTabChange == null ? void 0 : onTabChange(value);
241
640
  };
242
- return /* @__PURE__ */ jsxs("section", { className: cn("flex w-full flex-col", classNames == null ? void 0 : classNames.root), children: [
243
- /* @__PURE__ */ jsx(
641
+ return /* @__PURE__ */ jsxs2("section", { className: cn("flex w-full flex-col", classNames == null ? void 0 : classNames.root), children: [
642
+ /* @__PURE__ */ jsx2(Header, { searchProps: {} }),
643
+ !selectedEvent && !isShowingAllResults ? /* @__PURE__ */ jsx2(
244
644
  "header",
245
645
  {
246
- className: cn("w-full bg-agg-secondary border-b border-agg-separator", classNames == null ? void 0 : classNames.header),
247
- children: /* @__PURE__ */ jsx(
646
+ className: cn(
647
+ "w-full bg-agg-secondary border-b border-agg-separator",
648
+ classNames == null ? void 0 : classNames.header
649
+ ),
650
+ children: /* @__PURE__ */ jsx2(
248
651
  Tabs,
249
652
  {
250
653
  ariaLabel: labels.home.categoryTabsAria,
@@ -256,26 +659,39 @@ var HomePage = ({
256
659
  }
257
660
  )
258
661
  }
259
- ),
260
- /* @__PURE__ */ jsx(
662
+ ) : null,
663
+ /* @__PURE__ */ jsx2(
261
664
  "main",
262
665
  {
263
666
  className: cn(
264
667
  "flex w-full flex-col gap-4 md:gap-10 px-4 md:px-10 py-4 md:py-8",
265
668
  classNames == null ? void 0 : classNames.sections
266
669
  ),
267
- children: resolvedSectionItems.map((eventSectionItem) => {
268
- var _a, _b, _c;
269
- return /* @__PURE__ */ jsx(
670
+ children: selectedEvent ? /* @__PURE__ */ jsx2(EventMarketPage, { eventId: selectedEvent.id }) : isShowingAllResults && debouncedSearchValue ? /* @__PURE__ */ jsx2(
671
+ HomeSearchResults,
672
+ {
673
+ activeTabValue,
674
+ onTabChange: handleTabChange,
675
+ query: debouncedSearchValue,
676
+ tabs: tabsItems,
677
+ resolvedTabs
678
+ }
679
+ ) : resolvedSectionItems.map((eventSectionItem) => {
680
+ var _a, _b;
681
+ return /* @__PURE__ */ jsx2(
270
682
  EventList,
271
683
  {
272
684
  title: eventSectionItem.title,
273
685
  maxItemsPerRow: eventSectionItem.maxItemsPerRow,
274
686
  limit: eventSectionItem.limit,
275
687
  maxVisibleItems: eventSectionItem.maxVisibleItems,
276
- showVenueLogo: eventSectionItem.showVenueLogo,
277
- search: (_b = eventSectionItem.search) != null ? _b : activeTab == null ? void 0 : activeTab.search,
278
- categoryIds: (_c = eventSectionItem.categoryIds) != null ? _c : activeTab == null ? void 0 : activeTab.categoryIds
688
+ search: debouncedSearchValue || eventSectionItem.search || (activeTab == null ? void 0 : activeTab.search),
689
+ categoryIds: (_b = eventSectionItem.categoryIds) != null ? _b : activeTab == null ? void 0 : activeTab.categoryIds,
690
+ onClick: (event) => {
691
+ if (!event)
692
+ return;
693
+ onSelectEvent(event);
694
+ }
279
695
  },
280
696
  (_a = eventSectionItem.id) != null ? _a : eventSectionItem.title
281
697
  );
@@ -286,288 +702,6 @@ var HomePage = ({
286
702
  };
287
703
  HomePage.displayName = "HomePage";
288
704
 
289
- // src/pages/event-market/index.tsx
290
- import { useEffect as useEffect2, useMemo as useMemo2, useState as useState2 } from "react";
291
- import { useVenueEvent, useLabels as useLabels2 } from "@agg-market/hooks";
292
- import dayjs from "dayjs";
293
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
294
- var getMarketDateValue = (market, fallbackIndex) => {
295
- var _a, _b, _c;
296
- const candidateDate = (_c = (_b = (_a = market.endDate) != null ? _a : market.startDate) != null ? _b : market.creationDate) != null ? _c : null;
297
- if (!candidateDate)
298
- return Number.MAX_SAFE_INTEGER - 1 + fallbackIndex;
299
- const parsedDate = dayjs(candidateDate);
300
- if (!parsedDate.isValid()) {
301
- return Number.MAX_SAFE_INTEGER - 1 + fallbackIndex;
302
- }
303
- return parsedDate.valueOf();
304
- };
305
- var resolveHeroMarketId = (event, heroMarketId) => {
306
- var _a, _b;
307
- if (!((_a = event == null ? void 0 : event.venueMarkets) == null ? void 0 : _a.length))
308
- return void 0;
309
- if (heroMarketId) {
310
- const matchingHeroMarket = event.venueMarkets.find(
311
- (market) => market.id === heroMarketId
312
- );
313
- if (matchingHeroMarket)
314
- return matchingHeroMarket.id;
315
- }
316
- return (_b = event.venueMarkets[0]) == null ? void 0 : _b.id;
317
- };
318
- var buildHeroEvent = (event, heroMarketId) => {
319
- if (!heroMarketId)
320
- return void 0;
321
- const heroMarket = event.venueMarkets.find((market) => market.id === heroMarketId);
322
- if (!heroMarket)
323
- return void 0;
324
- return __spreadProps(__spreadValues({}, event), {
325
- venueMarkets: [heroMarket]
326
- });
327
- };
328
- var resolveDetailedMarkets = (event, heroMarketId) => {
329
- return event.venueMarkets.filter((market) => market.id !== heroMarketId).map((market, index) => ({
330
- market,
331
- index
332
- })).sort(
333
- (leftItem, rightItem) => {
334
- return getMarketDateValue(leftItem.market, leftItem.index) - getMarketDateValue(rightItem.market, rightItem.index);
335
- }
336
- ).map((item) => item.market);
337
- };
338
- var resolveInitialExpandedMarketId = (detailedMarkets, defaultExpandedMarketId) => {
339
- var _a, _b;
340
- if (!detailedMarkets.length)
341
- return null;
342
- if (defaultExpandedMarketId) {
343
- const matchingMarket = detailedMarkets.find((market) => market.id === defaultExpandedMarketId);
344
- if (matchingMarket)
345
- return matchingMarket.id;
346
- }
347
- return (_b = (_a = detailedMarkets[0]) == null ? void 0 : _a.id) != null ? _b : null;
348
- };
349
- var EventMarketPageUnavailableState = ({
350
- ariaLabel
351
- }) => {
352
- const labels = useLabels2();
353
- return /* @__PURE__ */ jsx2(
354
- Card,
355
- {
356
- className: "rounded-agg-xl border border-agg-separator bg-agg-secondary p-6 shadow-none hover:shadow-none",
357
- role: "status",
358
- "aria-label": ariaLabel != null ? ariaLabel : labels.eventMarketPage.unavailableAria,
359
- children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-1", children: [
360
- /* @__PURE__ */ jsx2(Typography, { variant: "body-large-strong", children: labels.eventMarketPage.unavailableTitle }),
361
- /* @__PURE__ */ jsx2(Typography, { variant: "label", className: "text-agg-muted-foreground", children: labels.eventMarketPage.unavailableDescription })
362
- ] })
363
- }
364
- );
365
- };
366
- var EventMarketPageNotFoundState = ({
367
- ariaLabel
368
- }) => {
369
- const labels = useLabels2();
370
- return /* @__PURE__ */ jsx2(Card, { className: "overflow-hidden rounded-agg-xl border border-agg-separator bg-agg-secondary p-0 shadow-none hover:shadow-none", children: /* @__PURE__ */ jsx2(
371
- StateMessage,
372
- {
373
- ariaLabel: ariaLabel != null ? ariaLabel : labels.eventItemDetails.notFoundAria,
374
- title: labels.eventItemDetails.notFoundTitle,
375
- description: labels.eventItemDetails.notFoundDescription,
376
- className: "min-h-[320px] md:min-h-[360px]"
377
- }
378
- ) });
379
- };
380
- var EventMarketPageLoadingState = ({
381
- placeOrder,
382
- settlement,
383
- classNames
384
- }) => {
385
- const labels = useLabels2();
386
- const fallbackSettlement = settlement != null ? settlement : {
387
- sectionLabel: labels.trading.settlementSection,
388
- question: labels.eventMarketPage.loadingSettlementQuestion,
389
- differencesTitle: labels.eventMarketPage.loadingSettlementDifferencesTitle,
390
- differences: [labels.eventMarketPage.loadingSettlementPlaceholder],
391
- venues: [
392
- {
393
- venue: "polymarket",
394
- description: labels.eventMarketPage.loadingSettlementPlaceholder
395
- }
396
- ]
397
- };
398
- return /* @__PURE__ */ jsx2("section", { className: cn("w-full", classNames == null ? void 0 : classNames.root), children: /* @__PURE__ */ jsxs2(
399
- "div",
400
- {
401
- className: cn(
402
- "mx-auto flex w-full max-w-[1200px] flex-col gap-6 px-3 py-3 md:px-6 md:py-6 lg:flex-row lg:items-start lg:gap-8",
403
- classNames == null ? void 0 : classNames.content
404
- ),
405
- children: [
406
- /* @__PURE__ */ jsxs2("div", { className: cn("flex min-w-0 flex-1 flex-col gap-6", classNames == null ? void 0 : classNames.main), children: [
407
- /* @__PURE__ */ jsx2(
408
- EventListItemDetails,
409
- {
410
- isLoading: true,
411
- classNames: {
412
- root: classNames == null ? void 0 : classNames.hero
413
- }
414
- }
415
- ),
416
- /* @__PURE__ */ jsxs2("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.markets), children: [
417
- /* @__PURE__ */ jsx2(MarketDetails, { isLoading: true, isOpened: true, classNames: { root: "w-full" } }),
418
- /* @__PURE__ */ jsx2(MarketDetails, { isLoading: true, isOpened: false, classNames: { root: "w-full" } }),
419
- /* @__PURE__ */ jsx2(MarketDetails, { isLoading: true, isOpened: false, classNames: { root: "w-full" } })
420
- ] }),
421
- /* @__PURE__ */ jsx2("div", { className: "md:hidden", children: /* @__PURE__ */ jsx2(Settlement, __spreadProps(__spreadValues({}, fallbackSettlement), { isLoading: true, className: classNames == null ? void 0 : classNames.settlement })) }),
422
- /* @__PURE__ */ jsx2("div", { className: "hidden md:block", children: /* @__PURE__ */ jsx2(Settlement, __spreadProps(__spreadValues({}, fallbackSettlement), { isLoading: true, className: classNames == null ? void 0 : classNames.settlement })) }),
423
- placeOrder ? /* @__PURE__ */ jsx2("div", { className: "md:hidden", children: /* @__PURE__ */ jsx2(PlaceOrder, __spreadProps(__spreadValues({}, placeOrder), { isLoading: true, className: classNames == null ? void 0 : classNames.mobileTrade })) }) : null
424
- ] }),
425
- placeOrder ? /* @__PURE__ */ jsx2(
426
- "aside",
427
- {
428
- className: cn(
429
- "hidden w-full shrink-0 lg:sticky lg:top-6 lg:block lg:w-[343px]",
430
- classNames == null ? void 0 : classNames.sidebar
431
- ),
432
- children: /* @__PURE__ */ jsx2(PlaceOrder, __spreadProps(__spreadValues({}, placeOrder), { isLoading: true, className: classNames == null ? void 0 : classNames.trade }))
433
- }
434
- ) : null
435
- ]
436
- }
437
- ) });
438
- };
439
- var EventMarketPageContent = ({
440
- event,
441
- heroMarketId,
442
- defaultExpandedMarketId,
443
- expandedMarketId,
444
- onExpandedMarketChange,
445
- heroDefaultTimeRange,
446
- placeOrder,
447
- settlement,
448
- classNames,
449
- ariaLabel
450
- }) => {
451
- const labels = useLabels2();
452
- const resolvedHeroMarketId = useMemo2(() => {
453
- return resolveHeroMarketId(event, heroMarketId);
454
- }, [event, heroMarketId]);
455
- const heroEvent = useMemo2(() => {
456
- return buildHeroEvent(event, resolvedHeroMarketId);
457
- }, [event, resolvedHeroMarketId]);
458
- const detailedMarkets = useMemo2(() => {
459
- return resolveDetailedMarkets(event, resolvedHeroMarketId);
460
- }, [event, resolvedHeroMarketId]);
461
- const [internalExpandedMarketId, setInternalExpandedMarketId] = useState2(() => {
462
- return resolveInitialExpandedMarketId(detailedMarkets, defaultExpandedMarketId);
463
- });
464
- useEffect2(() => {
465
- if (typeof expandedMarketId === "undefined")
466
- return;
467
- setInternalExpandedMarketId(expandedMarketId);
468
- }, [expandedMarketId]);
469
- useEffect2(() => {
470
- if (typeof expandedMarketId !== "undefined")
471
- return;
472
- setInternalExpandedMarketId((currentExpandedMarketId) => {
473
- if (currentExpandedMarketId && detailedMarkets.some((market) => market.id === currentExpandedMarketId)) {
474
- return currentExpandedMarketId;
475
- }
476
- return resolveInitialExpandedMarketId(detailedMarkets, defaultExpandedMarketId);
477
- });
478
- }, [defaultExpandedMarketId, detailedMarkets, expandedMarketId]);
479
- const resolvedExpandedMarketId = typeof expandedMarketId === "undefined" ? internalExpandedMarketId : expandedMarketId;
480
- const handleExpandedMarketChange = (marketId, isOpened) => {
481
- const nextExpandedMarketId = isOpened ? marketId : null;
482
- if (typeof expandedMarketId === "undefined") {
483
- setInternalExpandedMarketId(nextExpandedMarketId);
484
- }
485
- onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(nextExpandedMarketId);
486
- };
487
- if (!heroEvent || !event.venueMarkets.length) {
488
- return /* @__PURE__ */ jsx2(EventMarketPageUnavailableState, { ariaLabel });
489
- }
490
- return /* @__PURE__ */ jsx2("section", { className: cn("w-full", classNames == null ? void 0 : classNames.root), "aria-label": ariaLabel != null ? ariaLabel : event.title, children: /* @__PURE__ */ jsxs2(
491
- "div",
492
- {
493
- className: cn(
494
- "mx-auto flex w-full max-w-[1200px] flex-row gap-6 px-3 py-3 md:px-6 md:py-6 lg:flex-row lg:items-start lg:gap-8",
495
- classNames == null ? void 0 : classNames.content
496
- ),
497
- children: [
498
- /* @__PURE__ */ jsxs2("div", { className: cn("flex min-w-0 flex-1 flex-col gap-6", classNames == null ? void 0 : classNames.main), children: [
499
- /* @__PURE__ */ jsx2(
500
- EventListItemDetails,
501
- {
502
- event: heroEvent,
503
- defaultTimeRange: heroDefaultTimeRange,
504
- classNames: {
505
- root: classNames == null ? void 0 : classNames.hero
506
- }
507
- }
508
- ),
509
- detailedMarkets.length > 0 ? /* @__PURE__ */ jsx2("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.markets), children: detailedMarkets.map((market) => {
510
- const isOpened = resolvedExpandedMarketId === market.id;
511
- return /* @__PURE__ */ jsx2(
512
- MarketDetails,
513
- {
514
- event,
515
- marketId: market.id,
516
- isOpened,
517
- defaultTab: "order-book",
518
- ariaLabel: market.endDate && dayjs(market.endDate).isValid() ? labels.eventMarketPage.marketDetailsAriaByDate(
519
- dayjs(market.endDate).format("MMM D, YYYY")
520
- ) : labels.eventMarketPage.marketDetailsAriaByQuestion(market.question),
521
- onOpenChange: (nextIsOpened) => handleExpandedMarketChange(market.id, nextIsOpened)
522
- },
523
- market.id
524
- );
525
- }) }) : null,
526
- settlement ? /* @__PURE__ */ jsx2("div", { className: "md:hidden", children: /* @__PURE__ */ jsx2(Settlement, __spreadProps(__spreadValues({}, settlement), { className: classNames == null ? void 0 : classNames.settlement })) }) : null,
527
- settlement ? /* @__PURE__ */ jsx2("div", { className: "hidden md:block", children: /* @__PURE__ */ jsx2(Settlement, __spreadProps(__spreadValues({}, settlement), { className: classNames == null ? void 0 : classNames.settlement })) }) : null
528
- ] }),
529
- placeOrder ? /* @__PURE__ */ jsx2("aside", { className: cn("w-full lg:block lg:max-w-[360px]", classNames == null ? void 0 : classNames.sidebar), children: /* @__PURE__ */ jsx2(PlaceOrder, __spreadProps(__spreadValues({}, placeOrder), { className: classNames == null ? void 0 : classNames.trade })) }) : null
530
- ]
531
- }
532
- ) });
533
- };
534
- var EventMarketPage = (props) => {
535
- var _a;
536
- const hasEventProp = "event" in props && !!props.event;
537
- const {
538
- event: fetchedEvent,
539
- error: eventError,
540
- isLoading: isFetchingEvent
541
- } = useVenueEvent({
542
- eventId: hasEventProp ? "" : (_a = props.eventId) != null ? _a : "",
543
- enabled: !props.isLoading && !hasEventProp && !!props.eventId
544
- });
545
- if (props.isLoading) {
546
- return /* @__PURE__ */ jsx2(EventMarketPageLoadingState, { placeOrder: props.placeOrder, settlement: props.settlement });
547
- }
548
- if ("event" in props && props.event) {
549
- return /* @__PURE__ */ jsx2(EventMarketPageContent, __spreadProps(__spreadValues({}, props), { event: props.event }));
550
- }
551
- if (isFetchingEvent) {
552
- return /* @__PURE__ */ jsx2(
553
- EventMarketPageLoadingState,
554
- {
555
- placeOrder: props.placeOrder,
556
- settlement: props.settlement,
557
- classNames: props.classNames
558
- }
559
- );
560
- }
561
- if (!fetchedEvent) {
562
- if (isErrorWithStatus(eventError, 404)) {
563
- return /* @__PURE__ */ jsx2(EventMarketPageNotFoundState, { ariaLabel: props.ariaLabel });
564
- }
565
- return /* @__PURE__ */ jsx2(EventMarketPageUnavailableState, { ariaLabel: props.ariaLabel });
566
- }
567
- return /* @__PURE__ */ jsx2(EventMarketPageContent, __spreadProps(__spreadValues({}, props), { event: fetchedEvent }));
568
- };
569
- EventMarketPage.displayName = "EventMarketPage";
570
-
571
705
  // src/pages/user-profile/components/balance-display.tsx
572
706
  import { useState as useState3 } from "react";
573
707
 
@@ -1204,7 +1338,7 @@ var UserProfilePage = ({
1204
1338
  UserProfilePage.displayName = "UserProfilePage";
1205
1339
 
1206
1340
  export {
1207
- HomePage,
1208
1341
  EventMarketPage,
1342
+ HomePage,
1209
1343
  UserProfilePage
1210
1344
  };