@agg-build/ui 4.26.1 → 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.
- package/dist/event-trading-state.utils-B3my25Re.mjs +789 -0
- package/dist/event-trading-state.utils-s4DEc4iA.js +921 -0
- package/dist/events.js +23 -17658
- package/dist/events.mjs +3 -50
- package/dist/index.js +811 -47152
- package/dist/index.mjs +584 -1204
- package/dist/list-D8v2SmY1.js +6989 -0
- package/dist/list-DD7roCVl.mjs +6838 -0
- package/dist/manage-betdex-account-modal-21ZVLsz0.js +2390 -0
- package/dist/manage-betdex-account-modal-D2vKHird.mjs +2294 -0
- package/dist/modals-BReGwJzz.mjs +2993 -0
- package/dist/modals-CSexQO1C.js +3077 -0
- package/dist/modals.js +24 -11810
- package/dist/modals.mjs +3 -49
- package/dist/pages-CMlCYngA.mjs +7846 -0
- package/dist/pages-xvAzj6c2.js +7955 -0
- package/dist/pages.js +25 -42391
- package/dist/pages.mjs +3 -57
- package/dist/primitives-CqxNeV7H.js +9930 -0
- package/dist/primitives-Dz5aF8ma.mjs +8928 -0
- package/dist/primitives.js +102 -11079
- package/dist/primitives.mjs +1 -204
- package/dist/trading-CDkNdjGx.mjs +7086 -0
- package/dist/trading-CXsZFd3l.js +7217 -0
- package/dist/trading.js +39 -18215
- package/dist/trading.mjs +3 -68
- package/dist/types/agg-provider.d.mts +1 -1
- package/dist/types/agg-provider.d.ts +1 -1
- package/dist/types/auth/connect-button-view/index.d.mts +4 -5
- package/dist/types/auth/connect-button-view/index.d.ts +4 -5
- package/dist/types/deposit/components/DepositQRCode.d.mts +2 -2
- package/dist/types/deposit/components/DepositQRCode.d.ts +2 -2
- package/dist/types/deposit/index.d.mts +4 -4
- package/dist/types/deposit/index.d.ts +4 -4
- package/dist/types/deposit/steps/card-deposit.d.mts +1 -1
- package/dist/types/deposit/steps/card-deposit.d.ts +1 -1
- package/dist/types/deposit/steps/card-payment-pending.d.mts +1 -1
- package/dist/types/deposit/steps/card-payment-pending.d.ts +1 -1
- package/dist/types/deposit/steps/card-provider.d.mts +1 -1
- package/dist/types/deposit/steps/card-provider.d.ts +1 -1
- package/dist/types/deposit/steps/card-purchase-success.d.mts +1 -1
- package/dist/types/deposit/steps/card-purchase-success.d.ts +1 -1
- package/dist/types/deposit/steps/card-widget.d.mts +1 -1
- package/dist/types/deposit/steps/card-widget.d.ts +1 -1
- package/dist/types/deposit/steps/crypto-transfer.d.mts +1 -1
- package/dist/types/deposit/steps/crypto-transfer.d.ts +1 -1
- package/dist/types/deposit/steps/deposit-method.d.mts +2 -1
- package/dist/types/deposit/steps/deposit-method.d.ts +2 -1
- package/dist/types/deposit/steps/venue-selection.d.mts +1 -1
- package/dist/types/deposit/steps/venue-selection.d.ts +1 -1
- package/dist/types/deposit/steps/wallet-form.d.mts +1 -1
- package/dist/types/deposit/steps/wallet-form.d.ts +1 -1
- package/dist/types/deposit/steps/wallet-processing.d.mts +1 -1
- package/dist/types/deposit/steps/wallet-processing.d.ts +1 -1
- package/dist/types/deposit/steps/wallet-success.d.mts +1 -1
- package/dist/types/deposit/steps/wallet-success.d.ts +1 -1
- package/dist/types/events/item/event-list-item.utils.d.mts +1 -1
- package/dist/types/events/item/event-list-item.utils.d.ts +1 -1
- package/dist/types/events/item/index.d.mts +8 -8
- package/dist/types/events/item/index.d.ts +8 -8
- package/dist/types/events/item-details/event-list-item-details-market-selector.d.mts +1 -1
- package/dist/types/events/item-details/event-list-item-details-market-selector.d.ts +1 -1
- package/dist/types/events/item-details/event-markets-chart.d.mts +1 -1
- package/dist/types/events/item-details/event-markets-chart.d.ts +1 -1
- package/dist/types/events/item-details/event-markets-chart.utils.d.mts +1 -1
- package/dist/types/events/item-details/event-markets-chart.utils.d.ts +1 -1
- package/dist/types/events/item-details/index.d.mts +4 -4
- package/dist/types/events/item-details/index.d.ts +4 -4
- package/dist/types/events/item-details/settlement-summary.d.mts +4 -4
- package/dist/types/events/item-details/settlement-summary.d.ts +4 -4
- package/dist/types/events/list/category-sidebar.d.mts +4 -4
- package/dist/types/events/list/category-sidebar.d.ts +4 -4
- package/dist/types/events/list/event-list-tabs.d.mts +4 -8
- package/dist/types/events/list/event-list-tabs.d.ts +4 -8
- package/dist/types/events/list/event-list-venue-strip.d.mts +4 -11
- package/dist/types/events/list/event-list-venue-strip.d.ts +4 -11
- package/dist/types/events/list/index.d.mts +4 -4
- package/dist/types/events/list/index.d.ts +4 -4
- package/dist/types/events/market-details/index.d.mts +8 -8
- package/dist/types/events/market-details/index.d.ts +8 -8
- package/dist/types/events/market-details/market-details-graph-panel.d.mts +4 -14
- package/dist/types/events/market-details/market-details-graph-panel.d.ts +4 -14
- package/dist/types/events/market-details/market-details-outcome-button.d.mts +4 -4
- package/dist/types/events/market-details/market-details-outcome-button.d.ts +4 -4
- package/dist/types/events/market-details/orderbook-aggregation.d.mts +3 -1
- package/dist/types/events/market-details/orderbook-aggregation.d.ts +3 -1
- package/dist/types/events/market-details/use-visible-market-streams.d.mts +1 -1
- package/dist/types/events/market-details/use-visible-market-streams.d.ts +1 -1
- package/dist/types/events/orderbook/index.d.mts +4 -4
- package/dist/types/events/orderbook/index.d.ts +4 -4
- package/dist/types/events/orderbook/orderbook-with-states.d.mts +4 -4
- package/dist/types/events/orderbook/orderbook-with-states.d.ts +4 -4
- package/dist/types/events/shared/chart-source-caption.d.mts +1 -1
- package/dist/types/events/shared/chart-source-caption.d.ts +1 -1
- package/dist/types/events/shared/sports-live-score.d.mts +4 -4
- package/dist/types/events/shared/sports-live-score.d.ts +4 -4
- package/dist/types/events/shared/use-chart-orderbook.d.mts +3 -3
- package/dist/types/events/shared/use-chart-orderbook.d.ts +3 -3
- package/dist/types/geo-block-banner/index.d.mts +4 -4
- package/dist/types/geo-block-banner/index.d.ts +4 -4
- package/dist/types/geo-block-modal/index.d.mts +4 -4
- package/dist/types/geo-block-modal/index.d.ts +4 -4
- package/dist/types/kyc/shared-kyc-modal.d.mts +4 -4
- package/dist/types/kyc/shared-kyc-modal.d.ts +4 -4
- package/dist/types/notifications/agg-notification-events-provider.d.mts +1 -1
- package/dist/types/notifications/agg-notification-events-provider.d.ts +1 -1
- package/dist/types/notifications/agg-toast-provider.d.mts +1 -1
- package/dist/types/notifications/agg-toast-provider.d.ts +1 -1
- package/dist/types/onboarding/index.d.mts +4 -4
- package/dist/types/onboarding/index.d.ts +4 -4
- package/dist/types/onboarding/steps/connect-accounts.d.mts +4 -4
- package/dist/types/onboarding/steps/connect-accounts.d.ts +4 -4
- package/dist/types/onboarding/steps/connect-kalshi-modal.d.mts +4 -4
- package/dist/types/onboarding/steps/connect-kalshi-modal.d.ts +4 -4
- package/dist/types/onboarding/steps/connect-novig-modal.d.mts +1 -1
- package/dist/types/onboarding/steps/connect-novig-modal.d.ts +1 -1
- package/dist/types/onboarding/steps/connect-onchain-modal.d.mts +4 -4
- package/dist/types/onboarding/steps/connect-onchain-modal.d.ts +4 -4
- package/dist/types/onboarding/steps/connect-prophetx-modal.d.mts +1 -1
- package/dist/types/onboarding/steps/connect-prophetx-modal.d.ts +1 -1
- package/dist/types/onboarding/steps/how-it-works.d.mts +4 -4
- package/dist/types/onboarding/steps/how-it-works.d.ts +4 -4
- package/dist/types/onboarding/steps/profile-setup.d.mts +4 -4
- package/dist/types/onboarding/steps/profile-setup.d.ts +4 -4
- package/dist/types/pages/event-market/event-market.shared.d.mts +4 -4
- package/dist/types/pages/event-market/event-market.shared.d.ts +4 -4
- package/dist/types/pages/event-market/event-market.types.d.mts +2 -0
- package/dist/types/pages/event-market/event-market.types.d.ts +2 -0
- package/dist/types/pages/event-market/event-open-orders.d.mts +8 -27
- package/dist/types/pages/event-market/event-open-orders.d.ts +8 -27
- package/dist/types/pages/event-market/index.d.mts +6 -6
- package/dist/types/pages/event-market/index.d.ts +6 -6
- package/dist/types/pages/event-market/sports-event-market-page.d.mts +6 -6
- package/dist/types/pages/event-market/sports-event-market-page.d.ts +6 -6
- package/dist/types/pages/event-market/sports-line-rail.d.mts +2 -1
- package/dist/types/pages/event-market/sports-line-rail.d.ts +2 -1
- package/dist/types/pages/event-market/sports-market-card.d.mts +4 -4
- package/dist/types/pages/event-market/sports-market-card.d.ts +4 -4
- package/dist/types/pages/event-market/sports-markets.d.mts +4 -4
- package/dist/types/pages/event-market/sports-markets.d.ts +4 -4
- package/dist/types/pages/home/index.d.mts +6 -6
- package/dist/types/pages/home/index.d.ts +6 -6
- package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.mts +1 -1
- package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.ts +1 -1
- package/dist/types/pages/leaderboard/components/leaderboard-row.d.mts +1 -1
- package/dist/types/pages/leaderboard/components/leaderboard-row.d.ts +1 -1
- package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.mts +1 -1
- package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.ts +1 -1
- package/dist/types/pages/leaderboard/components/segmented-control.d.mts +1 -1
- package/dist/types/pages/leaderboard/components/segmented-control.d.ts +1 -1
- package/dist/types/pages/leaderboard/index.d.mts +1 -1
- package/dist/types/pages/leaderboard/index.d.ts +1 -1
- package/dist/types/pages/user-profile/components/activity-row.d.mts +4 -4
- package/dist/types/pages/user-profile/components/activity-row.d.ts +4 -4
- package/dist/types/pages/user-profile/components/available-balance-card.d.mts +4 -4
- package/dist/types/pages/user-profile/components/available-balance-card.d.ts +4 -4
- package/dist/types/pages/user-profile/components/balance-display.d.mts +4 -4
- package/dist/types/pages/user-profile/components/balance-display.d.ts +4 -4
- package/dist/types/pages/user-profile/components/balances-card.d.mts +4 -4
- package/dist/types/pages/user-profile/components/balances-card.d.ts +4 -4
- package/dist/types/pages/user-profile/components/betdex-account-activity.d.mts +1 -1
- package/dist/types/pages/user-profile/components/betdex-account-activity.d.ts +1 -1
- package/dist/types/pages/user-profile/components/betdex-account-card.d.mts +1 -1
- package/dist/types/pages/user-profile/components/betdex-account-card.d.ts +1 -1
- package/dist/types/pages/user-profile/components/betdex-account-transfers.d.mts +1 -1
- package/dist/types/pages/user-profile/components/betdex-account-transfers.d.ts +1 -1
- package/dist/types/pages/user-profile/components/betdex-wallet-deposit.d.mts +1 -1
- package/dist/types/pages/user-profile/components/betdex-wallet-deposit.d.ts +1 -1
- package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.mts +1 -1
- package/dist/types/pages/user-profile/components/claim-activity-breakdown-modal.d.ts +1 -1
- package/dist/types/pages/user-profile/components/empty-state.d.mts +4 -4
- package/dist/types/pages/user-profile/components/empty-state.d.ts +4 -4
- package/dist/types/pages/user-profile/components/manage-balances-modal.d.mts +4 -4
- package/dist/types/pages/user-profile/components/manage-balances-modal.d.ts +4 -4
- package/dist/types/pages/user-profile/components/open-order-row.d.mts +4 -4
- package/dist/types/pages/user-profile/components/open-order-row.d.ts +4 -4
- package/dist/types/pages/user-profile/components/position-row.d.mts +4 -4
- package/dist/types/pages/user-profile/components/position-row.d.ts +4 -4
- package/dist/types/pages/user-profile/components/positions-activity.d.mts +4 -4
- package/dist/types/pages/user-profile/components/positions-activity.d.ts +4 -4
- package/dist/types/pages/user-profile/components/positions-value-card.d.mts +4 -4
- package/dist/types/pages/user-profile/components/positions-value-card.d.ts +4 -4
- package/dist/types/pages/user-profile/components/user-info-card.d.mts +4 -4
- package/dist/types/pages/user-profile/components/user-info-card.d.ts +4 -4
- package/dist/types/pages/user-profile/index.d.mts +6 -6
- package/dist/types/pages/user-profile/index.d.ts +6 -6
- package/dist/types/paper-trading/paper-onboarding-modal.d.mts +4 -14
- package/dist/types/paper-trading/paper-onboarding-modal.d.ts +4 -14
- package/dist/types/paper-trading/paper-trading-badge.d.mts +4 -16
- package/dist/types/paper-trading/paper-trading-badge.d.ts +4 -16
- package/dist/types/paper-trading/paper-trading-onboarding.d.mts +4 -12
- package/dist/types/paper-trading/paper-trading-onboarding.d.ts +4 -12
- package/dist/types/primitives/agg-logo/agg-logo.utils.d.mts +1 -1
- package/dist/types/primitives/agg-logo/agg-logo.utils.d.ts +1 -1
- package/dist/types/primitives/agg-logo/index.d.mts +4 -5
- package/dist/types/primitives/agg-logo/index.d.ts +4 -5
- package/dist/types/primitives/autocomplete-select/index.d.mts +4 -5
- package/dist/types/primitives/autocomplete-select/index.d.ts +4 -5
- package/dist/types/primitives/badge/index.d.mts +1 -1
- package/dist/types/primitives/badge/index.d.ts +1 -1
- package/dist/types/primitives/button/button.types.d.mts +2 -2
- package/dist/types/primitives/button/button.types.d.ts +2 -2
- package/dist/types/primitives/button/index.d.mts +4 -5
- package/dist/types/primitives/button/index.d.ts +4 -5
- package/dist/types/primitives/calendar/index.d.mts +4 -4
- package/dist/types/primitives/calendar/index.d.ts +4 -4
- package/dist/types/primitives/card/index.d.mts +4 -5
- package/dist/types/primitives/card/index.d.ts +4 -5
- package/dist/types/primitives/chart/chart-type-switch.d.mts +4 -5
- package/dist/types/primitives/chart/chart-type-switch.d.ts +4 -5
- package/dist/types/primitives/chart/index.d.mts +4 -5
- package/dist/types/primitives/chart/index.d.ts +4 -5
- package/dist/types/primitives/chart/probability-chart.d.mts +2 -2
- package/dist/types/primitives/chart/probability-chart.d.ts +2 -2
- package/dist/types/primitives/chart/probability-live-tail.d.mts +1 -1
- package/dist/types/primitives/chart/probability-live-tail.d.ts +1 -1
- package/dist/types/primitives/conditional-wrapper.d.mts +6 -7
- package/dist/types/primitives/conditional-wrapper.d.ts +6 -7
- package/dist/types/primitives/copy-button/index.d.mts +4 -5
- package/dist/types/primitives/copy-button/index.d.ts +4 -5
- package/dist/types/primitives/currency-input/index.d.mts +4 -5
- package/dist/types/primitives/currency-input/index.d.ts +4 -5
- package/dist/types/primitives/footer/agg-build-logo.d.mts +12 -15
- package/dist/types/primitives/footer/agg-build-logo.d.ts +12 -15
- package/dist/types/primitives/footer/index.d.mts +4 -6
- package/dist/types/primitives/footer/index.d.ts +4 -6
- package/dist/types/primitives/header/index.d.mts +4 -6
- package/dist/types/primitives/header/index.d.ts +4 -6
- package/dist/types/primitives/icon/index.d.mts +4 -5
- package/dist/types/primitives/icon/index.d.ts +4 -5
- package/dist/types/primitives/icon/registry.d.mts +180 -351
- package/dist/types/primitives/icon/registry.d.ts +180 -351
- package/dist/types/primitives/icon/svg/activity-chart.d.mts +4 -4
- package/dist/types/primitives/icon/svg/activity-chart.d.ts +4 -4
- package/dist/types/primitives/icon/svg/activity.d.mts +4 -4
- package/dist/types/primitives/icon/svg/activity.d.ts +4 -4
- package/dist/types/primitives/icon/svg/apple.d.mts +4 -4
- package/dist/types/primitives/icon/svg/apple.d.ts +4 -4
- package/dist/types/primitives/icon/svg/apps.d.mts +4 -4
- package/dist/types/primitives/icon/svg/apps.d.ts +4 -4
- package/dist/types/primitives/icon/svg/arbitrum.d.mts +4 -4
- package/dist/types/primitives/icon/svg/arbitrum.d.ts +4 -4
- package/dist/types/primitives/icon/svg/arrow-right.d.mts +4 -4
- package/dist/types/primitives/icon/svg/arrow-right.d.ts +4 -4
- package/dist/types/primitives/icon/svg/arrow-trend-up.d.mts +4 -4
- package/dist/types/primitives/icon/svg/arrow-trend-up.d.ts +4 -4
- package/dist/types/primitives/icon/svg/arrows-to-dot.d.mts +4 -4
- package/dist/types/primitives/icon/svg/arrows-to-dot.d.ts +4 -4
- package/dist/types/primitives/icon/svg/badge-check-thin.d.mts +4 -4
- package/dist/types/primitives/icon/svg/badge-check-thin.d.ts +4 -4
- package/dist/types/primitives/icon/svg/bank.d.mts +4 -4
- package/dist/types/primitives/icon/svg/bank.d.ts +4 -4
- package/dist/types/primitives/icon/svg/base.d.mts +4 -4
- package/dist/types/primitives/icon/svg/base.d.ts +4 -4
- package/dist/types/primitives/icon/svg/best-prices.d.mts +4 -4
- package/dist/types/primitives/icon/svg/best-prices.d.ts +4 -4
- package/dist/types/primitives/icon/svg/bnb.d.mts +4 -4
- package/dist/types/primitives/icon/svg/bnb.d.ts +4 -4
- package/dist/types/primitives/icon/svg/bolt.d.mts +4 -4
- package/dist/types/primitives/icon/svg/bolt.d.ts +4 -4
- package/dist/types/primitives/icon/svg/calendar.d.mts +1 -1
- package/dist/types/primitives/icon/svg/calendar.d.ts +1 -1
- package/dist/types/primitives/icon/svg/chart-candlestick.d.mts +4 -4
- package/dist/types/primitives/icon/svg/chart-candlestick.d.ts +4 -4
- package/dist/types/primitives/icon/svg/chart-line.d.mts +4 -4
- package/dist/types/primitives/icon/svg/chart-line.d.ts +4 -4
- package/dist/types/primitives/icon/svg/check-badge.d.mts +4 -4
- package/dist/types/primitives/icon/svg/check-badge.d.ts +4 -4
- package/dist/types/primitives/icon/svg/check-circle.d.mts +4 -4
- package/dist/types/primitives/icon/svg/check-circle.d.ts +4 -4
- package/dist/types/primitives/icon/svg/chevron-down-thin.d.mts +4 -5
- package/dist/types/primitives/icon/svg/chevron-down-thin.d.ts +4 -5
- package/dist/types/primitives/icon/svg/chevron-down.d.mts +4 -4
- package/dist/types/primitives/icon/svg/chevron-down.d.ts +4 -4
- package/dist/types/primitives/icon/svg/chevron-left.d.mts +4 -4
- package/dist/types/primitives/icon/svg/chevron-left.d.ts +4 -4
- package/dist/types/primitives/icon/svg/chevron-right.d.mts +4 -4
- package/dist/types/primitives/icon/svg/chevron-right.d.ts +4 -4
- package/dist/types/primitives/icon/svg/chevron-up.d.mts +4 -4
- package/dist/types/primitives/icon/svg/chevron-up.d.ts +4 -4
- package/dist/types/primitives/icon/svg/circle-overlap.d.mts +4 -4
- package/dist/types/primitives/icon/svg/circle-overlap.d.ts +4 -4
- package/dist/types/primitives/icon/svg/circle-xmark.d.mts +4 -4
- package/dist/types/primitives/icon/svg/circle-xmark.d.ts +4 -4
- package/dist/types/primitives/icon/svg/close.d.mts +4 -4
- package/dist/types/primitives/icon/svg/close.d.ts +4 -4
- package/dist/types/primitives/icon/svg/copy.d.mts +4 -4
- package/dist/types/primitives/icon/svg/copy.d.ts +4 -4
- package/dist/types/primitives/icon/svg/create-account.d.mts +4 -4
- package/dist/types/primitives/icon/svg/create-account.d.ts +4 -4
- package/dist/types/primitives/icon/svg/credit-card.d.mts +4 -4
- package/dist/types/primitives/icon/svg/credit-card.d.ts +4 -4
- package/dist/types/primitives/icon/svg/cross-circle.d.mts +4 -4
- package/dist/types/primitives/icon/svg/cross-circle.d.ts +4 -4
- package/dist/types/primitives/icon/svg/disconnect.d.mts +4 -4
- package/dist/types/primitives/icon/svg/disconnect.d.ts +4 -4
- package/dist/types/primitives/icon/svg/discord.d.mts +4 -4
- package/dist/types/primitives/icon/svg/discord.d.ts +4 -4
- package/dist/types/primitives/icon/svg/document.d.mts +4 -4
- package/dist/types/primitives/icon/svg/document.d.ts +4 -4
- package/dist/types/primitives/icon/svg/dots-horizontal.d.mts +4 -4
- package/dist/types/primitives/icon/svg/dots-horizontal.d.ts +4 -4
- package/dist/types/primitives/icon/svg/download.d.mts +4 -4
- package/dist/types/primitives/icon/svg/download.d.ts +4 -4
- package/dist/types/primitives/icon/svg/email.d.mts +4 -4
- package/dist/types/primitives/icon/svg/email.d.ts +4 -4
- package/dist/types/primitives/icon/svg/error-filled.d.mts +4 -4
- package/dist/types/primitives/icon/svg/error-filled.d.ts +4 -4
- package/dist/types/primitives/icon/svg/ethereum.d.mts +4 -4
- package/dist/types/primitives/icon/svg/ethereum.d.ts +4 -4
- package/dist/types/primitives/icon/svg/external-link.d.mts +4 -4
- package/dist/types/primitives/icon/svg/external-link.d.ts +4 -4
- package/dist/types/primitives/icon/svg/gift-bonus.d.mts +4 -4
- package/dist/types/primitives/icon/svg/gift-bonus.d.ts +4 -4
- package/dist/types/primitives/icon/svg/google.d.mts +4 -4
- package/dist/types/primitives/icon/svg/google.d.ts +4 -4
- package/dist/types/primitives/icon/svg/hourglass-start.d.mts +4 -4
- package/dist/types/primitives/icon/svg/hourglass-start.d.ts +4 -4
- package/dist/types/primitives/icon/svg/image.d.mts +4 -4
- package/dist/types/primitives/icon/svg/image.d.ts +4 -4
- package/dist/types/primitives/icon/svg/info.d.mts +4 -4
- package/dist/types/primitives/icon/svg/info.d.ts +4 -4
- package/dist/types/primitives/icon/svg/internet-security.d.mts +4 -4
- package/dist/types/primitives/icon/svg/internet-security.d.ts +4 -4
- package/dist/types/primitives/icon/svg/link-accounts.d.mts +4 -4
- package/dist/types/primitives/icon/svg/link-accounts.d.ts +4 -4
- package/dist/types/primitives/icon/svg/lock.d.mts +4 -4
- package/dist/types/primitives/icon/svg/lock.d.ts +4 -4
- package/dist/types/primitives/icon/svg/minus.d.mts +1 -1
- package/dist/types/primitives/icon/svg/minus.d.ts +1 -1
- package/dist/types/primitives/icon/svg/paper-buying-power.d.mts +4 -10
- package/dist/types/primitives/icon/svg/paper-buying-power.d.ts +4 -10
- package/dist/types/primitives/icon/svg/paper-earnings.d.mts +4 -10
- package/dist/types/primitives/icon/svg/paper-earnings.d.ts +4 -10
- package/dist/types/primitives/icon/svg/paper-mode.d.mts +4 -4
- package/dist/types/primitives/icon/svg/paper-mode.d.ts +4 -4
- package/dist/types/primitives/icon/svg/paper-onboarding-funds.d.mts +4 -11
- package/dist/types/primitives/icon/svg/paper-onboarding-funds.d.ts +4 -11
- package/dist/types/primitives/icon/svg/paper-onboarding-markets.d.mts +4 -11
- package/dist/types/primitives/icon/svg/paper-onboarding-markets.d.ts +4 -11
- package/dist/types/primitives/icon/svg/paper-onboarding-performance.d.mts +4 -11
- package/dist/types/primitives/icon/svg/paper-onboarding-performance.d.ts +4 -11
- package/dist/types/primitives/icon/svg/paper-plane.d.mts +4 -4
- package/dist/types/primitives/icon/svg/paper-plane.d.ts +4 -4
- package/dist/types/primitives/icon/svg/pencil.d.mts +4 -4
- package/dist/types/primitives/icon/svg/pencil.d.ts +4 -4
- package/dist/types/primitives/icon/svg/play-square.d.mts +4 -4
- package/dist/types/primitives/icon/svg/play-square.d.ts +4 -4
- package/dist/types/primitives/icon/svg/plus.d.mts +1 -1
- package/dist/types/primitives/icon/svg/plus.d.ts +1 -1
- package/dist/types/primitives/icon/svg/polygon.d.mts +4 -4
- package/dist/types/primitives/icon/svg/polygon.d.ts +4 -4
- package/dist/types/primitives/icon/svg/profile-about-tab.d.mts +4 -5
- package/dist/types/primitives/icon/svg/profile-about-tab.d.ts +4 -5
- package/dist/types/primitives/icon/svg/profile-accounts-wallets-tab.d.mts +4 -5
- package/dist/types/primitives/icon/svg/profile-accounts-wallets-tab.d.ts +4 -5
- package/dist/types/primitives/icon/svg/profile.d.mts +4 -4
- package/dist/types/primitives/icon/svg/profile.d.ts +4 -4
- package/dist/types/primitives/icon/svg/quotes-warning.d.mts +4 -5
- package/dist/types/primitives/icon/svg/quotes-warning.d.ts +4 -5
- package/dist/types/primitives/icon/svg/recenter.d.mts +4 -4
- package/dist/types/primitives/icon/svg/recenter.d.ts +4 -4
- package/dist/types/primitives/icon/svg/revenue-alt.d.mts +4 -4
- package/dist/types/primitives/icon/svg/revenue-alt.d.ts +4 -4
- package/dist/types/primitives/icon/svg/search.d.mts +4 -4
- package/dist/types/primitives/icon/svg/search.d.ts +4 -4
- package/dist/types/primitives/icon/svg/shield-trust.d.mts +4 -4
- package/dist/types/primitives/icon/svg/shield-trust.d.ts +4 -4
- package/dist/types/primitives/icon/svg/solana.d.mts +4 -4
- package/dist/types/primitives/icon/svg/solana.d.ts +4 -4
- package/dist/types/primitives/icon/svg/sort-end-date.d.mts +4 -4
- package/dist/types/primitives/icon/svg/sort-end-date.d.ts +4 -4
- package/dist/types/primitives/icon/svg/sort-top-arbitrage.d.mts +4 -4
- package/dist/types/primitives/icon/svg/sort-top-arbitrage.d.ts +4 -4
- package/dist/types/primitives/icon/svg/sort-volume-24hr.d.mts +4 -4
- package/dist/types/primitives/icon/svg/sort-volume-24hr.d.ts +4 -4
- package/dist/types/primitives/icon/svg/sort-volume.d.mts +4 -4
- package/dist/types/primitives/icon/svg/sort-volume.d.ts +4 -4
- package/dist/types/primitives/icon/svg/sparkles-filled.d.mts +4 -4
- package/dist/types/primitives/icon/svg/sparkles-filled.d.ts +4 -4
- package/dist/types/primitives/icon/svg/spinner.d.mts +4 -4
- package/dist/types/primitives/icon/svg/spinner.d.ts +4 -4
- package/dist/types/primitives/icon/svg/stay-in-control.d.mts +4 -4
- package/dist/types/primitives/icon/svg/stay-in-control.d.ts +4 -4
- package/dist/types/primitives/icon/svg/success-check.d.mts +4 -4
- package/dist/types/primitives/icon/svg/success-check.d.ts +4 -4
- package/dist/types/primitives/icon/svg/telegram.d.mts +4 -4
- package/dist/types/primitives/icon/svg/telegram.d.ts +4 -4
- package/dist/types/primitives/icon/svg/triangle-down.d.mts +4 -4
- package/dist/types/primitives/icon/svg/triangle-down.d.ts +4 -4
- package/dist/types/primitives/icon/svg/triangle-up-filled.d.mts +4 -4
- package/dist/types/primitives/icon/svg/triangle-up-filled.d.ts +4 -4
- package/dist/types/primitives/icon/svg/triangle-up.d.mts +4 -4
- package/dist/types/primitives/icon/svg/triangle-up.d.ts +4 -4
- package/dist/types/primitives/icon/svg/twitter.d.mts +4 -4
- package/dist/types/primitives/icon/svg/twitter.d.ts +4 -4
- package/dist/types/primitives/icon/svg/upload.d.mts +4 -4
- package/dist/types/primitives/icon/svg/upload.d.ts +4 -4
- package/dist/types/primitives/icon/svg/usdc.d.mts +4 -4
- package/dist/types/primitives/icon/svg/usdc.d.ts +4 -4
- package/dist/types/primitives/icon/svg/user-trust.d.mts +4 -4
- package/dist/types/primitives/icon/svg/user-trust.d.ts +4 -4
- package/dist/types/primitives/icon/svg/wallet-avatar.d.mts +1 -1
- package/dist/types/primitives/icon/svg/wallet-avatar.d.ts +1 -1
- package/dist/types/primitives/icon/svg/wallet-filled.d.mts +4 -4
- package/dist/types/primitives/icon/svg/wallet-filled.d.ts +4 -4
- package/dist/types/primitives/icon/svg/wallet.d.mts +4 -4
- package/dist/types/primitives/icon/svg/wallet.d.ts +4 -4
- package/dist/types/primitives/icon/svg/warning-filled.d.mts +4 -4
- package/dist/types/primitives/icon/svg/warning-filled.d.ts +4 -4
- package/dist/types/primitives/icon/svg/warning.d.mts +4 -4
- package/dist/types/primitives/icon/svg/warning.d.ts +4 -4
- package/dist/types/primitives/inline-alert/index.d.mts +4 -5
- package/dist/types/primitives/inline-alert/index.d.ts +4 -5
- package/dist/types/primitives/loading-icon/index.d.mts +4 -5
- package/dist/types/primitives/loading-icon/index.d.ts +4 -5
- package/dist/types/primitives/modal/index.d.mts +12 -9
- package/dist/types/primitives/modal/index.d.ts +12 -9
- package/dist/types/primitives/number-value.d.mts +4 -4
- package/dist/types/primitives/number-value.d.ts +4 -4
- package/dist/types/primitives/remote-image/index.d.mts +4 -5
- package/dist/types/primitives/remote-image/index.d.ts +4 -5
- package/dist/types/primitives/search/index.d.mts +4 -5
- package/dist/types/primitives/search/index.d.ts +4 -5
- package/dist/types/primitives/search/search-empty-icon.d.mts +4 -4
- package/dist/types/primitives/search/search-empty-icon.d.ts +4 -4
- package/dist/types/primitives/select/index.d.mts +4 -5
- package/dist/types/primitives/select/index.d.ts +4 -5
- package/dist/types/primitives/skeleton/index.d.mts +4 -5
- package/dist/types/primitives/skeleton/index.d.ts +4 -5
- package/dist/types/primitives/skeleton/skeleton-block.d.mts +4 -4
- package/dist/types/primitives/skeleton/skeleton-block.d.ts +4 -4
- package/dist/types/primitives/skeleton/views/event-list-item-details-skeleton-view.d.mts +4 -4
- package/dist/types/primitives/skeleton/views/event-list-item-details-skeleton-view.d.ts +4 -4
- package/dist/types/primitives/skeleton/views/event-list-item-skeleton-view.d.mts +4 -10
- package/dist/types/primitives/skeleton/views/event-list-item-skeleton-view.d.ts +4 -10
- package/dist/types/primitives/skeleton/views/event-list-skeleton-view.d.mts +4 -4
- package/dist/types/primitives/skeleton/views/event-list-skeleton-view.d.ts +4 -4
- package/dist/types/primitives/skeleton/views/market-details-skeleton-view.d.mts +5 -5
- package/dist/types/primitives/skeleton/views/market-details-skeleton-view.d.ts +5 -5
- package/dist/types/primitives/skeleton/views/place-order-skeleton-view.d.mts +8 -8
- package/dist/types/primitives/skeleton/views/place-order-skeleton-view.d.ts +8 -8
- package/dist/types/primitives/skeleton/views/search-skeleton-view.d.mts +4 -4
- package/dist/types/primitives/skeleton/views/search-skeleton-view.d.ts +4 -4
- package/dist/types/primitives/skeleton/views/settlement-skeleton-view.d.mts +4 -4
- package/dist/types/primitives/skeleton/views/settlement-skeleton-view.d.ts +4 -4
- package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.mts +4 -4
- package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.ts +4 -4
- package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.mts +4 -4
- package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.ts +4 -4
- package/dist/types/primitives/state-message/index.d.mts +4 -5
- package/dist/types/primitives/state-message/index.d.ts +4 -5
- package/dist/types/primitives/switch-button/index.d.mts +4 -5
- package/dist/types/primitives/switch-button/index.d.ts +4 -5
- package/dist/types/primitives/tabs/index.d.mts +4 -5
- package/dist/types/primitives/tabs/index.d.ts +4 -5
- package/dist/types/primitives/toast/index.d.mts +1 -1
- package/dist/types/primitives/toast/index.d.ts +1 -1
- package/dist/types/primitives/tooltip/index.d.mts +4 -5
- package/dist/types/primitives/tooltip/index.d.ts +4 -5
- package/dist/types/primitives/typography/index.d.mts +4 -5
- package/dist/types/primitives/typography/index.d.ts +4 -5
- package/dist/types/primitives/typography/typography.types.d.mts +1 -1
- package/dist/types/primitives/typography/typography.types.d.ts +1 -1
- package/dist/types/primitives/venue-logo/index.d.mts +4 -5
- package/dist/types/primitives/venue-logo/index.d.ts +4 -5
- package/dist/types/primitives/venue-logo/svg/default-venue.d.mts +1 -1
- package/dist/types/primitives/venue-logo/svg/default-venue.d.ts +1 -1
- package/dist/types/primitives/venue-logo/svg/logo-betdex.d.mts +1 -1
- package/dist/types/primitives/venue-logo/svg/logo-betdex.d.ts +1 -1
- package/dist/types/primitives/venue-logo/svg/logo-hyperliquid.d.mts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-hyperliquid.d.ts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-kalshi.d.mts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-kalshi.d.ts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-limitless.d.mts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-limitless.d.ts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-myriad.d.mts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-myriad.d.ts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-novig.d.mts +4 -23
- package/dist/types/primitives/venue-logo/svg/logo-novig.d.ts +4 -23
- package/dist/types/primitives/venue-logo/svg/logo-opinion.d.mts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-opinion.d.ts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-polymarket.d.mts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-polymarket.d.ts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-pred.d.mts +4 -5
- package/dist/types/primitives/venue-logo/svg/logo-pred.d.ts +4 -5
- package/dist/types/primitives/venue-logo/svg/logo-predict.d.mts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-predict.d.ts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-probable.d.mts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-probable.d.ts +4 -4
- package/dist/types/primitives/venue-logo/svg/logo-prophetx.d.mts +4 -26
- package/dist/types/primitives/venue-logo/svg/logo-prophetx.d.ts +4 -26
- package/dist/types/primitives/venue-logo/svg/logo-tiprun.d.mts +4 -5
- package/dist/types/primitives/venue-logo/svg/logo-tiprun.d.ts +4 -5
- package/dist/types/primitives/venue-logo/venue-logo.constants.d.mts +1 -1
- package/dist/types/primitives/venue-logo/venue-logo.constants.d.ts +1 -1
- package/dist/types/profile/index.d.mts +4 -4
- package/dist/types/profile/index.d.ts +4 -4
- package/dist/types/profile/tabs/about-tab.d.mts +4 -4
- package/dist/types/profile/tabs/about-tab.d.ts +4 -4
- package/dist/types/profile/tabs/accounts-wallets-tab.d.mts +4 -4
- package/dist/types/profile/tabs/accounts-wallets-tab.d.ts +4 -4
- package/dist/types/profile/tabs/trading-access-tab.d.mts +4 -4
- package/dist/types/profile/tabs/trading-access-tab.d.ts +4 -4
- package/dist/types/shared/default-avatar.d.mts +4 -4
- package/dist/types/shared/default-avatar.d.ts +4 -4
- package/dist/types/shared/open-orders.d.mts +1 -1
- package/dist/types/shared/open-orders.d.ts +1 -1
- package/dist/types/shared/react-inert.d.mts +1 -0
- package/dist/types/shared/react-inert.d.ts +1 -0
- package/dist/types/shared/transfer-fee-summary.d.mts +1 -1
- package/dist/types/shared/transfer-fee-summary.d.ts +1 -1
- package/dist/types/trading/fund-kalshi-modal.d.mts +4 -4
- package/dist/types/trading/fund-kalshi-modal.d.ts +4 -4
- package/dist/types/trading/manage-betdex-account-modal.d.mts +1 -1
- package/dist/types/trading/manage-betdex-account-modal.d.ts +1 -1
- package/dist/types/trading/place-order/index.d.mts +4 -4
- package/dist/types/trading/place-order/index.d.ts +4 -4
- package/dist/types/trading/place-order/index.place-order.execution-view.d.mts +6 -6
- package/dist/types/trading/place-order/index.place-order.execution-view.d.ts +6 -6
- package/dist/types/trading/place-order/index.place-order.failure.d.mts +4 -4
- package/dist/types/trading/place-order/index.place-order.failure.d.ts +4 -4
- package/dist/types/trading/place-order/index.place-order.success.d.mts +4 -4
- package/dist/types/trading/place-order/index.place-order.success.d.ts +4 -4
- package/dist/types/trading/settlement/index.d.mts +4 -4
- package/dist/types/trading/settlement/index.d.ts +4 -4
- package/dist/types/trading/settlement/settlement-details.d.mts +4 -4
- package/dist/types/trading/settlement/settlement-details.d.ts +4 -4
- package/dist/types/trading/settlement/settlement-text-renderer.d.mts +4 -4
- package/dist/types/trading/settlement/settlement-text-renderer.d.ts +4 -4
- package/dist/types/withdraw/index.d.mts +4 -4
- package/dist/types/withdraw/index.d.ts +4 -4
- package/dist/types/withdraw/steps/withdraw-amount.d.mts +1 -1
- package/dist/types/withdraw/steps/withdraw-amount.d.ts +1 -1
- package/dist/types/withdraw/steps/withdraw-method.d.mts +1 -1
- package/dist/types/withdraw/steps/withdraw-method.d.ts +1 -1
- package/dist/types/withdraw/steps/withdraw-provider.d.mts +1 -1
- package/dist/types/withdraw/steps/withdraw-provider.d.ts +1 -1
- package/dist/types/withdraw/steps/withdraw-success.d.mts +2 -2
- package/dist/types/withdraw/steps/withdraw-success.d.ts +2 -2
- package/package.json +9 -8
- package/dist/chunk-6CZNJSRL.mjs +0 -3551
- package/dist/chunk-7G2GTWAS.mjs +0 -5189
- package/dist/chunk-7ORC3TUJ.mjs +0 -2883
- package/dist/chunk-EJXA32MG.mjs +0 -2377
- package/dist/chunk-JH4B3ZHQ.mjs +0 -1
- package/dist/chunk-KN7JN7F5.mjs +0 -8303
- package/dist/chunk-PN5HEBFC.mjs +0 -5789
- package/dist/chunk-W2LCFCW3.mjs +0 -2879
- package/dist/chunk-WOCZ4TVT.mjs +0 -1645
- package/dist/chunk-XZVGHKMW.mjs +0 -11426
- package/dist/event-market-A276CAYG.mjs +0 -21
package/dist/chunk-6CZNJSRL.mjs
DELETED
|
@@ -1,3551 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import {
|
|
3
|
-
EventListItemDetails,
|
|
4
|
-
MarketDetails,
|
|
5
|
-
MarketDetailsList,
|
|
6
|
-
isErrorWithStatus
|
|
7
|
-
} from "./chunk-7G2GTWAS.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
|
-
};
|