@agg-build/ui 4.26.0 → 4.27.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 (552) hide show
  1. package/dist/event-trading-state.utils-B3my25Re.mjs +789 -0
  2. package/dist/event-trading-state.utils-s4DEc4iA.js +921 -0
  3. package/dist/events.js +23 -17650
  4. package/dist/events.mjs +3 -50
  5. package/dist/index.js +811 -47144
  6. package/dist/index.mjs +584 -1204
  7. package/dist/list-D8v2SmY1.js +6989 -0
  8. package/dist/list-DD7roCVl.mjs +6838 -0
  9. package/dist/manage-betdex-account-modal-21ZVLsz0.js +2390 -0
  10. package/dist/manage-betdex-account-modal-D2vKHird.mjs +2294 -0
  11. package/dist/modals-BReGwJzz.mjs +2993 -0
  12. package/dist/modals-CSexQO1C.js +3077 -0
  13. package/dist/modals.js +24 -11810
  14. package/dist/modals.mjs +3 -49
  15. package/dist/pages-CMlCYngA.mjs +7846 -0
  16. package/dist/pages-xvAzj6c2.js +7955 -0
  17. package/dist/pages.js +25 -42383
  18. package/dist/pages.mjs +3 -57
  19. package/dist/primitives-CqxNeV7H.js +9930 -0
  20. package/dist/primitives-Dz5aF8ma.mjs +8928 -0
  21. package/dist/primitives.js +102 -11079
  22. package/dist/primitives.mjs +1 -204
  23. package/dist/trading-CDkNdjGx.mjs +7086 -0
  24. package/dist/trading-CXsZFd3l.js +7217 -0
  25. package/dist/trading.js +39 -18215
  26. package/dist/trading.mjs +3 -68
  27. package/dist/types/agg-provider.d.mts +1 -1
  28. package/dist/types/agg-provider.d.ts +1 -1
  29. package/dist/types/auth/connect-button-view/index.d.mts +4 -5
  30. package/dist/types/auth/connect-button-view/index.d.ts +4 -5
  31. package/dist/types/deposit/components/DepositQRCode.d.mts +2 -2
  32. package/dist/types/deposit/components/DepositQRCode.d.ts +2 -2
  33. package/dist/types/deposit/index.d.mts +4 -4
  34. package/dist/types/deposit/index.d.ts +4 -4
  35. package/dist/types/deposit/steps/card-deposit.d.mts +1 -1
  36. package/dist/types/deposit/steps/card-deposit.d.ts +1 -1
  37. package/dist/types/deposit/steps/card-payment-pending.d.mts +1 -1
  38. package/dist/types/deposit/steps/card-payment-pending.d.ts +1 -1
  39. package/dist/types/deposit/steps/card-provider.d.mts +1 -1
  40. package/dist/types/deposit/steps/card-provider.d.ts +1 -1
  41. package/dist/types/deposit/steps/card-purchase-success.d.mts +1 -1
  42. package/dist/types/deposit/steps/card-purchase-success.d.ts +1 -1
  43. package/dist/types/deposit/steps/card-widget.d.mts +1 -1
  44. package/dist/types/deposit/steps/card-widget.d.ts +1 -1
  45. package/dist/types/deposit/steps/crypto-transfer.d.mts +1 -1
  46. package/dist/types/deposit/steps/crypto-transfer.d.ts +1 -1
  47. package/dist/types/deposit/steps/deposit-method.d.mts +2 -1
  48. package/dist/types/deposit/steps/deposit-method.d.ts +2 -1
  49. package/dist/types/deposit/steps/venue-selection.d.mts +1 -1
  50. package/dist/types/deposit/steps/venue-selection.d.ts +1 -1
  51. package/dist/types/deposit/steps/wallet-form.d.mts +1 -1
  52. package/dist/types/deposit/steps/wallet-form.d.ts +1 -1
  53. package/dist/types/deposit/steps/wallet-processing.d.mts +1 -1
  54. package/dist/types/deposit/steps/wallet-processing.d.ts +1 -1
  55. package/dist/types/deposit/steps/wallet-success.d.mts +1 -1
  56. package/dist/types/deposit/steps/wallet-success.d.ts +1 -1
  57. package/dist/types/events/item/event-list-item.utils.d.mts +1 -1
  58. package/dist/types/events/item/event-list-item.utils.d.ts +1 -1
  59. package/dist/types/events/item/index.d.mts +8 -8
  60. package/dist/types/events/item/index.d.ts +8 -8
  61. package/dist/types/events/item-details/event-list-item-details-market-selector.d.mts +1 -1
  62. package/dist/types/events/item-details/event-list-item-details-market-selector.d.ts +1 -1
  63. package/dist/types/events/item-details/event-markets-chart.d.mts +1 -1
  64. package/dist/types/events/item-details/event-markets-chart.d.ts +1 -1
  65. package/dist/types/events/item-details/event-markets-chart.utils.d.mts +1 -1
  66. package/dist/types/events/item-details/event-markets-chart.utils.d.ts +1 -1
  67. package/dist/types/events/item-details/index.d.mts +4 -4
  68. package/dist/types/events/item-details/index.d.ts +4 -4
  69. package/dist/types/events/item-details/settlement-summary.d.mts +4 -4
  70. package/dist/types/events/item-details/settlement-summary.d.ts +4 -4
  71. package/dist/types/events/list/category-sidebar.d.mts +4 -4
  72. package/dist/types/events/list/category-sidebar.d.ts +4 -4
  73. package/dist/types/events/list/event-list-tabs.d.mts +4 -8
  74. package/dist/types/events/list/event-list-tabs.d.ts +4 -8
  75. package/dist/types/events/list/event-list-venue-strip.d.mts +4 -11
  76. package/dist/types/events/list/event-list-venue-strip.d.ts +4 -11
  77. package/dist/types/events/list/index.d.mts +4 -4
  78. package/dist/types/events/list/index.d.ts +4 -4
  79. package/dist/types/events/market-details/index.d.mts +8 -8
  80. package/dist/types/events/market-details/index.d.ts +8 -8
  81. package/dist/types/events/market-details/market-details-graph-panel.d.mts +4 -14
  82. package/dist/types/events/market-details/market-details-graph-panel.d.ts +4 -14
  83. package/dist/types/events/market-details/market-details-outcome-button.d.mts +4 -4
  84. package/dist/types/events/market-details/market-details-outcome-button.d.ts +4 -4
  85. package/dist/types/events/market-details/orderbook-aggregation.d.mts +3 -1
  86. package/dist/types/events/market-details/orderbook-aggregation.d.ts +3 -1
  87. package/dist/types/events/market-details/use-visible-market-streams.d.mts +1 -1
  88. package/dist/types/events/market-details/use-visible-market-streams.d.ts +1 -1
  89. package/dist/types/events/orderbook/index.d.mts +4 -4
  90. package/dist/types/events/orderbook/index.d.ts +4 -4
  91. package/dist/types/events/orderbook/orderbook-with-states.d.mts +4 -4
  92. package/dist/types/events/orderbook/orderbook-with-states.d.ts +4 -4
  93. package/dist/types/events/shared/chart-source-caption.d.mts +1 -1
  94. package/dist/types/events/shared/chart-source-caption.d.ts +1 -1
  95. package/dist/types/events/shared/sports-live-score.d.mts +4 -4
  96. package/dist/types/events/shared/sports-live-score.d.ts +4 -4
  97. package/dist/types/events/shared/use-chart-orderbook.d.mts +3 -3
  98. package/dist/types/events/shared/use-chart-orderbook.d.ts +3 -3
  99. package/dist/types/geo-block-banner/index.d.mts +4 -4
  100. package/dist/types/geo-block-banner/index.d.ts +4 -4
  101. package/dist/types/geo-block-modal/index.d.mts +4 -4
  102. package/dist/types/geo-block-modal/index.d.ts +4 -4
  103. package/dist/types/kyc/shared-kyc-modal.d.mts +4 -4
  104. package/dist/types/kyc/shared-kyc-modal.d.ts +4 -4
  105. package/dist/types/notifications/agg-notification-events-provider.d.mts +1 -1
  106. package/dist/types/notifications/agg-notification-events-provider.d.ts +1 -1
  107. package/dist/types/notifications/agg-toast-provider.d.mts +1 -1
  108. package/dist/types/notifications/agg-toast-provider.d.ts +1 -1
  109. package/dist/types/onboarding/index.d.mts +4 -4
  110. package/dist/types/onboarding/index.d.ts +4 -4
  111. package/dist/types/onboarding/steps/connect-accounts.d.mts +4 -4
  112. package/dist/types/onboarding/steps/connect-accounts.d.ts +4 -4
  113. package/dist/types/onboarding/steps/connect-kalshi-modal.d.mts +4 -4
  114. package/dist/types/onboarding/steps/connect-kalshi-modal.d.ts +4 -4
  115. package/dist/types/onboarding/steps/connect-novig-modal.d.mts +1 -1
  116. package/dist/types/onboarding/steps/connect-novig-modal.d.ts +1 -1
  117. package/dist/types/onboarding/steps/connect-onchain-modal.d.mts +4 -4
  118. package/dist/types/onboarding/steps/connect-onchain-modal.d.ts +4 -4
  119. package/dist/types/onboarding/steps/connect-prophetx-modal.d.mts +1 -1
  120. package/dist/types/onboarding/steps/connect-prophetx-modal.d.ts +1 -1
  121. package/dist/types/onboarding/steps/how-it-works.d.mts +4 -4
  122. package/dist/types/onboarding/steps/how-it-works.d.ts +4 -4
  123. package/dist/types/onboarding/steps/profile-setup.d.mts +4 -4
  124. package/dist/types/onboarding/steps/profile-setup.d.ts +4 -4
  125. package/dist/types/pages/event-market/event-market.shared.d.mts +4 -4
  126. package/dist/types/pages/event-market/event-market.shared.d.ts +4 -4
  127. package/dist/types/pages/event-market/event-market.types.d.mts +2 -0
  128. package/dist/types/pages/event-market/event-market.types.d.ts +2 -0
  129. package/dist/types/pages/event-market/event-open-orders.d.mts +8 -27
  130. package/dist/types/pages/event-market/event-open-orders.d.ts +8 -27
  131. package/dist/types/pages/event-market/index.d.mts +6 -6
  132. package/dist/types/pages/event-market/index.d.ts +6 -6
  133. package/dist/types/pages/event-market/sports-event-market-page.d.mts +6 -6
  134. package/dist/types/pages/event-market/sports-event-market-page.d.ts +6 -6
  135. package/dist/types/pages/event-market/sports-line-rail.d.mts +2 -1
  136. package/dist/types/pages/event-market/sports-line-rail.d.ts +2 -1
  137. package/dist/types/pages/event-market/sports-market-card.d.mts +4 -4
  138. package/dist/types/pages/event-market/sports-market-card.d.ts +4 -4
  139. package/dist/types/pages/event-market/sports-markets.d.mts +4 -4
  140. package/dist/types/pages/event-market/sports-markets.d.ts +4 -4
  141. package/dist/types/pages/home/index.d.mts +6 -6
  142. package/dist/types/pages/home/index.d.ts +6 -6
  143. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.mts +1 -1
  144. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.ts +1 -1
  145. package/dist/types/pages/leaderboard/components/leaderboard-row.d.mts +1 -1
  146. package/dist/types/pages/leaderboard/components/leaderboard-row.d.ts +1 -1
  147. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.mts +1 -1
  148. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.ts +1 -1
  149. package/dist/types/pages/leaderboard/components/segmented-control.d.mts +1 -1
  150. package/dist/types/pages/leaderboard/components/segmented-control.d.ts +1 -1
  151. package/dist/types/pages/leaderboard/index.d.mts +1 -1
  152. package/dist/types/pages/leaderboard/index.d.ts +1 -1
  153. package/dist/types/pages/user-profile/components/activity-row.d.mts +4 -4
  154. package/dist/types/pages/user-profile/components/activity-row.d.ts +4 -4
  155. package/dist/types/pages/user-profile/components/available-balance-card.d.mts +4 -4
  156. package/dist/types/pages/user-profile/components/available-balance-card.d.ts +4 -4
  157. package/dist/types/pages/user-profile/components/balance-display.d.mts +4 -4
  158. package/dist/types/pages/user-profile/components/balance-display.d.ts +4 -4
  159. package/dist/types/pages/user-profile/components/balances-card.d.mts +4 -4
  160. package/dist/types/pages/user-profile/components/balances-card.d.ts +4 -4
  161. package/dist/types/pages/user-profile/components/betdex-account-activity.d.mts +1 -1
  162. package/dist/types/pages/user-profile/components/betdex-account-activity.d.ts +1 -1
  163. package/dist/types/pages/user-profile/components/betdex-account-card.d.mts +1 -1
  164. package/dist/types/pages/user-profile/components/betdex-account-card.d.ts +1 -1
  165. package/dist/types/pages/user-profile/components/betdex-account-transfers.d.mts +1 -1
  166. package/dist/types/pages/user-profile/components/betdex-account-transfers.d.ts +1 -1
  167. package/dist/types/pages/user-profile/components/betdex-wallet-deposit.d.mts +1 -1
  168. package/dist/types/pages/user-profile/components/betdex-wallet-deposit.d.ts +1 -1
  169. package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.mts +1 -1
  170. package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.ts +1 -1
  171. package/dist/types/pages/user-profile/components/empty-state.d.mts +4 -4
  172. package/dist/types/pages/user-profile/components/empty-state.d.ts +4 -4
  173. package/dist/types/pages/user-profile/components/manage-balances-modal.d.mts +4 -4
  174. package/dist/types/pages/user-profile/components/manage-balances-modal.d.ts +4 -4
  175. package/dist/types/pages/user-profile/components/open-order-row.d.mts +4 -4
  176. package/dist/types/pages/user-profile/components/open-order-row.d.ts +4 -4
  177. package/dist/types/pages/user-profile/components/position-row.d.mts +4 -4
  178. package/dist/types/pages/user-profile/components/position-row.d.ts +4 -4
  179. package/dist/types/pages/user-profile/components/positions-activity.d.mts +4 -4
  180. package/dist/types/pages/user-profile/components/positions-activity.d.ts +4 -4
  181. package/dist/types/pages/user-profile/components/positions-value-card.d.mts +4 -4
  182. package/dist/types/pages/user-profile/components/positions-value-card.d.ts +4 -4
  183. package/dist/types/pages/user-profile/components/user-info-card.d.mts +4 -4
  184. package/dist/types/pages/user-profile/components/user-info-card.d.ts +4 -4
  185. package/dist/types/pages/user-profile/index.d.mts +6 -6
  186. package/dist/types/pages/user-profile/index.d.ts +6 -6
  187. package/dist/types/paper-trading/paper-onboarding-modal.d.mts +4 -14
  188. package/dist/types/paper-trading/paper-onboarding-modal.d.ts +4 -14
  189. package/dist/types/paper-trading/paper-trading-badge.d.mts +4 -16
  190. package/dist/types/paper-trading/paper-trading-badge.d.ts +4 -16
  191. package/dist/types/paper-trading/paper-trading-onboarding.d.mts +4 -12
  192. package/dist/types/paper-trading/paper-trading-onboarding.d.ts +4 -12
  193. package/dist/types/primitives/agg-logo/agg-logo.utils.d.mts +1 -1
  194. package/dist/types/primitives/agg-logo/agg-logo.utils.d.ts +1 -1
  195. package/dist/types/primitives/agg-logo/index.d.mts +4 -5
  196. package/dist/types/primitives/agg-logo/index.d.ts +4 -5
  197. package/dist/types/primitives/autocomplete-select/index.d.mts +4 -5
  198. package/dist/types/primitives/autocomplete-select/index.d.ts +4 -5
  199. package/dist/types/primitives/badge/index.d.mts +1 -1
  200. package/dist/types/primitives/badge/index.d.ts +1 -1
  201. package/dist/types/primitives/button/button.types.d.mts +2 -2
  202. package/dist/types/primitives/button/button.types.d.ts +2 -2
  203. package/dist/types/primitives/button/index.d.mts +4 -5
  204. package/dist/types/primitives/button/index.d.ts +4 -5
  205. package/dist/types/primitives/calendar/index.d.mts +4 -4
  206. package/dist/types/primitives/calendar/index.d.ts +4 -4
  207. package/dist/types/primitives/card/index.d.mts +4 -5
  208. package/dist/types/primitives/card/index.d.ts +4 -5
  209. package/dist/types/primitives/chart/chart-type-switch.d.mts +4 -5
  210. package/dist/types/primitives/chart/chart-type-switch.d.ts +4 -5
  211. package/dist/types/primitives/chart/index.d.mts +4 -5
  212. package/dist/types/primitives/chart/index.d.ts +4 -5
  213. package/dist/types/primitives/chart/probability-chart.d.mts +2 -2
  214. package/dist/types/primitives/chart/probability-chart.d.ts +2 -2
  215. package/dist/types/primitives/chart/probability-live-tail.d.mts +1 -1
  216. package/dist/types/primitives/chart/probability-live-tail.d.ts +1 -1
  217. package/dist/types/primitives/conditional-wrapper.d.mts +6 -7
  218. package/dist/types/primitives/conditional-wrapper.d.ts +6 -7
  219. package/dist/types/primitives/copy-button/index.d.mts +4 -5
  220. package/dist/types/primitives/copy-button/index.d.ts +4 -5
  221. package/dist/types/primitives/currency-input/index.d.mts +4 -5
  222. package/dist/types/primitives/currency-input/index.d.ts +4 -5
  223. package/dist/types/primitives/footer/agg-build-logo.d.mts +12 -15
  224. package/dist/types/primitives/footer/agg-build-logo.d.ts +12 -15
  225. package/dist/types/primitives/footer/index.d.mts +4 -6
  226. package/dist/types/primitives/footer/index.d.ts +4 -6
  227. package/dist/types/primitives/header/index.d.mts +4 -6
  228. package/dist/types/primitives/header/index.d.ts +4 -6
  229. package/dist/types/primitives/icon/index.d.mts +4 -5
  230. package/dist/types/primitives/icon/index.d.ts +4 -5
  231. package/dist/types/primitives/icon/registry.d.mts +180 -351
  232. package/dist/types/primitives/icon/registry.d.ts +180 -351
  233. package/dist/types/primitives/icon/svg/activity-chart.d.mts +4 -4
  234. package/dist/types/primitives/icon/svg/activity-chart.d.ts +4 -4
  235. package/dist/types/primitives/icon/svg/activity.d.mts +4 -4
  236. package/dist/types/primitives/icon/svg/activity.d.ts +4 -4
  237. package/dist/types/primitives/icon/svg/apple.d.mts +4 -4
  238. package/dist/types/primitives/icon/svg/apple.d.ts +4 -4
  239. package/dist/types/primitives/icon/svg/apps.d.mts +4 -4
  240. package/dist/types/primitives/icon/svg/apps.d.ts +4 -4
  241. package/dist/types/primitives/icon/svg/arbitrum.d.mts +4 -4
  242. package/dist/types/primitives/icon/svg/arbitrum.d.ts +4 -4
  243. package/dist/types/primitives/icon/svg/arrow-right.d.mts +4 -4
  244. package/dist/types/primitives/icon/svg/arrow-right.d.ts +4 -4
  245. package/dist/types/primitives/icon/svg/arrow-trend-up.d.mts +4 -4
  246. package/dist/types/primitives/icon/svg/arrow-trend-up.d.ts +4 -4
  247. package/dist/types/primitives/icon/svg/arrows-to-dot.d.mts +4 -4
  248. package/dist/types/primitives/icon/svg/arrows-to-dot.d.ts +4 -4
  249. package/dist/types/primitives/icon/svg/badge-check-thin.d.mts +4 -4
  250. package/dist/types/primitives/icon/svg/badge-check-thin.d.ts +4 -4
  251. package/dist/types/primitives/icon/svg/bank.d.mts +4 -4
  252. package/dist/types/primitives/icon/svg/bank.d.ts +4 -4
  253. package/dist/types/primitives/icon/svg/base.d.mts +4 -4
  254. package/dist/types/primitives/icon/svg/base.d.ts +4 -4
  255. package/dist/types/primitives/icon/svg/best-prices.d.mts +4 -4
  256. package/dist/types/primitives/icon/svg/best-prices.d.ts +4 -4
  257. package/dist/types/primitives/icon/svg/bnb.d.mts +4 -4
  258. package/dist/types/primitives/icon/svg/bnb.d.ts +4 -4
  259. package/dist/types/primitives/icon/svg/bolt.d.mts +4 -4
  260. package/dist/types/primitives/icon/svg/bolt.d.ts +4 -4
  261. package/dist/types/primitives/icon/svg/calendar.d.mts +1 -1
  262. package/dist/types/primitives/icon/svg/calendar.d.ts +1 -1
  263. package/dist/types/primitives/icon/svg/chart-candlestick.d.mts +4 -4
  264. package/dist/types/primitives/icon/svg/chart-candlestick.d.ts +4 -4
  265. package/dist/types/primitives/icon/svg/chart-line.d.mts +4 -4
  266. package/dist/types/primitives/icon/svg/chart-line.d.ts +4 -4
  267. package/dist/types/primitives/icon/svg/check-badge.d.mts +4 -4
  268. package/dist/types/primitives/icon/svg/check-badge.d.ts +4 -4
  269. package/dist/types/primitives/icon/svg/check-circle.d.mts +4 -4
  270. package/dist/types/primitives/icon/svg/check-circle.d.ts +4 -4
  271. package/dist/types/primitives/icon/svg/chevron-down-thin.d.mts +4 -5
  272. package/dist/types/primitives/icon/svg/chevron-down-thin.d.ts +4 -5
  273. package/dist/types/primitives/icon/svg/chevron-down.d.mts +4 -4
  274. package/dist/types/primitives/icon/svg/chevron-down.d.ts +4 -4
  275. package/dist/types/primitives/icon/svg/chevron-left.d.mts +4 -4
  276. package/dist/types/primitives/icon/svg/chevron-left.d.ts +4 -4
  277. package/dist/types/primitives/icon/svg/chevron-right.d.mts +4 -4
  278. package/dist/types/primitives/icon/svg/chevron-right.d.ts +4 -4
  279. package/dist/types/primitives/icon/svg/chevron-up.d.mts +4 -4
  280. package/dist/types/primitives/icon/svg/chevron-up.d.ts +4 -4
  281. package/dist/types/primitives/icon/svg/circle-overlap.d.mts +4 -4
  282. package/dist/types/primitives/icon/svg/circle-overlap.d.ts +4 -4
  283. package/dist/types/primitives/icon/svg/circle-xmark.d.mts +4 -4
  284. package/dist/types/primitives/icon/svg/circle-xmark.d.ts +4 -4
  285. package/dist/types/primitives/icon/svg/close.d.mts +4 -4
  286. package/dist/types/primitives/icon/svg/close.d.ts +4 -4
  287. package/dist/types/primitives/icon/svg/copy.d.mts +4 -4
  288. package/dist/types/primitives/icon/svg/copy.d.ts +4 -4
  289. package/dist/types/primitives/icon/svg/create-account.d.mts +4 -4
  290. package/dist/types/primitives/icon/svg/create-account.d.ts +4 -4
  291. package/dist/types/primitives/icon/svg/credit-card.d.mts +4 -4
  292. package/dist/types/primitives/icon/svg/credit-card.d.ts +4 -4
  293. package/dist/types/primitives/icon/svg/cross-circle.d.mts +4 -4
  294. package/dist/types/primitives/icon/svg/cross-circle.d.ts +4 -4
  295. package/dist/types/primitives/icon/svg/disconnect.d.mts +4 -4
  296. package/dist/types/primitives/icon/svg/disconnect.d.ts +4 -4
  297. package/dist/types/primitives/icon/svg/discord.d.mts +4 -4
  298. package/dist/types/primitives/icon/svg/discord.d.ts +4 -4
  299. package/dist/types/primitives/icon/svg/document.d.mts +4 -4
  300. package/dist/types/primitives/icon/svg/document.d.ts +4 -4
  301. package/dist/types/primitives/icon/svg/dots-horizontal.d.mts +4 -4
  302. package/dist/types/primitives/icon/svg/dots-horizontal.d.ts +4 -4
  303. package/dist/types/primitives/icon/svg/download.d.mts +4 -4
  304. package/dist/types/primitives/icon/svg/download.d.ts +4 -4
  305. package/dist/types/primitives/icon/svg/email.d.mts +4 -4
  306. package/dist/types/primitives/icon/svg/email.d.ts +4 -4
  307. package/dist/types/primitives/icon/svg/error-filled.d.mts +4 -4
  308. package/dist/types/primitives/icon/svg/error-filled.d.ts +4 -4
  309. package/dist/types/primitives/icon/svg/ethereum.d.mts +4 -4
  310. package/dist/types/primitives/icon/svg/ethereum.d.ts +4 -4
  311. package/dist/types/primitives/icon/svg/external-link.d.mts +4 -4
  312. package/dist/types/primitives/icon/svg/external-link.d.ts +4 -4
  313. package/dist/types/primitives/icon/svg/gift-bonus.d.mts +4 -4
  314. package/dist/types/primitives/icon/svg/gift-bonus.d.ts +4 -4
  315. package/dist/types/primitives/icon/svg/google.d.mts +4 -4
  316. package/dist/types/primitives/icon/svg/google.d.ts +4 -4
  317. package/dist/types/primitives/icon/svg/hourglass-start.d.mts +4 -4
  318. package/dist/types/primitives/icon/svg/hourglass-start.d.ts +4 -4
  319. package/dist/types/primitives/icon/svg/image.d.mts +4 -4
  320. package/dist/types/primitives/icon/svg/image.d.ts +4 -4
  321. package/dist/types/primitives/icon/svg/info.d.mts +4 -4
  322. package/dist/types/primitives/icon/svg/info.d.ts +4 -4
  323. package/dist/types/primitives/icon/svg/internet-security.d.mts +4 -4
  324. package/dist/types/primitives/icon/svg/internet-security.d.ts +4 -4
  325. package/dist/types/primitives/icon/svg/link-accounts.d.mts +4 -4
  326. package/dist/types/primitives/icon/svg/link-accounts.d.ts +4 -4
  327. package/dist/types/primitives/icon/svg/lock.d.mts +4 -4
  328. package/dist/types/primitives/icon/svg/lock.d.ts +4 -4
  329. package/dist/types/primitives/icon/svg/minus.d.mts +1 -1
  330. package/dist/types/primitives/icon/svg/minus.d.ts +1 -1
  331. package/dist/types/primitives/icon/svg/paper-buying-power.d.mts +4 -10
  332. package/dist/types/primitives/icon/svg/paper-buying-power.d.ts +4 -10
  333. package/dist/types/primitives/icon/svg/paper-earnings.d.mts +4 -10
  334. package/dist/types/primitives/icon/svg/paper-earnings.d.ts +4 -10
  335. package/dist/types/primitives/icon/svg/paper-mode.d.mts +4 -4
  336. package/dist/types/primitives/icon/svg/paper-mode.d.ts +4 -4
  337. package/dist/types/primitives/icon/svg/paper-onboarding-funds.d.mts +4 -11
  338. package/dist/types/primitives/icon/svg/paper-onboarding-funds.d.ts +4 -11
  339. package/dist/types/primitives/icon/svg/paper-onboarding-markets.d.mts +4 -11
  340. package/dist/types/primitives/icon/svg/paper-onboarding-markets.d.ts +4 -11
  341. package/dist/types/primitives/icon/svg/paper-onboarding-performance.d.mts +4 -11
  342. package/dist/types/primitives/icon/svg/paper-onboarding-performance.d.ts +4 -11
  343. package/dist/types/primitives/icon/svg/paper-plane.d.mts +4 -4
  344. package/dist/types/primitives/icon/svg/paper-plane.d.ts +4 -4
  345. package/dist/types/primitives/icon/svg/pencil.d.mts +4 -4
  346. package/dist/types/primitives/icon/svg/pencil.d.ts +4 -4
  347. package/dist/types/primitives/icon/svg/play-square.d.mts +4 -4
  348. package/dist/types/primitives/icon/svg/play-square.d.ts +4 -4
  349. package/dist/types/primitives/icon/svg/plus.d.mts +1 -1
  350. package/dist/types/primitives/icon/svg/plus.d.ts +1 -1
  351. package/dist/types/primitives/icon/svg/polygon.d.mts +4 -4
  352. package/dist/types/primitives/icon/svg/polygon.d.ts +4 -4
  353. package/dist/types/primitives/icon/svg/profile-about-tab.d.mts +4 -5
  354. package/dist/types/primitives/icon/svg/profile-about-tab.d.ts +4 -5
  355. package/dist/types/primitives/icon/svg/profile-accounts-wallets-tab.d.mts +4 -5
  356. package/dist/types/primitives/icon/svg/profile-accounts-wallets-tab.d.ts +4 -5
  357. package/dist/types/primitives/icon/svg/profile.d.mts +4 -4
  358. package/dist/types/primitives/icon/svg/profile.d.ts +4 -4
  359. package/dist/types/primitives/icon/svg/quotes-warning.d.mts +4 -5
  360. package/dist/types/primitives/icon/svg/quotes-warning.d.ts +4 -5
  361. package/dist/types/primitives/icon/svg/recenter.d.mts +4 -4
  362. package/dist/types/primitives/icon/svg/recenter.d.ts +4 -4
  363. package/dist/types/primitives/icon/svg/revenue-alt.d.mts +4 -4
  364. package/dist/types/primitives/icon/svg/revenue-alt.d.ts +4 -4
  365. package/dist/types/primitives/icon/svg/search.d.mts +4 -4
  366. package/dist/types/primitives/icon/svg/search.d.ts +4 -4
  367. package/dist/types/primitives/icon/svg/shield-trust.d.mts +4 -4
  368. package/dist/types/primitives/icon/svg/shield-trust.d.ts +4 -4
  369. package/dist/types/primitives/icon/svg/solana.d.mts +4 -4
  370. package/dist/types/primitives/icon/svg/solana.d.ts +4 -4
  371. package/dist/types/primitives/icon/svg/sort-end-date.d.mts +4 -4
  372. package/dist/types/primitives/icon/svg/sort-end-date.d.ts +4 -4
  373. package/dist/types/primitives/icon/svg/sort-top-arbitrage.d.mts +4 -4
  374. package/dist/types/primitives/icon/svg/sort-top-arbitrage.d.ts +4 -4
  375. package/dist/types/primitives/icon/svg/sort-volume-24hr.d.mts +4 -4
  376. package/dist/types/primitives/icon/svg/sort-volume-24hr.d.ts +4 -4
  377. package/dist/types/primitives/icon/svg/sort-volume.d.mts +4 -4
  378. package/dist/types/primitives/icon/svg/sort-volume.d.ts +4 -4
  379. package/dist/types/primitives/icon/svg/sparkles-filled.d.mts +4 -4
  380. package/dist/types/primitives/icon/svg/sparkles-filled.d.ts +4 -4
  381. package/dist/types/primitives/icon/svg/spinner.d.mts +4 -4
  382. package/dist/types/primitives/icon/svg/spinner.d.ts +4 -4
  383. package/dist/types/primitives/icon/svg/stay-in-control.d.mts +4 -4
  384. package/dist/types/primitives/icon/svg/stay-in-control.d.ts +4 -4
  385. package/dist/types/primitives/icon/svg/success-check.d.mts +4 -4
  386. package/dist/types/primitives/icon/svg/success-check.d.ts +4 -4
  387. package/dist/types/primitives/icon/svg/telegram.d.mts +4 -4
  388. package/dist/types/primitives/icon/svg/telegram.d.ts +4 -4
  389. package/dist/types/primitives/icon/svg/triangle-down.d.mts +4 -4
  390. package/dist/types/primitives/icon/svg/triangle-down.d.ts +4 -4
  391. package/dist/types/primitives/icon/svg/triangle-up-filled.d.mts +4 -4
  392. package/dist/types/primitives/icon/svg/triangle-up-filled.d.ts +4 -4
  393. package/dist/types/primitives/icon/svg/triangle-up.d.mts +4 -4
  394. package/dist/types/primitives/icon/svg/triangle-up.d.ts +4 -4
  395. package/dist/types/primitives/icon/svg/twitter.d.mts +4 -4
  396. package/dist/types/primitives/icon/svg/twitter.d.ts +4 -4
  397. package/dist/types/primitives/icon/svg/upload.d.mts +4 -4
  398. package/dist/types/primitives/icon/svg/upload.d.ts +4 -4
  399. package/dist/types/primitives/icon/svg/usdc.d.mts +4 -4
  400. package/dist/types/primitives/icon/svg/usdc.d.ts +4 -4
  401. package/dist/types/primitives/icon/svg/user-trust.d.mts +4 -4
  402. package/dist/types/primitives/icon/svg/user-trust.d.ts +4 -4
  403. package/dist/types/primitives/icon/svg/wallet-avatar.d.mts +1 -1
  404. package/dist/types/primitives/icon/svg/wallet-avatar.d.ts +1 -1
  405. package/dist/types/primitives/icon/svg/wallet-filled.d.mts +4 -4
  406. package/dist/types/primitives/icon/svg/wallet-filled.d.ts +4 -4
  407. package/dist/types/primitives/icon/svg/wallet.d.mts +4 -4
  408. package/dist/types/primitives/icon/svg/wallet.d.ts +4 -4
  409. package/dist/types/primitives/icon/svg/warning-filled.d.mts +4 -4
  410. package/dist/types/primitives/icon/svg/warning-filled.d.ts +4 -4
  411. package/dist/types/primitives/icon/svg/warning.d.mts +4 -4
  412. package/dist/types/primitives/icon/svg/warning.d.ts +4 -4
  413. package/dist/types/primitives/inline-alert/index.d.mts +4 -5
  414. package/dist/types/primitives/inline-alert/index.d.ts +4 -5
  415. package/dist/types/primitives/loading-icon/index.d.mts +4 -5
  416. package/dist/types/primitives/loading-icon/index.d.ts +4 -5
  417. package/dist/types/primitives/modal/index.d.mts +12 -9
  418. package/dist/types/primitives/modal/index.d.ts +12 -9
  419. package/dist/types/primitives/number-value.d.mts +4 -4
  420. package/dist/types/primitives/number-value.d.ts +4 -4
  421. package/dist/types/primitives/remote-image/index.d.mts +4 -5
  422. package/dist/types/primitives/remote-image/index.d.ts +4 -5
  423. package/dist/types/primitives/search/index.d.mts +4 -5
  424. package/dist/types/primitives/search/index.d.ts +4 -5
  425. package/dist/types/primitives/search/search-empty-icon.d.mts +4 -4
  426. package/dist/types/primitives/search/search-empty-icon.d.ts +4 -4
  427. package/dist/types/primitives/select/index.d.mts +4 -5
  428. package/dist/types/primitives/select/index.d.ts +4 -5
  429. package/dist/types/primitives/skeleton/index.d.mts +4 -5
  430. package/dist/types/primitives/skeleton/index.d.ts +4 -5
  431. package/dist/types/primitives/skeleton/skeleton-block.d.mts +4 -4
  432. package/dist/types/primitives/skeleton/skeleton-block.d.ts +4 -4
  433. package/dist/types/primitives/skeleton/views/event-list-item-details-skeleton-view.d.mts +4 -4
  434. package/dist/types/primitives/skeleton/views/event-list-item-details-skeleton-view.d.ts +4 -4
  435. package/dist/types/primitives/skeleton/views/event-list-item-skeleton-view.d.mts +4 -10
  436. package/dist/types/primitives/skeleton/views/event-list-item-skeleton-view.d.ts +4 -10
  437. package/dist/types/primitives/skeleton/views/event-list-skeleton-view.d.mts +4 -4
  438. package/dist/types/primitives/skeleton/views/event-list-skeleton-view.d.ts +4 -4
  439. package/dist/types/primitives/skeleton/views/market-details-skeleton-view.d.mts +5 -5
  440. package/dist/types/primitives/skeleton/views/market-details-skeleton-view.d.ts +5 -5
  441. package/dist/types/primitives/skeleton/views/place-order-skeleton-view.d.mts +8 -8
  442. package/dist/types/primitives/skeleton/views/place-order-skeleton-view.d.ts +8 -8
  443. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.mts +4 -4
  444. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.ts +4 -4
  445. package/dist/types/primitives/skeleton/views/settlement-skeleton-view.d.mts +4 -4
  446. package/dist/types/primitives/skeleton/views/settlement-skeleton-view.d.ts +4 -4
  447. package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.mts +4 -4
  448. package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.ts +4 -4
  449. package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.mts +4 -4
  450. package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.ts +4 -4
  451. package/dist/types/primitives/state-message/index.d.mts +4 -5
  452. package/dist/types/primitives/state-message/index.d.ts +4 -5
  453. package/dist/types/primitives/switch-button/index.d.mts +4 -5
  454. package/dist/types/primitives/switch-button/index.d.ts +4 -5
  455. package/dist/types/primitives/tabs/index.d.mts +4 -5
  456. package/dist/types/primitives/tabs/index.d.ts +4 -5
  457. package/dist/types/primitives/toast/index.d.mts +1 -1
  458. package/dist/types/primitives/toast/index.d.ts +1 -1
  459. package/dist/types/primitives/tooltip/index.d.mts +4 -5
  460. package/dist/types/primitives/tooltip/index.d.ts +4 -5
  461. package/dist/types/primitives/typography/index.d.mts +4 -5
  462. package/dist/types/primitives/typography/index.d.ts +4 -5
  463. package/dist/types/primitives/typography/typography.types.d.mts +1 -1
  464. package/dist/types/primitives/typography/typography.types.d.ts +1 -1
  465. package/dist/types/primitives/venue-logo/index.d.mts +4 -5
  466. package/dist/types/primitives/venue-logo/index.d.ts +4 -5
  467. package/dist/types/primitives/venue-logo/svg/default-venue.d.mts +1 -1
  468. package/dist/types/primitives/venue-logo/svg/default-venue.d.ts +1 -1
  469. package/dist/types/primitives/venue-logo/svg/logo-betdex.d.mts +1 -1
  470. package/dist/types/primitives/venue-logo/svg/logo-betdex.d.ts +1 -1
  471. package/dist/types/primitives/venue-logo/svg/logo-hyperliquid.d.mts +4 -4
  472. package/dist/types/primitives/venue-logo/svg/logo-hyperliquid.d.ts +4 -4
  473. package/dist/types/primitives/venue-logo/svg/logo-kalshi.d.mts +4 -4
  474. package/dist/types/primitives/venue-logo/svg/logo-kalshi.d.ts +4 -4
  475. package/dist/types/primitives/venue-logo/svg/logo-limitless.d.mts +4 -4
  476. package/dist/types/primitives/venue-logo/svg/logo-limitless.d.ts +4 -4
  477. package/dist/types/primitives/venue-logo/svg/logo-myriad.d.mts +4 -4
  478. package/dist/types/primitives/venue-logo/svg/logo-myriad.d.ts +4 -4
  479. package/dist/types/primitives/venue-logo/svg/logo-novig.d.mts +4 -23
  480. package/dist/types/primitives/venue-logo/svg/logo-novig.d.ts +4 -23
  481. package/dist/types/primitives/venue-logo/svg/logo-opinion.d.mts +4 -4
  482. package/dist/types/primitives/venue-logo/svg/logo-opinion.d.ts +4 -4
  483. package/dist/types/primitives/venue-logo/svg/logo-polymarket.d.mts +4 -4
  484. package/dist/types/primitives/venue-logo/svg/logo-polymarket.d.ts +4 -4
  485. package/dist/types/primitives/venue-logo/svg/logo-pred.d.mts +4 -5
  486. package/dist/types/primitives/venue-logo/svg/logo-pred.d.ts +4 -5
  487. package/dist/types/primitives/venue-logo/svg/logo-predict.d.mts +4 -4
  488. package/dist/types/primitives/venue-logo/svg/logo-predict.d.ts +4 -4
  489. package/dist/types/primitives/venue-logo/svg/logo-probable.d.mts +4 -4
  490. package/dist/types/primitives/venue-logo/svg/logo-probable.d.ts +4 -4
  491. package/dist/types/primitives/venue-logo/svg/logo-prophetx.d.mts +4 -26
  492. package/dist/types/primitives/venue-logo/svg/logo-prophetx.d.ts +4 -26
  493. package/dist/types/primitives/venue-logo/svg/logo-tiprun.d.mts +4 -5
  494. package/dist/types/primitives/venue-logo/svg/logo-tiprun.d.ts +4 -5
  495. package/dist/types/primitives/venue-logo/venue-logo.constants.d.mts +1 -1
  496. package/dist/types/primitives/venue-logo/venue-logo.constants.d.ts +1 -1
  497. package/dist/types/profile/index.d.mts +4 -4
  498. package/dist/types/profile/index.d.ts +4 -4
  499. package/dist/types/profile/tabs/about-tab.d.mts +4 -4
  500. package/dist/types/profile/tabs/about-tab.d.ts +4 -4
  501. package/dist/types/profile/tabs/accounts-wallets-tab.d.mts +4 -4
  502. package/dist/types/profile/tabs/accounts-wallets-tab.d.ts +4 -4
  503. package/dist/types/profile/tabs/trading-access-tab.d.mts +4 -4
  504. package/dist/types/profile/tabs/trading-access-tab.d.ts +4 -4
  505. package/dist/types/shared/default-avatar.d.mts +4 -4
  506. package/dist/types/shared/default-avatar.d.ts +4 -4
  507. package/dist/types/shared/open-orders.d.mts +1 -1
  508. package/dist/types/shared/open-orders.d.ts +1 -1
  509. package/dist/types/shared/react-inert.d.mts +1 -0
  510. package/dist/types/shared/react-inert.d.ts +1 -0
  511. package/dist/types/shared/transfer-fee-summary.d.mts +1 -1
  512. package/dist/types/shared/transfer-fee-summary.d.ts +1 -1
  513. package/dist/types/trading/fund-kalshi-modal.d.mts +4 -4
  514. package/dist/types/trading/fund-kalshi-modal.d.ts +4 -4
  515. package/dist/types/trading/manage-betdex-account-modal.d.mts +1 -1
  516. package/dist/types/trading/manage-betdex-account-modal.d.ts +1 -1
  517. package/dist/types/trading/place-order/index.d.mts +4 -4
  518. package/dist/types/trading/place-order/index.d.ts +4 -4
  519. package/dist/types/trading/place-order/index.place-order.execution-view.d.mts +6 -6
  520. package/dist/types/trading/place-order/index.place-order.execution-view.d.ts +6 -6
  521. package/dist/types/trading/place-order/index.place-order.failure.d.mts +4 -4
  522. package/dist/types/trading/place-order/index.place-order.failure.d.ts +4 -4
  523. package/dist/types/trading/place-order/index.place-order.success.d.mts +4 -4
  524. package/dist/types/trading/place-order/index.place-order.success.d.ts +4 -4
  525. package/dist/types/trading/settlement/index.d.mts +4 -4
  526. package/dist/types/trading/settlement/index.d.ts +4 -4
  527. package/dist/types/trading/settlement/settlement-details.d.mts +4 -4
  528. package/dist/types/trading/settlement/settlement-details.d.ts +4 -4
  529. package/dist/types/trading/settlement/settlement-text-renderer.d.mts +4 -4
  530. package/dist/types/trading/settlement/settlement-text-renderer.d.ts +4 -4
  531. package/dist/types/withdraw/index.d.mts +4 -4
  532. package/dist/types/withdraw/index.d.ts +4 -4
  533. package/dist/types/withdraw/steps/withdraw-amount.d.mts +1 -1
  534. package/dist/types/withdraw/steps/withdraw-amount.d.ts +1 -1
  535. package/dist/types/withdraw/steps/withdraw-method.d.mts +1 -1
  536. package/dist/types/withdraw/steps/withdraw-method.d.ts +1 -1
  537. package/dist/types/withdraw/steps/withdraw-provider.d.mts +1 -1
  538. package/dist/types/withdraw/steps/withdraw-provider.d.ts +1 -1
  539. package/dist/types/withdraw/steps/withdraw-success.d.mts +2 -2
  540. package/dist/types/withdraw/steps/withdraw-success.d.ts +2 -2
  541. package/package.json +9 -8
  542. package/dist/chunk-4X7OLBO6.mjs +0 -3551
  543. package/dist/chunk-7ORC3TUJ.mjs +0 -2883
  544. package/dist/chunk-JH4B3ZHQ.mjs +0 -1
  545. package/dist/chunk-KN7JN7F5.mjs +0 -8303
  546. package/dist/chunk-MDCFCGA3.mjs +0 -2377
  547. package/dist/chunk-PHT5VLGB.mjs +0 -5789
  548. package/dist/chunk-W2LCFCW3.mjs +0 -2879
  549. package/dist/chunk-WOCZ4TVT.mjs +0 -1645
  550. package/dist/chunk-XZVGHKMW.mjs +0 -11426
  551. package/dist/chunk-YYGS6S7N.mjs +0 -5180
  552. package/dist/event-market-Q2LBJJ5E.mjs +0 -21
@@ -1,3551 +0,0 @@
1
- "use client";
2
- import {
3
- EventListItemDetails,
4
- MarketDetails,
5
- MarketDetailsList,
6
- isErrorWithStatus
7
- } from "./chunk-YYGS6S7N.mjs";
8
- import {
9
- PlaceOrder,
10
- SettlementDetails,
11
- useResolvedMarketClaim
12
- } from "./chunk-KN7JN7F5.mjs";
13
- import {
14
- getDisplayOutcomePrice,
15
- resolveHeaderOutcomeItems,
16
- resolveMarketFromVenueMarkets
17
- } from "./chunk-WOCZ4TVT.mjs";
18
- import {
19
- AggErrorBoundary,
20
- Button,
21
- CloseIcon,
22
- Icon,
23
- LoadingIcon,
24
- Modal,
25
- RemoteImage,
26
- SearchEmptyIcon,
27
- Skeleton,
28
- StateMessage,
29
- VenueLogo,
30
- __async,
31
- __objRest,
32
- __restKey,
33
- __spreadProps,
34
- __spreadValues,
35
- cn,
36
- formatRecurringMarketPillTimeEt,
37
- formatRecurringMarketWindowTimeEt,
38
- normalizeVenueMarketCluster,
39
- skeletonViews,
40
- useOptionalToast
41
- } from "./chunk-XZVGHKMW.mjs";
42
-
43
- // src/pages/event-market/index.tsx
44
- import {
45
- resolveRecurringCryptoTimeline,
46
- resolveEventTradingState as resolveEventTradingState3,
47
- TradeSide as TradeSide2,
48
- useEnrichedVenueEvent,
49
- useEventTradingContext as useEventTradingContext4,
50
- useLabels as useLabels8,
51
- useMidpoints as useMidpoints2,
52
- useRecurringCryptoMarkets,
53
- useSdkUiConfig as useSdkUiConfig4,
54
- useResolvedExecutionMode as useResolvedExecutionMode2
55
- } from "@agg-build/hooks";
56
- import { useCallback as useCallback5, useEffect as useEffect6, useMemo as useMemo5, useRef as useRef5, useState as useState7 } from "react";
57
-
58
- // src/pages/event-market/event-open-orders.tsx
59
- import { useAggAuthState, useLabels as useLabels4, useSdkUiConfig } from "@agg-build/hooks";
60
- import { useCallback as useCallback2 } from "react";
61
-
62
- // src/pages/user-profile/components/open-order-row.tsx
63
- import { optimizedImageUrl, retinaImageUrl, useLabels } from "@agg-build/hooks";
64
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
65
- var shouldUseNativeLinkNavigation = (event) => {
66
- return event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button === 1;
67
- };
68
- var CANCELLABLE_LIMIT_ORDER_STATUSES = /* @__PURE__ */ new Set([
69
- "submitted",
70
- "open",
71
- "partially_filled_open",
72
- "cancel_pending"
73
- ]);
74
- var canCancelOpenOrder = (order) => {
75
- const status = order.status.trim().toLowerCase();
76
- const isLimitOrder = order.orderType === "limit" || order.limitPriceLabel != null;
77
- if (!isLimitOrder) return false;
78
- if (status === "pending" && !order.dagRunId) return true;
79
- return CANCELLABLE_LIMIT_ORDER_STATUSES.has(status);
80
- };
81
- var PENDING_LIMIT_ORDER_STATUSES = /* @__PURE__ */ new Set([
82
- "pending",
83
- "signing",
84
- "pending_bridge",
85
- "submitting"
86
- ]);
87
- var isPendingOpenOrder = (order) => {
88
- const isLimitOrder = order.orderType === "limit" || order.limitPriceLabel != null;
89
- return isLimitOrder && PENDING_LIMIT_ORDER_STATUSES.has(order.status.trim().toLowerCase()) && !canCancelOpenOrder(order);
90
- };
91
- var OpenOrderRow = ({
92
- order,
93
- variant = "profile",
94
- href,
95
- onClick,
96
- onCancel,
97
- isCancelling = false,
98
- cancelLabel,
99
- cancelAriaLabel,
100
- limitPriceHeader,
101
- filledHeader,
102
- totalHeader,
103
- expirationHeader
104
- }) => {
105
- var _a, _b, _c, _d;
106
- const allLabels = useLabels();
107
- const labels = allLabels.userProfile.openOrders;
108
- const isEventVariant = variant === "event";
109
- const resolvedCancelLabel = cancelLabel != null ? cancelLabel : labels.cancel;
110
- const resolvedCancelAriaLabel = cancelAriaLabel != null ? cancelAriaLabel : labels.cancelOrderAria(order.id);
111
- const resolvedLimitPriceHeader = limitPriceHeader != null ? limitPriceHeader : labels.limitPriceHeader;
112
- const resolvedFilledHeader = filledHeader != null ? filledHeader : labels.filledHeader;
113
- const resolvedTotalHeader = totalHeader != null ? totalHeader : labels.totalHeader;
114
- const resolvedExpirationHeader = expirationHeader != null ? expirationHeader : labels.expirationHeader;
115
- const handleDivClick = () => {
116
- onClick == null ? void 0 : onClick(order);
117
- };
118
- const handleAnchorClick = (event) => {
119
- if (shouldUseNativeLinkNavigation(event)) return;
120
- if (!onClick) return;
121
- event.preventDefault();
122
- onClick(order);
123
- };
124
- const handleCancelClick = (event) => {
125
- event.preventDefault();
126
- event.stopPropagation();
127
- onCancel == null ? void 0 : onCancel(order);
128
- };
129
- const canCancel = canCancelOpenOrder(order);
130
- const isPending = isPendingOpenOrder(order);
131
- const sideLabel = order.side === "buy" ? labels.buy : order.side === "sell" ? labels.sell : void 0;
132
- const outcomePillLabel = sideLabel ? `${sideLabel} ${order.outcomeLabel}` : order.outcomeLabel;
133
- const currentPriceLabel = order.currentPriceLabel ? `${labels.nowPrefix} ${order.currentPriceLabel}` : void 0;
134
- const outcomePill = /* @__PURE__ */ jsx("span", { className: "agg-open-order-outcome inline-flex w-fit shrink-0 items-center justify-center rounded-full bg-agg-secondary-hover px-4 py-[6px]", children: /* @__PURE__ */ jsx("span", { className: "font-agg-sans text-agg-sm leading-agg-5 font-agg-normal text-agg-foreground whitespace-nowrap", children: outcomePillLabel }) });
135
- const sharesLabel = isEventVariant && order.sizeShares != null ? allLabels.trading.shares(order.sizeShares) : void 0;
136
- const mobileStats = [
137
- __spreadValues({
138
- label: resolvedLimitPriceHeader,
139
- value: (_a = order.limitPriceLabel) != null ? _a : "\u2014"
140
- }, currentPriceLabel ? { subValue: currentPriceLabel } : {}),
141
- { label: resolvedFilledHeader, value: order.filledLabel },
142
- { label: resolvedTotalHeader, value: order.valueLabel },
143
- { label: resolvedExpirationHeader, value: (_b = order.expirationLabel) != null ? _b : "\u2014" }
144
- ];
145
- const isInteractive = Boolean(href || onClick);
146
- const Wrapper = href ? "a" : "div";
147
- const wrapperProps = href ? {
148
- href,
149
- onClick: handleAnchorClick
150
- } : onClick ? {
151
- role: "button",
152
- tabIndex: 0,
153
- onClick: handleDivClick,
154
- onKeyDown: (event) => {
155
- if (event.target !== event.currentTarget) return;
156
- if (event.key !== "Enter" && event.key !== " ") return;
157
- event.preventDefault();
158
- handleDivClick();
159
- }
160
- } : {};
161
- return /* @__PURE__ */ jsx(
162
- Wrapper,
163
- __spreadProps(__spreadValues({
164
- "aria-label": order.title,
165
- className: cn(
166
- "agg-open-order-row relative block focus-visible:outline-none",
167
- isInteractive && "cursor-pointer",
168
- isInteractive && "before:absolute before:-top-2 before:-left-2 before:-bottom-2 before:-right-2 before:z-0",
169
- isInteractive && "before:rounded-agg-xl before:bg-agg-secondary-hover before:opacity-0 before:transition-all before:duration-300",
170
- isInteractive && "hover:before:opacity-100 focus-visible:before:opacity-100"
171
- )
172
- }, wrapperProps), {
173
- children: /* @__PURE__ */ jsxs("div", { className: "agg-open-order-row-content relative z-10 flex w-full flex-col gap-3 rounded-agg-xl px-3 py-2.5 text-left lg:flex-row lg:items-center lg:gap-6 lg:px-0 lg:py-0", children: [
174
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-3 lg:gap-4", children: [
175
- !isEventVariant ? /* @__PURE__ */ jsx("div", { className: "agg-open-order-image flex h-10 w-10 shrink-0 items-center justify-center lg:h-15 lg:w-15", children: /* @__PURE__ */ jsx(
176
- RemoteImage,
177
- {
178
- src: optimizedImageUrl(order.thumbnailSrc, 60),
179
- retinaSrc: retinaImageUrl(order.thumbnailSrc, 60),
180
- alt: "",
181
- className: "h-full w-full rounded-agg-sm object-cover"
182
- }
183
- ) }) : null,
184
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col justify-center gap-2", children: [
185
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-3", children: [
186
- /* @__PURE__ */ jsx("p", { className: "agg-open-order-market min-w-0 flex-1 overflow-hidden font-agg-sans text-agg-sm leading-agg-5 font-agg-bold text-agg-foreground [display:-webkit-box] [-webkit-line-clamp:2] [-webkit-box-orient:vertical] lg:text-agg-base lg:leading-agg-6 lg:whitespace-nowrap lg:text-ellipsis lg:[-webkit-line-clamp:1] lg:[display:block]", children: order.title }),
187
- isEventVariant ? /* @__PURE__ */ jsx("span", { className: "lg:hidden", children: outcomePill }) : null
188
- ] }),
189
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-2", children: [
190
- /* @__PURE__ */ jsx("span", { className: "hidden lg:inline-flex", children: outcomePill }),
191
- sharesLabel ? /* @__PURE__ */ jsxs("span", { className: "agg-open-order-shares flex min-w-0 items-center gap-1", children: [
192
- /* @__PURE__ */ jsx(VenueLogo, { venue: order.venue, size: "small", className: "size-4 shrink-0" }),
193
- /* @__PURE__ */ jsx("span", { className: "truncate whitespace-nowrap font-agg-sans text-agg-sm leading-agg-5 font-agg-normal text-agg-foreground", children: sharesLabel })
194
- ] }) : null
195
- ] })
196
- ] })
197
- ] }),
198
- /* @__PURE__ */ jsxs(
199
- "div",
200
- {
201
- className: cn(
202
- // Wraps in both variants: the values are `whitespace-nowrap`, so a
203
- // long expiration ("Good 'til canceled") beside a wide fill count
204
- // overflows the card — and takes the page's horizontal scroll with
205
- // it — on a narrow phone if the row is pinned to one line.
206
- "flex w-full flex-wrap items-center lg:hidden",
207
- isEventVariant ? "justify-between gap-x-3 gap-y-2" : "gap-x-4 gap-y-2"
208
- ),
209
- children: [
210
- !isEventVariant ? /* @__PURE__ */ jsx(Fragment, { children: outcomePill }) : null,
211
- mobileStats.map(({ label, value, subValue }) => /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [
212
- /* @__PURE__ */ jsxs(
213
- "div",
214
- {
215
- className: cn(
216
- "flex whitespace-nowrap",
217
- isEventVariant ? "flex-col gap-1.5" : "items-baseline gap-1.5"
218
- ),
219
- children: [
220
- /* @__PURE__ */ jsx(
221
- "span",
222
- {
223
- className: cn(
224
- "font-agg-sans text-agg-foreground",
225
- isEventVariant ? "text-agg-sm leading-agg-5 font-agg-bold" : "text-agg-lg leading-agg-7 font-agg-normal"
226
- ),
227
- children: value
228
- }
229
- ),
230
- /* @__PURE__ */ jsx("span", { className: "font-agg-sans text-[10px] leading-[14px] font-agg-bold uppercase text-agg-muted-foreground", children: label })
231
- ]
232
- }
233
- ),
234
- subValue ? /* @__PURE__ */ jsx("span", { className: "agg-open-order-current-price font-agg-sans text-agg-sm leading-agg-5 font-agg-normal whitespace-nowrap text-agg-foreground", children: subValue }) : null
235
- ] }, label))
236
- ]
237
- }
238
- ),
239
- /* @__PURE__ */ jsxs("div", { className: "agg-open-order-limit-price hidden w-[120px] shrink-0 flex-col justify-center gap-0.5 lg:flex", children: [
240
- /* @__PURE__ */ jsx("p", { className: "agg-type-body-strong text-agg-foreground", children: (_c = order.limitPriceLabel) != null ? _c : "\u2014" }),
241
- currentPriceLabel ? /* @__PURE__ */ jsx("p", { className: "agg-open-order-current-price font-agg-sans text-agg-sm leading-agg-5 font-agg-normal text-agg-foreground", children: currentPriceLabel }) : null
242
- ] }),
243
- /* @__PURE__ */ jsx("p", { className: "agg-open-order-filled hidden w-[120px] shrink-0 agg-type-body-strong text-agg-foreground lg:block", children: order.filledLabel }),
244
- /* @__PURE__ */ jsx("p", { className: "agg-open-order-value hidden w-[120px] shrink-0 agg-type-body-strong text-agg-foreground lg:block", children: order.valueLabel }),
245
- /* @__PURE__ */ jsx("p", { className: "agg-open-order-expiration hidden w-[140px] shrink-0 agg-type-label text-agg-foreground lg:block", children: (_d = order.expirationLabel) != null ? _d : "\u2014" }),
246
- /* @__PURE__ */ jsx(
247
- "div",
248
- {
249
- className: cn(
250
- "shrink-0 justify-end",
251
- canCancel || isPending ? "flex w-full lg:w-[80px]" : "hidden lg:flex lg:w-[80px]"
252
- ),
253
- children: canCancel ? /* @__PURE__ */ jsx(
254
- Button,
255
- {
256
- variant: "secondary",
257
- size: "small",
258
- isLoading: isCancelling,
259
- disabled: isCancelling,
260
- onClick: handleCancelClick,
261
- "aria-label": resolvedCancelAriaLabel,
262
- className: "w-full lg:w-auto !text-agg-error font-agg-bold",
263
- children: resolvedCancelLabel
264
- }
265
- ) : isPending ? /* @__PURE__ */ jsxs("div", { className: "flex w-full items-center justify-center gap-2 agg-type-label text-agg-foreground", children: [
266
- /* @__PURE__ */ jsx(LoadingIcon, { size: "small", ariaLabel: labels.pending, className: "text-agg-primary" }),
267
- /* @__PURE__ */ jsx("span", { children: labels.pending })
268
- ] }) : null
269
- }
270
- )
271
- ] })
272
- })
273
- );
274
- };
275
- OpenOrderRow.displayName = "OpenOrderRow";
276
-
277
- // src/shared/use-open-order-cancellation.ts
278
- import { useCancelManagedOrder, useLabels as useLabels2 } from "@agg-build/hooks";
279
- import { useCallback, useState } from "react";
280
- var useOpenOrderCancellation = ({
281
- onCancelOrder
282
- } = {}) => {
283
- const cancelOrderMutation = useCancelManagedOrder();
284
- const toastContext = useOptionalToast();
285
- const labels = useLabels2();
286
- const [cancellingOrderIds, setCancellingOrderIds] = useState({});
287
- const cancelOrder = useCallback(
288
- (order) => __async(null, null, function* () {
289
- if (onCancelOrder) {
290
- onCancelOrder(order);
291
- return;
292
- }
293
- setCancellingOrderIds((prev) => __spreadProps(__spreadValues({}, prev), { [order.id]: true }));
294
- try {
295
- const cancellationResult = yield cancelOrderMutation.mutateAsync(order.id);
296
- const isCancellationPending = cancellationResult.status === "cancel_pending";
297
- toastContext == null ? void 0 : toastContext.toast(
298
- isCancellationPending ? labels.notifications.order.cancelPendingMessage : labels.notifications.order.cancelledMessage,
299
- {
300
- title: isCancellationPending ? labels.notifications.order.cancelPendingTitle : labels.notifications.order.cancelledTitle,
301
- tone: "success"
302
- }
303
- );
304
- } catch (error) {
305
- const errorReason = error instanceof Error ? error.message : void 0;
306
- toastContext == null ? void 0 : toastContext.toast(labels.notifications.order.cancelFailedMessage(errorReason), {
307
- title: labels.notifications.order.cancelFailedTitle,
308
- tone: "error"
309
- });
310
- } finally {
311
- setCancellingOrderIds((prev) => {
312
- var _a;
313
- const _b = prev, { [_a = order.id]: _removed } = _b, rest = __objRest(_b, [__restKey(_a)]);
314
- return rest;
315
- });
316
- }
317
- }),
318
- [cancelOrderMutation, labels.notifications.order, onCancelOrder, toastContext]
319
- );
320
- return { cancellingOrderIds, cancelOrder };
321
- };
322
-
323
- // src/pages/event-market/use-event-open-orders.ts
324
- import { useExecutionOrdersForMarkets, useLabels as useLabels3, useVenueMarketMidpoints } from "@agg-build/hooks";
325
- import { useMemo } from "react";
326
-
327
- // src/shared/open-orders.ts
328
- import dayjs from "dayjs";
329
- var MICRO_UNITS_SCALE = 1e6;
330
- var twoDecimalNumberFormatter = new Intl.NumberFormat("en-US", {
331
- minimumFractionDigits: 2,
332
- maximumFractionDigits: 2
333
- });
334
- var twoDecimalUsdFormatter = new Intl.NumberFormat("en-US", {
335
- style: "currency",
336
- currency: "USD",
337
- minimumFractionDigits: 2,
338
- maximumFractionDigits: 2
339
- });
340
- var limitPriceCentsFormatter = new Intl.NumberFormat("en-US", {
341
- maximumFractionDigits: 1
342
- });
343
- var parseRawMicroValue = (value) => {
344
- if (!value) return null;
345
- if (value.startsWith("0x") || value.startsWith("0X")) {
346
- try {
347
- return Number(BigInt(value)) / MICRO_UNITS_SCALE;
348
- } catch (e) {
349
- return null;
350
- }
351
- }
352
- const parsed = Number(value);
353
- if (!Number.isFinite(parsed)) return null;
354
- return value.includes(".") ? parsed : parsed / MICRO_UNITS_SCALE;
355
- };
356
- var formatScaledNumberTwoDecimals = (value) => {
357
- const parsed = parseRawMicroValue(value);
358
- if (parsed == null) return "0.00";
359
- return twoDecimalNumberFormatter.format(parsed);
360
- };
361
- var formatFilledUsdTwoDecimals = (filledAmountRaw) => {
362
- var _a;
363
- return twoDecimalUsdFormatter.format((_a = parseRawMicroValue(filledAmountRaw)) != null ? _a : 0);
364
- };
365
- var formatPriceCentsLabel = (value) => `${limitPriceCentsFormatter.format(value * 100)}\xA2`;
366
- var formatLimitPriceLabel = (value) => {
367
- const parsed = parseRawMicroValue(value);
368
- if (parsed == null) return void 0;
369
- return formatPriceCentsLabel(parsed);
370
- };
371
- var formatOpenOrderExpirationLabel = ({
372
- timeInForce,
373
- expiresAt,
374
- goodTilCanceledLabel,
375
- expiredLabel
376
- }) => {
377
- if (timeInForce === "GTC") return goodTilCanceledLabel;
378
- if (!expiresAt) return void 0;
379
- const expiration = dayjs(expiresAt);
380
- if (!expiration.isValid()) return void 0;
381
- const now = dayjs();
382
- const remainingMinutes = expiration.diff(now, "minute", true);
383
- if (remainingMinutes <= 0) return expiredLabel;
384
- if (remainingMinutes < 60) return `${Math.ceil(remainingMinutes)}m`;
385
- const remainingHours = expiration.diff(now, "hour", true);
386
- if (remainingHours < 24) return `${Math.ceil(remainingHours)}h`;
387
- return `${Math.ceil(expiration.diff(now, "day", true))}d`;
388
- };
389
- var OPEN_ORDER_STATUSES = /* @__PURE__ */ new Set([
390
- "pending",
391
- "signing",
392
- "pending_bridge",
393
- "submitting",
394
- "submitted",
395
- "open",
396
- "partially_filled_open",
397
- "cancel_pending"
398
- ]);
399
- var OPEN_ORDER_QUERY_STATUSES = [
400
- "pending",
401
- "signing",
402
- "pending_bridge",
403
- "submitting",
404
- "submitted",
405
- "open",
406
- "partially_filled_open",
407
- "cancel_pending"
408
- ];
409
- var isOpenOrderStatus = (status) => OPEN_ORDER_STATUSES.has(status.toLowerCase());
410
- var isExecutionLimitOrder = (order) => order.orderType === "limit" || order.orderType == null && order.limitSizeRaw != null;
411
- var selectOpenLimitOrders = (orderLists, options = {}) => {
412
- const { venueEventId, venueMarketIds } = options;
413
- const venueMarketIdSet = venueMarketIds ? new Set(venueMarketIds) : void 0;
414
- const ordersById = /* @__PURE__ */ new Map();
415
- for (const orders of orderLists) {
416
- for (const order of orders) {
417
- ordersById.set(order.id, order);
418
- }
419
- }
420
- return Array.from(ordersById.values()).filter((order) => isOpenOrderStatus(order.status) && isExecutionLimitOrder(order)).filter((order) => {
421
- var _a;
422
- return !venueEventId || ((_a = order.venueMarket) == null ? void 0 : _a.venueEventId) === venueEventId;
423
- }).filter((order) => {
424
- var _a;
425
- if (!venueMarketIdSet) return true;
426
- const venueMarketId = (_a = order.venueMarket) == null ? void 0 : _a.id;
427
- return !!venueMarketId && venueMarketIdSet.has(venueMarketId);
428
- }).sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
429
- };
430
- var normalizeOutcomeMatchLabel = (value) => typeof value === "string" ? value.trim().toLowerCase() : "";
431
- var buildOpenOrderCurrentPriceLabels = (orders, midpointRows) => {
432
- var _a, _b, _c, _d;
433
- const midpointRowsByVenueMarketId = new Map(midpointRows.map((row) => [row.venueMarketId, row]));
434
- const labelsByOrderId = /* @__PURE__ */ new Map();
435
- for (const order of orders) {
436
- const venueMarketId = (_a = order.venueMarket) == null ? void 0 : _a.id;
437
- if (!venueMarketId) continue;
438
- const midpointRow = midpointRowsByVenueMarketId.get(venueMarketId);
439
- if (!midpointRow) continue;
440
- const orderOutcomeLabels = [
441
- normalizeOutcomeMatchLabel((_b = order.venueMarketOutcome) == null ? void 0 : _b.label),
442
- normalizeOutcomeMatchLabel((_c = order.venueMarketOutcome) == null ? void 0 : _c.title)
443
- ].filter(Boolean);
444
- if (orderOutcomeLabels.length === 0) continue;
445
- const outcomeMidpoint = (_d = midpointRow.outcomes) == null ? void 0 : _d.find(
446
- (outcome) => orderOutcomeLabels.includes(normalizeOutcomeMatchLabel(outcome.label))
447
- );
448
- if ((outcomeMidpoint == null ? void 0 : outcomeMidpoint.midpoint) == null) continue;
449
- labelsByOrderId.set(order.id, formatPriceCentsLabel(outcomeMidpoint.midpoint));
450
- }
451
- return labelsByOrderId;
452
- };
453
- var OPEN_ORDER_FALLBACK_THUMBNAIL_SRC = 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60"><rect width="100%" height="100%" fill="%23f4f4f7"/></svg>';
454
- var mapExecutionOrderToOpenOrder = (order, {
455
- goodTilCanceledLabel,
456
- expiredLabel,
457
- currentPriceLabel,
458
- fallbackThumbnailSrc = OPEN_ORDER_FALLBACK_THUMBNAIL_SRC
459
- }) => {
460
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
461
- const isLimitOrder = isExecutionLimitOrder(order);
462
- const filledRaw = isLimitOrder ? order.filledSizeRaw : order.filledAmountRaw;
463
- const totalRaw = isLimitOrder ? order.limitSizeRaw : order.amountRaw;
464
- const totalCostRaw = isLimitOrder ? (_a = order.reservedCostRaw) != null ? _a : order.amountRaw : order.amountRaw;
465
- const limitPriceLabel = formatLimitPriceLabel(order.limitPriceRaw);
466
- const expirationLabel = formatOpenOrderExpirationLabel({
467
- timeInForce: order.timeInForce,
468
- expiresAt: order.expiresAt,
469
- goodTilCanceledLabel,
470
- expiredLabel
471
- });
472
- const sizeShares = parseRawMicroValue(totalRaw);
473
- return __spreadProps(__spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues(__spreadProps(__spreadValues({
474
- id: order.id,
475
- eventId: (_c = (_b = order.venueMarket) == null ? void 0 : _b.venueEventId) != null ? _c : void 0,
476
- marketId: (_e = (_d = order.venueMarket) == null ? void 0 : _d.id) != null ? _e : void 0,
477
- thumbnailSrc: (_g = (_f = order.venueMarket) == null ? void 0 : _f.image) != null ? _g : fallbackThumbnailSrc,
478
- title: ((_h = order.venueMarket) == null ? void 0 : _h.question) || "Market",
479
- outcomeLabel: ((_i = order.venueMarketOutcome) == null ? void 0 : _i.title) || ((_j = order.venueMarketOutcome) == null ? void 0 : _j.label) || "Outcome"
480
- }, order.side === "sell" || order.side === "buy" ? { side: order.side } : {}), {
481
- venue: order.venue
482
- }), limitPriceLabel ? { limitPriceLabel } : {}), currentPriceLabel ? { currentPriceLabel } : {}), {
483
- filledLabel: `${formatScaledNumberTwoDecimals(filledRaw != null ? filledRaw : "0")}/${formatScaledNumberTwoDecimals(totalRaw)}`,
484
- valueLabel: formatFilledUsdTwoDecimals(totalCostRaw)
485
- }), expirationLabel ? { expirationLabel } : {}), sizeShares != null ? { sizeShares } : {}), {
486
- status: order.status,
487
- orderType: isLimitOrder ? "limit" : "market",
488
- dagRunId: (_k = order.dagRunId) != null ? _k : null
489
- });
490
- };
491
-
492
- // src/pages/event-market/use-event-open-orders.ts
493
- var useEventOpenOrders = ({
494
- venueMarketIds: pageVenueMarketIds,
495
- enabled = true,
496
- executionMode
497
- }) => {
498
- const labels = useLabels3();
499
- const isEnabled = enabled && pageVenueMarketIds.length > 0;
500
- const ordersQuery = useExecutionOrdersForMarkets(__spreadProps(__spreadValues({
501
- venueMarketIds: pageVenueMarketIds,
502
- orderType: "limit"
503
- }, executionMode === "paper" ? { mode: "paper" } : {}), {
504
- enabled: isEnabled
505
- }));
506
- const pageVenueMarketIdKey = pageVenueMarketIds.join("\0");
507
- const orderRows = useMemo(
508
- () => selectOpenLimitOrders([ordersQuery.orders], {
509
- // Already scoped by the API; kept so an API deploy that predates the
510
- // `venueMarketIds` filter (and returns everything) can't leak other
511
- // events' orders onto this page.
512
- venueMarketIds: pageVenueMarketIdKey ? pageVenueMarketIdKey.split("\0") : []
513
- }),
514
- [ordersQuery.orders, pageVenueMarketIdKey]
515
- );
516
- const venueMarketIds = useMemo(
517
- () => orderRows.map((order) => {
518
- var _a;
519
- return (_a = order.venueMarket) == null ? void 0 : _a.id;
520
- }).filter((venueMarketId) => Boolean(venueMarketId)),
521
- [orderRows]
522
- );
523
- const midpointsQuery = useVenueMarketMidpoints({
524
- venueMarketIds,
525
- enabled: isEnabled && venueMarketIds.length > 0
526
- });
527
- const midpointRows = midpointsQuery.midpointRows;
528
- const currentPriceLabels = useMemo(
529
- () => buildOpenOrderCurrentPriceLabels(orderRows, midpointRows),
530
- [midpointRows, orderRows]
531
- );
532
- const orders = useMemo(
533
- () => orderRows.map(
534
- (order) => mapExecutionOrderToOpenOrder(order, __spreadValues({
535
- goodTilCanceledLabel: labels.userProfile.openOrders.goodTilCanceled,
536
- expiredLabel: labels.userProfile.openOrders.expired
537
- }, currentPriceLabels.has(order.id) ? { currentPriceLabel: currentPriceLabels.get(order.id) } : {}))
538
- ),
539
- [currentPriceLabels, labels, orderRows]
540
- );
541
- return { orders, isLoading: ordersQuery.isLoading, hasError: !!ordersQuery.error };
542
- };
543
-
544
- // src/pages/event-market/event-open-orders.tsx
545
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
546
- var EventOpenOrdersCard = ({
547
- orders,
548
- hasError = false,
549
- onCancelOrder,
550
- cancellingOrderIds,
551
- className
552
- }) => {
553
- const allLabels = useLabels4();
554
- const labels = allLabels.eventMarketPage.openOrders;
555
- const errorLabels = allLabels.userProfile.openOrders;
556
- if (orders.length === 0 && hasError) {
557
- return /* @__PURE__ */ jsxs2(
558
- "section",
559
- {
560
- className: cn(
561
- "agg-event-open-orders agg-event-open-orders-error flex w-full flex-col gap-1 rounded-agg-xl border border-agg-separator bg-agg-secondary p-4 lg:p-5",
562
- className
563
- ),
564
- "aria-label": labels.title,
565
- role: "status",
566
- children: [
567
- /* @__PURE__ */ jsx2("p", { className: "font-agg-sans text-agg-sm leading-agg-5 font-agg-bold text-agg-foreground", children: errorLabels.errorTitle }),
568
- /* @__PURE__ */ jsx2("p", { className: "font-agg-sans text-agg-sm leading-agg-5 font-agg-normal text-agg-muted-foreground", children: errorLabels.errorDescription })
569
- ]
570
- }
571
- );
572
- }
573
- if (orders.length === 0) return null;
574
- const columnHeaderClassName = "font-agg-sans text-agg-xs leading-agg-4 font-agg-bold uppercase text-agg-muted-foreground";
575
- return /* @__PURE__ */ jsxs2(
576
- "section",
577
- {
578
- className: cn(
579
- "agg-event-open-orders flex w-full flex-col gap-4 rounded-agg-xl border border-agg-separator bg-agg-secondary p-4 lg:gap-4 lg:p-5",
580
- className
581
- ),
582
- "aria-label": labels.title,
583
- children: [
584
- /* @__PURE__ */ jsxs2("div", { className: "flex w-full items-center gap-6", children: [
585
- /* @__PURE__ */ jsx2("p", { className: cn("agg-event-open-orders-title min-w-0 flex-1", columnHeaderClassName), children: labels.title }),
586
- /* @__PURE__ */ jsx2("p", { className: cn("hidden w-[120px] shrink-0 lg:block", columnHeaderClassName), children: labels.limitPriceHeader }),
587
- /* @__PURE__ */ jsx2("p", { className: cn("hidden w-[120px] shrink-0 lg:block", columnHeaderClassName), children: labels.filledHeader }),
588
- /* @__PURE__ */ jsx2("p", { className: cn("hidden w-[120px] shrink-0 lg:block", columnHeaderClassName), children: labels.totalHeader }),
589
- /* @__PURE__ */ jsx2("p", { className: cn("hidden w-[140px] shrink-0 lg:block", columnHeaderClassName), children: labels.expirationHeader }),
590
- /* @__PURE__ */ jsx2("span", { className: "hidden w-[80px] shrink-0 lg:block", "aria-hidden": true })
591
- ] }),
592
- /* @__PURE__ */ jsx2("div", { className: "flex w-full flex-col gap-4", children: orders.map((order) => {
593
- var _a;
594
- return /* @__PURE__ */ jsx2(
595
- OpenOrderRow,
596
- __spreadProps(__spreadValues({
597
- order,
598
- variant: "event"
599
- }, onCancelOrder ? { onCancel: onCancelOrder } : {}), {
600
- isCancelling: (_a = cancellingOrderIds == null ? void 0 : cancellingOrderIds[order.id]) != null ? _a : false,
601
- limitPriceHeader: labels.limitShort,
602
- filledHeader: labels.filledShort,
603
- totalHeader: labels.totalShort,
604
- expirationHeader: labels.expirationShort
605
- }),
606
- order.id
607
- );
608
- }) })
609
- ]
610
- }
611
- );
612
- };
613
- EventOpenOrdersCard.displayName = "EventOpenOrdersCard";
614
- var EventOpenOrders = ({
615
- venueMarketIds,
616
- executionMode,
617
- className
618
- }) => {
619
- const { isAuthenticated } = useAggAuthState();
620
- const {
621
- features: { showLimitOrders }
622
- } = useSdkUiConfig();
623
- const isPaperMode = executionMode === "paper";
624
- const isEnabled = isAuthenticated && showLimitOrders && !isPaperMode;
625
- const { orders, hasError } = useEventOpenOrders(__spreadValues({
626
- venueMarketIds,
627
- enabled: isEnabled
628
- }, executionMode ? { executionMode } : {}));
629
- const { cancellingOrderIds, cancelOrder } = useOpenOrderCancellation();
630
- const handleCancelOrder = useCallback2(
631
- (order) => {
632
- void cancelOrder(order);
633
- },
634
- [cancelOrder]
635
- );
636
- if (!isEnabled) return null;
637
- return /* @__PURE__ */ jsx2(
638
- EventOpenOrdersCard,
639
- __spreadValues({
640
- orders,
641
- hasError,
642
- onCancelOrder: handleCancelOrder,
643
- cancellingOrderIds
644
- }, className ? { className } : {})
645
- );
646
- };
647
- EventOpenOrders.displayName = "EventOpenOrders";
648
-
649
- // src/pages/event-market/event-market.utils.ts
650
- var EVENT_MARKET_PAGE_STICKY_HEADER_OFFSET_PX = 48;
651
- var EVENT_MARKET_PAGE_STICKY_SPACING_PX = 32;
652
- var EVENT_MARKET_PAGE_STICKY_TOP_PX = EVENT_MARKET_PAGE_STICKY_HEADER_OFFSET_PX + EVENT_MARKET_PAGE_STICKY_SPACING_PX;
653
- var EVENT_MARKET_PAGE_STICKY_TOP_CSS_VAR = "--agg-event-market-sidebar-top";
654
- var EVENT_MARKET_PAGE_STICKY_SPACING_CSS_VAR = "--agg-event-market-sidebar-spacing";
655
- var toCssLength = (value, fallback) => {
656
- if (typeof value === "number") {
657
- return `${value}px`;
658
- }
659
- return value != null ? value : `${fallback}px`;
660
- };
661
- var deriveSpacingFromTop = (top) => {
662
- if (typeof top !== "number") {
663
- return void 0;
664
- }
665
- return Math.max(top - EVENT_MARKET_PAGE_STICKY_HEADER_OFFSET_PX, 0);
666
- };
667
- var resolveEventMarketPageStickyState = ({
668
- stickyOrderPanel
669
- }) => {
670
- var _a, _b;
671
- const isEnabled = (_a = stickyOrderPanel == null ? void 0 : stickyOrderPanel.enabled) != null ? _a : Boolean(stickyOrderPanel);
672
- if (!isEnabled) {
673
- return {
674
- contentClassName: cn(),
675
- sidebarClassName: cn("pt-4 sm:pt-6 md:pt-8 pb-10"),
676
- placeOrder: cn("mb-10"),
677
- mainClassName: cn("pt-4 sm:pt-6 md:pt-8"),
678
- style: {}
679
- };
680
- }
681
- return {
682
- contentClassName: cn("lg:items-stretch!"),
683
- sidebarClassName: cn(
684
- "pt-4 sm:pt-6 md:pt-8 pb-10",
685
- "lg:self-start lg:sticky lg:top-[var(--agg-event-market-sidebar-top)] lg:max-h-[calc(100vh-var(--agg-event-market-sidebar-top))] lg:overflow-y-auto lg:overscroll-contain",
686
- stickyOrderPanel == null ? void 0 : stickyOrderPanel.className
687
- ),
688
- placeOrder: cn("mb-10"),
689
- mainClassName: cn("pt-4 sm:pt-6 md:pt-8"),
690
- style: {
691
- [EVENT_MARKET_PAGE_STICKY_TOP_CSS_VAR]: toCssLength(
692
- stickyOrderPanel == null ? void 0 : stickyOrderPanel.top,
693
- EVENT_MARKET_PAGE_STICKY_TOP_PX
694
- ),
695
- [EVENT_MARKET_PAGE_STICKY_SPACING_CSS_VAR]: toCssLength(
696
- (_b = stickyOrderPanel == null ? void 0 : stickyOrderPanel.spacing) != null ? _b : deriveSpacingFromTop(stickyOrderPanel == null ? void 0 : stickyOrderPanel.top),
697
- EVENT_MARKET_PAGE_STICKY_SPACING_PX
698
- )
699
- }
700
- };
701
- };
702
-
703
- // src/pages/event-market/event-market.shared.tsx
704
- import { useLabels as useLabels5 } from "@agg-build/hooks";
705
- import * as Dialog from "@radix-ui/react-dialog";
706
- import { useEffect, useState as useState2 } from "react";
707
- import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
708
- var MOBILE_EVENT_MARKET_MEDIA_QUERY = "(max-width: 1023px)";
709
- var SPORTS_EVENT_MARKET_MEDIA_QUERY = "(max-width: 1279px)";
710
- var getIsMobileEventMarketViewport = (mediaQuery = MOBILE_EVENT_MARKET_MEDIA_QUERY) => {
711
- if (typeof window === "undefined") return false;
712
- if (typeof window.matchMedia !== "function") return false;
713
- return window.matchMedia(mediaQuery).matches;
714
- };
715
- var useIsMobileEventMarketViewport = (mediaQuery = MOBILE_EVENT_MARKET_MEDIA_QUERY) => {
716
- const [isMobileViewport, setIsMobileViewport] = useState2(
717
- () => getIsMobileEventMarketViewport(mediaQuery)
718
- );
719
- useEffect(() => {
720
- if (typeof window === "undefined") return;
721
- if (typeof window.matchMedia !== "function") return;
722
- const mediaQueryList = window.matchMedia(mediaQuery);
723
- const handleChange = () => {
724
- setIsMobileViewport(mediaQueryList.matches);
725
- };
726
- handleChange();
727
- mediaQueryList.addEventListener("change", handleChange);
728
- return () => {
729
- mediaQueryList.removeEventListener("change", handleChange);
730
- };
731
- }, [mediaQuery]);
732
- return isMobileViewport;
733
- };
734
- var resolveDesktopTradePlaceOrderClassNames = (classNames) => {
735
- const resolvedClassNames = {
736
- body: classNames == null ? void 0 : classNames.tradeBody,
737
- content: classNames == null ? void 0 : classNames.tradeContent,
738
- footer: classNames == null ? void 0 : classNames.tradeFooter,
739
- header: classNames == null ? void 0 : classNames.tradeHeader
740
- };
741
- if (!Object.values(resolvedClassNames).some(Boolean)) {
742
- return void 0;
743
- }
744
- return resolvedClassNames;
745
- };
746
- var resolveMobileTradePlaceOrderClassNames = (classNames) => {
747
- return {
748
- root: "rounded-t-agg-2xl rounded-b-none md:rounded-agg-2xl md:rounded-b-agg-2xl",
749
- body: cn("flex h-full min-h-0 flex-col", classNames == null ? void 0 : classNames.tradeBody, classNames == null ? void 0 : classNames.mobileTradeBody),
750
- content: cn(
751
- "min-h-0 flex-1 overflow-y-auto overflow-x-hidden overscroll-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
752
- classNames == null ? void 0 : classNames.tradeContent,
753
- classNames == null ? void 0 : classNames.mobileTradeContent
754
- ),
755
- footer: cn(classNames == null ? void 0 : classNames.tradeFooter, classNames == null ? void 0 : classNames.mobileTradeFooter),
756
- header: cn(
757
- "sticky top-0 z-10 bg-agg-secondary",
758
- classNames == null ? void 0 : classNames.tradeHeader,
759
- classNames == null ? void 0 : classNames.mobileTradeHeader
760
- )
761
- };
762
- };
763
- var EventMarketPageMobileTrade = ({
764
- classNames,
765
- eventTradingState,
766
- executionMode,
767
- showPlaceOrder = true,
768
- isOpen,
769
- onOpenChange,
770
- midpointsResult,
771
- onBeforePrimaryAction,
772
- sharedKyc
773
- }) => {
774
- const labels = useLabels5();
775
- if (!showPlaceOrder) return null;
776
- const handleOpenChange = (nextOpen) => {
777
- onOpenChange(nextOpen);
778
- };
779
- const handleClose = () => {
780
- onOpenChange(false);
781
- };
782
- return /* @__PURE__ */ jsx3(Fragment2, { children: /* @__PURE__ */ jsx3(Modal, { open: isOpen, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxs3(
783
- Modal.Container,
784
- {
785
- classNames: {
786
- content: "items-end p-0 sm:items-center sm:p-4",
787
- container: cn(
788
- "agg-mobile-trade-modal",
789
- "w-full border-0 bg-transparent shadow-none",
790
- classNames == null ? void 0 : classNames.mobileTradeModal
791
- )
792
- },
793
- children: [
794
- /* @__PURE__ */ jsx3(Dialog.Title, { className: "sr-only", children: labels.trading.confirmOrder }),
795
- /* @__PURE__ */ jsx3(Dialog.Description, { className: "sr-only", children: labels.trading.disclaimer }),
796
- /* @__PURE__ */ jsx3("div", { className: "agg-mobile-trade-handle relative flex w-full flex-col items-center sm:hidden", children: /* @__PURE__ */ jsx3(
797
- "button",
798
- {
799
- type: "button",
800
- className: "absolute right-3 top-4 z-100 flex cursor-pointer items-center justify-center rounded-full p-1 text-agg-muted-foreground hover:text-agg-foreground",
801
- "aria-label": labels.common.close,
802
- onClick: handleClose,
803
- children: /* @__PURE__ */ jsx3(CloseIcon, { className: "h-5 w-5" })
804
- }
805
- ) }),
806
- /* @__PURE__ */ jsx3(
807
- PlaceOrder,
808
- {
809
- eventTradingState,
810
- executionMode,
811
- isQuotePanelActive: isOpen,
812
- midpointsResult,
813
- onBeforePrimaryAction,
814
- sharedKyc,
815
- className: cn(
816
- "agg-mobile-trade-panel w-full overflow-hidden rounded-t-agg-2xl sm:rounded-agg-xl",
817
- classNames == null ? void 0 : classNames.mobileTrade
818
- ),
819
- classNames: resolveMobileTradePlaceOrderClassNames(classNames),
820
- onClose: handleClose
821
- }
822
- )
823
- ]
824
- }
825
- ) }) });
826
- };
827
- var EventMarketPageUnavailableState = ({
828
- ariaLabel: _ariaLabel
829
- }) => {
830
- const labels = useLabels5();
831
- return /* @__PURE__ */ jsx3(
832
- StateMessage,
833
- {
834
- title: labels.eventMarketPage.unavailableTitle,
835
- description: labels.eventMarketPage.unavailableDescription,
836
- icon: /* @__PURE__ */ jsx3(Icon, { name: "quotes-warning", className: "h-12 w-12" }),
837
- classNames: {
838
- root: "min-h-[calc(100vh-5rem)]!"
839
- }
840
- }
841
- );
842
- };
843
- var EventMarketPageNotFoundState = ({
844
- ariaLabel: _ariaLabel
845
- }) => {
846
- const labels = useLabels5();
847
- return /* @__PURE__ */ jsx3(
848
- StateMessage,
849
- {
850
- title: labels.eventItemDetails.notFoundTitle,
851
- description: labels.eventItemDetails.notFoundDescription,
852
- icon: /* @__PURE__ */ jsx3(SearchEmptyIcon, {}),
853
- classNames: { root: "min-h-[320px] md:min-h-[360px]" }
854
- }
855
- );
856
- };
857
- var EventMarketPageLoadingState = ({
858
- classNames,
859
- stickyOrderPanel
860
- }) => {
861
- const stickyOrderPanelState = resolveEventMarketPageStickyState({
862
- stickyOrderPanel
863
- });
864
- return /* @__PURE__ */ jsx3(
865
- "section",
866
- {
867
- className: cn(
868
- "agg-event-market-page",
869
- "w-full mx-auto max-w-[1440px] px-6 lg:px-10 pb-10",
870
- classNames == null ? void 0 : classNames.root
871
- ),
872
- children: /* @__PURE__ */ jsxs3(
873
- "div",
874
- {
875
- className: cn(
876
- "agg-page-content",
877
- "flex w-full flex-col gap-6 lg:flex-row lg:items-start lg:gap-8",
878
- stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.contentClassName,
879
- classNames == null ? void 0 : classNames.content
880
- ),
881
- style: stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.style,
882
- children: [
883
- /* @__PURE__ */ jsxs3(
884
- "div",
885
- {
886
- className: cn(
887
- "agg-page-main flex min-w-0 flex-1 flex-col gap-6 mb-10",
888
- stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.mainClassName,
889
- classNames == null ? void 0 : classNames.main
890
- ),
891
- children: [
892
- /* @__PURE__ */ jsx3(
893
- EventListItemDetails,
894
- {
895
- isLoading: true,
896
- classNames: {
897
- root: cn("agg-event-hero", classNames == null ? void 0 : classNames.hero)
898
- }
899
- }
900
- ),
901
- /* @__PURE__ */ jsxs3("div", { className: cn("agg-market-list flex flex-col gap-3", classNames == null ? void 0 : classNames.markets), children: [
902
- /* @__PURE__ */ jsx3(MarketDetails, { isLoading: true, isOpened: true, classNames: { root: "w-full" } }),
903
- /* @__PURE__ */ jsx3(MarketDetails, { isLoading: true, isOpened: false, classNames: { root: "w-full" } }),
904
- /* @__PURE__ */ jsx3(MarketDetails, { isLoading: true, isOpened: false, classNames: { root: "w-full" } })
905
- ] }),
906
- /* @__PURE__ */ jsx3(
907
- Skeleton,
908
- {
909
- view: skeletonViews.settlement,
910
- className: cn("agg-settlement-list-item", classNames == null ? void 0 : classNames.settlement)
911
- }
912
- )
913
- ]
914
- }
915
- ),
916
- /* @__PURE__ */ jsx3(
917
- "aside",
918
- {
919
- className: cn(
920
- "agg-sidebar",
921
- "hidden w-full shrink-0 lg:block lg:w-[342px] lg:shrink-0",
922
- stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.sidebarClassName,
923
- classNames == null ? void 0 : classNames.sidebar
924
- ),
925
- children: /* @__PURE__ */ jsx3(
926
- PlaceOrder,
927
- {
928
- isLoading: true,
929
- className: cn(stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.placeOrder, classNames == null ? void 0 : classNames.trade),
930
- classNames: resolveDesktopTradePlaceOrderClassNames(classNames)
931
- }
932
- )
933
- }
934
- )
935
- ]
936
- }
937
- )
938
- }
939
- );
940
- };
941
-
942
- // src/pages/event-market/sports-event-market-page.tsx
943
- import {
944
- resolveEventTradingState as resolveEventTradingState2,
945
- TradeSide,
946
- useEventTradingContext as useEventTradingContext3,
947
- useMidpoints,
948
- useResolvedExecutionMode,
949
- useSdkUiConfig as useSdkUiConfig3,
950
- useSportsLive
951
- } from "@agg-build/hooks";
952
- import { useCallback as useCallback4, useEffect as useEffect5, useMemo as useMemo4, useRef as useRef4, useState as useState6 } from "react";
953
-
954
- // src/pages/event-market/sports-markets.tsx
955
- import {
956
- MarketStatus as MarketStatus2,
957
- resolveMarketTradingState as resolveMarketTradingState2,
958
- useEventTradingContext as useEventTradingContext2,
959
- useLabels as useLabels7,
960
- useVenueMarkets
961
- } from "@agg-build/hooks";
962
- import { useEffect as useEffect4, useMemo as useMemo3, useRef as useRef3, useState as useState5 } from "react";
963
-
964
- // src/pages/event-market/sports-event-market.utils.ts
965
- var SPORTS_MARKET_TYPE_KEYS = [
966
- "to_advance",
967
- "moneyline",
968
- "spread",
969
- "total",
970
- "prop",
971
- "completion",
972
- "other"
973
- ];
974
- var SPORTS_PERIOD_KEYS = [
975
- "full",
976
- "1h",
977
- "2h",
978
- "q1",
979
- "q2",
980
- "q3",
981
- "q4",
982
- "ot",
983
- "first_inning",
984
- "second_inning",
985
- "third_inning",
986
- "first_5_innings",
987
- "other"
988
- ];
989
- var SPORTS_PERIOD_GRAMMAR_PATTERN = /^(?:(set|map|game|period|inning)_(\d{1,2})|first_(\d{1,2})_innings)$/;
990
- var SPORTS_MARKET_CATEGORY_KEYS = [
991
- "game_lines",
992
- "exact_score",
993
- "corners",
994
- "goals",
995
- "assists",
996
- "shots",
997
- "other"
998
- ];
999
- var SPORTS_MARKET_GROUP_KEYS = [
1000
- "game_lines",
1001
- "spreads",
1002
- "totals",
1003
- "period_lines",
1004
- "exact_score",
1005
- "team_props",
1006
- "player_props",
1007
- "specials",
1008
- "completion",
1009
- "other"
1010
- ];
1011
- var SPORTS_PERIOD_KEY_SET = new Set(SPORTS_PERIOD_KEYS);
1012
- var SPORTS_MARKET_TYPE_KEY_SET = new Set(SPORTS_MARKET_TYPE_KEYS);
1013
- var SPORTS_MARKET_CATEGORY_KEY_SET = new Set(SPORTS_MARKET_CATEGORY_KEYS);
1014
- var SPORTS_MARKET_GROUP_KEY_SET = new Set(SPORTS_MARKET_GROUP_KEYS);
1015
- var SPORTS_LEGACY_PROP_CATEGORY_KEY_SET = /* @__PURE__ */ new Set([
1016
- "corners",
1017
- "goals",
1018
- "assists",
1019
- "shots"
1020
- ]);
1021
- var SPORTS_GAME_LINE_GROUPS = [
1022
- "game_lines",
1023
- "spreads",
1024
- "totals",
1025
- "team_props",
1026
- "specials",
1027
- "completion"
1028
- ];
1029
- var SPORTS_GENERIC_STAT = "player_props";
1030
- var ESPORTS_CATEGORY_TOKENS = /* @__PURE__ */ new Set([
1031
- "esports",
1032
- "video games",
1033
- "video game",
1034
- "computer games",
1035
- "computer game",
1036
- "gaming"
1037
- ]);
1038
- var ESPORTS_TITLE_PATTERN = /\b(?:esports?|valorant|counter-strike|cs2|league of legends|lol|dota|rocket league|overwatch|rainbow six|starcraft|call of duty)\b/i;
1039
- var SERIES_SCOPE_PATTERN = /\b(?:bo[1-9]|best of \d+|map \d+|game \d+)\b/i;
1040
- var SPORTS_PERIOD_ORDER = [
1041
- "full",
1042
- "1h",
1043
- "2h",
1044
- "q1",
1045
- "q2",
1046
- "q3",
1047
- "q4",
1048
- "ot",
1049
- "first_inning",
1050
- "second_inning",
1051
- "third_inning",
1052
- "other"
1053
- ];
1054
- var FIRST_N_INNINGS_PATTERN = /^first_(\d{1,2})_innings$/;
1055
- var SPORTS_MARKET_TYPE_ORDER = [
1056
- "to_advance",
1057
- "moneyline",
1058
- "spread",
1059
- "total",
1060
- "prop",
1061
- "completion",
1062
- "other"
1063
- ];
1064
- var YES_NO_LABELS = /* @__PURE__ */ new Set(["yes", "no"]);
1065
- var LINE_MARKET_TYPES = /* @__PURE__ */ new Set(["spread", "total"]);
1066
- var PLAYER_PROP_COUNT_PATTERN = /\+\s|\bo\/u\b|\bover\/under\b/i;
1067
- var REG_TIME_TITLE_PATTERN = /^reg(?:ular)?\s*time\s*:/i;
1068
- var toTrimmedString = (value) => {
1069
- return typeof value === "string" ? value.trim() : "";
1070
- };
1071
- var resolveSportsMarketAggKey = (market) => {
1072
- const typedMarket = market;
1073
- return toTrimmedString(typedMarket.aggKey);
1074
- };
1075
- var sanitizeFamilyValue = (value) => {
1076
- return value.toLowerCase().replace(/[-+]?\d+(?:\.\d+)?/g, "").replace(/[¢$]/g, "").replace(/\s+/g, " ").replace(/[|:()[\]{}]/g, "").trim();
1077
- };
1078
- var stripLineValueFromQuestion = (question) => {
1079
- const strippedQuestion = sanitizeFamilyValue(question);
1080
- return strippedQuestion ? question.replace(/\(\s*[+-]?\d+(?:\.\d+)?\s*\)\s*$/g, "").replace(/\s+[+-]?\d+(?:\.\d+)?\s*$/g, "").replace(/\s+/g, " ").trim() : question.trim();
1081
- };
1082
- var SPORTS_PERIOD_FAMILY_ORDER = ["period", "inning", "set", "map", "game"];
1083
- var getSportsPeriodOrderIndex = (period) => {
1084
- var _a, _b;
1085
- const inningsMatch = FIRST_N_INNINGS_PATTERN.exec(period);
1086
- if (inningsMatch) {
1087
- return SPORTS_PERIOD_ORDER.indexOf("third_inning") + 1 + Number(inningsMatch[1]) / 100;
1088
- }
1089
- const periodIndex = SPORTS_PERIOD_ORDER.indexOf(period);
1090
- if (periodIndex >= 0) {
1091
- return period === "other" ? Number.MAX_SAFE_INTEGER : periodIndex;
1092
- }
1093
- const grammarMatch = SPORTS_PERIOD_GRAMMAR_PATTERN.exec(period);
1094
- if (grammarMatch) {
1095
- const familyIndex = grammarMatch[1] ? SPORTS_PERIOD_FAMILY_ORDER.indexOf(
1096
- grammarMatch[1]
1097
- ) : SPORTS_PERIOD_FAMILY_ORDER.length;
1098
- const scopeNumber = Number((_b = (_a = grammarMatch[2]) != null ? _a : grammarMatch[3]) != null ? _b : 0);
1099
- return SPORTS_PERIOD_ORDER.length + familyIndex * 100 + scopeNumber;
1100
- }
1101
- return Number.MAX_SAFE_INTEGER - 1;
1102
- };
1103
- var getSportsMarketTypeOrderIndex = (sportsMarketType) => {
1104
- if (!sportsMarketType) return SPORTS_MARKET_TYPE_ORDER.length;
1105
- const marketTypeIndex = SPORTS_MARKET_TYPE_ORDER.indexOf(sportsMarketType);
1106
- return marketTypeIndex >= 0 ? marketTypeIndex : SPORTS_MARKET_TYPE_ORDER.length;
1107
- };
1108
- var resolveSportsPeriodFamily = (period) => {
1109
- if (period === "1h" || period === "2h") return "halves";
1110
- if (period === "q1" || period === "q2" || period === "q3" || period === "q4") return "quarters";
1111
- if (/^inning_\d{1,2}$/.test(period)) return "innings";
1112
- if (/^set_\d{1,2}$/.test(period)) return "sets";
1113
- if (/^(?:map|game)_\d{1,2}$/.test(period)) return "maps";
1114
- return period;
1115
- };
1116
- var normalizeSportsPeriod = (value) => {
1117
- const resolvedValue = toTrimmedString(value).toLowerCase();
1118
- if (!resolvedValue) return "full";
1119
- if (resolvedValue === "match") return "full";
1120
- if (SPORTS_PERIOD_KEY_SET.has(resolvedValue)) return resolvedValue;
1121
- if (SPORTS_PERIOD_GRAMMAR_PATTERN.test(resolvedValue)) return resolvedValue;
1122
- return "other";
1123
- };
1124
- var normalizeSportsMarketType = (value) => {
1125
- const resolvedValue = toTrimmedString(value).toLowerCase();
1126
- if (!resolvedValue) return null;
1127
- return SPORTS_MARKET_TYPE_KEY_SET.has(resolvedValue) ? resolvedValue : "other";
1128
- };
1129
- var normalizeSportsMarketCategory = (value) => {
1130
- const resolvedValue = toTrimmedString(value).toLowerCase();
1131
- if (!resolvedValue) return null;
1132
- return SPORTS_MARKET_CATEGORY_KEY_SET.has(resolvedValue) ? resolvedValue : "other";
1133
- };
1134
- var normalizeSportsMarketGroup = (value) => {
1135
- const resolvedValue = toTrimmedString(value).toLowerCase();
1136
- if (!resolvedValue) return null;
1137
- return SPORTS_MARKET_GROUP_KEY_SET.has(resolvedValue) ? resolvedValue : "other";
1138
- };
1139
- var resolveFallbackSportsMarketCategory = (market) => {
1140
- const marketSubtype = toTrimmedString(market.marketSubtype).toLowerCase();
1141
- const question = toTrimmedString(market.question).toLowerCase();
1142
- if (marketSubtype.includes("exact_score") || marketSubtype.includes("correct_score") || question.includes("exact score") || question.includes("correct score")) {
1143
- return "exact_score";
1144
- }
1145
- if (marketSubtype.includes("corner") || question.includes("corner")) {
1146
- return "corners";
1147
- }
1148
- if (marketSubtype.includes("shot")) return "shots";
1149
- if (marketSubtype.includes("assist")) return "assists";
1150
- if (marketSubtype.includes("goal")) return "goals";
1151
- if (!PLAYER_PROP_COUNT_PATTERN.test(question) || !question.includes(":") || question.includes(" vs ") || question.includes(" vs. ")) {
1152
- return null;
1153
- }
1154
- if (question.includes("shot")) return "shots";
1155
- if (question.includes("assist")) return "assists";
1156
- if (question.includes("goal")) return "goals";
1157
- return null;
1158
- };
1159
- var resolveSportsStatToken = (market) => {
1160
- const subtype = toTrimmedString(market.marketSubtype).toLowerCase();
1161
- const playerMatch = /_player_(.+)$/.exec(subtype);
1162
- if (playerMatch) return playerMatch[1];
1163
- const category = normalizeSportsMarketCategory(market.marketCategory);
1164
- if (category && SPORTS_LEGACY_PROP_CATEGORY_KEY_SET.has(category)) return category;
1165
- return null;
1166
- };
1167
- var resolveMarketSectionTabKey = (market) => {
1168
- var _a;
1169
- if (normalizeSportsMarketType(market.sportsMarketType) === "to_advance") {
1170
- return "game_lines";
1171
- }
1172
- const normalizedCategory = normalizeSportsMarketCategory(market.marketCategory);
1173
- const fallbackCategory = !normalizedCategory || normalizedCategory === "other" ? resolveFallbackSportsMarketCategory(market) : null;
1174
- const category = fallbackCategory != null ? fallbackCategory : normalizedCategory;
1175
- if (category && SPORTS_LEGACY_PROP_CATEGORY_KEY_SET.has(category)) return `stat:${category}`;
1176
- if (category === "exact_score") return "exact_score";
1177
- const group = normalizeSportsMarketGroup(market.marketGroup);
1178
- if (group === "exact_score") return "exact_score";
1179
- if (group === "player_props") {
1180
- return `stat:${(_a = resolveSportsStatToken(market)) != null ? _a : SPORTS_GENERIC_STAT}`;
1181
- }
1182
- if (group === "period_lines") {
1183
- return `period:${resolveSportsPeriodFamily(normalizeSportsPeriod(market.period))}`;
1184
- }
1185
- if (group === "other") return "other";
1186
- if (group) return "game_lines";
1187
- if (category === "game_lines") return "game_lines";
1188
- if (category === "other") return "other";
1189
- return null;
1190
- };
1191
- var SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS = {
1192
- halves: /* @__PURE__ */ new Set(["soccer", "basketball", "american_football", "rugby", "aussie_rules"]),
1193
- quarters: /* @__PURE__ */ new Set(["basketball", "american_football", "lacrosse", "aussie_rules"]),
1194
- innings: /* @__PURE__ */ new Set(["baseball"]),
1195
- sets: /* @__PURE__ */ new Set(["tennis", "table_tennis", "volleyball"]),
1196
- maps: /* @__PURE__ */ new Set(["esports"]),
1197
- ot: /* @__PURE__ */ new Set(["basketball", "american_football", "hockey", "soccer"])
1198
- };
1199
- var PERIOD_N_FAMILY_PATTERN = /^period_\d{1,2}$/;
1200
- var isPeriodFamilyAllowedForSport = (family, sport) => {
1201
- if (!sport || sport === "other_sport") return true;
1202
- if (PERIOD_N_FAMILY_PATTERN.test(family)) return sport === "hockey";
1203
- const normalizedFamily = FIRST_N_INNINGS_PATTERN.test(family) ? "innings" : family;
1204
- const allowedSports = SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS[normalizedFamily];
1205
- return !allowedSports || allowedSports.has(sport);
1206
- };
1207
- var resolveEffectiveMarketSectionTabKey = (market, sport) => {
1208
- const key = resolveMarketSectionTabKey(market);
1209
- if (!key || !key.startsWith("period:")) return key;
1210
- const family = key.slice("period:".length);
1211
- return isPeriodFamilyAllowedForSport(family, sport) ? key : "other";
1212
- };
1213
- var resolveVisibleSportsSectionTabs = (event) => {
1214
- var _a, _b, _c;
1215
- const periodsByFamily = /* @__PURE__ */ new Map();
1216
- const statVolume = /* @__PURE__ */ new Map();
1217
- let hasGameLines = false;
1218
- let hasExactScore = false;
1219
- let hasOther = false;
1220
- for (const market of event.venueMarkets) {
1221
- const key = resolveEffectiveMarketSectionTabKey(market, event.sport);
1222
- if (!key) continue;
1223
- if (key === "game_lines") hasGameLines = true;
1224
- else if (key === "exact_score") hasExactScore = true;
1225
- else if (key === "other") hasOther = true;
1226
- else if (key.startsWith("period:")) {
1227
- const family = key.slice("period:".length);
1228
- const periods = (_a = periodsByFamily.get(family)) != null ? _a : /* @__PURE__ */ new Set();
1229
- periods.add(normalizeSportsPeriod(market.period));
1230
- periodsByFamily.set(family, periods);
1231
- } else if (key.startsWith("stat:")) {
1232
- const stat = key.slice("stat:".length);
1233
- statVolume.set(stat, ((_b = statVolume.get(stat)) != null ? _b : 0) + ((_c = market.volume) != null ? _c : 0));
1234
- }
1235
- }
1236
- const tabs = [];
1237
- if (hasGameLines) tabs.push({ key: "game_lines", kind: "game_lines" });
1238
- const periodTabs = Array.from(periodsByFamily.entries()).map(([periodFamily, periods]) => ({
1239
- key: `period:${periodFamily}`,
1240
- kind: "period",
1241
- periodFamily,
1242
- periods: Array.from(periods).sort(
1243
- (left, right) => getSportsPeriodOrderIndex(left) - getSportsPeriodOrderIndex(right)
1244
- )
1245
- })).sort(
1246
- (left, right) => getSportsPeriodOrderIndex(left.periods[0]) - getSportsPeriodOrderIndex(right.periods[0])
1247
- );
1248
- tabs.push(...periodTabs);
1249
- const statTabs = Array.from(statVolume.entries()).sort((left, right) => {
1250
- if (left[0] === SPORTS_GENERIC_STAT !== (right[0] === SPORTS_GENERIC_STAT)) {
1251
- return left[0] === SPORTS_GENERIC_STAT ? 1 : -1;
1252
- }
1253
- return right[1] - left[1];
1254
- }).map(([stat]) => ({ key: `stat:${stat}`, kind: "stat", stat }));
1255
- tabs.push(...statTabs);
1256
- if (hasExactScore) tabs.push({ key: "exact_score", kind: "exact_score" });
1257
- if (hasOther) tabs.push({ key: "other", kind: "other" });
1258
- if (isNonStandardSportsLikeEvent(event)) {
1259
- return tabs.filter((tab) => tab.kind === "game_lines" || tab.kind === "other");
1260
- }
1261
- return tabs;
1262
- };
1263
- var resolveSportsSectionFilters = (tab) => {
1264
- if (tab.kind === "period") {
1265
- return {
1266
- marketGroup: ["period_lines"],
1267
- marketCategory: void 0,
1268
- sportsMarketType: void 0,
1269
- period: tab.periods ? [...tab.periods] : void 0
1270
- };
1271
- }
1272
- if (tab.kind === "stat") {
1273
- const legacyCategory = SPORTS_LEGACY_PROP_CATEGORY_KEY_SET.has(
1274
- tab.stat
1275
- ) ? tab.stat : null;
1276
- return legacyCategory ? {
1277
- marketGroup: void 0,
1278
- marketCategory: [legacyCategory],
1279
- sportsMarketType: void 0,
1280
- period: void 0
1281
- } : {
1282
- marketGroup: ["player_props"],
1283
- marketCategory: void 0,
1284
- sportsMarketType: void 0,
1285
- period: void 0
1286
- };
1287
- }
1288
- if (tab.kind === "exact_score") {
1289
- return {
1290
- marketGroup: ["exact_score"],
1291
- marketCategory: void 0,
1292
- sportsMarketType: void 0,
1293
- period: void 0
1294
- };
1295
- }
1296
- if (tab.kind === "other") {
1297
- return {
1298
- marketGroup: ["other"],
1299
- marketCategory: void 0,
1300
- sportsMarketType: void 0,
1301
- period: void 0
1302
- };
1303
- }
1304
- return {
1305
- marketGroup: [...SPORTS_GAME_LINE_GROUPS],
1306
- marketCategory: void 0,
1307
- sportsMarketType: void 0,
1308
- period: void 0
1309
- };
1310
- };
1311
- var hasTeamTitledOutcomes = (market) => {
1312
- var _a;
1313
- const titles = ((_a = market.venueMarketOutcomes) != null ? _a : []).map(
1314
- (outcome) => toTrimmedString(outcome.title)
1315
- );
1316
- return titles.length > 1 && titles.every((title) => title && !YES_NO_LABELS.has(title.toLowerCase())) && new Set(titles).size === titles.length;
1317
- };
1318
- var isClusterRelation = (left, right) => {
1319
- var _a, _b;
1320
- return ((_a = left.matchedVenueMarkets) != null ? _a : []).some((market) => market.id === right.id) || ((_b = right.matchedVenueMarkets) != null ? _b : []).some((market) => market.id === left.id);
1321
- };
1322
- var isDecomposedLeg = (market) => {
1323
- var _a;
1324
- const labels = ((_a = market.venueMarketOutcomes) != null ? _a : []).map(
1325
- (outcome) => toTrimmedString(outcome.label).toLowerCase()
1326
- );
1327
- return labels.length === 2 && labels.every((label) => YES_NO_LABELS.has(label)) && !hasTeamTitledOutcomes(market);
1328
- };
1329
- var singleEnumeratesLegs = (single, legs) => {
1330
- var _a;
1331
- const titles = new Set(
1332
- ((_a = single.venueMarketOutcomes) != null ? _a : []).map((outcome) => toTrimmedString(outcome.title).toLowerCase()).filter(Boolean)
1333
- );
1334
- if (titles.size === 0) return false;
1335
- return legs.every((leg) => {
1336
- const label = resolveCombinedMoneylineLegLabel(leg).toLowerCase();
1337
- return label.length > 0 && titles.has(label);
1338
- });
1339
- };
1340
- var dropDecomposedLegsMergedIntoSingle = (markets) => {
1341
- const legs = markets.filter((market) => isDecomposedLeg(market));
1342
- if (legs.length === 0) return markets;
1343
- const hasMergedSingle = markets.some(
1344
- (market) => {
1345
- var _a, _b;
1346
- return hasTeamTitledOutcomes(market) && ((_b = (_a = market.venueMarketOutcomes) == null ? void 0 : _a.length) != null ? _b : 0) >= legs.length && (markets.some((other) => other !== market && isClusterRelation(market, other)) || singleEnumeratesLegs(market, legs));
1347
- }
1348
- );
1349
- return hasMergedSingle ? markets.filter((market) => !isDecomposedLeg(market)) : markets;
1350
- };
1351
- var resolveSportsSectionMarkets = ({
1352
- tab,
1353
- eventMarkets,
1354
- sectionMarkets,
1355
- sport
1356
- }) => {
1357
- const effectiveSectionMarkets = sectionMarkets.length > 0 ? sectionMarkets : eventMarkets.filter(
1358
- (market) => resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
1359
- );
1360
- const filteredSectionMarkets = effectiveSectionMarkets.filter(
1361
- (market) => resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
1362
- );
1363
- if (tab.key === "other" || tab.key === `stat:${SPORTS_GENERIC_STAT}`) {
1364
- const seenIds = new Set(filteredSectionMarkets.map((market) => market.id));
1365
- const strayMarkets = eventMarkets.filter(
1366
- (market) => !seenIds.has(market.id) && resolveEffectiveMarketSectionTabKey(market, sport) === tab.key
1367
- );
1368
- return [...filteredSectionMarkets, ...strayMarkets];
1369
- }
1370
- if (tab.kind !== "game_lines") return filteredSectionMarkets;
1371
- const dedupeEventMarketsOfType = (type) => {
1372
- var _a, _b, _c, _d;
1373
- const dedupedMarkets = [];
1374
- const keptIndexByKey = /* @__PURE__ */ new Map();
1375
- for (const market of eventMarkets) {
1376
- if (normalizeSportsMarketType(market.sportsMarketType) !== type || resolveMarketSectionTabKey(market) !== "game_lines") {
1377
- continue;
1378
- }
1379
- const key = resolveSportsMarketAggKey(market) || market.id;
1380
- const keptIndex = keptIndexByKey.get(key);
1381
- if (keptIndex !== void 0) {
1382
- const kept = dedupedMarkets[keptIndex];
1383
- if (hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market) && ((_b = (_a = kept.venueMarketOutcomes) == null ? void 0 : _a.length) != null ? _b : 0) !== ((_d = (_c = market.venueMarketOutcomes) == null ? void 0 : _c.length) != null ? _d : 0)) {
1384
- dedupedMarkets.push(market);
1385
- continue;
1386
- }
1387
- if (!hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market)) {
1388
- dedupedMarkets[keptIndex] = market;
1389
- }
1390
- continue;
1391
- }
1392
- keptIndexByKey.set(key, dedupedMarkets.length);
1393
- dedupedMarkets.push(market);
1394
- }
1395
- return dropDecomposedLegsMergedIntoSingle(dedupedMarkets);
1396
- };
1397
- const eventMoneylineMarkets = dedupeEventMarketsOfType("moneyline");
1398
- const eventToAdvanceMarkets = dedupeEventMarketsOfType("to_advance");
1399
- const sectionWithoutAdvance = filteredSectionMarkets.filter(
1400
- (market) => normalizeSportsMarketType(market.sportsMarketType) !== "to_advance"
1401
- );
1402
- if (eventMoneylineMarkets.length === 0) {
1403
- return [...eventToAdvanceMarkets, ...sectionWithoutAdvance];
1404
- }
1405
- const lineSectionMarkets = sectionWithoutAdvance.filter(
1406
- (market) => normalizeSportsMarketType(market.sportsMarketType) !== "moneyline" && resolveMarketSectionTabKey(market) === "game_lines"
1407
- );
1408
- return [...eventToAdvanceMarkets, ...eventMoneylineMarkets, ...lineSectionMarkets];
1409
- };
1410
- var resolveSportsMarketCardVariant = (market) => {
1411
- var _a;
1412
- const normalizedOutcomeLabels = ((_a = market.venueMarketOutcomes) != null ? _a : []).map(
1413
- (outcome) => toTrimmedString(outcome.label).toLowerCase()
1414
- );
1415
- const sportsMarketType = normalizeSportsMarketType(market.sportsMarketType);
1416
- if (sportsMarketType && LINE_MARKET_TYPES.has(sportsMarketType)) {
1417
- return "line";
1418
- }
1419
- if (market.lineValue != null) {
1420
- return "line";
1421
- }
1422
- if (normalizedOutcomeLabels.length === 2 && normalizedOutcomeLabels.every((label) => YES_NO_LABELS.has(label))) {
1423
- return "yes_no";
1424
- }
1425
- return "outcome";
1426
- };
1427
- var isBinarySportsMoneylineMarket = (market) => {
1428
- var _a;
1429
- const normalizedOutcomeLabels = ((_a = market.venueMarketOutcomes) != null ? _a : []).map(
1430
- (outcome) => toTrimmedString(outcome.label).toLowerCase()
1431
- );
1432
- const marketSubtype = toTrimmedString(market.marketSubtype).toLowerCase();
1433
- const marketGroup = normalizeSportsMarketGroup(market.marketGroup);
1434
- const sportsMarketType = normalizeSportsMarketType(market.sportsMarketType);
1435
- const question = toTrimmedString(market.question);
1436
- const aggKey = resolveSportsMarketAggKey(market);
1437
- return sportsMarketType === "moneyline" && marketGroup === "game_lines" && normalizeSportsPeriod(market.period) === "full" && normalizedOutcomeLabels.length === 2 && normalizedOutcomeLabels.every((label) => YES_NO_LABELS.has(label)) && (marketSubtype === "moneyline" || REG_TIME_TITLE_PATTERN.test(question) || aggKey.includes("_ml_"));
1438
- };
1439
- var AGGKEY_LINE_TOKEN_PATTERN = /_\d{1,3}(?:p\d+)?(?=_|$)/g;
1440
- var resolveSportsLineFamilyKey = (market) => {
1441
- const aggKey = resolveSportsMarketAggKey(market);
1442
- return aggKey ? aggKey.replace(AGGKEY_LINE_TOKEN_PATTERN, "") : "";
1443
- };
1444
- var resolveSpreadFamilyKey = (market) => {
1445
- const aggKey = resolveSportsMarketAggKey(market);
1446
- return aggKey ? aggKey.replace(/_sp_.+$/i, "_sp") : "";
1447
- };
1448
- var SPREAD_KEY_LEG_PATTERN = /_sp_([a-z0-9]+?)_([mp]?)(\d{1,3})(?:p(\d+))?(?:_|$)/i;
1449
- var resolveSpreadKeyLeg = (market) => {
1450
- const match = SPREAD_KEY_LEG_PATTERN.exec(resolveSportsMarketAggKey(market));
1451
- if (!match) return null;
1452
- const [, team, leg, whole, fraction] = match;
1453
- return {
1454
- team: team.toLowerCase(),
1455
- isFavorite: (leg == null ? void 0 : leg.toLowerCase()) !== "p",
1456
- line: Number(fraction ? `${whole}.${fraction}` : whole)
1457
- };
1458
- };
1459
- var isSpreadUnderdogLeg = (market) => {
1460
- var _a;
1461
- return ((_a = resolveSpreadKeyLeg(market)) == null ? void 0 : _a.isFavorite) === false;
1462
- };
1463
- var resolveSpreadAnchorToken = (markets) => {
1464
- var _a;
1465
- const tokens = /* @__PURE__ */ new Set();
1466
- let prefix = "";
1467
- for (const market of markets) {
1468
- const leg = resolveSpreadKeyLeg(market);
1469
- if (leg) tokens.add(leg.team);
1470
- if (!prefix) prefix = (_a = resolveSportsMarketAggKey(market).split("_sp_")[0]) != null ? _a : "";
1471
- }
1472
- if (tokens.size === 0 || !prefix) return null;
1473
- return Array.from(tokens).sort((left, right) => prefix.indexOf(left) - prefix.indexOf(right))[0];
1474
- };
1475
- var SPREAD_NON_TEAM_TITLE_PATTERN = /\b(?:yes|no|over|under|wins?\s+by|reg\.?\s*time|goal\s*diff|more\s+than|less\s+than|halftime|1st\s+half|2nd\s+half|goals?)\b/i;
1476
- var isSpreadTeamTitle = (title) => {
1477
- const trimmed = toTrimmedString(title);
1478
- if (!trimmed || trimmed.length > 24) return false;
1479
- const normalized = trimmed.toLowerCase();
1480
- if (normalized === "yes" || normalized === "no") return false;
1481
- return !SPREAD_NON_TEAM_TITLE_PATTERN.test(trimmed);
1482
- };
1483
- var resolveSpreadOutcomeTeamNames = (activeMarket, groupMarkets) => {
1484
- const aggKey = resolveSportsMarketAggKey(activeMarket);
1485
- const twins = aggKey ? groupMarkets.filter((market) => resolveSportsMarketAggKey(market) === aggKey) : [activeMarket];
1486
- const pickName = (index) => {
1487
- const cleanTitles = twins.map((market) => {
1488
- var _a, _b;
1489
- return toTrimmedString((_b = (_a = market.venueMarketOutcomes) == null ? void 0 : _a[index]) == null ? void 0 : _b.title);
1490
- }).filter((title) => isSpreadTeamTitle(title));
1491
- if (cleanTitles.length === 0) return null;
1492
- return cleanTitles.reduce(
1493
- (longest, title) => title.length > longest.length ? title : longest
1494
- );
1495
- };
1496
- const named = pickName(0);
1497
- const opponent = pickName(1);
1498
- return isSpreadUnderdogLeg(activeMarket) ? { favored: opponent, dog: named } : { favored: named, dog: opponent };
1499
- };
1500
- var resolveCombinedMoneylineLegLabel = (market) => {
1501
- const typedMarket = market;
1502
- return toTrimmedString(typedMarket.shortTitle) || toTrimmedString(market.question);
1503
- };
1504
- var normalizeSportsSubtypeToken = (subtype, sport) => {
1505
- const token = toTrimmedString(subtype).toLowerCase().replace(/^sports_/, "");
1506
- const sportToken = toTrimmedString(sport).toLowerCase();
1507
- return sportToken && token.startsWith(`${sportToken}_`) ? token.slice(sportToken.length + 1) : token;
1508
- };
1509
- var SPORTS_LEG_GROUPABLE_GROUPS = /* @__PURE__ */ new Set([
1510
- "game_lines",
1511
- "period_lines",
1512
- "team_props",
1513
- "specials",
1514
- "completion"
1515
- ]);
1516
- var DRAW_OUTCOME_TITLE_PATTERN = /\b(draw|tie)\b/i;
1517
- var isThreeWayMoneylineHub = (market) => {
1518
- var _a, _b;
1519
- const outcomes = (_a = market.venueMarketOutcomes) != null ? _a : [];
1520
- return normalizeSportsMarketType(market.sportsMarketType) === "moneyline" && normalizeSportsMarketGroup(market.marketGroup) === "game_lines" && normalizeSportsPeriod(market.period) === "full" && outcomes.length === 3 && outcomes.filter((outcome) => DRAW_OUTCOME_TITLE_PATTERN.test(toTrimmedString(outcome.title))).length === 1 && ((_b = market.matchedVenueMarkets) != null ? _b : []).length > 0;
1521
- };
1522
- var resolveDisplayGroupFamilyKey = (market, sport) => {
1523
- var _a, _b, _c;
1524
- const normalizedQuestion = sanitizeFamilyValue(toTrimmedString(market.question));
1525
- const outcomeKey = ((_a = market.venueMarketOutcomes) != null ? _a : []).map(
1526
- (outcome) => sanitizeFamilyValue(toTrimmedString(outcome.title) || toTrimmedString(outcome.label))
1527
- ).filter(Boolean).sort((left, right) => left.localeCompare(right)).join("|");
1528
- const sportsMarketType = (_b = normalizeSportsMarketType(market.sportsMarketType)) != null ? _b : "other";
1529
- const period = normalizeSportsPeriod(market.period);
1530
- const marketCategory = (_c = normalizeSportsMarketCategory(market.marketCategory)) != null ? _c : "other";
1531
- if (isBinarySportsMoneylineMarket(market) || isThreeWayMoneylineHub(market)) {
1532
- return `${period}|moneyline|${marketCategory}`;
1533
- }
1534
- if (sportsMarketType === "to_advance") {
1535
- return `${period}|to_advance`;
1536
- }
1537
- const lineFamily = resolveSportsLineFamilyKey(market);
1538
- if (sportsMarketType === "spread") {
1539
- const spreadFamily = resolveSpreadFamilyKey(market);
1540
- return spreadFamily ? `${period}|spread|${spreadFamily}` : `${period}|spread|${marketCategory}`;
1541
- }
1542
- if (market.lineValue != null || LINE_MARKET_TYPES.has(sportsMarketType)) {
1543
- return lineFamily ? `${period}|${sportsMarketType}|${lineFamily}` : `${period}|${sportsMarketType}|${marketCategory}|${normalizedQuestion}|${outcomeKey}`;
1544
- }
1545
- const marketGroup = normalizeSportsMarketGroup(market.marketGroup);
1546
- const legToken = marketGroup && SPORTS_LEG_GROUPABLE_GROUPS.has(marketGroup) && isDecomposedLeg(market) ? normalizeSportsSubtypeToken(market.marketSubtype, sport) : "";
1547
- if (legToken) {
1548
- return `${period}|leg|${marketGroup}|${legToken}`;
1549
- }
1550
- return resolveMarketOwnCardKey(market);
1551
- };
1552
- var resolveMarketOwnCardKey = (market) => {
1553
- var _a, _b, _c;
1554
- const outcomeKey = ((_a = market.venueMarketOutcomes) != null ? _a : []).map(
1555
- (outcome) => sanitizeFamilyValue(toTrimmedString(outcome.title) || toTrimmedString(outcome.label))
1556
- ).filter(Boolean).sort((left, right) => left.localeCompare(right)).join("|");
1557
- const sportsMarketType = (_b = normalizeSportsMarketType(market.sportsMarketType)) != null ? _b : "other";
1558
- const period = normalizeSportsPeriod(market.period);
1559
- const marketCategory = (_c = normalizeSportsMarketCategory(market.marketCategory)) != null ? _c : "other";
1560
- return `${period}|${sportsMarketType}|${marketCategory}|${toTrimmedString(market.question)}|${outcomeKey}|${market.id}`;
1561
- };
1562
- var LEG_GROUP_KEY_MARKER = "|leg|";
1563
- var TOTAL_STAT_UNITS = [
1564
- [/\bcorners?\b/i, "Corners"],
1565
- [/\bcards?\b|\bbookings?\b/i, "Cards"],
1566
- [/\bgoals?\b/i, "Goals"],
1567
- [/\bpoints?\b/i, "Points"],
1568
- [/\bruns?\b/i, "Runs"],
1569
- [/\brounds?\b/i, "Rounds"],
1570
- [/\bgames?\b/i, "Games"],
1571
- [/\bsets?\b/i, "Sets"],
1572
- [/\bmaps?\b/i, "Maps"]
1573
- ];
1574
- var resolveTotalStatUnit = (markets, marketCategory) => {
1575
- if (marketCategory === "corners") return "Corners";
1576
- for (const market of markets) {
1577
- const question = toTrimmedString(market.question);
1578
- for (const [pattern, unit] of TOTAL_STAT_UNITS) {
1579
- if (pattern.test(question)) return unit;
1580
- }
1581
- }
1582
- return null;
1583
- };
1584
- var SPORTS_LEG_TITLE_OVERRIDES = { nrfi: "NRFI" };
1585
- var SPORTS_LEG_TITLE_SMALL_WORDS = /* @__PURE__ */ new Set(["to", "the", "of", "in", "at", "a", "and", "or"]);
1586
- var formatSportsLegTitle = (token) => {
1587
- var _a;
1588
- return (_a = SPORTS_LEG_TITLE_OVERRIDES[token]) != null ? _a : token.split("_").filter(Boolean).map(
1589
- (word, index) => index > 0 && SPORTS_LEG_TITLE_SMALL_WORDS.has(word) ? word : word.charAt(0).toUpperCase() + word.slice(1)
1590
- ).join(" ");
1591
- };
1592
- var resolveDisplayGroupTitle = (market, groupMarkets = [market], sport, isCombinedLegGroup = false) => {
1593
- const sportsMarketType = normalizeSportsMarketType(market.sportsMarketType);
1594
- const question = toTrimmedString(market.question);
1595
- if (isBinarySportsMoneylineMarket(market) || isThreeWayMoneylineHub(market)) return "Moneyline";
1596
- if (sportsMarketType === "to_advance") return "Team to Advance";
1597
- if (sportsMarketType === "spread") return "Spreads";
1598
- if (isCombinedLegGroup) {
1599
- const legToken = normalizeSportsSubtypeToken(market.marketSubtype, sport);
1600
- if (legToken) return formatSportsLegTitle(legToken);
1601
- }
1602
- if (!question) {
1603
- return sportsMarketType != null ? sportsMarketType : market.id;
1604
- }
1605
- if (sportsMarketType === "total") {
1606
- const lineFamily = resolveSportsLineFamilyKey(market);
1607
- const marketCategory = normalizeSportsMarketCategory(market.marketCategory);
1608
- if (/_tot(_corners)?(_\dh)?$/i.test(lineFamily)) {
1609
- const unit = resolveTotalStatUnit(groupMarkets, marketCategory);
1610
- return unit ? `Total ${unit}` : "Totals";
1611
- }
1612
- const base = stripLineValueFromQuestion(question).replace(/o\s*\/\s*u/gi, " ").replace(/\btotals?\b/gi, " ").replace(/\s+/g, " ").trim();
1613
- return base ? `${base} Totals` : "Totals";
1614
- }
1615
- if (market.lineValue != null) {
1616
- const strippedQuestion = stripLineValueFromQuestion(question);
1617
- return strippedQuestion || question;
1618
- }
1619
- return question;
1620
- };
1621
- var sortMarketsByLineValue = (markets) => {
1622
- return [...markets].sort((leftMarket, rightMarket) => {
1623
- var _a, _b;
1624
- const leftLineValue = (_a = leftMarket.lineValue) != null ? _a : Number.NEGATIVE_INFINITY;
1625
- const rightLineValue = (_b = rightMarket.lineValue) != null ? _b : Number.NEGATIVE_INFINITY;
1626
- if (leftLineValue !== rightLineValue) {
1627
- return leftLineValue - rightLineValue;
1628
- }
1629
- return leftMarket.question.localeCompare(rightMarket.question);
1630
- });
1631
- };
1632
- var buildSportsMarketDisplayGroups = (markets, sport) => {
1633
- var _a, _b, _c, _d, _e;
1634
- const groupsByKey = /* @__PURE__ */ new Map();
1635
- for (const market of markets) {
1636
- const groupKey = resolveDisplayGroupFamilyKey(market, sport);
1637
- const currentMarkets = (_a = groupsByKey.get(groupKey)) != null ? _a : [];
1638
- currentMarkets.push(market);
1639
- groupsByKey.set(groupKey, currentMarkets);
1640
- }
1641
- const VENUE_SPLIT_MARKER = "|venue:";
1642
- const pending = Array.from(groupsByKey.keys());
1643
- while (pending.length > 0) {
1644
- const groupKey = pending.pop();
1645
- if (groupKey == null) continue;
1646
- const groupMarkets = groupsByKey.get(groupKey);
1647
- if (!groupMarkets || groupMarkets.length === 0) continue;
1648
- const isLegBucket = groupKey.includes(LEG_GROUP_KEY_MARKER);
1649
- const combinable = groupMarkets.length > 1 ? resolveSportsCombinedLegs({
1650
- markets: groupMarkets,
1651
- sportsMarketType: normalizeSportsMarketType((_b = groupMarkets[0]) == null ? void 0 : _b.sportsMarketType)
1652
- }) : null;
1653
- if (groupMarkets.length > 1) {
1654
- if (groupMarkets.some((market) => market.lineValue != null)) continue;
1655
- if (!combinable && groupMarkets.some((market) => hasTeamTitledOutcomes(market))) continue;
1656
- const marketsPerVenue = /* @__PURE__ */ new Map();
1657
- for (const market of groupMarkets) {
1658
- marketsPerVenue.set(market.venue, [...(_c = marketsPerVenue.get(market.venue)) != null ? _c : [], market]);
1659
- }
1660
- const mostFromOneVenue = Math.max(...Array.from(marketsPerVenue.values(), (m) => m.length));
1661
- if (combinable && combinable.length <= mostFromOneVenue) continue;
1662
- if (marketsPerVenue.size > 1) {
1663
- groupsByKey.delete(groupKey);
1664
- for (const [venue, venueMarkets] of marketsPerVenue) {
1665
- const venueKey = `${groupKey}${VENUE_SPLIT_MARKER}${venue}`;
1666
- groupsByKey.set(venueKey, [...(_d = groupsByKey.get(venueKey)) != null ? _d : [], ...venueMarkets]);
1667
- pending.push(venueKey);
1668
- }
1669
- continue;
1670
- }
1671
- }
1672
- if (isLegBucket && !combinable) {
1673
- groupsByKey.delete(groupKey);
1674
- for (const market of groupMarkets) {
1675
- const ownKey = resolveMarketOwnCardKey(market);
1676
- groupsByKey.set(ownKey, [...(_e = groupsByKey.get(ownKey)) != null ? _e : [], market]);
1677
- }
1678
- }
1679
- }
1680
- const groups = Array.from(groupsByKey.entries()).map(([id, groupMarkets]) => {
1681
- var _a2;
1682
- const isToAdvanceGroup = groupMarkets.some(
1683
- (market) => normalizeSportsMarketType(market.sportsMarketType) === "to_advance"
1684
- );
1685
- const orderedMarkets = isToAdvanceGroup ? [...groupMarkets].sort((left, right) => {
1686
- var _a3, _b2;
1687
- const leftSingle = resolveSportsMarketAggKey(left).endsWith("_adv") ? 0 : 1;
1688
- const rightSingle = resolveSportsMarketAggKey(right).endsWith("_adv") ? 0 : 1;
1689
- if (leftSingle !== rightSingle) return leftSingle - rightSingle;
1690
- return ((_a3 = right.volume) != null ? _a3 : 0) - ((_b2 = left.volume) != null ? _b2 : 0);
1691
- }) : sortMarketsByLineValue(groupMarkets);
1692
- const firstMarket = orderedMarkets[0];
1693
- const sportsMarketType = normalizeSportsMarketType(firstMarket == null ? void 0 : firstMarket.sportsMarketType);
1694
- const marketCategory = normalizeSportsMarketCategory(firstMarket == null ? void 0 : firstMarket.marketCategory);
1695
- const period = normalizeSportsPeriod(firstMarket == null ? void 0 : firstMarket.period);
1696
- const sectionRank = (_a2 = firstMarket == null ? void 0 : firstMarket.sectionRank) != null ? _a2 : Number.MAX_SAFE_INTEGER;
1697
- return {
1698
- id,
1699
- title: resolveDisplayGroupTitle(
1700
- firstMarket,
1701
- orderedMarkets,
1702
- id.includes(LEG_GROUP_KEY_MARKER) ? sport : void 0,
1703
- id.includes(LEG_GROUP_KEY_MARKER)
1704
- ),
1705
- questionKey: sanitizeFamilyValue(toTrimmedString(firstMarket == null ? void 0 : firstMarket.question)),
1706
- sportsMarketType,
1707
- marketCategory,
1708
- period,
1709
- sectionRank,
1710
- markets: orderedMarkets,
1711
- hasLineVariants: orderedMarkets.some((market) => market.lineValue != null)
1712
- };
1713
- });
1714
- return groups.sort((leftGroup, rightGroup) => {
1715
- var _a2, _b2, _c2, _d2;
1716
- if (leftGroup.sectionRank !== rightGroup.sectionRank) {
1717
- return leftGroup.sectionRank - rightGroup.sectionRank;
1718
- }
1719
- const leftMarketTypeOrder = getSportsMarketTypeOrderIndex(leftGroup.sportsMarketType);
1720
- const rightMarketTypeOrder = getSportsMarketTypeOrderIndex(rightGroup.sportsMarketType);
1721
- if (leftMarketTypeOrder !== rightMarketTypeOrder) {
1722
- return leftMarketTypeOrder - rightMarketTypeOrder;
1723
- }
1724
- const leftLineValue = (_b2 = (_a2 = leftGroup.markets[0]) == null ? void 0 : _a2.lineValue) != null ? _b2 : Number.NEGATIVE_INFINITY;
1725
- const rightLineValue = (_d2 = (_c2 = rightGroup.markets[0]) == null ? void 0 : _c2.lineValue) != null ? _d2 : Number.NEGATIVE_INFINITY;
1726
- if (leftLineValue !== rightLineValue) {
1727
- return leftLineValue - rightLineValue;
1728
- }
1729
- return leftGroup.title.localeCompare(rightGroup.title);
1730
- });
1731
- };
1732
- var groupSportsMarketsByPeriod = (markets, sport) => {
1733
- var _a;
1734
- const periodGroups = /* @__PURE__ */ new Map();
1735
- for (const market of markets) {
1736
- const period = normalizeSportsPeriod(market.period);
1737
- const currentMarkets = (_a = periodGroups.get(period)) != null ? _a : [];
1738
- currentMarkets.push(market);
1739
- periodGroups.set(period, currentMarkets);
1740
- }
1741
- return Array.from(periodGroups.entries()).map(([key, groupedMarkets]) => ({
1742
- key,
1743
- markets: groupedMarkets,
1744
- groups: buildSportsMarketDisplayGroups(groupedMarkets, sport)
1745
- })).sort((leftGroup, rightGroup) => {
1746
- return getSportsPeriodOrderIndex(leftGroup.key) - getSportsPeriodOrderIndex(rightGroup.key);
1747
- });
1748
- };
1749
- var resolveSelectedSportsLineValue = (lineValue) => {
1750
- if (lineValue == null) return "0";
1751
- return Number.isInteger(lineValue) ? String(lineValue) : lineValue.toFixed(1);
1752
- };
1753
- var collectVenueNames = (market) => {
1754
- var _a;
1755
- const venues = /* @__PURE__ */ new Set([market.venue]);
1756
- for (const matchedVenueMarket of (_a = market.matchedVenueMarkets) != null ? _a : []) {
1757
- venues.add(matchedVenueMarket.venue);
1758
- }
1759
- return Array.from(venues);
1760
- };
1761
- var resolveTotalGroupVolume = (markets) => {
1762
- return markets.reduce((totalVolume, market) => {
1763
- var _a;
1764
- return totalVolume + ((_a = market.volume) != null ? _a : 0);
1765
- }, 0);
1766
- };
1767
- var resolveSportsExpandedMarkets = (markets) => {
1768
- var _a;
1769
- const expandedMarkets = [];
1770
- const seenMarketIds = /* @__PURE__ */ new Set();
1771
- for (const market of markets) {
1772
- if (!seenMarketIds.has(market.id)) {
1773
- seenMarketIds.add(market.id);
1774
- expandedMarkets.push(market);
1775
- }
1776
- for (const matchedVenueMarket of (_a = market.matchedVenueMarkets) != null ? _a : []) {
1777
- if (seenMarketIds.has(matchedVenueMarket.id)) continue;
1778
- seenMarketIds.add(matchedVenueMarket.id);
1779
- expandedMarkets.push(matchedVenueMarket);
1780
- }
1781
- }
1782
- return expandedMarkets;
1783
- };
1784
- var resolveSportsExpandedMarketsVolume = (markets) => {
1785
- return resolveSportsExpandedMarkets(markets).reduce((totalVolume, market) => {
1786
- var _a;
1787
- return totalVolume + ((_a = market.volume) != null ? _a : 0);
1788
- }, 0);
1789
- };
1790
- var resolveHighestVolumeIndex = (markets) => {
1791
- let bestIndex = 0;
1792
- let bestVolume = Number.NEGATIVE_INFINITY;
1793
- markets.forEach((market, index) => {
1794
- var _a;
1795
- const volume = (_a = market.volume) != null ? _a : 0;
1796
- if (volume > bestVolume) {
1797
- bestVolume = volume;
1798
- bestIndex = index;
1799
- }
1800
- });
1801
- return bestIndex;
1802
- };
1803
- var resolveSportsCombinedLegs = (group) => {
1804
- var _a;
1805
- if (group.markets.some((market) => market.lineValue != null)) return null;
1806
- const isMoneylineGroup = group.sportsMarketType === "moneyline" && group.markets.every((market) => isBinarySportsMoneylineMarket(market));
1807
- const legs = group.markets.filter(
1808
- (market) => isMoneylineGroup ? isBinarySportsMoneylineMarket(market) : isDecomposedLeg(market)
1809
- );
1810
- if (legs.length < 2 || legs.length !== group.markets.length) return null;
1811
- if (!isMoneylineGroup) {
1812
- const legsPerVenue = /* @__PURE__ */ new Map();
1813
- for (const leg of legs) {
1814
- legsPerVenue.set(leg.venue, ((_a = legsPerVenue.get(leg.venue)) != null ? _a : 0) + 1);
1815
- }
1816
- const isDecomposition = Array.from(legsPerVenue.values()).some((count) => count > 1);
1817
- if (!isDecomposition) return null;
1818
- }
1819
- const twinSets = [];
1820
- for (const leg of legs) {
1821
- const legQuestion = sanitizeFamilyValue(toTrimmedString(leg.question));
1822
- const twins = twinSets.find(
1823
- (candidates) => candidates.some(
1824
- (candidate) => (
1825
- // CROSS-VENUE only. A venue never lists one leg twice, so two legs
1826
- // from the SAME venue are always different bets — and they routinely
1827
- // reference each other through their absent merged anchor, so the
1828
- // cluster test alone would fold a 2-way decomposition down to one
1829
- // pill and drop a team off the card.
1830
- candidate.venue !== leg.venue && (isClusterRelation(candidate, leg) || legQuestion.length > 0 && sanitizeFamilyValue(toTrimmedString(candidate.question)) === legQuestion)
1831
- )
1832
- )
1833
- );
1834
- if (twins) twins.push(leg);
1835
- else twinSets.push([leg]);
1836
- }
1837
- const pills = twinSets.map((twins) => {
1838
- var _a2;
1839
- const market = (_a2 = twins[resolveHighestVolumeIndex(twins)]) != null ? _a2 : twins[0];
1840
- const label = twins.map((twin) => resolveCombinedMoneylineLegLabel(twin)).reduce(
1841
- (longest, candidate) => candidate.length > longest.length ? candidate : longest,
1842
- ""
1843
- );
1844
- const venues = /* @__PURE__ */ new Set();
1845
- for (const twin of twins) {
1846
- for (const venue of collectVenueNames(twin)) venues.add(venue);
1847
- }
1848
- return { label, market, venues: Array.from(venues) };
1849
- });
1850
- const labels = pills.map((pill) => pill.label.toLowerCase());
1851
- if (pills.length < 2 || labels.some((label) => !label)) return null;
1852
- return new Set(labels).size === labels.length ? pills : null;
1853
- };
1854
- var resolveSlideKind = (group) => {
1855
- if (group.sportsMarketType === "to_advance") return "to_advance";
1856
- if (group.sportsMarketType === "moneyline") return "moneyline";
1857
- if (group.sportsMarketType === "spread") return "spread";
1858
- if (group.sportsMarketType === "total") return "total";
1859
- return "other";
1860
- };
1861
- var aggregateSportsLineStops = (markets, isSpread = false) => {
1862
- var _a;
1863
- const anchorToken = isSpread ? resolveSpreadAnchorToken(markets) : null;
1864
- const axisOf = (market) => {
1865
- var _a2;
1866
- if (anchorToken) {
1867
- const leg = resolveSpreadKeyLeg(market);
1868
- if (leg) {
1869
- const anchorGivesPoints = leg.team === anchorToken ? leg.isFavorite : !leg.isFavorite;
1870
- return anchorGivesPoints ? -leg.line : leg.line;
1871
- }
1872
- }
1873
- return (_a2 = market.lineValue) != null ? _a2 : Number.NEGATIVE_INFINITY;
1874
- };
1875
- const displayOf = (market) => {
1876
- var _a2;
1877
- if (!anchorToken) return resolveSelectedSportsLineValue(market.lineValue);
1878
- const leg = resolveSpreadKeyLeg(market);
1879
- return resolveSelectedSportsLineValue(leg ? leg.line : Math.abs((_a2 = market.lineValue) != null ? _a2 : 0));
1880
- };
1881
- const marketsByAxis = /* @__PURE__ */ new Map();
1882
- for (const market of markets) {
1883
- const axis = axisOf(market);
1884
- const lineMarkets = (_a = marketsByAxis.get(axis)) != null ? _a : [];
1885
- lineMarkets.push(market);
1886
- marketsByAxis.set(axis, lineMarkets);
1887
- }
1888
- return Array.from(marketsByAxis.entries()).map(([axis, lineMarkets]) => {
1889
- var _a2;
1890
- const representative = (_a2 = lineMarkets[resolveHighestVolumeIndex(lineMarkets)]) != null ? _a2 : lineMarkets[0];
1891
- const venues = /* @__PURE__ */ new Set();
1892
- for (const lineMarket of lineMarkets) {
1893
- for (const venue of collectVenueNames(lineMarket)) {
1894
- venues.add(venue);
1895
- }
1896
- }
1897
- return {
1898
- value: displayOf(representative),
1899
- representative,
1900
- venues: Array.from(venues),
1901
- // Cluster volume: a line anchored on a zero-volume venue can carry its
1902
- // real volume on the matched twins (prophetx $0 → kalshi $23K).
1903
- volume: resolveSportsExpandedMarketsVolume(lineMarkets),
1904
- lineValue: axis
1905
- };
1906
- }).sort(
1907
- (left, right) => left.lineValue !== right.lineValue ? left.lineValue - right.lineValue : left.value.localeCompare(right.value)
1908
- );
1909
- };
1910
- var escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1911
- var resolveSportsLadderTitle = (group, selectedLineDisplay) => {
1912
- var _a;
1913
- const anchorLineValue = (_a = group.markets[0]) == null ? void 0 : _a.lineValue;
1914
- if (anchorLineValue == null || !selectedLineDisplay) return group.title;
1915
- const anchorDisplay = resolveSelectedSportsLineValue(anchorLineValue);
1916
- if (anchorDisplay === selectedLineDisplay) return group.title;
1917
- const pattern = new RegExp(`(^|[^\\d.])${escapeRegExp(anchorDisplay)}(?![\\d.])`);
1918
- return pattern.test(group.title) ? group.title.replace(pattern, (_match, prefix) => `${prefix}${selectedLineDisplay}`) : group.title;
1919
- };
1920
- var resolveDistanceFromEvenMoney = (market, prices) => {
1921
- const price = market.venueMarketOutcomes.map((outcome) => prices == null ? void 0 : prices.get(outcome.id)).find((value) => value != null);
1922
- return price == null ? Number.POSITIVE_INFINITY : Math.abs(price - 0.5);
1923
- };
1924
- var MAIN_LINE_PRICE_BAND = 0.2;
1925
- var buildSportsSlideFromGroup = (group, prices) => {
1926
- const lineStops = group.hasLineVariants ? aggregateSportsLineStops(group.markets, group.sportsMarketType === "spread") : [];
1927
- const hasLadder = lineStops.length > 1;
1928
- const stops = hasLadder ? lineStops.map((lineStop) => ({
1929
- value: lineStop.value,
1930
- venues: lineStop.venues,
1931
- market: lineStop.representative
1932
- })) : [];
1933
- const evenMoneyDistances = lineStops.map(
1934
- (lineStop) => resolveDistanceFromEvenMoney(lineStop.representative, prices)
1935
- );
1936
- const isBetter = (index, bestIndex) => {
1937
- const distance = evenMoneyDistances[index];
1938
- const bestDistance = evenMoneyDistances[bestIndex];
1939
- const inBand = distance <= MAIN_LINE_PRICE_BAND;
1940
- const bestInBand = bestDistance <= MAIN_LINE_PRICE_BAND;
1941
- if (inBand !== bestInBand) return inBand;
1942
- const volume = lineStops[index].volume;
1943
- const bestVolume = lineStops[bestIndex].volume;
1944
- if (inBand) return volume !== bestVolume ? volume > bestVolume : distance < bestDistance;
1945
- return distance !== bestDistance ? distance < bestDistance : volume > bestVolume;
1946
- };
1947
- const defaultStopIndex = hasLadder ? lineStops.reduce(
1948
- (bestIndex, _lineStop, index) => isBetter(index, bestIndex) ? index : bestIndex,
1949
- 0
1950
- ) : 0;
1951
- return {
1952
- id: group.id,
1953
- kind: resolveSlideKind(group),
1954
- group,
1955
- hasLadder,
1956
- stops,
1957
- defaultStopIndex
1958
- };
1959
- };
1960
- var formatSportsPeriodGrammarLabel = (period) => {
1961
- const grammarMatch = SPORTS_PERIOD_GRAMMAR_PATTERN.exec(period);
1962
- if (!grammarMatch) return null;
1963
- if (grammarMatch[1]) {
1964
- const family = grammarMatch[1].charAt(0).toUpperCase() + grammarMatch[1].slice(1);
1965
- return `${family} ${Number(grammarMatch[2])}`;
1966
- }
1967
- return `First ${Number(grammarMatch[3])} Innings`;
1968
- };
1969
- var resolveSportsCategoryTokens = (event) => {
1970
- return new Set(
1971
- event.categories.flatMap((entry) => {
1972
- const categoryName = toTrimmedString(entry.category.name).toLowerCase();
1973
- const categoryDisplayName = toTrimmedString(entry.category.displayName).toLowerCase();
1974
- return [categoryName, categoryDisplayName].filter(Boolean);
1975
- })
1976
- );
1977
- };
1978
- var isNonStandardSportsLikeEvent = (event) => {
1979
- const categoryTokens = resolveSportsCategoryTokens(event);
1980
- if ([...categoryTokens].some((token) => ESPORTS_CATEGORY_TOKENS.has(token))) {
1981
- return true;
1982
- }
1983
- if (ESPORTS_TITLE_PATTERN.test(event.title) || SERIES_SCOPE_PATTERN.test(event.title)) {
1984
- return true;
1985
- }
1986
- return event.venueMarkets.some((market) => {
1987
- const question = toTrimmedString(market.question);
1988
- return ESPORTS_TITLE_PATTERN.test(question) || SERIES_SCOPE_PATTERN.test(question);
1989
- });
1990
- };
1991
- var mergeSportsSectionMarketsIntoEvent = ({
1992
- event,
1993
- sectionMarketsByKey
1994
- }) => {
1995
- const orderedVenueMarkets = [...event.venueMarkets];
1996
- const seenMarketIds = new Set(orderedVenueMarkets.map((market) => market.id));
1997
- for (const markets of Object.values(sectionMarketsByKey)) {
1998
- for (const market of markets != null ? markets : []) {
1999
- if (seenMarketIds.has(market.id)) continue;
2000
- seenMarketIds.add(market.id);
2001
- orderedVenueMarkets.push(market);
2002
- }
2003
- }
2004
- return __spreadProps(__spreadValues({}, event), { venueMarkets: orderedVenueMarkets });
2005
- };
2006
-
2007
- // src/pages/event-market/sports-market-card.tsx
2008
- import {
2009
- MarketStatus,
2010
- resolveMarketTradingState,
2011
- useEventTradingContext,
2012
- useLabels as useLabels6,
2013
- useSdkUiConfig as useSdkUiConfig2
2014
- } from "@agg-build/hooks";
2015
- import { useEffect as useEffect3, useMemo as useMemo2, useRef as useRef2, useState as useState4 } from "react";
2016
-
2017
- // src/pages/event-market/sports-line-rail.tsx
2018
- import * as React from "react";
2019
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
2020
- function VenueRow({ venues, active }) {
2021
- if (!venues || venues.length === 0) return /* @__PURE__ */ jsx4("span", { className: "h-4" });
2022
- const shown = venues.length > 3 ? venues.slice(0, 2) : venues;
2023
- const extra = venues.length - shown.length;
2024
- return /* @__PURE__ */ jsxs4(
2025
- "span",
2026
- {
2027
- className: cn(
2028
- "flex h-4 items-center justify-center gap-1",
2029
- !active && "text-agg-muted-foreground"
2030
- ),
2031
- children: [
2032
- shown.map((venue, index) => /* @__PURE__ */ jsx4(
2033
- VenueLogo,
2034
- {
2035
- venue,
2036
- isMonochromatic: !active,
2037
- size: "small",
2038
- className: "size-3! shrink-0"
2039
- },
2040
- `${venue}-${index}`
2041
- )),
2042
- extra > 0 && /* @__PURE__ */ jsxs4("span", { className: "text-[10px] font-agg-bold uppercase leading-[14px] text-agg-muted-foreground", children: [
2043
- "+",
2044
- extra
2045
- ] })
2046
- ]
2047
- }
2048
- );
2049
- }
2050
- function SportsLineRail({
2051
- stops,
2052
- selectedIndex,
2053
- onSelect,
2054
- ariaLabel,
2055
- previousAriaLabel,
2056
- nextAriaLabel,
2057
- className
2058
- }) {
2059
- const scrollRef = React.useRef(null);
2060
- const itemRefs = React.useRef([]);
2061
- const didInit = React.useRef(false);
2062
- const programmatic = React.useRef(false);
2063
- const progTimer = React.useRef(void 0);
2064
- const skipCenterForIndex = React.useRef(null);
2065
- const pendingScrollIndex = React.useRef(null);
2066
- const scrollSettleTimer = React.useRef(void 0);
2067
- const stopCount = stops.length;
2068
- const [pad, setPad] = React.useState({ left: 0, right: 0 });
2069
- const [mask, setMask] = React.useState({ left: false, right: false });
2070
- const updateMask = React.useCallback(() => {
2071
- const c = scrollRef.current;
2072
- if (!c || !c.clientWidth) return;
2073
- setMask({
2074
- left: c.scrollLeft > 1,
2075
- right: c.scrollLeft + c.clientWidth < c.scrollWidth - 1
2076
- });
2077
- }, []);
2078
- const resolveNearestIndexToViewportCenter = React.useCallback(() => {
2079
- const container = scrollRef.current;
2080
- if (!container || !container.clientWidth) return null;
2081
- const viewportCenter = container.scrollLeft + container.clientWidth / 2;
2082
- let nearestIndex = null;
2083
- let nearestDistance = Number.POSITIVE_INFINITY;
2084
- itemRefs.current.forEach((item, index) => {
2085
- if (!item) return;
2086
- const itemCenter = item.offsetLeft + item.offsetWidth / 2;
2087
- const distance = Math.abs(itemCenter - viewportCenter);
2088
- if (distance < nearestDistance) {
2089
- nearestDistance = distance;
2090
- nearestIndex = index;
2091
- }
2092
- });
2093
- return nearestIndex;
2094
- }, []);
2095
- React.useLayoutEffect(() => {
2096
- const c = scrollRef.current;
2097
- if (!c) return;
2098
- const measure = () => {
2099
- var _a, _b, _c, _d;
2100
- const w = c.clientWidth;
2101
- if (!w) return;
2102
- const firstW = (_b = (_a = itemRefs.current[0]) == null ? void 0 : _a.offsetWidth) != null ? _b : 0;
2103
- const lastW = (_d = (_c = itemRefs.current[stopCount - 1]) == null ? void 0 : _c.offsetWidth) != null ? _d : 0;
2104
- const nextPad = {
2105
- left: Math.max(0, w / 2 - firstW / 2),
2106
- right: Math.max(0, w / 2 - lastW / 2)
2107
- };
2108
- setPad((currentPad) => {
2109
- if (currentPad.left === nextPad.left && currentPad.right === nextPad.right) {
2110
- return currentPad;
2111
- }
2112
- return nextPad;
2113
- });
2114
- updateMask();
2115
- };
2116
- const onScroll = () => {
2117
- if (!programmatic.current) {
2118
- const nearestIndex = resolveNearestIndexToViewportCenter();
2119
- if (nearestIndex != null && nearestIndex !== selectedIndex) {
2120
- pendingScrollIndex.current = nearestIndex;
2121
- clearTimeout(scrollSettleTimer.current);
2122
- scrollSettleTimer.current = setTimeout(() => {
2123
- const nextIndex = pendingScrollIndex.current;
2124
- if (nextIndex == null || nextIndex === selectedIndex) return;
2125
- skipCenterForIndex.current = nextIndex;
2126
- onSelect(nextIndex);
2127
- }, 120);
2128
- }
2129
- }
2130
- updateMask();
2131
- };
2132
- measure();
2133
- const ro = new ResizeObserver(measure);
2134
- ro.observe(c);
2135
- c.addEventListener("scroll", onScroll, { passive: true });
2136
- return () => {
2137
- ro.disconnect();
2138
- c.removeEventListener("scroll", onScroll);
2139
- clearTimeout(scrollSettleTimer.current);
2140
- };
2141
- }, [onSelect, resolveNearestIndexToViewportCenter, selectedIndex, stopCount, updateMask]);
2142
- React.useEffect(() => {
2143
- pendingScrollIndex.current = selectedIndex;
2144
- }, [selectedIndex]);
2145
- React.useEffect(() => {
2146
- const c = scrollRef.current;
2147
- const el = itemRefs.current[selectedIndex];
2148
- if (!c || !el || !c.clientWidth) return;
2149
- if (skipCenterForIndex.current === selectedIndex) {
2150
- skipCenterForIndex.current = null;
2151
- updateMask();
2152
- return;
2153
- }
2154
- skipCenterForIndex.current = null;
2155
- const max = c.scrollWidth - c.clientWidth;
2156
- const target = el.offsetLeft - c.clientWidth / 2 + el.clientWidth / 2;
2157
- programmatic.current = true;
2158
- c.scrollTo({
2159
- left: Math.max(0, Math.min(max, target)),
2160
- behavior: didInit.current ? "smooth" : "auto"
2161
- });
2162
- if (pad.left > 0 || pad.right > 0) didInit.current = true;
2163
- clearTimeout(progTimer.current);
2164
- progTimer.current = setTimeout(() => {
2165
- programmatic.current = false;
2166
- }, 500);
2167
- updateMask();
2168
- }, [selectedIndex, stopCount, pad, updateMask]);
2169
- const clampStopIndex = (index) => Math.min(stops.length - 1, Math.max(0, index));
2170
- const handleStopClick = (index) => {
2171
- const next = clampStopIndex(index);
2172
- if (next !== selectedIndex) {
2173
- skipCenterForIndex.current = next;
2174
- }
2175
- onSelect(next);
2176
- };
2177
- const handleStep = (delta) => {
2178
- const next = clampStopIndex(selectedIndex + delta);
2179
- if (next !== selectedIndex) onSelect(next);
2180
- };
2181
- if (stopCount === 0) return null;
2182
- return /* @__PURE__ */ jsxs4(
2183
- "div",
2184
- {
2185
- className: cn("flex items-center justify-center gap-3 px-3 py-3 sm:gap-4 sm:px-5", className),
2186
- "aria-label": ariaLabel,
2187
- children: [
2188
- /* @__PURE__ */ jsx4(
2189
- "button",
2190
- {
2191
- type: "button",
2192
- onClick: () => handleStep(-1),
2193
- disabled: selectedIndex === 0,
2194
- "aria-label": previousAriaLabel != null ? previousAriaLabel : "Previous line",
2195
- className: "flex size-5! shrink-0 cursor-pointer items-center justify-center text-agg-muted-foreground transition-colors hover:text-agg-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary disabled:cursor-not-allowed disabled:opacity-30",
2196
- children: /* @__PURE__ */ jsx4(Icon, { name: "chevron-left", className: "size-4" })
2197
- }
2198
- ),
2199
- /* @__PURE__ */ jsxs4("div", { className: "relative min-w-0 flex-1", children: [
2200
- /* @__PURE__ */ jsx4(
2201
- "div",
2202
- {
2203
- ref: scrollRef,
2204
- style: { paddingLeft: pad.left, paddingRight: pad.right },
2205
- className: "flex items-end gap-1 overflow-x-hidden py-0.5 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
2206
- children: stops.map((stop, index) => {
2207
- const active = index === selectedIndex;
2208
- return /* @__PURE__ */ jsxs4(
2209
- "button",
2210
- {
2211
- type: "button",
2212
- ref: (el) => {
2213
- itemRefs.current[index] = el;
2214
- },
2215
- onClick: () => handleStopClick(index),
2216
- disabled: stop.disabled,
2217
- "aria-pressed": active,
2218
- className: "flex shrink-0 cursor-pointer flex-col items-center gap-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-40",
2219
- children: [
2220
- /* @__PURE__ */ jsx4(
2221
- "span",
2222
- {
2223
- className: cn(
2224
- "flex h-8 min-w-[60px] items-center justify-center rounded-agg-full border px-3 text-agg-sm leading-agg-5 tabular-nums transition-colors",
2225
- active ? "border-agg-primary bg-agg-secondary font-agg-bold text-agg-foreground" : "border-transparent bg-agg-secondary text-agg-muted-foreground hover:bg-agg-secondary-hover hover:text-agg-foreground"
2226
- ),
2227
- children: stop.value
2228
- }
2229
- ),
2230
- /* @__PURE__ */ jsx4(VenueRow, { venues: stop.venues, active })
2231
- ]
2232
- },
2233
- index
2234
- );
2235
- })
2236
- }
2237
- ),
2238
- /* @__PURE__ */ jsx4(
2239
- "span",
2240
- {
2241
- className: cn(
2242
- "pointer-events-none absolute inset-y-0 left-0 w-8 bg-gradient-to-r from-agg-secondary to-transparent transition-opacity duration-200",
2243
- mask.left ? "opacity-100" : "opacity-0"
2244
- )
2245
- }
2246
- ),
2247
- /* @__PURE__ */ jsx4(
2248
- "span",
2249
- {
2250
- className: cn(
2251
- "pointer-events-none absolute inset-y-0 right-0 w-8 bg-gradient-to-l from-agg-secondary to-transparent transition-opacity duration-200",
2252
- mask.right ? "opacity-100" : "opacity-0"
2253
- )
2254
- }
2255
- )
2256
- ] }),
2257
- /* @__PURE__ */ jsx4(
2258
- "button",
2259
- {
2260
- type: "button",
2261
- onClick: () => handleStep(1),
2262
- disabled: selectedIndex === stopCount - 1,
2263
- "aria-label": nextAriaLabel != null ? nextAriaLabel : "Next line",
2264
- className: "flex size-5! shrink-0 cursor-pointer items-center justify-center text-agg-muted-foreground transition-colors hover:text-agg-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary disabled:cursor-not-allowed disabled:opacity-30",
2265
- children: /* @__PURE__ */ jsx4(Icon, { name: "chevron-right", className: "size-4" })
2266
- }
2267
- )
2268
- ]
2269
- }
2270
- );
2271
- }
2272
-
2273
- // src/pages/event-market/sports-market-card.tsx
2274
- import { jsx as jsx5 } from "react/jsx-runtime";
2275
- var resolveSpreadHeaderOutcomeItems = ({
2276
- market,
2277
- groupMarkets,
2278
- midpointsResult
2279
- }) => {
2280
- var _a;
2281
- const outcomes = (_a = market.venueMarketOutcomes) != null ? _a : [];
2282
- const lineValue = market.lineValue;
2283
- if (outcomes.length < 2 || lineValue == null) return void 0;
2284
- const { favored, dog } = resolveSpreadOutcomeTeamNames(market, groupMarkets);
2285
- if (!favored && !dog) return void 0;
2286
- const magnitude = Math.abs(lineValue);
2287
- const formatLine = (value) => `${value > 0 ? "+" : "\u2212"}${Number.isInteger(magnitude) ? String(magnitude) : magnitude.toFixed(1)}`;
2288
- const isDogLeg = isSpreadUnderdogLeg(market);
2289
- return [
2290
- { index: isDogLeg ? 1 : 0, name: favored, signedLine: -magnitude, tone: "positive" },
2291
- { index: isDogLeg ? 0 : 1, name: dog, signedLine: magnitude, tone: "negative" }
2292
- ].flatMap(({ index, name, signedLine, tone }) => {
2293
- var _a2;
2294
- const outcome = outcomes[index];
2295
- if (!outcome) return [];
2296
- const label = name != null ? name : outcome.label.trim();
2297
- const probability = midpointsResult == null ? void 0 : getDisplayOutcomePrice({
2298
- outcomeId: outcome.id,
2299
- outcomeLabel: outcome.label,
2300
- bestMidpointsByOutcomeId: (_a2 = midpointsResult.bestMidpointsByOutcomeId) != null ? _a2 : midpointsResult.prices
2301
- });
2302
- return [
2303
- {
2304
- id: outcome.id,
2305
- label,
2306
- title: label,
2307
- lineLabel: formatLine(signedLine),
2308
- probability,
2309
- isPriceLoading: (midpointsResult == null ? void 0 : midpointsResult.isLoading) === true && probability == null,
2310
- tone,
2311
- variant: "line",
2312
- venue: market.venue
2313
- }
2314
- ];
2315
- });
2316
- };
2317
- var resolveDisplayedOutcomes = ({
2318
- market,
2319
- venueMarkets,
2320
- groupMarkets,
2321
- useSpreadOverride
2322
- }) => {
2323
- var _a;
2324
- const spreadHeaderOutcomeItems = useSpreadOverride ? resolveSpreadHeaderOutcomeItems({ market, groupMarkets }) : void 0;
2325
- const resolvedMarket = resolveMarketFromVenueMarkets(venueMarkets, market.id);
2326
- const headerOutcomeItems = spreadHeaderOutcomeItems != null ? spreadHeaderOutcomeItems : resolveHeaderOutcomeItems(
2327
- (_a = resolvedMarket == null ? void 0 : resolvedMarket.venueMarkets) != null ? _a : [market],
2328
- market,
2329
- resolveSportsMarketCardVariant(market)
2330
- );
2331
- return headerOutcomeItems.flatMap((item) => {
2332
- const outcome = market.venueMarketOutcomes.find((candidate) => candidate.id === item.id);
2333
- return outcome ? [outcome] : [];
2334
- });
2335
- };
2336
- var resolveSelectedOutcomeSide = ({
2337
- displayedOutcomes,
2338
- selectedOutcomeId
2339
- }) => {
2340
- const selectedOutcomeIndex = displayedOutcomes.findIndex(
2341
- (outcome) => outcome.id === selectedOutcomeId
2342
- );
2343
- if (selectedOutcomeIndex === 0) return "left";
2344
- if (selectedOutcomeIndex === 1) return "right";
2345
- return null;
2346
- };
2347
- var resolveOutcomeBySide = (displayedOutcomes, side) => {
2348
- var _a;
2349
- return (_a = displayedOutcomes[side === "right" ? 1 : 0]) != null ? _a : displayedOutcomes[0];
2350
- };
2351
- var SportsMarketCard = ({
2352
- group,
2353
- venueMarkets,
2354
- isExpanded,
2355
- onToggle,
2356
- onOutcomeSelect,
2357
- live,
2358
- midpointsFallback,
2359
- midpointsFallbackVenues,
2360
- midpointsResult
2361
- }) => {
2362
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
2363
- const labels = useLabels6();
2364
- const {
2365
- formatting: { formatCompactCurrency }
2366
- } = useSdkUiConfig2();
2367
- const tradingContext = useEventTradingContext();
2368
- const linePrices = (_a = midpointsResult == null ? void 0 : midpointsResult.bestMidpointsByOutcomeId) != null ? _a : midpointsResult == null ? void 0 : midpointsResult.prices;
2369
- const slide = useMemo2(() => buildSportsSlideFromGroup(group, linePrices), [group, linePrices]);
2370
- const [selectedLineIndex, setSelectedLineIndex] = useState4(slide.defaultStopIndex);
2371
- const userPickedLineRef = useRef2(false);
2372
- const autoLineIndexRef = useRef2(slide.defaultStopIndex);
2373
- const autoSelectedMarketIdRef = useRef2(null);
2374
- const combinedLegs = useMemo2(() => resolveSportsCombinedLegs(group), [group]);
2375
- const isCombinedLegGroup = combinedLegs != null;
2376
- const combinedLegMarkets = useMemo2(
2377
- () => {
2378
- var _a2;
2379
- return (_a2 = combinedLegs == null ? void 0 : combinedLegs.map((leg) => leg.market)) != null ? _a2 : [];
2380
- },
2381
- [combinedLegs]
2382
- );
2383
- const preferredResolvedLegMarket = useMemo2(() => {
2384
- var _a2, _b2;
2385
- const resolvedYesWinnerMarket = (_a2 = combinedLegMarkets.find(
2386
- (market) => market.venueMarketOutcomes.some(
2387
- (outcome) => outcome.winner === true && outcome.label.trim().toLowerCase() === "yes"
2388
- )
2389
- )) != null ? _a2 : null;
2390
- if (resolvedYesWinnerMarket) return resolvedYesWinnerMarket;
2391
- return (_b2 = combinedLegMarkets.find(
2392
- (market) => market.venueMarketOutcomes.some((outcome) => outcome.winner === true)
2393
- )) != null ? _b2 : null;
2394
- }, [combinedLegMarkets]);
2395
- useEffect3(() => {
2396
- if (!slide.hasLadder) return;
2397
- const tradingMarketId = tradingContext == null ? void 0 : tradingContext.selectedMarketId;
2398
- if (!tradingMarketId) return;
2399
- const matchedIndex = slide.stops.findIndex((stop) => stop.market.id === tradingMarketId);
2400
- if (matchedIndex >= 0) setSelectedLineIndex(matchedIndex);
2401
- }, [slide.hasLadder, slide.stops, tradingContext == null ? void 0 : tradingContext.selectedMarketId]);
2402
- useEffect3(() => {
2403
- var _a2;
2404
- if (!slide.hasLadder || userPickedLineRef.current) return;
2405
- const nextIndex = slide.defaultStopIndex;
2406
- if (nextIndex === autoLineIndexRef.current) return;
2407
- const tradingIndex = slide.stops.findIndex(
2408
- (stop) => stop.market.id === (tradingContext == null ? void 0 : tradingContext.selectedMarketId)
2409
- );
2410
- if (tradingIndex >= 0 && (tradingContext == null ? void 0 : tradingContext.selectedMarketId) !== autoSelectedMarketIdRef.current) {
2411
- return;
2412
- }
2413
- autoLineIndexRef.current = nextIndex;
2414
- setSelectedLineIndex(nextIndex);
2415
- const nextMarket = (_a2 = slide.stops[nextIndex]) == null ? void 0 : _a2.market;
2416
- if (tradingIndex >= 0 && nextMarket) {
2417
- autoSelectedMarketIdRef.current = nextMarket.id;
2418
- tradingContext == null ? void 0 : tradingContext.selectMarket(nextMarket.id, nextMarket);
2419
- }
2420
- }, [slide.hasLadder, slide.defaultStopIndex, slide.stops, tradingContext]);
2421
- const activeLegMarket = isCombinedLegGroup ? preferredResolvedLegMarket != null ? preferredResolvedLegMarket : (tradingContext == null ? void 0 : tradingContext.selectedMarketId) ? (_b = group.markets.find((market) => market.id === tradingContext.selectedMarketId)) != null ? _b : null : null : null;
2422
- const activeMarket = slide.hasLadder ? (_e = (_d = (_c = slide.stops[selectedLineIndex]) == null ? void 0 : _c.market) != null ? _d : group.markets[0]) != null ? _e : null : (_g = (_f = activeLegMarket != null ? activeLegMarket : combinedLegMarkets[0]) != null ? _f : group.markets[0]) != null ? _g : null;
2423
- const activeDefaultOutcome = isCombinedLegGroup && activeMarket ? (_h = activeMarket.venueMarketOutcomes.find(
2424
- (outcome) => outcome.label.trim().toLowerCase() === "yes"
2425
- )) != null ? _h : activeMarket.venueMarketOutcomes[0] : activeMarket == null ? void 0 : activeMarket.venueMarketOutcomes[0];
2426
- const wasExpandedRef = useRef2(isExpanded);
2427
- useEffect3(() => {
2428
- const justOpened = isExpanded && !wasExpandedRef.current;
2429
- wasExpandedRef.current = isExpanded;
2430
- if (!justOpened || !activeMarket) return;
2431
- if (resolveMarketTradingState(activeMarket).isTradingDisabled) return;
2432
- const selectedOutcomeId = tradingContext == null ? void 0 : tradingContext.selectedOutcomeId;
2433
- const hasInScopeOutcome = selectedOutcomeId != null && activeMarket.venueMarketOutcomes.some((outcome) => outcome.id === selectedOutcomeId);
2434
- if (hasInScopeOutcome) return;
2435
- const firstOutcome = activeDefaultOutcome;
2436
- if (firstOutcome) {
2437
- autoSelectedMarketIdRef.current = activeMarket.id;
2438
- tradingContext == null ? void 0 : tradingContext.selectMarketAndOutcome(activeMarket.id, firstOutcome.id);
2439
- }
2440
- }, [activeDefaultOutcome, isExpanded, activeMarket, tradingContext]);
2441
- const combinedLegHeaderOutcomeItems = useMemo2(() => {
2442
- if (!combinedLegs) return void 0;
2443
- return combinedLegs.flatMap(({ label, market }, index) => {
2444
- var _a2;
2445
- const yesOutcome = market.venueMarketOutcomes.find(
2446
- (outcome) => outcome.label.trim().toLowerCase() === "yes"
2447
- );
2448
- if (!yesOutcome) return [];
2449
- const probability = midpointsResult == null ? void 0 : getDisplayOutcomePrice({
2450
- outcomeId: yesOutcome.id,
2451
- outcomeLabel: yesOutcome.label,
2452
- bestMidpointsByOutcomeId: (_a2 = midpointsResult.bestMidpointsByOutcomeId) != null ? _a2 : midpointsResult.prices
2453
- });
2454
- return [
2455
- {
2456
- id: yesOutcome.id,
2457
- label,
2458
- title: label,
2459
- probability,
2460
- isPriceLoading: (midpointsResult == null ? void 0 : midpointsResult.isLoading) === true && probability == null,
2461
- tone: index === 0 ? "positive" : "negative",
2462
- variant: "outcome",
2463
- venue: market.venue
2464
- }
2465
- ];
2466
- });
2467
- }, [combinedLegs, midpointsResult]);
2468
- const spreadHeaderOutcomeItems = useMemo2(() => {
2469
- if (slide.kind !== "spread" || !activeMarket) return void 0;
2470
- return resolveSpreadHeaderOutcomeItems({
2471
- market: activeMarket,
2472
- groupMarkets: group.markets,
2473
- midpointsResult
2474
- });
2475
- }, [slide.kind, activeMarket, group.markets, midpointsResult]);
2476
- if (!activeMarket) return null;
2477
- const selectedStop = slide.hasLadder ? slide.stops[selectedLineIndex] : void 0;
2478
- const cardTitle = selectedStop ? resolveSportsLadderTitle(group, selectedStop.value) : group.title;
2479
- const activeOutcome = (_i = activeMarket.venueMarketOutcomes.find(
2480
- (outcome) => outcome.id === (tradingContext == null ? void 0 : tradingContext.selectedOutcomeId)
2481
- )) != null ? _i : activeDefaultOutcome;
2482
- const activeOutcomeVenueCount = (() => {
2483
- var _a2, _b2;
2484
- if (!activeOutcome) return collectVenueNames(activeMarket).length;
2485
- const venueNames = /* @__PURE__ */ new Set([activeMarket.venue]);
2486
- for (const matchedOutcome of (_a2 = activeOutcome.matchedVenueMarketOutcomes) != null ? _a2 : []) {
2487
- const matchedVenueMarket = (_b2 = activeMarket.matchedVenueMarkets) == null ? void 0 : _b2.find(
2488
- (market) => market.id === matchedOutcome.venueMarketId
2489
- );
2490
- if (matchedVenueMarket == null ? void 0 : matchedVenueMarket.venue) {
2491
- venueNames.add(matchedVenueMarket.venue);
2492
- }
2493
- }
2494
- return venueNames.size > 0 ? venueNames.size : collectVenueNames(activeMarket).length;
2495
- })();
2496
- const activeMarketVolume = resolveSportsExpandedMarketsVolume([activeMarket]);
2497
- const totalGroupVolume = resolveSportsExpandedMarketsVolume(group.markets);
2498
- const compactSubtitle = `${activeOutcomeVenueCount} ${activeOutcomeVenueCount === 1 ? labels.marketDetails.meta.venueSingular : labels.marketDetails.meta.venuePlural} \xB7 ${formatCompactCurrency(activeMarketVolume || resolveTotalGroupVolume([activeMarket]))} ${labels.eventMarketPage.sports.volumeShort} \xB7 ${formatCompactCurrency(totalGroupVolume || resolveTotalGroupVolume(group.markets))} ${labels.eventMarketPage.sports.totalVolumeShort}`;
2499
- const headerOutcomeItemsOverride = combinedLegHeaderOutcomeItems != null ? combinedLegHeaderOutcomeItems : spreadHeaderOutcomeItems;
2500
- const headerOutcomeVariant = isCombinedLegGroup ? "outcome" : resolveSportsMarketCardVariant(activeMarket);
2501
- const handleLineSelect = (index) => {
2502
- var _a2, _b2, _c2;
2503
- const targetMarket = (_a2 = slide.stops[index]) == null ? void 0 : _a2.market;
2504
- if (!targetMarket) return;
2505
- const selectedMarket = (_c2 = (_b2 = tradingContext == null ? void 0 : tradingContext.selectedMarket) != null ? _b2 : venueMarkets.find((market) => market.id === (tradingContext == null ? void 0 : tradingContext.selectedMarketId))) != null ? _c2 : null;
2506
- const selectedMarketIsInGroup = selectedMarket != null && group.markets.some((market) => market.id === selectedMarket.id);
2507
- const selectedSide = selectedMarket ? resolveSelectedOutcomeSide({
2508
- displayedOutcomes: resolveDisplayedOutcomes({
2509
- market: selectedMarket,
2510
- venueMarkets,
2511
- groupMarkets: group.markets,
2512
- useSpreadOverride: slide.kind === "spread" && selectedMarketIsInGroup
2513
- }),
2514
- selectedOutcomeId: tradingContext == null ? void 0 : tradingContext.selectedOutcomeId
2515
- }) : null;
2516
- const targetDisplayedOutcomes = resolveDisplayedOutcomes({
2517
- market: targetMarket,
2518
- venueMarkets,
2519
- groupMarkets: group.markets,
2520
- useSpreadOverride: slide.kind === "spread"
2521
- });
2522
- const nextOutcome = resolveOutcomeBySide(targetDisplayedOutcomes, selectedSide != null ? selectedSide : "left");
2523
- userPickedLineRef.current = true;
2524
- setSelectedLineIndex(index);
2525
- if (nextOutcome) {
2526
- tradingContext == null ? void 0 : tradingContext.selectMarketAndOutcome(targetMarket.id, nextOutcome.id);
2527
- onOutcomeSelect == null ? void 0 : onOutcomeSelect(group.id, {
2528
- marketId: targetMarket.id,
2529
- outcomeId: nextOutcome.id
2530
- });
2531
- } else {
2532
- tradingContext == null ? void 0 : tradingContext.selectMarket(targetMarket.id, targetMarket);
2533
- }
2534
- };
2535
- return /* @__PURE__ */ jsx5(
2536
- MarketDetails,
2537
- {
2538
- marketId: activeMarket.id,
2539
- venueMarkets,
2540
- title: cardTitle,
2541
- compactHeader: true,
2542
- subtitleOverride: compactSubtitle,
2543
- headerOutcomeVariant,
2544
- headerOutcomeItemsOverride,
2545
- isOpened: isExpanded,
2546
- suppressOutcomeFallbackSelection: activeMarket.id !== (tradingContext == null ? void 0 : tradingContext.selectedMarketId),
2547
- onOpenChange: () => onToggle(group.id, activeMarket),
2548
- onOutcomeSelect: (selection) => onOutcomeSelect == null ? void 0 : onOutcomeSelect(group.id, selection),
2549
- headerAccessory: slide.hasLadder ? /* @__PURE__ */ jsx5(
2550
- SportsLineRail,
2551
- {
2552
- stops: slide.stops.map((stop) => ({
2553
- value: stop.value,
2554
- venues: stop.venues,
2555
- disabled: stop.market.status !== MarketStatus.open
2556
- })),
2557
- selectedIndex: selectedLineIndex,
2558
- onSelect: handleLineSelect,
2559
- ariaLabel: labels.eventMarketPage.sports.lineSelectorAria(cardTitle),
2560
- previousAriaLabel: labels.eventMarketPage.sports.previousLineAria(cardTitle),
2561
- nextAriaLabel: labels.eventMarketPage.sports.nextLineAria(cardTitle)
2562
- }
2563
- ) : void 0,
2564
- classNames: { root: "agg-market-list-item agg-sports-market-card" },
2565
- live,
2566
- midpointsFallback,
2567
- midpointsFallbackVenues,
2568
- midpointsResult
2569
- }
2570
- );
2571
- };
2572
- SportsMarketCard.displayName = "SportsMarketCard";
2573
-
2574
- // src/pages/event-market/sports-markets.tsx
2575
- import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
2576
- var STAT_LABEL_OVERRIDES = {
2577
- rbis: "RBIs",
2578
- hits_runs_rbis: "Hits + Runs + RBIs",
2579
- ot: "OT"
2580
- };
2581
- var formatStatLabel = (stat) => {
2582
- var _a;
2583
- return (_a = STAT_LABEL_OVERRIDES[stat]) != null ? _a : stat.split("_").filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
2584
- };
2585
- var LEGACY_STAT_LABEL_KEYS = {
2586
- corners: "cornersTab",
2587
- goals: "goalsTab",
2588
- assists: "assistsTab",
2589
- shots: "shotsTab"
2590
- };
2591
- var SPORTS_PERIOD_LABEL_KEYS = {
2592
- full: "fullPeriod",
2593
- "1h": "firstHalfPeriod",
2594
- "2h": "secondHalfPeriod",
2595
- q1: "quarterOnePeriod",
2596
- q2: "quarterTwoPeriod",
2597
- q3: "quarterThreePeriod",
2598
- q4: "quarterFourPeriod",
2599
- ot: "overtimePeriod"
2600
- };
2601
- var resolveSportsPeriodLabel = (labels, period) => {
2602
- var _a;
2603
- const sports = labels.eventMarketPage.sports;
2604
- const labelKey = SPORTS_PERIOD_LABEL_KEYS[period];
2605
- if (labelKey && typeof sports[labelKey] === "string") return sports[labelKey];
2606
- return (_a = formatSportsPeriodGrammarLabel(period)) != null ? _a : formatStatLabel(period);
2607
- };
2608
- var resolveSportsSectionLabel = (labels, tab) => {
2609
- var _a, _b, _c, _d, _e;
2610
- const sports = labels.eventMarketPage.sports;
2611
- switch (tab.kind) {
2612
- case "game_lines":
2613
- return sports.gameLinesTab;
2614
- case "exact_score":
2615
- return sports.exactScoreTab;
2616
- case "other":
2617
- return sports.otherTab;
2618
- case "stat": {
2619
- if (tab.stat === "player_props") return sports.playerPropsTab;
2620
- const legacyLabelKey = tab.stat ? LEGACY_STAT_LABEL_KEYS[tab.stat] : void 0;
2621
- return legacyLabelKey ? sports[legacyLabelKey] : formatStatLabel((_a = tab.stat) != null ? _a : "");
2622
- }
2623
- case "period": {
2624
- switch (tab.periodFamily) {
2625
- case "halves":
2626
- return sports.halvesTab;
2627
- case "quarters":
2628
- return sports.quartersTab;
2629
- case "sets":
2630
- return sports.setsTab;
2631
- default:
2632
- return (_e = (_c = formatSportsPeriodGrammarLabel((_b = tab.periodFamily) != null ? _b : "")) == null ? void 0 : _c.replace(/^First /, "")) != null ? _e : formatStatLabel((_d = tab.periodFamily) != null ? _d : "");
2633
- }
2634
- }
2635
- }
2636
- };
2637
- var SportsTabButton = ({
2638
- isActive,
2639
- label,
2640
- onClick
2641
- }) => {
2642
- return /* @__PURE__ */ jsx6(
2643
- "button",
2644
- {
2645
- type: "button",
2646
- role: "tab",
2647
- "aria-selected": isActive,
2648
- "data-testid": "sports-section-tab",
2649
- className: cn(
2650
- "inline-flex h-9 shrink-0 cursor-pointer items-center justify-center rounded-agg-full border px-4 text-agg-sm leading-agg-5 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary focus-visible:ring-offset-2 focus-visible:ring-offset-agg-secondary",
2651
- isActive ? "border-agg-primary bg-agg-secondary font-agg-bold text-agg-foreground" : "border-transparent bg-agg-secondary-hover font-agg-normal text-agg-foreground hover:bg-agg-tertiary"
2652
- ),
2653
- onClick,
2654
- children: label
2655
- }
2656
- );
2657
- };
2658
- var SportsMarketsLoadingState = () => {
2659
- const labels = useLabels7();
2660
- return /* @__PURE__ */ jsxs5(
2661
- "div",
2662
- {
2663
- className: "flex flex-col gap-3",
2664
- role: "status",
2665
- "aria-label": labels.eventMarketPage.sports.loadingTitle,
2666
- children: [
2667
- /* @__PURE__ */ jsx6("span", { className: "sr-only", children: labels.eventMarketPage.sports.loadingDescription }),
2668
- Array.from({ length: 3 }).map((_, index) => /* @__PURE__ */ jsxs5(
2669
- "div",
2670
- {
2671
- className: "flex min-h-[76px] animate-pulse flex-col gap-3 rounded-agg-2xl border border-agg-separator bg-agg-secondary px-5 py-3 sm:flex-row sm:items-center sm:justify-between",
2672
- children: [
2673
- /* @__PURE__ */ jsxs5("div", { className: "flex flex-col gap-2", children: [
2674
- /* @__PURE__ */ jsx6("div", { className: "h-5 w-32 rounded-agg-sm bg-agg-secondary-hover" }),
2675
- /* @__PURE__ */ jsx6("div", { className: "h-4 w-40 rounded-agg-sm bg-agg-secondary-hover" })
2676
- ] }),
2677
- /* @__PURE__ */ jsxs5("div", { className: "flex gap-2", children: [
2678
- /* @__PURE__ */ jsx6("div", { className: "h-9 w-32 rounded-agg-full bg-agg-secondary-hover" }),
2679
- /* @__PURE__ */ jsx6("div", { className: "hidden h-9 w-32 rounded-agg-full bg-agg-secondary-hover sm:block" })
2680
- ] })
2681
- ]
2682
- },
2683
- `sports-card-skeleton-${index}`
2684
- ))
2685
- ]
2686
- }
2687
- );
2688
- };
2689
- var SportsMarkets = ({
2690
- event,
2691
- onSectionMarketsChange,
2692
- onOutcomeSelect,
2693
- live,
2694
- midpointsResult,
2695
- minVolume
2696
- }) => {
2697
- var _a, _b;
2698
- const labels = useLabels7();
2699
- const tradingContext = useEventTradingContext2();
2700
- const hasAggKey = Boolean(event.aggKey);
2701
- const gameMarketsQuery = useVenueMarkets({
2702
- aggKey: event.aggKey ? [event.aggKey] : void 0,
2703
- limit: 100,
2704
- status: MarketStatus2.open,
2705
- minVolume,
2706
- enabled: hasAggKey
2707
- });
2708
- const {
2709
- markets: gameMarkets,
2710
- hasNextPage: hasNextGameMarketsPage,
2711
- isFetchingNextPage: isFetchingNextGameMarketsPage,
2712
- fetchNextPage: fetchNextGameMarketsPage
2713
- } = gameMarketsQuery;
2714
- const tabSourceMarkets = useMemo3(() => {
2715
- const seen = /* @__PURE__ */ new Set();
2716
- const merged = [];
2717
- for (const market of [...event.venueMarkets, ...gameMarkets]) {
2718
- if (seen.has(market.id)) continue;
2719
- seen.add(market.id);
2720
- merged.push(market);
2721
- }
2722
- return merged;
2723
- }, [event.venueMarkets, gameMarkets]);
2724
- const visibleTabs = useMemo3(
2725
- () => resolveVisibleSportsSectionTabs(__spreadProps(__spreadValues({}, event), { venueMarkets: tabSourceMarkets })),
2726
- [event, tabSourceMarkets]
2727
- );
2728
- const shouldRenderTabs = visibleTabs.length > 1 && tabSourceMarkets.length > 1;
2729
- const [activeTabKey, setActiveTabKey] = useState5((_b = (_a = visibleTabs[0]) == null ? void 0 : _a.key) != null ? _b : "game_lines");
2730
- const activeTab = useMemo3(
2731
- () => {
2732
- var _a2, _b2;
2733
- return (_b2 = (_a2 = visibleTabs.find((tab) => tab.key === activeTabKey)) != null ? _a2 : visibleTabs[0]) != null ? _b2 : { key: "game_lines", kind: "game_lines" };
2734
- },
2735
- [visibleTabs, activeTabKey]
2736
- );
2737
- const [expandedGroupId, setExpandedGroupId] = useState5(null);
2738
- const [stableMarketsByTab, setStableMarketsByTab] = useState5({});
2739
- const activeTabLabel = resolveSportsSectionLabel(labels, activeTab);
2740
- const sectionFilters = resolveSportsSectionFilters(activeTab);
2741
- const sectionMarketsQuery = useVenueMarkets({
2742
- aggKey: event.aggKey ? [event.aggKey] : void 0,
2743
- sportsMarketType: sectionFilters.sportsMarketType,
2744
- period: sectionFilters.period,
2745
- marketCategory: sectionFilters.marketCategory,
2746
- marketGroup: sectionFilters.marketGroup,
2747
- // The per-tab section fetch paginates; a large page (schema max) collapses a
2748
- // heavy tab (e.g. "Other" spans other/team_props/player_props/specials/
2749
- // completion — hundreds of markets on prop-rich events) from ~15 calls to 1-3.
2750
- limit: 100,
2751
- status: MarketStatus2.open,
2752
- minVolume,
2753
- enabled: hasAggKey
2754
- });
2755
- const {
2756
- markets: sectionMarkets,
2757
- isLoading: isSectionLoading,
2758
- hasNextPage,
2759
- isFetchingNextPage,
2760
- fetchNextPage
2761
- } = sectionMarketsQuery;
2762
- const resolvedSectionMarkets = useMemo3(
2763
- () => resolveSportsSectionMarkets({
2764
- tab: activeTab,
2765
- eventMarkets: tabSourceMarkets,
2766
- sectionMarkets,
2767
- sport: event.sport
2768
- }),
2769
- [activeTab, tabSourceMarkets, sectionMarkets, event.sport]
2770
- );
2771
- const isSectionSettled = !isSectionLoading && !hasNextPage && !isFetchingNextPage;
2772
- const stableSectionMarkets = stableMarketsByTab[activeTabKey];
2773
- const displayedSectionMarkets = useMemo3(
2774
- () => stableSectionMarkets != null ? stableSectionMarkets : isSectionSettled ? resolvedSectionMarkets : [],
2775
- [stableSectionMarkets, isSectionSettled, resolvedSectionMarkets]
2776
- );
2777
- const periodGroups = useMemo3(
2778
- () => groupSportsMarketsByPeriod(displayedSectionMarkets, event.sport),
2779
- [displayedSectionMarkets, event.sport]
2780
- );
2781
- const allGroups = useMemo3(
2782
- () => periodGroups.flatMap((periodGroup) => periodGroup.groups),
2783
- [periodGroups]
2784
- );
2785
- useEffect4(() => {
2786
- if (hasNextPage && !isFetchingNextPage) {
2787
- void fetchNextPage();
2788
- }
2789
- }, [hasNextPage, isFetchingNextPage, fetchNextPage]);
2790
- useEffect4(() => {
2791
- if (hasNextGameMarketsPage && !isFetchingNextGameMarketsPage) {
2792
- void fetchNextGameMarketsPage();
2793
- }
2794
- }, [hasNextGameMarketsPage, isFetchingNextGameMarketsPage, fetchNextGameMarketsPage]);
2795
- useEffect4(() => {
2796
- if (!isSectionSettled) return;
2797
- setStableMarketsByTab((currentStableMarketsByTab) => {
2798
- var _a2;
2799
- const currentMarkets = (_a2 = currentStableMarketsByTab[activeTabKey]) != null ? _a2 : [];
2800
- if (currentMarkets.length === resolvedSectionMarkets.length && currentMarkets.every((market, index) => {
2801
- var _a3;
2802
- return market.id === ((_a3 = resolvedSectionMarkets[index]) == null ? void 0 : _a3.id);
2803
- })) {
2804
- return currentStableMarketsByTab;
2805
- }
2806
- return __spreadProps(__spreadValues({}, currentStableMarketsByTab), {
2807
- [activeTabKey]: resolvedSectionMarkets
2808
- });
2809
- });
2810
- }, [activeTabKey, isSectionSettled, resolvedSectionMarkets]);
2811
- useEffect4(() => {
2812
- if (!hasAggKey) return;
2813
- onSectionMarketsChange(activeTabKey, displayedSectionMarkets);
2814
- }, [activeTabKey, displayedSectionMarkets, hasAggKey, onSectionMarketsChange]);
2815
- useEffect4(() => {
2816
- var _a2, _b2;
2817
- if (visibleTabs.some((tab) => tab.key === activeTabKey)) return;
2818
- setActiveTabKey((_b2 = (_a2 = visibleTabs[0]) == null ? void 0 : _a2.key) != null ? _b2 : "game_lines");
2819
- }, [activeTabKey, visibleTabs]);
2820
- const lastActiveTabRef = useRef3(null);
2821
- useEffect4(() => {
2822
- if (allGroups.length === 0) return;
2823
- if (lastActiveTabRef.current !== activeTabKey) {
2824
- lastActiveTabRef.current = activeTabKey;
2825
- setExpandedGroupId(null);
2826
- return;
2827
- }
2828
- if (expandedGroupId && !allGroups.some((group) => group.id === expandedGroupId)) {
2829
- setExpandedGroupId(null);
2830
- }
2831
- }, [activeTabKey, allGroups, expandedGroupId]);
2832
- const handleToggleGroup = (groupId, market) => {
2833
- if (groupId === expandedGroupId) {
2834
- setExpandedGroupId(null);
2835
- return;
2836
- }
2837
- setExpandedGroupId(groupId);
2838
- if (resolveMarketTradingState2(market).isTradingDisabled) return;
2839
- if (market.id !== (tradingContext == null ? void 0 : tradingContext.selectedMarketId)) {
2840
- tradingContext == null ? void 0 : tradingContext.selectMarket(market.id, market);
2841
- }
2842
- };
2843
- const handleGroupOutcomeSelect = (groupId) => {
2844
- setExpandedGroupId(groupId);
2845
- onOutcomeSelect == null ? void 0 : onOutcomeSelect();
2846
- };
2847
- if (!hasAggKey && event.venueMarkets.length === 0) {
2848
- return /* @__PURE__ */ jsx6(
2849
- StateMessage,
2850
- {
2851
- title: labels.eventMarketPage.sports.emptyTitle,
2852
- description: labels.eventMarketPage.unavailableDescription,
2853
- icon: /* @__PURE__ */ jsx6(Icon, { name: "warning", className: "h-10 w-10 text-agg-warning" }),
2854
- classNames: { root: "min-h-[220px]" }
2855
- }
2856
- );
2857
- }
2858
- const shouldShowLoadingState = stableSectionMarkets == null && !isSectionSettled;
2859
- return /* @__PURE__ */ jsxs5("div", { className: "flex flex-col gap-3", "data-testid": "sports-markets", children: [
2860
- shouldRenderTabs ? /* @__PURE__ */ jsx6(
2861
- "div",
2862
- {
2863
- role: "tablist",
2864
- "aria-label": labels.eventMarketPage.sports.sectionTabsAria,
2865
- className: "flex flex-nowrap items-center gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
2866
- children: visibleTabs.map((tab) => /* @__PURE__ */ jsx6(
2867
- SportsTabButton,
2868
- {
2869
- isActive: tab.key === activeTabKey,
2870
- label: resolveSportsSectionLabel(labels, tab),
2871
- onClick: () => setActiveTabKey(tab.key)
2872
- },
2873
- tab.key
2874
- ))
2875
- }
2876
- ) : null,
2877
- shouldShowLoadingState ? /* @__PURE__ */ jsx6(SportsMarketsLoadingState, {}) : null,
2878
- !shouldShowLoadingState && allGroups.length === 0 ? /* @__PURE__ */ jsx6(
2879
- StateMessage,
2880
- {
2881
- title: labels.eventMarketPage.sports.emptyTitle,
2882
- description: labels.eventMarketPage.sports.emptyDescription(activeTabLabel),
2883
- icon: /* @__PURE__ */ jsx6(Icon, { name: "search", className: "h-10 w-10 text-agg-muted-foreground" }),
2884
- classNames: { root: "min-h-[220px]" }
2885
- }
2886
- ) : null,
2887
- periodGroups.map((periodGroup) => {
2888
- return /* @__PURE__ */ jsxs5(
2889
- "section",
2890
- {
2891
- className: "flex flex-col gap-3",
2892
- "data-period-key": periodGroup.key,
2893
- children: [
2894
- periodGroups.length > 1 ? /* @__PURE__ */ jsx6(
2895
- "h3",
2896
- {
2897
- "data-testid": "sports-period-heading",
2898
- className: "text-agg-sm font-agg-bold leading-agg-5 text-agg-muted-foreground",
2899
- children: resolveSportsPeriodLabel(labels, periodGroup.key)
2900
- }
2901
- ) : null,
2902
- periodGroup.groups.map((group) => /* @__PURE__ */ jsx6(
2903
- SportsMarketCard,
2904
- {
2905
- group,
2906
- venueMarkets: displayedSectionMarkets,
2907
- isExpanded: expandedGroupId === group.id,
2908
- onToggle: handleToggleGroup,
2909
- onOutcomeSelect: (_groupId, _selection) => handleGroupOutcomeSelect(group.id),
2910
- live,
2911
- midpointsResult
2912
- },
2913
- group.id
2914
- ))
2915
- ]
2916
- },
2917
- `${activeTabKey}-${periodGroup.key}`
2918
- );
2919
- })
2920
- ] });
2921
- };
2922
- SportsMarkets.displayName = "SportsMarkets";
2923
-
2924
- // src/pages/event-market/sports-event-market-page.tsx
2925
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
2926
- var areSportsSectionMarketsEqual = (leftMarkets, rightMarkets) => {
2927
- if (leftMarkets.length !== rightMarkets.length) return false;
2928
- return leftMarkets.every((market, index) => {
2929
- var _a;
2930
- return market.id === ((_a = rightMarkets[index]) == null ? void 0 : _a.id);
2931
- });
2932
- };
2933
- var SportsEventMarketPage = ({
2934
- event,
2935
- defaultMarketId,
2936
- defaultOutcomeId,
2937
- defaultTradeSide,
2938
- defaultChartView,
2939
- classNames,
2940
- ariaLabel,
2941
- showPlaceOrder,
2942
- executionMode,
2943
- stickyOrderPanel,
2944
- resolvedClaim,
2945
- onBeforePrimaryAction,
2946
- sharedKyc
2947
- }) => {
2948
- const {
2949
- market: { minVolume }
2950
- } = useSdkUiConfig3();
2951
- const [sectionMarketsByKey, setSectionMarketsByKey] = useState6({});
2952
- const composedEvent = useMemo4(() => {
2953
- return mergeSportsSectionMarketsIntoEvent({
2954
- event,
2955
- sectionMarketsByKey
2956
- });
2957
- }, [event, sectionMarketsByKey]);
2958
- const eventTradingState = useMemo4(() => resolveEventTradingState2(composedEvent), [composedEvent]);
2959
- const hasSportsSections = useMemo4(
2960
- () => resolveVisibleSportsSectionTabs(event).length > 0,
2961
- [event]
2962
- );
2963
- const stickyOrderPanelState = resolveEventMarketPageStickyState({
2964
- stickyOrderPanel
2965
- });
2966
- const { executionMode: resolvedExecutionMode } = useResolvedExecutionMode(executionMode);
2967
- const [isMobileTradeOpen, setIsMobileTradeOpen] = useState6(false);
2968
- const isMobileViewport = useIsMobileEventMarketViewport(SPORTS_EVENT_MARKET_MEDIA_QUERY);
2969
- const tradingContext = useEventTradingContext3();
2970
- const { stateByEventId: sportsLiveStateByEventId } = useSportsLive([event.id]);
2971
- const midpointsResult = useMidpoints(composedEvent.venueMarkets);
2972
- const internalResolvedClaim = useResolvedMarketClaim({
2973
- market: eventTradingState.primaryMarket,
2974
- enabled: eventTradingState.kind === "resolved",
2975
- executionMode: resolvedExecutionMode
2976
- });
2977
- const effectiveResolvedClaim = resolvedClaim != null ? resolvedClaim : internalResolvedClaim;
2978
- const setTradeSideRef = useRef4(tradingContext == null ? void 0 : tradingContext.setTradeSide);
2979
- setTradeSideRef.current = tradingContext == null ? void 0 : tradingContext.setTradeSide;
2980
- useEffect5(() => {
2981
- return () => {
2982
- var _a;
2983
- (_a = setTradeSideRef.current) == null ? void 0 : _a.call(setTradeSideRef, TradeSide.Buy);
2984
- };
2985
- }, []);
2986
- const handleSectionMarketsChange = useCallback4(
2987
- (tabKey, markets) => {
2988
- setSectionMarketsByKey((currentSectionMarketsByKey) => {
2989
- var _a;
2990
- const currentMarkets = (_a = currentSectionMarketsByKey[tabKey]) != null ? _a : [];
2991
- if (areSportsSectionMarketsEqual(currentMarkets, markets)) {
2992
- return currentSectionMarketsByKey;
2993
- }
2994
- return __spreadProps(__spreadValues({}, currentSectionMarketsByKey), {
2995
- [tabKey]: markets
2996
- });
2997
- });
2998
- },
2999
- []
3000
- );
3001
- if (!composedEvent.venueMarkets.length) {
3002
- return /* @__PURE__ */ jsx7(EventMarketPageUnavailableState, { ariaLabel });
3003
- }
3004
- return /* @__PURE__ */ jsxs6(
3005
- "section",
3006
- {
3007
- className: cn(
3008
- "agg-event-market-page",
3009
- "mx-auto w-full max-w-[1440px] px-4 pb-10 pt-4 sm:px-6 sm:pt-6 xl:px-9 xl:pt-8",
3010
- classNames == null ? void 0 : classNames.root
3011
- ),
3012
- "aria-label": ariaLabel != null ? ariaLabel : composedEvent.title,
3013
- children: [
3014
- /* @__PURE__ */ jsxs6(
3015
- "div",
3016
- {
3017
- className: cn(
3018
- "agg-page-content",
3019
- "flex w-full flex-col gap-6 xl:flex-row xl:items-start xl:gap-[60px]",
3020
- stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.contentClassName,
3021
- classNames == null ? void 0 : classNames.content
3022
- ),
3023
- style: stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.style,
3024
- children: [
3025
- /* @__PURE__ */ jsxs6(
3026
- "div",
3027
- {
3028
- className: cn(
3029
- "agg-page-main mb-10 flex min-w-0 flex-1 flex-col gap-10",
3030
- stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.mainClassName,
3031
- classNames == null ? void 0 : classNames.main
3032
- ),
3033
- children: [
3034
- /* @__PURE__ */ jsx7(
3035
- EventListItemDetails,
3036
- {
3037
- event: composedEvent,
3038
- defaultMarketId,
3039
- defaultOutcomeId,
3040
- defaultTradeSide,
3041
- defaultChartView,
3042
- eventTradingState,
3043
- midpointsResult,
3044
- sportsLiveState: sportsLiveStateByEventId.get(event.id),
3045
- classNames: {
3046
- root: cn("agg-event-hero", classNames == null ? void 0 : classNames.hero),
3047
- // The sports tabs + market cards own market navigation, so hide the
3048
- // hero's per-market selector pills (one per line market would be noise).
3049
- headerPills: "hidden"
3050
- }
3051
- }
3052
- ),
3053
- hasSportsSections ? /* @__PURE__ */ jsx7(
3054
- SportsMarkets,
3055
- {
3056
- event,
3057
- onSectionMarketsChange: handleSectionMarketsChange,
3058
- minVolume: defaultMarketId ? void 0 : minVolume,
3059
- midpointsResult,
3060
- onOutcomeSelect: isMobileViewport ? () => {
3061
- setIsMobileTradeOpen(true);
3062
- } : void 0
3063
- }
3064
- ) : /* @__PURE__ */ jsx7(
3065
- MarketDetailsList,
3066
- {
3067
- eventId: composedEvent.id,
3068
- markets: eventTradingState.displayMarkets,
3069
- eventTradingState,
3070
- live: true,
3071
- expandSelectedMarketOnChange: !isMobileViewport,
3072
- autoExpandFallbackMarket: !isMobileViewport,
3073
- autoSelectFallbackMarket: !isMobileViewport,
3074
- onOutcomeSelect: () => {
3075
- if (!isMobileViewport) return;
3076
- setIsMobileTradeOpen(true);
3077
- },
3078
- classNames: { root: "agg-market-list", item: "agg-market-list-item" },
3079
- midpointsResult
3080
- }
3081
- ),
3082
- showPlaceOrder !== false && eventTradingState.isTradingDisabled ? /* @__PURE__ */ jsx7("div", { className: "xl:hidden", children: /* @__PURE__ */ jsx7(
3083
- PlaceOrder,
3084
- {
3085
- eventTradingState,
3086
- executionMode: resolvedExecutionMode,
3087
- resolvedClaim: effectiveResolvedClaim,
3088
- midpointsResult,
3089
- onBeforePrimaryAction,
3090
- sharedKyc,
3091
- className: cn(
3092
- "agg-mobile-trade-panel w-full overflow-hidden",
3093
- classNames == null ? void 0 : classNames.mobileTrade
3094
- ),
3095
- classNames: resolveMobileTradePlaceOrderClassNames(classNames)
3096
- }
3097
- ) }) : null,
3098
- /* @__PURE__ */ jsx7(SettlementDetails, { eventId: event.id, className: classNames == null ? void 0 : classNames.settlement })
3099
- ]
3100
- }
3101
- ),
3102
- /* @__PURE__ */ jsx7(
3103
- "aside",
3104
- {
3105
- className: cn(
3106
- "agg-sidebar hidden w-full xl:block xl:max-w-[343px] xl:shrink-0",
3107
- stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.sidebarClassName,
3108
- classNames == null ? void 0 : classNames.sidebar
3109
- ),
3110
- children: showPlaceOrder !== false ? /* @__PURE__ */ jsx7(
3111
- PlaceOrder,
3112
- {
3113
- eventTradingState,
3114
- executionMode: resolvedExecutionMode,
3115
- resolvedClaim: effectiveResolvedClaim,
3116
- midpointsResult,
3117
- onBeforePrimaryAction,
3118
- sharedKyc,
3119
- className: cn(stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.placeOrder, classNames == null ? void 0 : classNames.trade),
3120
- classNames: resolveDesktopTradePlaceOrderClassNames(classNames)
3121
- }
3122
- ) : null
3123
- }
3124
- )
3125
- ]
3126
- }
3127
- ),
3128
- !eventTradingState.isTradingDisabled ? /* @__PURE__ */ jsx7(
3129
- EventMarketPageMobileTrade,
3130
- {
3131
- classNames,
3132
- eventTradingState,
3133
- executionMode: resolvedExecutionMode,
3134
- showPlaceOrder,
3135
- isOpen: isMobileTradeOpen,
3136
- onOpenChange: setIsMobileTradeOpen,
3137
- midpointsResult,
3138
- onBeforePrimaryAction,
3139
- sharedKyc
3140
- }
3141
- ) : null
3142
- ]
3143
- }
3144
- );
3145
- };
3146
- SportsEventMarketPage.displayName = "SportsEventMarketPage";
3147
-
3148
- // src/pages/event-market/index.tsx
3149
- import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
3150
- var CLOCK_INTERVAL_MS = 1e3;
3151
- var formatRecurringCountdown = (remainingMs) => {
3152
- if (!Number.isFinite(remainingMs) || remainingMs <= 0) return null;
3153
- const totalSeconds = Math.ceil(remainingMs / 1e3);
3154
- const hours = Math.floor(totalSeconds / 3600);
3155
- const minutes = Math.floor(totalSeconds % 3600 / 60);
3156
- const seconds = totalSeconds % 60;
3157
- const minuteSecondLabel = `${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
3158
- return hours > 0 ? `${hours}:${minuteSecondLabel}` : minuteSecondLabel;
3159
- };
3160
- var useCurrentTimestamp = (enabled) => {
3161
- const [currentTimestamp, setCurrentTimestamp] = useState7(null);
3162
- useEffect6(() => {
3163
- if (!enabled) {
3164
- setCurrentTimestamp(null);
3165
- return;
3166
- }
3167
- const updateCurrentTimestamp = () => {
3168
- setCurrentTimestamp(Date.now());
3169
- };
3170
- updateCurrentTimestamp();
3171
- const intervalId = window.setInterval(updateCurrentTimestamp, CLOCK_INTERVAL_MS);
3172
- document.addEventListener("visibilitychange", updateCurrentTimestamp);
3173
- return () => {
3174
- window.clearInterval(intervalId);
3175
- document.removeEventListener("visibilitychange", updateCurrentTimestamp);
3176
- };
3177
- }, [enabled]);
3178
- return currentTimestamp;
3179
- };
3180
- var EventMarketPageContent = ({
3181
- event,
3182
- defaultMarketId,
3183
- defaultOutcomeId,
3184
- defaultTradeSide,
3185
- defaultChartView,
3186
- classNames,
3187
- ariaLabel,
3188
- showPlaceOrder,
3189
- executionMode,
3190
- stickyOrderPanel,
3191
- resolvedClaim,
3192
- onBeforePrimaryAction,
3193
- sharedKyc,
3194
- onRecurringMarketNavigate
3195
- }) => {
3196
- var _a;
3197
- const eventTradingState = useMemo5(() => resolveEventTradingState3(event), [event]);
3198
- const stickyOrderPanelState = resolveEventMarketPageStickyState({
3199
- stickyOrderPanel
3200
- });
3201
- const { executionMode: resolvedExecutionMode } = useResolvedExecutionMode2(executionMode);
3202
- const [isMobileTradeOpen, setIsMobileTradeOpen] = useState7(false);
3203
- const isMobileViewport = useIsMobileEventMarketViewport();
3204
- const tradingContext = useEventTradingContext4();
3205
- const labels = useLabels8();
3206
- const recurringQuery = useRecurringCryptoMarkets({ event });
3207
- const currentTimestamp = useCurrentTimestamp(recurringQuery.isRecurringCryptoMarket);
3208
- const recurringTimeline = useMemo5(
3209
- () => currentTimestamp == null ? null : resolveRecurringCryptoTimeline(recurringQuery.windows, event, currentTimestamp),
3210
- [currentTimestamp, event, recurringQuery.windows]
3211
- );
3212
- const isRecurringCryptoMarket = (recurringTimeline == null ? void 0 : recurringTimeline.viewed) != null;
3213
- const recurringViewedEndTimestamp = (recurringTimeline == null ? void 0 : recurringTimeline.viewed) ? Date.parse(recurringTimeline.viewed.windowEnd) : Number.NaN;
3214
- const hasViewedMarketEnded = currentTimestamp != null && Number.isFinite(recurringViewedEndTimestamp) && currentTimestamp >= recurringViewedEndTimestamp;
3215
- const isRecurringResolvingMarket = recurringQuery.isRecurringCryptoMarket && eventTradingState.kind === "closed";
3216
- const lastBoundaryRefetchRef = useRef5(null);
3217
- useEffect6(() => {
3218
- lastBoundaryRefetchRef.current = null;
3219
- }, [event.id]);
3220
- useEffect6(() => {
3221
- if (!isRecurringCryptoMarket || !hasViewedMarketEnded || !(recurringTimeline == null ? void 0 : recurringTimeline.viewed)) return;
3222
- const refetchKey = `${event.id}:${recurringTimeline.viewed.windowEnd}`;
3223
- if (lastBoundaryRefetchRef.current === refetchKey) return;
3224
- lastBoundaryRefetchRef.current = refetchKey;
3225
- void recurringQuery.refetch();
3226
- }, [
3227
- event.id,
3228
- hasViewedMarketEnded,
3229
- isRecurringCryptoMarket,
3230
- recurringQuery,
3231
- recurringTimeline == null ? void 0 : recurringTimeline.viewed
3232
- ]);
3233
- const handleRecurringMarketSelect = useCallback5(
3234
- (eventId) => {
3235
- if (!onRecurringMarketNavigate || eventId === event.id) return;
3236
- onRecurringMarketNavigate(eventId, { replace: false });
3237
- },
3238
- [event.id, onRecurringMarketNavigate]
3239
- );
3240
- const handleGoToLive = useCallback5(() => {
3241
- var _a2;
3242
- const liveEventId = (_a2 = recurringTimeline == null ? void 0 : recurringTimeline.live) == null ? void 0 : _a2.venueEventId;
3243
- if (!onRecurringMarketNavigate || !liveEventId || liveEventId === event.id) return;
3244
- onRecurringMarketNavigate(liveEventId, { replace: false });
3245
- }, [event.id, onRecurringMarketNavigate, (_a = recurringTimeline == null ? void 0 : recurringTimeline.live) == null ? void 0 : _a.venueEventId]);
3246
- const recurringMarketsPresentation = useMemo5(() => {
3247
- var _a2, _b;
3248
- if (!isRecurringCryptoMarket || !(recurringTimeline == null ? void 0 : recurringTimeline.viewed)) return void 0;
3249
- const toOption = (market) => {
3250
- var _a3;
3251
- return {
3252
- value: market.venueEventId,
3253
- label: (_a3 = formatRecurringMarketPillTimeEt(market.windowStart)) != null ? _a3 : market.windowStart
3254
- };
3255
- };
3256
- const countdownLabel = ((_a2 = recurringTimeline.live) == null ? void 0 : _a2.venueEventId) === event.id ? formatRecurringCountdown(recurringViewedEndTimestamp - currentTimestamp) : null;
3257
- return {
3258
- visibleOptions: recurringTimeline.visible.map(toOption),
3259
- browseOptions: recurringTimeline.all.map(toOption),
3260
- selectedValue: event.id,
3261
- liveValue: (_b = recurringTimeline.live) == null ? void 0 : _b.venueEventId,
3262
- duration: recurringTimeline.viewed.duration,
3263
- windowLabel: formatRecurringMarketWindowTimeEt(
3264
- recurringTimeline.viewed.windowStart,
3265
- recurringTimeline.viewed.windowEnd
3266
- ),
3267
- countdownLabel,
3268
- countdownAriaLabel: countdownLabel ? labels.eventMarketPage.recurringCountdownAria(countdownLabel) : null,
3269
- isResolving: hasViewedMarketEnded,
3270
- canGoToLive: recurringTimeline.live != null && recurringTimeline.live.venueEventId !== event.id,
3271
- onSelect: handleRecurringMarketSelect,
3272
- onGoToLive: handleGoToLive
3273
- };
3274
- }, [
3275
- currentTimestamp,
3276
- event.id,
3277
- handleGoToLive,
3278
- handleRecurringMarketSelect,
3279
- hasViewedMarketEnded,
3280
- isRecurringCryptoMarket,
3281
- labels.eventMarketPage,
3282
- recurringTimeline,
3283
- recurringViewedEndTimestamp
3284
- ]);
3285
- const eventDetailVenueMarkets = useMemo5(
3286
- () => normalizeVenueMarketCluster(event.venueMarkets),
3287
- [event.venueMarkets]
3288
- );
3289
- const eventDetailVenueMarketIds = useMemo5(
3290
- () => eventDetailVenueMarkets.map((venueMarket) => venueMarket.id),
3291
- [eventDetailVenueMarkets]
3292
- );
3293
- const midpointsResult = useMidpoints2(
3294
- recurringQuery.isRecurringCryptoMarket && eventTradingState.kind !== "open" ? [] : eventDetailVenueMarkets
3295
- );
3296
- const internalResolvedClaim = useResolvedMarketClaim({
3297
- market: eventTradingState.primaryMarket,
3298
- enabled: eventTradingState.kind === "resolved",
3299
- executionMode: resolvedExecutionMode
3300
- });
3301
- const effectiveResolvedClaim = resolvedClaim != null ? resolvedClaim : internalResolvedClaim;
3302
- const setTradeSideRef = useRef5(tradingContext == null ? void 0 : tradingContext.setTradeSide);
3303
- setTradeSideRef.current = tradingContext == null ? void 0 : tradingContext.setTradeSide;
3304
- useEffect6(() => {
3305
- return () => {
3306
- var _a2;
3307
- (_a2 = setTradeSideRef.current) == null ? void 0 : _a2.call(setTradeSideRef, TradeSide2.Buy);
3308
- };
3309
- }, []);
3310
- if (!event.venueMarkets.length) {
3311
- return /* @__PURE__ */ jsx8(EventMarketPageUnavailableState, { ariaLabel });
3312
- }
3313
- return /* @__PURE__ */ jsxs7(
3314
- "section",
3315
- {
3316
- className: cn(
3317
- "agg-event-market-page",
3318
- "w-full mx-auto max-w-[1440px] px-6 lg:px-10 pb-10",
3319
- classNames == null ? void 0 : classNames.root
3320
- ),
3321
- "aria-label": ariaLabel != null ? ariaLabel : event.title,
3322
- children: [
3323
- /* @__PURE__ */ jsxs7(
3324
- "div",
3325
- {
3326
- className: cn(
3327
- "agg-page-content",
3328
- "flex w-full flex-col gap-6 lg:flex-row lg:items-start lg:gap-8",
3329
- stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.contentClassName,
3330
- classNames == null ? void 0 : classNames.content
3331
- ),
3332
- style: stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.style,
3333
- children: [
3334
- /* @__PURE__ */ jsxs7(
3335
- "div",
3336
- {
3337
- className: cn(
3338
- "agg-page-main flex min-w-0 flex-1 flex-col gap-6 mb-10",
3339
- stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.mainClassName,
3340
- classNames == null ? void 0 : classNames.main
3341
- ),
3342
- children: [
3343
- /* @__PURE__ */ jsx8(
3344
- EventListItemDetails,
3345
- {
3346
- event,
3347
- defaultMarketId,
3348
- defaultOutcomeId,
3349
- defaultTradeSide,
3350
- defaultChartView,
3351
- eventTradingState,
3352
- midpointsResult,
3353
- recurringMarkets: recurringMarketsPresentation,
3354
- classNames: {
3355
- root: cn("agg-event-hero", classNames == null ? void 0 : classNames.hero)
3356
- }
3357
- }
3358
- ),
3359
- /* @__PURE__ */ jsx8(
3360
- EventOpenOrders,
3361
- __spreadValues({
3362
- venueMarketIds: eventDetailVenueMarketIds,
3363
- executionMode: resolvedExecutionMode
3364
- }, (classNames == null ? void 0 : classNames.openOrders) ? { className: classNames.openOrders } : {})
3365
- ),
3366
- /* @__PURE__ */ jsx8(
3367
- MarketDetailsList,
3368
- {
3369
- eventId: event.id,
3370
- markets: eventTradingState.displayMarkets,
3371
- eventTradingState,
3372
- live: true,
3373
- showResolvingState: isRecurringResolvingMarket,
3374
- expandSelectedMarketOnChange: !isMobileViewport,
3375
- autoExpandFallbackMarket: !isMobileViewport,
3376
- autoSelectFallbackMarket: !isMobileViewport,
3377
- onOutcomeSelect: () => {
3378
- if (!isMobileViewport) return;
3379
- setIsMobileTradeOpen(true);
3380
- },
3381
- classNames: { root: "agg-market-list", item: "agg-market-list-item" },
3382
- midpointsResult
3383
- }
3384
- ),
3385
- showPlaceOrder !== false && eventTradingState.isTradingDisabled ? /* @__PURE__ */ jsx8("div", { className: "lg:hidden", children: /* @__PURE__ */ jsx8(
3386
- PlaceOrder,
3387
- {
3388
- eventTradingState,
3389
- executionMode: resolvedExecutionMode,
3390
- isQuotePanelActive: isMobileViewport,
3391
- resolvedClaim: effectiveResolvedClaim,
3392
- showResolvingState: isRecurringResolvingMarket,
3393
- midpointsResult,
3394
- onBeforePrimaryAction,
3395
- sharedKyc,
3396
- className: cn(
3397
- "agg-mobile-trade-panel w-full overflow-hidden",
3398
- classNames == null ? void 0 : classNames.mobileTrade
3399
- ),
3400
- classNames: resolveMobileTradePlaceOrderClassNames(classNames)
3401
- }
3402
- ) }) : null,
3403
- /* @__PURE__ */ jsx8(SettlementDetails, { eventId: event.id, className: classNames == null ? void 0 : classNames.settlement })
3404
- ]
3405
- }
3406
- ),
3407
- /* @__PURE__ */ jsx8(
3408
- "aside",
3409
- {
3410
- className: cn(
3411
- "agg-sidebar hidden w-full lg:block lg:max-w-[342px] lg:shrink-0",
3412
- stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.sidebarClassName,
3413
- classNames == null ? void 0 : classNames.sidebar
3414
- ),
3415
- children: showPlaceOrder !== false ? /* @__PURE__ */ jsx8(
3416
- PlaceOrder,
3417
- {
3418
- eventTradingState,
3419
- executionMode: resolvedExecutionMode,
3420
- isQuotePanelActive: !isMobileViewport,
3421
- resolvedClaim: effectiveResolvedClaim,
3422
- showResolvingState: isRecurringResolvingMarket,
3423
- midpointsResult,
3424
- onBeforePrimaryAction,
3425
- sharedKyc,
3426
- className: cn(stickyOrderPanelState == null ? void 0 : stickyOrderPanelState.placeOrder, classNames == null ? void 0 : classNames.trade),
3427
- classNames: resolveDesktopTradePlaceOrderClassNames(classNames)
3428
- }
3429
- ) : null
3430
- }
3431
- )
3432
- ]
3433
- }
3434
- ),
3435
- !eventTradingState.isTradingDisabled ? /* @__PURE__ */ jsx8(
3436
- EventMarketPageMobileTrade,
3437
- {
3438
- classNames,
3439
- eventTradingState,
3440
- executionMode: resolvedExecutionMode,
3441
- showPlaceOrder,
3442
- isOpen: isMobileTradeOpen,
3443
- onOpenChange: setIsMobileTradeOpen,
3444
- midpointsResult,
3445
- onBeforePrimaryAction,
3446
- sharedKyc
3447
- }
3448
- ) : null
3449
- ]
3450
- }
3451
- );
3452
- };
3453
- var EventMarketPage = (props) => {
3454
- var _a;
3455
- const {
3456
- features: { showSportsMarkets },
3457
- market: { minVolume }
3458
- } = useSdkUiConfig4();
3459
- const labels = useLabels8();
3460
- const hasEventProp = "event" in props && !!props.event;
3461
- const {
3462
- event: fetchedEvent,
3463
- error: eventError,
3464
- isLoading: isFetchingEvent,
3465
- isEnriching,
3466
- hasMoreMarkets,
3467
- loadMoreMarkets,
3468
- isLoadingMoreMarkets
3469
- } = useEnrichedVenueEvent({
3470
- progressive: props.progressiveMarkets,
3471
- eventId: hasEventProp ? "" : (_a = props.eventId) != null ? _a : "",
3472
- enabled: !props.isLoading && !hasEventProp && !!props.eventId,
3473
- // A deep-linked market may sit below the floor; filtering it out would make the
3474
- // page silently select a different market, so the floor only applies to browsing.
3475
- minVolume: props.defaultMarketId ? void 0 : minVolume
3476
- });
3477
- const renderEventContent = (event) => {
3478
- const contentProps = __spreadProps(__spreadValues({}, props), {
3479
- event,
3480
- isLoading: false
3481
- });
3482
- const hasKnownSport = !!event.sport && event.sport !== "other_sport";
3483
- if (showSportsMarkets === true && event.structureType === "sport" && hasKnownSport) {
3484
- return /* @__PURE__ */ jsx8(SportsEventMarketPage, __spreadValues({}, contentProps));
3485
- }
3486
- return /* @__PURE__ */ jsx8(EventMarketPageContent, __spreadValues({}, contentProps));
3487
- };
3488
- const content = (() => {
3489
- if (props.isLoading) {
3490
- return /* @__PURE__ */ jsx8(
3491
- EventMarketPageLoadingState,
3492
- {
3493
- classNames: props.classNames,
3494
- stickyOrderPanel: props.stickyOrderPanel
3495
- }
3496
- );
3497
- }
3498
- if ("event" in props && props.event) {
3499
- return renderEventContent(props.event);
3500
- }
3501
- if (isFetchingEvent || fetchedEvent && !fetchedEvent.venueMarkets.length && isEnriching) {
3502
- return /* @__PURE__ */ jsx8(
3503
- EventMarketPageLoadingState,
3504
- {
3505
- classNames: props.classNames,
3506
- stickyOrderPanel: props.stickyOrderPanel
3507
- }
3508
- );
3509
- }
3510
- if (!fetchedEvent) {
3511
- if (isErrorWithStatus(eventError, 404)) {
3512
- return /* @__PURE__ */ jsx8(EventMarketPageNotFoundState, { ariaLabel: props.ariaLabel });
3513
- }
3514
- return /* @__PURE__ */ jsx8(EventMarketPageUnavailableState, { ariaLabel: props.ariaLabel });
3515
- }
3516
- return renderEventContent(fetchedEvent);
3517
- })();
3518
- return /* @__PURE__ */ jsxs7(AggErrorBoundary, { onError: props.onError, children: [
3519
- content,
3520
- props.progressiveMarkets && !hasEventProp && hasMoreMarkets ? /* @__PURE__ */ jsx8("div", { className: "mx-auto flex max-w-[1440px] justify-center px-6 pb-8", children: /* @__PURE__ */ jsx8(
3521
- Button,
3522
- {
3523
- disabled: isLoadingMoreMarkets,
3524
- onClick: () => {
3525
- void (loadMoreMarkets == null ? void 0 : loadMoreMarkets());
3526
- },
3527
- children: isLoadingMoreMarkets ? labels.eventMarketPage.loadingMoreMarkets : labels.eventMarketPage.loadMoreMarkets
3528
- }
3529
- ) }) : null
3530
- ] });
3531
- };
3532
- EventMarketPage.displayName = "EventMarketPage";
3533
-
3534
- export {
3535
- OpenOrderRow,
3536
- useOpenOrderCancellation,
3537
- parseRawMicroValue,
3538
- formatScaledNumberTwoDecimals,
3539
- formatFilledUsdTwoDecimals,
3540
- OPEN_ORDER_QUERY_STATUSES,
3541
- isOpenOrderStatus,
3542
- selectOpenLimitOrders,
3543
- buildOpenOrderCurrentPriceLabels,
3544
- OPEN_ORDER_FALLBACK_THUMBNAIL_SRC,
3545
- mapExecutionOrderToOpenOrder,
3546
- useEventOpenOrders,
3547
- EventOpenOrdersCard,
3548
- EventOpenOrders,
3549
- formatRecurringCountdown,
3550
- EventMarketPage
3551
- };