@agg-market/ui 0.0.1

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 (192) hide show
  1. package/dist/badge.d.mts +26 -0
  2. package/dist/badge.d.ts +26 -0
  3. package/dist/badge.js +70 -0
  4. package/dist/badge.mjs +9 -0
  5. package/dist/button.d.mts +20 -0
  6. package/dist/button.d.ts +20 -0
  7. package/dist/button.js +197 -0
  8. package/dist/button.mjs +8 -0
  9. package/dist/card.d.mts +8 -0
  10. package/dist/card.d.ts +8 -0
  11. package/dist/card.js +84 -0
  12. package/dist/card.mjs +7 -0
  13. package/dist/chart.d.mts +40 -0
  14. package/dist/chart.d.ts +40 -0
  15. package/dist/chart.js +418 -0
  16. package/dist/chart.mjs +8 -0
  17. package/dist/chunk-2PGUPOXY.mjs +285 -0
  18. package/dist/chunk-3DV3D2LH.mjs +155 -0
  19. package/dist/chunk-44UEI6KD.mjs +280 -0
  20. package/dist/chunk-4ADCXJE6.mjs +297 -0
  21. package/dist/chunk-4GSXVVSA.mjs +64 -0
  22. package/dist/chunk-4NK2FNAG.mjs +581 -0
  23. package/dist/chunk-4XWCYUV3.mjs +355 -0
  24. package/dist/chunk-5MN6ZNFA.mjs +355 -0
  25. package/dist/chunk-6RRBINER.mjs +50 -0
  26. package/dist/chunk-765JPQDG.mjs +280 -0
  27. package/dist/chunk-7CD7GIZC.mjs +850 -0
  28. package/dist/chunk-7XRKA6XF.mjs +462 -0
  29. package/dist/chunk-AOFP74IB.mjs +850 -0
  30. package/dist/chunk-BNDFQPHF.mjs +9 -0
  31. package/dist/chunk-C4OI72SM.mjs +14 -0
  32. package/dist/chunk-CB2MLGCJ.mjs +279 -0
  33. package/dist/chunk-CKTAVEW2.mjs +212 -0
  34. package/dist/chunk-DA6KZWSK.mjs +807 -0
  35. package/dist/chunk-DBD5GHHD.mjs +147 -0
  36. package/dist/chunk-DQ6XFBYJ.mjs +37 -0
  37. package/dist/chunk-FACIYUNK.mjs +217 -0
  38. package/dist/chunk-FUJQIYOF.mjs +37 -0
  39. package/dist/chunk-FZTAHWOS.mjs +82 -0
  40. package/dist/chunk-GC3QIIH7.mjs +112 -0
  41. package/dist/chunk-GPBLZGJ2.mjs +136 -0
  42. package/dist/chunk-H4LELROL.mjs +262 -0
  43. package/dist/chunk-H7P6DIX4.mjs +262 -0
  44. package/dist/chunk-H7YEBGYY.mjs +42 -0
  45. package/dist/chunk-HJOBAMDU.mjs +142 -0
  46. package/dist/chunk-IJG5I642.mjs +462 -0
  47. package/dist/chunk-IY2AA3OL.mjs +50 -0
  48. package/dist/chunk-J6L5BLKX.mjs +136 -0
  49. package/dist/chunk-J7OETCZ7.mjs +147 -0
  50. package/dist/chunk-JLLMIPIX.mjs +42 -0
  51. package/dist/chunk-KBRLFTJT.mjs +741 -0
  52. package/dist/chunk-KDBYDMYV.mjs +64 -0
  53. package/dist/chunk-L6E6Q4C4.mjs +217 -0
  54. package/dist/chunk-LY6474C4.mjs +297 -0
  55. package/dist/chunk-M23S2DVV.mjs +581 -0
  56. package/dist/chunk-MG243DSX.mjs +44 -0
  57. package/dist/chunk-MRHSN2B7.mjs +279 -0
  58. package/dist/chunk-MXWRCVRJ.mjs +285 -0
  59. package/dist/chunk-NFYS557L.mjs +481 -0
  60. package/dist/chunk-NNSY462N.mjs +212 -0
  61. package/dist/chunk-OUOIDPGX.mjs +25 -0
  62. package/dist/chunk-P5PFQX75.mjs +31 -0
  63. package/dist/chunk-P674XRDY.mjs +481 -0
  64. package/dist/chunk-PAQ542ER.mjs +170 -0
  65. package/dist/chunk-QE46DVJG.mjs +323 -0
  66. package/dist/chunk-QXFDXXDB.mjs +792 -0
  67. package/dist/chunk-R3DRVI4J.mjs +741 -0
  68. package/dist/chunk-TTOR7JCT.mjs +155 -0
  69. package/dist/chunk-V5WIYMKS.mjs +25 -0
  70. package/dist/chunk-VAZE267Q.mjs +82 -0
  71. package/dist/chunk-VLIJ7PQK.mjs +792 -0
  72. package/dist/chunk-VYNVBJK6.mjs +44 -0
  73. package/dist/chunk-WIWJ6DIE.mjs +323 -0
  74. package/dist/chunk-XDAEEJYR.mjs +142 -0
  75. package/dist/chunk-YUIZZ6XE.mjs +31 -0
  76. package/dist/connect-button.d.mts +40 -0
  77. package/dist/connect-button.d.ts +40 -0
  78. package/dist/connect-button.js +1815 -0
  79. package/dist/connect-button.mjs +14 -0
  80. package/dist/event-list-item-details.d.mts +11 -0
  81. package/dist/event-list-item-details.d.ts +11 -0
  82. package/dist/event-list-item-details.js +2140 -0
  83. package/dist/event-list-item-details.mjs +19 -0
  84. package/dist/event-list-item-details.types-CMbXOrT-.d.ts +53 -0
  85. package/dist/event-list-item-details.types-CxWr4Qn1.d.ts +53 -0
  86. package/dist/event-list-item-details.types-DRi99PZq.d.mts +53 -0
  87. package/dist/event-list-item-details.types-DekJKeMD.d.mts +53 -0
  88. package/dist/event-list-item.d.mts +10 -0
  89. package/dist/event-list-item.d.ts +10 -0
  90. package/dist/event-list-item.js +2097 -0
  91. package/dist/event-list-item.mjs +17 -0
  92. package/dist/event-list-item.types-B1490EQm.d.mts +46 -0
  93. package/dist/event-list-item.types-B1490EQm.d.ts +46 -0
  94. package/dist/event-list-item.types-Y6IeJ4e4.d.mts +46 -0
  95. package/dist/event-list-item.types-Y6IeJ4e4.d.ts +46 -0
  96. package/dist/event-list.d.mts +9 -0
  97. package/dist/event-list.d.ts +9 -0
  98. package/dist/event-list.js +3151 -0
  99. package/dist/event-list.mjs +20 -0
  100. package/dist/event-list.types-Bpp6Vn-t.d.mts +13 -0
  101. package/dist/event-list.types-Bpp6Vn-t.d.ts +13 -0
  102. package/dist/event-list.types-CkAAUqwW.d.mts +13 -0
  103. package/dist/event-list.types-CkAAUqwW.d.ts +13 -0
  104. package/dist/event-market-page.d.mts +52 -0
  105. package/dist/event-market-page.d.ts +52 -0
  106. package/dist/event-market-page.js +5369 -0
  107. package/dist/event-market-page.mjs +29 -0
  108. package/dist/hello-world.d.mts +8 -0
  109. package/dist/hello-world.d.ts +8 -0
  110. package/dist/hello-world.js +80 -0
  111. package/dist/hello-world.mjs +8 -0
  112. package/dist/home-page.d.mts +51 -0
  113. package/dist/home-page.d.ts +51 -0
  114. package/dist/home-page.js +3415 -0
  115. package/dist/home-page.mjs +21 -0
  116. package/dist/icon.d.mts +123 -0
  117. package/dist/icon.d.ts +123 -0
  118. package/dist/icon.js +922 -0
  119. package/dist/icon.mjs +57 -0
  120. package/dist/index.d.mts +70 -0
  121. package/dist/index.d.ts +70 -0
  122. package/dist/index.js +8184 -0
  123. package/dist/index.mjs +307 -0
  124. package/dist/loading-icon.d.mts +14 -0
  125. package/dist/loading-icon.d.ts +14 -0
  126. package/dist/loading-icon.js +115 -0
  127. package/dist/loading-icon.mjs +8 -0
  128. package/dist/market-details.d.mts +73 -0
  129. package/dist/market-details.d.ts +73 -0
  130. package/dist/market-details.js +3923 -0
  131. package/dist/market-details.mjs +22 -0
  132. package/dist/modal.d.mts +66 -0
  133. package/dist/modal.d.ts +66 -0
  134. package/dist/modal.js +317 -0
  135. package/dist/modal.mjs +9 -0
  136. package/dist/number-value.d.mts +14 -0
  137. package/dist/number-value.d.ts +14 -0
  138. package/dist/number-value.js +67 -0
  139. package/dist/number-value.mjs +7 -0
  140. package/dist/onboarding-modal.d.mts +88 -0
  141. package/dist/onboarding-modal.d.ts +88 -0
  142. package/dist/onboarding-modal.js +2242 -0
  143. package/dist/onboarding-modal.mjs +24 -0
  144. package/dist/place-order.d.mts +20 -0
  145. package/dist/place-order.d.ts +20 -0
  146. package/dist/place-order.js +2916 -0
  147. package/dist/place-order.mjs +18 -0
  148. package/dist/registry-CVn79H3I.d.mts +106 -0
  149. package/dist/registry-CVn79H3I.d.ts +106 -0
  150. package/dist/search.d.mts +69 -0
  151. package/dist/search.d.ts +69 -0
  152. package/dist/search.js +1465 -0
  153. package/dist/search.mjs +12 -0
  154. package/dist/select.d.mts +19 -0
  155. package/dist/select.d.ts +19 -0
  156. package/dist/select.js +920 -0
  157. package/dist/select.mjs +11 -0
  158. package/dist/settlement.d.mts +16 -0
  159. package/dist/settlement.d.ts +16 -0
  160. package/dist/settlement.js +1769 -0
  161. package/dist/settlement.mjs +15 -0
  162. package/dist/skeleton.d.mts +22 -0
  163. package/dist/skeleton.d.ts +22 -0
  164. package/dist/skeleton.js +523 -0
  165. package/dist/skeleton.mjs +10 -0
  166. package/dist/styles.css +2 -0
  167. package/dist/switch-button.d.mts +21 -0
  168. package/dist/switch-button.d.ts +21 -0
  169. package/dist/switch-button.js +184 -0
  170. package/dist/switch-button.mjs +7 -0
  171. package/dist/tabs.d.mts +27 -0
  172. package/dist/tabs.d.ts +27 -0
  173. package/dist/tabs.js +1708 -0
  174. package/dist/tabs.mjs +12 -0
  175. package/dist/tailwind.css +2 -0
  176. package/dist/types-8VUuQVZq.d.mts +387 -0
  177. package/dist/types-8VUuQVZq.d.ts +387 -0
  178. package/dist/types-CayJ8tWA.d.mts +3 -0
  179. package/dist/types-CayJ8tWA.d.ts +3 -0
  180. package/dist/typography.d.mts +16 -0
  181. package/dist/typography.d.ts +16 -0
  182. package/dist/typography.js +62 -0
  183. package/dist/typography.mjs +7 -0
  184. package/dist/venue-logo.d.mts +12 -0
  185. package/dist/venue-logo.d.ts +12 -0
  186. package/dist/venue-logo.js +350 -0
  187. package/dist/venue-logo.mjs +10 -0
  188. package/dist/venue-logo.types-4hmCg3D3.d.ts +17 -0
  189. package/dist/venue-logo.types-B1iPJgiD.d.mts +17 -0
  190. package/dist/venue-logo.types-Bg8eXtGp.d.ts +17 -0
  191. package/dist/venue-logo.types-QNDwiQ77.d.mts +17 -0
  192. package/package.json +195 -0
@@ -0,0 +1,279 @@
1
+ import {
2
+ formatCountLabel,
3
+ getVenueSummary,
4
+ normalizeProbability,
5
+ resolveEventListItemEvent,
6
+ resolveOutcomeTitle,
7
+ resolveTileImage,
8
+ resolveTileTitle,
9
+ resolveVenueLabel,
10
+ resolveVisibleOutcomes,
11
+ selectPrimaryVenueMarket
12
+ } from "./chunk-PAQ542ER.mjs";
13
+ import {
14
+ Badge
15
+ } from "./chunk-MG243DSX.mjs";
16
+ import {
17
+ Skeleton,
18
+ baseCardClassName
19
+ } from "./chunk-P674XRDY.mjs";
20
+ import {
21
+ VenueLogo
22
+ } from "./chunk-4ADCXJE6.mjs";
23
+ import {
24
+ Icon
25
+ } from "./chunk-DA6KZWSK.mjs";
26
+ import {
27
+ Typography
28
+ } from "./chunk-DQ6XFBYJ.mjs";
29
+ import {
30
+ Card
31
+ } from "./chunk-P5PFQX75.mjs";
32
+ import {
33
+ __objRest,
34
+ __spreadValues,
35
+ cn
36
+ } from "./chunk-GC3QIIH7.mjs";
37
+
38
+ // src/events/item/index.tsx
39
+ import dayjs from "dayjs";
40
+ import { useMemo } from "react";
41
+ import { useEvent, useLabels, useSdkUiConfig } from "@agg/hooks";
42
+ import { jsx, jsxs } from "react/jsx-runtime";
43
+ var EventListItemLoadingState = ({
44
+ classNames,
45
+ ariaLabel
46
+ }) => {
47
+ const labels = useLabels();
48
+ return /* @__PURE__ */ jsx(
49
+ Skeleton,
50
+ {
51
+ view: "event-list-item",
52
+ className: classNames == null ? void 0 : classNames.root,
53
+ ariaLabel: ariaLabel != null ? ariaLabel : labels.eventItem.loading
54
+ }
55
+ );
56
+ };
57
+ var EventListItemUnavailableState = ({
58
+ classNames,
59
+ ariaLabel
60
+ }) => {
61
+ const labels = useLabels();
62
+ return /* @__PURE__ */ jsx(
63
+ Card,
64
+ {
65
+ className: cn(baseCardClassName, classNames == null ? void 0 : classNames.root),
66
+ role: "status",
67
+ "aria-label": ariaLabel != null ? ariaLabel : labels.eventItem.unavailableAria,
68
+ children: /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-1", classNames == null ? void 0 : classNames.header), children: [
69
+ /* @__PURE__ */ jsx(Typography, { variant: "title", className: cn("truncate", classNames == null ? void 0 : classNames.title), children: labels.eventItem.unavailableTitle }),
70
+ /* @__PURE__ */ jsx(Typography, { variant: "body", className: "text-agg-muted-foreground", children: labels.eventItem.unavailableDescription })
71
+ ] })
72
+ }
73
+ );
74
+ };
75
+ var EventListItemContent = ({
76
+ event,
77
+ title,
78
+ image,
79
+ showVenueLogo = true,
80
+ maxOutcomes = 2,
81
+ classNames,
82
+ venueInfo,
83
+ arbitrageByOutcomeId,
84
+ onClick,
85
+ ariaLabel
86
+ }) => {
87
+ var _a;
88
+ const config = useSdkUiConfig();
89
+ const labels = useLabels();
90
+ const allVenueMarkets = useMemo(() => {
91
+ return event.markets.flatMap((market) => market.venueMarkets);
92
+ }, [event.markets]);
93
+ const primaryVenueMarket = useMemo(() => {
94
+ return selectPrimaryVenueMarket(allVenueMarkets);
95
+ }, [allVenueMarkets]);
96
+ const visibleOutcomes = useMemo(() => {
97
+ if (allVenueMarkets.length === 0)
98
+ return [];
99
+ return resolveVisibleOutcomes(allVenueMarkets, maxOutcomes);
100
+ }, [allVenueMarkets, maxOutcomes]);
101
+ const resolvedTitle = resolveTileTitle(event, primaryVenueMarket, title);
102
+ const resolvedImage = resolveTileImage(event, primaryVenueMarket, image);
103
+ const { marketCount, venueCount, singleVenue } = getVenueSummary(allVenueMarkets);
104
+ const venueLabel = resolveVenueLabel(singleVenue, venueInfo, labels);
105
+ const visibleVenueLogos = useMemo(() => {
106
+ return Array.from(new Set(allVenueMarkets.map((market) => market.venue))).slice(0, 4);
107
+ }, [allVenueMarkets]);
108
+ const resolvedVolume = typeof event.volume === "number" ? event.volume : (_a = primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume) != null ? _a : void 0;
109
+ const volumeLabel = typeof resolvedVolume === "number" ? `${config.formatCompactCurrency(resolvedVolume)} ${labels.eventItem.volumeSuffix}` : "";
110
+ const handleKeyDown = (eventToHandle) => {
111
+ if (!onClick)
112
+ return;
113
+ if (eventToHandle.key === "Enter" || eventToHandle.key === " ") {
114
+ eventToHandle.preventDefault();
115
+ onClick();
116
+ }
117
+ };
118
+ const renderArbitrage = (value) => {
119
+ if (value == null)
120
+ return null;
121
+ if (Math.abs(value) < config.arbitrageThreshold)
122
+ return null;
123
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-baseline gap-1", "text-agg-success"), children: [
124
+ /* @__PURE__ */ jsx(Typography, { variant: "label", className: "text-agg-success", children: config.formatPercent(value) }),
125
+ /* @__PURE__ */ jsx(Icon, { name: "triangle-up", size: "xxs", title: labels.eventItem.arbitrage })
126
+ ] });
127
+ };
128
+ return /* @__PURE__ */ jsxs(
129
+ Card,
130
+ {
131
+ className: cn(baseCardClassName, onClick && "cursor-pointer", classNames == null ? void 0 : classNames.root),
132
+ role: onClick ? "button" : void 0,
133
+ tabIndex: onClick ? 0 : void 0,
134
+ onClick,
135
+ onKeyDown: handleKeyDown,
136
+ "aria-label": ariaLabel != null ? ariaLabel : resolvedTitle,
137
+ children: [
138
+ /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-3", classNames == null ? void 0 : classNames.header), children: [
139
+ resolvedImage ? /* @__PURE__ */ jsx(
140
+ "img",
141
+ {
142
+ src: resolvedImage,
143
+ alt: "",
144
+ className: cn("h-10 w-10", "rounded-agg-lg object-cover")
145
+ }
146
+ ) : null,
147
+ /* @__PURE__ */ jsx(
148
+ Typography,
149
+ {
150
+ variant: "title",
151
+ className: cn(
152
+ "min-w-0 text-agg-base font-agg-bold leading-agg-6 whitespace-normal [display:-webkit-box] [-webkit-box-orient:vertical] [-webkit-line-clamp:2] md:block md:truncate md:whitespace-nowrap",
153
+ classNames == null ? void 0 : classNames.title
154
+ ),
155
+ children: resolvedTitle
156
+ }
157
+ )
158
+ ] }),
159
+ /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.outcomes), children: visibleOutcomes.map((visibleOutcome) => {
160
+ const probability = normalizeProbability(visibleOutcome.outcome.price);
161
+ const showBadge = typeof probability === "number";
162
+ const arbitragePercent = arbitrageByOutcomeId == null ? void 0 : arbitrageByOutcomeId[visibleOutcome.outcome.id];
163
+ const outcomeTitle = resolveOutcomeTitle(visibleOutcome.outcome);
164
+ const formattedTitle = dayjs(outcomeTitle).isValid() ? dayjs(outcomeTitle).format("MMMM D, YYYY") : outcomeTitle;
165
+ return /* @__PURE__ */ jsxs(
166
+ "div",
167
+ {
168
+ className: cn(
169
+ "grid w-full grid-cols-[minmax(0,1fr)_auto_auto] items-center gap-3",
170
+ classNames == null ? void 0 : classNames.outcomeRow
171
+ ),
172
+ children: [
173
+ /* @__PURE__ */ jsx(
174
+ Typography,
175
+ {
176
+ variant: "body",
177
+ className: "min-w-0 truncate text-agg-sm leading-agg-5 md:text-agg-base md:leading-agg-6",
178
+ children: formattedTitle
179
+ }
180
+ ),
181
+ renderArbitrage(arbitragePercent),
182
+ showBadge ? /* @__PURE__ */ jsx(
183
+ Badge,
184
+ {
185
+ text: config.formatPercent(probability),
186
+ prefix: showVenueLogo ? /* @__PURE__ */ jsx(VenueLogo, { venue: visibleOutcome.venue, size: "s" }) : void 0,
187
+ size: "l",
188
+ classNames: {
189
+ root: cn(
190
+ "h-9 min-w-[101px] justify-center px-4 text-agg-base leading-agg-6",
191
+ classNames == null ? void 0 : classNames.badge
192
+ )
193
+ }
194
+ }
195
+ ) : null
196
+ ]
197
+ },
198
+ `${visibleOutcome.market.id}-${visibleOutcome.outcome.id}`
199
+ );
200
+ }) }),
201
+ /* @__PURE__ */ jsxs(
202
+ "div",
203
+ {
204
+ className: cn(
205
+ "flex items-center justify-between gap-2",
206
+ "text-agg-muted-foreground",
207
+ classNames == null ? void 0 : classNames.footer
208
+ ),
209
+ children: [
210
+ /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", "text-agg-sm leading-agg-5"), children: [
211
+ /* @__PURE__ */ jsx("span", { className: "truncate text-agg-muted-foreground", children: formatCountLabel(
212
+ marketCount,
213
+ labels.eventItem.marketSingular,
214
+ labels.eventItem.marketPlural
215
+ ) }),
216
+ /* @__PURE__ */ jsx("span", { className: "text-agg-muted-foreground", children: "\xD7" }),
217
+ singleVenue ? /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 truncate text-agg-muted-foreground", children: [
218
+ showVenueLogo ? /* @__PURE__ */ jsx(VenueLogo, { venue: singleVenue, size: "xs" }) : null,
219
+ /* @__PURE__ */ jsx("span", { children: venueLabel })
220
+ ] }) : /* @__PURE__ */ jsx("span", { className: "truncate text-agg-muted-foreground", children: formatCountLabel(
221
+ venueCount,
222
+ labels.eventItem.venueSingular,
223
+ labels.eventItem.venuePlural
224
+ ) }),
225
+ showVenueLogo && !singleVenue && visibleVenueLogos.length > 0 ? /* @__PURE__ */ jsx("span", { className: "flex items-center gap-1 overflow-hidden", children: visibleVenueLogos.map((venue) => /* @__PURE__ */ jsx(VenueLogo, { venue, size: "xs" }, venue)) }) : null
226
+ ] }),
227
+ volumeLabel ? /* @__PURE__ */ jsx(Typography, { variant: "meta", className: "text-agg-sm", children: volumeLabel }) : null
228
+ ]
229
+ }
230
+ )
231
+ ]
232
+ }
233
+ );
234
+ };
235
+ var EventListItemByEventId = (_a) => {
236
+ var _b = _a, {
237
+ eventId
238
+ } = _b, rest = __objRest(_b, [
239
+ "eventId"
240
+ ]);
241
+ const {
242
+ event: fetchedEvent,
243
+ isError,
244
+ isLoading
245
+ } = useEvent(eventId, {
246
+ enabled: !!eventId
247
+ });
248
+ const resolvedEvent = useMemo(() => {
249
+ return resolveEventListItemEvent(fetchedEvent);
250
+ }, [fetchedEvent]);
251
+ if (!eventId) {
252
+ return /* @__PURE__ */ jsx(EventListItemUnavailableState, { classNames: rest.classNames, ariaLabel: rest.ariaLabel });
253
+ }
254
+ if (isLoading) {
255
+ return /* @__PURE__ */ jsx(EventListItemLoadingState, { classNames: rest.classNames, ariaLabel: rest.ariaLabel });
256
+ }
257
+ if (!resolvedEvent && !isError) {
258
+ return /* @__PURE__ */ jsx(EventListItemLoadingState, { classNames: rest.classNames, ariaLabel: rest.ariaLabel });
259
+ }
260
+ if (!resolvedEvent) {
261
+ return /* @__PURE__ */ jsx(EventListItemUnavailableState, { classNames: rest.classNames, ariaLabel: rest.ariaLabel });
262
+ }
263
+ return /* @__PURE__ */ jsx(EventListItemContent, __spreadValues({ event: resolvedEvent }, rest));
264
+ };
265
+ var EventListItem = (props) => {
266
+ if (props.isLoading) {
267
+ return /* @__PURE__ */ jsx(EventListItemLoadingState, { classNames: props.classNames, ariaLabel: props.ariaLabel });
268
+ }
269
+ if ("event" in props && props.event) {
270
+ const _a = props, { event } = _a, rest = __objRest(_a, ["event"]);
271
+ return /* @__PURE__ */ jsx(EventListItemContent, __spreadValues({ event }, rest));
272
+ }
273
+ return /* @__PURE__ */ jsx(EventListItemByEventId, __spreadValues({}, props));
274
+ };
275
+ EventListItem.displayName = "EventListItem";
276
+
277
+ export {
278
+ EventListItem
279
+ };
@@ -0,0 +1,285 @@
1
+ import {
2
+ Settlement
3
+ } from "./chunk-DBD5GHHD.mjs";
4
+ import {
5
+ PlaceOrder
6
+ } from "./chunk-4XWCYUV3.mjs";
7
+ import {
8
+ EventListItemDetails
9
+ } from "./chunk-M23S2DVV.mjs";
10
+ import {
11
+ MarketDetails
12
+ } from "./chunk-AOFP74IB.mjs";
13
+ import {
14
+ Typography
15
+ } from "./chunk-DQ6XFBYJ.mjs";
16
+ import {
17
+ Card
18
+ } from "./chunk-P5PFQX75.mjs";
19
+ import {
20
+ __spreadProps,
21
+ __spreadValues,
22
+ cn
23
+ } from "./chunk-GC3QIIH7.mjs";
24
+
25
+ // src/pages/event-market/index.tsx
26
+ import { useEffect, useMemo, useState } from "react";
27
+ import { useEvent, useLabels } from "@agg/hooks";
28
+ import dayjs from "dayjs";
29
+ import { jsx, jsxs } from "react/jsx-runtime";
30
+ var getMarketDateValue = (market, fallbackIndex) => {
31
+ var _a, _b, _c;
32
+ const candidateDate = (_c = (_b = (_a = market.endDate) != null ? _a : market.startDate) != null ? _b : market.creationDate) != null ? _c : null;
33
+ if (!candidateDate)
34
+ return Number.MAX_SAFE_INTEGER - 1 + fallbackIndex;
35
+ const parsedDate = dayjs(candidateDate);
36
+ if (!parsedDate.isValid()) {
37
+ return Number.MAX_SAFE_INTEGER - 1 + fallbackIndex;
38
+ }
39
+ return parsedDate.valueOf();
40
+ };
41
+ var resolveHeroMarketId = (event, heroMarketId) => {
42
+ var _a, _b;
43
+ if (!((_a = event == null ? void 0 : event.markets) == null ? void 0 : _a.length))
44
+ return void 0;
45
+ if (heroMarketId) {
46
+ const matchingHeroMarket = event.markets.find((market) => market.id === heroMarketId);
47
+ if (matchingHeroMarket)
48
+ return matchingHeroMarket.id;
49
+ }
50
+ return (_b = event.markets[0]) == null ? void 0 : _b.id;
51
+ };
52
+ var buildHeroEvent = (event, heroMarketId) => {
53
+ if (!heroMarketId)
54
+ return void 0;
55
+ const heroMarket = event.markets.find((market) => market.id === heroMarketId);
56
+ if (!heroMarket)
57
+ return void 0;
58
+ return __spreadProps(__spreadValues({}, event), {
59
+ markets: [heroMarket]
60
+ });
61
+ };
62
+ var resolveDetailedMarkets = (event, heroMarketId) => {
63
+ return event.markets.filter((market) => market.id !== heroMarketId).map((market, index) => ({
64
+ market,
65
+ index
66
+ })).sort((leftItem, rightItem) => {
67
+ return getMarketDateValue(leftItem.market, leftItem.index) - getMarketDateValue(rightItem.market, rightItem.index);
68
+ }).map((item) => item.market);
69
+ };
70
+ var resolveInitialExpandedMarketId = (detailedMarkets, defaultExpandedMarketId) => {
71
+ var _a, _b;
72
+ if (!detailedMarkets.length)
73
+ return null;
74
+ if (defaultExpandedMarketId) {
75
+ const matchingMarket = detailedMarkets.find((market) => market.id === defaultExpandedMarketId);
76
+ if (matchingMarket)
77
+ return matchingMarket.id;
78
+ }
79
+ return (_b = (_a = detailedMarkets[0]) == null ? void 0 : _a.id) != null ? _b : null;
80
+ };
81
+ var EventMarketPageUnavailableState = ({
82
+ ariaLabel
83
+ }) => {
84
+ const labels = useLabels();
85
+ return /* @__PURE__ */ jsx(
86
+ Card,
87
+ {
88
+ className: "rounded-agg-xl border border-agg-separator bg-agg-secondary p-6 shadow-none hover:shadow-none",
89
+ role: "status",
90
+ "aria-label": ariaLabel != null ? ariaLabel : labels.eventMarketPage.unavailableAria,
91
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
92
+ /* @__PURE__ */ jsx(Typography, { variant: "title", children: labels.eventMarketPage.unavailableTitle }),
93
+ /* @__PURE__ */ jsx(Typography, { variant: "meta", children: labels.eventMarketPage.unavailableDescription })
94
+ ] })
95
+ }
96
+ );
97
+ };
98
+ var EventMarketPageLoadingState = ({
99
+ placeOrder,
100
+ settlement,
101
+ classNames
102
+ }) => {
103
+ const labels = useLabels();
104
+ const fallbackSettlement = settlement != null ? settlement : {
105
+ sectionLabel: labels.trading.settlementSection,
106
+ question: labels.eventMarketPage.loadingSettlementQuestion,
107
+ differencesTitle: labels.eventMarketPage.loadingSettlementDifferencesTitle,
108
+ differences: [labels.eventMarketPage.loadingSettlementPlaceholder],
109
+ venues: [
110
+ {
111
+ venue: "polymarket",
112
+ description: labels.eventMarketPage.loadingSettlementPlaceholder
113
+ }
114
+ ]
115
+ };
116
+ return /* @__PURE__ */ jsx("section", { className: cn("w-full", classNames == null ? void 0 : classNames.root), children: /* @__PURE__ */ jsxs(
117
+ "div",
118
+ {
119
+ className: cn(
120
+ "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",
121
+ classNames == null ? void 0 : classNames.content
122
+ ),
123
+ children: [
124
+ /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-1 flex-col gap-6", classNames == null ? void 0 : classNames.main), children: [
125
+ /* @__PURE__ */ jsx(
126
+ EventListItemDetails,
127
+ {
128
+ isLoading: true,
129
+ classNames: {
130
+ root: classNames == null ? void 0 : classNames.hero
131
+ }
132
+ }
133
+ ),
134
+ /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.markets), children: [
135
+ /* @__PURE__ */ jsx(MarketDetails, { isLoading: true, isOpened: true, classNames: { root: "w-full" } }),
136
+ /* @__PURE__ */ jsx(MarketDetails, { isLoading: true, isOpened: false, classNames: { root: "w-full" } }),
137
+ /* @__PURE__ */ jsx(MarketDetails, { isLoading: true, isOpened: false, classNames: { root: "w-full" } })
138
+ ] }),
139
+ /* @__PURE__ */ jsx("div", { className: "md:hidden", children: /* @__PURE__ */ jsx(Settlement, __spreadProps(__spreadValues({}, fallbackSettlement), { isLoading: true, className: classNames == null ? void 0 : classNames.settlement })) }),
140
+ /* @__PURE__ */ jsx("div", { className: "hidden md:block", children: /* @__PURE__ */ jsx(Settlement, __spreadProps(__spreadValues({}, fallbackSettlement), { isLoading: true, className: classNames == null ? void 0 : classNames.settlement })) }),
141
+ placeOrder ? /* @__PURE__ */ jsx("div", { className: "md:hidden", children: /* @__PURE__ */ jsx(PlaceOrder, __spreadProps(__spreadValues({}, placeOrder), { isLoading: true, className: classNames == null ? void 0 : classNames.mobileTrade })) }) : null
142
+ ] }),
143
+ placeOrder ? /* @__PURE__ */ jsx(
144
+ "aside",
145
+ {
146
+ className: cn(
147
+ "hidden w-full shrink-0 lg:sticky lg:top-6 lg:block lg:w-[343px]",
148
+ classNames == null ? void 0 : classNames.sidebar
149
+ ),
150
+ children: /* @__PURE__ */ jsx(PlaceOrder, __spreadProps(__spreadValues({}, placeOrder), { isLoading: true, className: classNames == null ? void 0 : classNames.trade }))
151
+ }
152
+ ) : null
153
+ ]
154
+ }
155
+ ) });
156
+ };
157
+ var EventMarketPageContent = ({
158
+ event,
159
+ heroMarketId,
160
+ defaultExpandedMarketId,
161
+ expandedMarketId,
162
+ onExpandedMarketChange,
163
+ heroDefaultTimeRange,
164
+ placeOrder,
165
+ settlement,
166
+ classNames,
167
+ ariaLabel
168
+ }) => {
169
+ const labels = useLabels();
170
+ const resolvedHeroMarketId = useMemo(() => {
171
+ return resolveHeroMarketId(event, heroMarketId);
172
+ }, [event, heroMarketId]);
173
+ const heroEvent = useMemo(() => {
174
+ return buildHeroEvent(event, resolvedHeroMarketId);
175
+ }, [event, resolvedHeroMarketId]);
176
+ const detailedMarkets = useMemo(() => {
177
+ return resolveDetailedMarkets(event, resolvedHeroMarketId);
178
+ }, [event, resolvedHeroMarketId]);
179
+ const [internalExpandedMarketId, setInternalExpandedMarketId] = useState(() => {
180
+ return resolveInitialExpandedMarketId(detailedMarkets, defaultExpandedMarketId);
181
+ });
182
+ useEffect(() => {
183
+ if (typeof expandedMarketId === "undefined")
184
+ return;
185
+ setInternalExpandedMarketId(expandedMarketId);
186
+ }, [expandedMarketId]);
187
+ useEffect(() => {
188
+ if (typeof expandedMarketId !== "undefined")
189
+ return;
190
+ setInternalExpandedMarketId((currentExpandedMarketId) => {
191
+ if (currentExpandedMarketId && detailedMarkets.some((market) => market.id === currentExpandedMarketId)) {
192
+ return currentExpandedMarketId;
193
+ }
194
+ return resolveInitialExpandedMarketId(detailedMarkets, defaultExpandedMarketId);
195
+ });
196
+ }, [defaultExpandedMarketId, detailedMarkets, expandedMarketId]);
197
+ const resolvedExpandedMarketId = typeof expandedMarketId === "undefined" ? internalExpandedMarketId : expandedMarketId;
198
+ const handleExpandedMarketChange = (marketId, isOpened) => {
199
+ const nextExpandedMarketId = isOpened ? marketId : null;
200
+ if (typeof expandedMarketId === "undefined") {
201
+ setInternalExpandedMarketId(nextExpandedMarketId);
202
+ }
203
+ onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(nextExpandedMarketId);
204
+ };
205
+ if (!heroEvent || !event.markets.length) {
206
+ return /* @__PURE__ */ jsx(EventMarketPageUnavailableState, { ariaLabel });
207
+ }
208
+ return /* @__PURE__ */ jsx("section", { className: cn("w-full", classNames == null ? void 0 : classNames.root), "aria-label": ariaLabel != null ? ariaLabel : event.title, children: /* @__PURE__ */ jsxs(
209
+ "div",
210
+ {
211
+ className: cn(
212
+ "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",
213
+ classNames == null ? void 0 : classNames.content
214
+ ),
215
+ children: [
216
+ /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-1 flex-col gap-6", classNames == null ? void 0 : classNames.main), children: [
217
+ /* @__PURE__ */ jsx(
218
+ EventListItemDetails,
219
+ {
220
+ event: heroEvent,
221
+ defaultTimeRange: heroDefaultTimeRange,
222
+ classNames: {
223
+ root: classNames == null ? void 0 : classNames.hero
224
+ }
225
+ }
226
+ ),
227
+ detailedMarkets.length > 0 ? /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.markets), children: detailedMarkets.map((market) => {
228
+ const isOpened = resolvedExpandedMarketId === market.id;
229
+ return /* @__PURE__ */ jsx(
230
+ MarketDetails,
231
+ {
232
+ event,
233
+ marketId: market.id,
234
+ isOpened,
235
+ defaultTab: "order-book",
236
+ ariaLabel: market.endDate && dayjs(market.endDate).isValid() ? labels.eventMarketPage.marketDetailsAriaByDate(
237
+ dayjs(market.endDate).format("MMM D, YYYY")
238
+ ) : labels.eventMarketPage.marketDetailsAriaByQuestion(market.question),
239
+ onOpenChange: (nextIsOpened) => handleExpandedMarketChange(market.id, nextIsOpened)
240
+ },
241
+ market.id
242
+ );
243
+ }) }) : null,
244
+ settlement ? /* @__PURE__ */ jsx("div", { className: "md:hidden", children: /* @__PURE__ */ jsx(Settlement, __spreadProps(__spreadValues({}, settlement), { className: classNames == null ? void 0 : classNames.settlement })) }) : null,
245
+ settlement ? /* @__PURE__ */ jsx("div", { className: "hidden md:block", children: /* @__PURE__ */ jsx(Settlement, __spreadProps(__spreadValues({}, settlement), { className: classNames == null ? void 0 : classNames.settlement })) }) : null
246
+ ] }),
247
+ placeOrder ? /* @__PURE__ */ jsx("aside", { className: cn("w-full lg:block lg:max-w-[360px]", classNames == null ? void 0 : classNames.sidebar), children: /* @__PURE__ */ jsx(PlaceOrder, __spreadProps(__spreadValues({}, placeOrder), { className: classNames == null ? void 0 : classNames.trade })) }) : null
248
+ ]
249
+ }
250
+ ) });
251
+ };
252
+ var EventMarketPage = (props) => {
253
+ const hasEventProp = "event" in props && !!props.event;
254
+ const { event: fetchedEvent, isLoading: isFetchingEvent } = useEvent(
255
+ hasEventProp ? void 0 : props.eventId,
256
+ {
257
+ enabled: !props.isLoading && !hasEventProp && !!props.eventId
258
+ }
259
+ );
260
+ if (props.isLoading) {
261
+ return /* @__PURE__ */ jsx(EventMarketPageLoadingState, { placeOrder: props.placeOrder, settlement: props.settlement });
262
+ }
263
+ if ("event" in props && props.event) {
264
+ return /* @__PURE__ */ jsx(EventMarketPageContent, __spreadProps(__spreadValues({}, props), { event: props.event }));
265
+ }
266
+ if (isFetchingEvent) {
267
+ return /* @__PURE__ */ jsx(
268
+ EventMarketPageLoadingState,
269
+ {
270
+ placeOrder: props.placeOrder,
271
+ settlement: props.settlement,
272
+ classNames: props.classNames
273
+ }
274
+ );
275
+ }
276
+ if (!fetchedEvent) {
277
+ return /* @__PURE__ */ jsx(EventMarketPageUnavailableState, { ariaLabel: props.ariaLabel });
278
+ }
279
+ return /* @__PURE__ */ jsx(EventMarketPageContent, __spreadProps(__spreadValues({}, props), { event: fetchedEvent }));
280
+ };
281
+ EventMarketPage.displayName = "EventMarketPage";
282
+
283
+ export {
284
+ EventMarketPage
285
+ };