@riverbankcms/sdk 0.123.0 → 0.125.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/README.md +14 -9
- package/dist/{PreviewEditorSidebar-DvJFmC29.mjs → PreviewEditorSidebar-BezDOtQ7.mjs} +22 -39
- package/dist/{PreviewEditorUI-DVHP4bCo.mjs → PreviewEditorUI-CgSqmfo2.mjs} +3 -3
- package/dist/{PreviewQueryProvider-07EE4uWL.mjs → PreviewQueryProvider-BH-3-jSj.mjs} +1 -1
- package/dist/{SdkPreviewModeRuntime-BE5eFayo.mjs → SdkPreviewModeRuntime-Co3AHfj0.mjs} +1031 -1237
- package/dist/{SiteChromeCustomizeContext-4hn4A0HX.mjs → SiteChromeCustomizeContext-BHF-KANn.mjs} +1949 -2004
- package/dist/_dts/ai/src/contracts/proposals.d.ts +1236 -4152
- package/dist/_dts/api/src/accessAdmin.d.ts +2 -14
- package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +435 -0
- package/dist/_dts/api/src/bookingClosures.d.ts +3 -3
- package/dist/_dts/api/src/bookingConfig.d.ts +72 -73
- package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +26 -35
- package/dist/_dts/api/src/bookingRecords.d.ts +4 -15
- package/dist/_dts/api/src/bookingVerticalCatalog.d.ts +746 -0
- package/dist/_dts/api/src/bookingVerticalPreset.d.ts +38 -0
- package/dist/_dts/api/src/bookingVerticals.d.ts +11 -652
- package/dist/_dts/api/src/bookings.d.ts +11 -9
- package/dist/_dts/api/src/cache-tags.d.ts +2 -2
- package/dist/_dts/api/src/commercePortalEndpoints.d.ts +10 -10
- package/dist/_dts/api/src/common/envelope.d.ts +2 -0
- package/dist/_dts/api/src/contentRuntime.d.ts +0 -17
- package/dist/_dts/api/src/courseEndpointDefinitions.d.ts +99 -0
- package/dist/_dts/api/src/courses.d.ts +22 -33
- package/dist/_dts/api/src/defineEndpointDefinitions.d.ts +14 -0
- package/dist/_dts/api/src/demoMutationPolicies.d.ts +4 -0
- package/dist/_dts/api/src/endpoints.d.ts +3740 -3733
- package/dist/_dts/api/src/event-destination-policy.d.ts +1 -1
- package/dist/_dts/api/src/event-presentation.d.ts +4 -9
- package/dist/_dts/api/src/index.d.ts +9 -11
- package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +376 -0
- package/dist/_dts/api/src/participantMessaging.d.ts +2 -2
- package/dist/_dts/api/src/public/endpoints.d.ts +1 -1
- package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +272 -0
- package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +274 -0
- package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +31 -0
- package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +152 -0
- package/dist/_dts/api/src/publicExperience/siteEndpoints.d.ts +95 -0
- package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +154 -0
- package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +10 -962
- package/dist/_dts/api/src/publicWholeSeriesEndpointDefinitions.d.ts +52 -0
- package/dist/_dts/api/src/sdkContracts.d.ts +0 -51
- package/dist/_dts/api/src/sdkEntryReadEndpoints.d.ts +23 -0
- package/dist/_dts/api/src/siteAccessAdmin.d.ts +23 -0
- package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -38
- package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -4
- package/dist/_dts/billing/src/plans/types.d.ts +24 -5
- package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -15
- package/dist/_dts/blocks/src/contracts/index.d.ts +1 -1
- package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +4 -16
- package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +8 -222
- package/dist/_dts/blocks/src/portal/types.d.ts +3 -3
- package/dist/_dts/blocks/src/subroutes/fold.d.ts +1 -14
- package/dist/_dts/blocks/src/subroutes/index.d.ts +1 -1
- package/dist/_dts/blocks/src/subroutes/kinds.d.ts +3 -3
- package/dist/_dts/blocks/src/system/blocks/course-details.d.ts +0 -11
- package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +3 -4
- package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +1 -1
- package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +401 -12
- package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +9 -10
- package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +14 -13
- package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +1 -2
- package/dist/_dts/blocks/src/system/blocks/events/shared/filtering.d.ts +1 -4
- package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +19 -18
- package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +9 -11
- package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +2 -2
- package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +10 -10
- package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +10 -10
- package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +162 -0
- package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +59 -0
- package/dist/_dts/blocks/src/system/runtime/api/types/courses.d.ts +134 -0
- package/dist/_dts/blocks/src/system/runtime/api/types/discounts.d.ts +85 -0
- package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +241 -0
- package/dist/_dts/blocks/src/system/runtime/api/types/forms.d.ts +53 -0
- package/dist/_dts/blocks/src/system/runtime/api/types/newsletter.d.ts +32 -0
- package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +220 -0
- package/dist/_dts/blocks/src/system/runtime/api/types/shop.d.ts +176 -0
- package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +12 -1121
- package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +20 -583
- package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +9 -276
- package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +1 -12
- package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +0 -1
- package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +0 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +2 -3
- package/dist/_dts/blocks/src/system/runtime/nodes/course-details/logic.d.ts +1 -18
- package/dist/_dts/blocks/src/system/runtime/nodes/course-details/runs.d.ts +0 -2
- package/dist/_dts/blocks/src/system/runtime/nodes/course-details.server.d.ts +1 -5
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.d.ts +21 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/index.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/pricing.d.ts +14 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +0 -25
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.d.ts +24 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.d.ts +9 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.d.ts +35 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.d.ts +7 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.d.ts +31 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +80 -55
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.d.ts +14 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/whole-series-registration.headless.contract.d.ts +4 -5
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +0 -38
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.server.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +2 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +4 -3
- package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +2 -2
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +12 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +0 -4
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventScope.d.ts +0 -9
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +0 -5
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +0 -11
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +13 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +0 -21
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +24 -433
- package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +1 -2
- package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +52 -266
- package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -15
- package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventFilters.d.ts +0 -8
- package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +1573 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +1 -3
- package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -3
- package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +2 -2
- package/dist/_dts/content-model/src/content-types/builtin-schemas.d.ts +0 -5
- package/dist/_dts/content-model/src/content-types/builtins.d.ts +0 -5
- package/dist/_dts/content-model/src/templates/defaults.d.ts +6 -3
- package/dist/_dts/core/src/editor-state.d.ts +1 -13
- package/dist/_dts/db/src/generated/supabase/database.types.d.ts +1646 -37
- package/dist/_dts/preview-next/src/client/preview/siteChromeBrandPreferences.d.ts +6 -6
- package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +6 -1
- package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +27 -4
- package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -2
- package/dist/_dts/sdk/src/cli/commands/pull-dated-offering-scope.d.ts +1 -1
- package/dist/_dts/sdk/src/cli/commands/pull-dry-run.d.ts +4 -6
- package/dist/_dts/sdk/src/cli/commands/push/consts.d.ts +1 -1
- package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +1 -1
- package/dist/_dts/sdk/src/cli/commands/push/pushAllExtras.d.ts +0 -1
- package/dist/_dts/sdk/src/cli/commands/push/verification.d.ts +1 -1
- package/dist/_dts/sdk/src/cli/content/collectionWriters.d.ts +23 -0
- package/dist/_dts/sdk/src/cli/content/metadataAfterPush.d.ts +25 -0
- package/dist/_dts/sdk/src/cli/content/reader.d.ts +0 -52
- package/dist/_dts/sdk/src/cli/content/writer.d.ts +3 -81
- package/dist/_dts/sdk/src/cli/site-commands/datedOfferingCommands.d.ts +6 -9
- package/dist/_dts/sdk/src/client/contentReadOperations.d.ts +40 -0
- package/dist/_dts/sdk/src/client/management/index.d.ts +1 -3
- package/dist/_dts/sdk/src/client/management/types.d.ts +3 -91
- package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +72 -0
- package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +10 -75
- package/dist/_dts/sdk/src/client/types.d.ts +7 -33
- package/dist/_dts/sdk/src/components.d.ts +1 -1
- package/dist/_dts/sdk/src/config/types.d.ts +1 -1
- package/dist/_dts/sdk/src/config/validation.d.ts +3 -6
- package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
- package/dist/_dts/sdk/src/contracts/page.d.ts +0 -8
- package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +1 -34
- package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +4 -3
- package/dist/_dts/sdk/src/next/catch-all-utils.d.ts +0 -11
- package/dist/_dts/sdk/src/next/catch-all.d.ts +1 -76
- package/dist/_dts/sdk/src/next/types.d.ts +0 -19
- package/dist/_dts/sdk/src/public-api/contracts.d.ts +7 -207
- package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
- package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -1
- package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
- package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +0 -7
- package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +81 -0
- package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
- package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -51
- package/dist/_dts/sdk/src/rendering/overrides.d.ts +2 -1
- package/dist/_dts/sdk/src/routing/entrySubroutes.d.ts +6 -6
- package/dist/_dts/sdk/src/routing/index.d.ts +0 -2
- package/dist/_dts/sdk/src/routing/resolveOccurrence.d.ts +3 -3
- package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +10 -39
- package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
- package/dist/_dts/sdk/src/version.d.ts +1 -1
- package/dist/_dts/site-commands/src/adapter.d.ts +1 -1
- package/dist/_dts/site-commands/src/appointmentCommandSchemas.d.ts +100 -0
- package/dist/_dts/site-commands/src/capabilityGaps.d.ts +2 -2
- package/dist/_dts/site-commands/src/commandContract.d.ts +1242 -0
- package/dist/_dts/site-commands/src/commandDomain.d.ts +20 -0
- package/dist/_dts/site-commands/src/commandIdentifiers.d.ts +7 -0
- package/dist/_dts/site-commands/src/commandValidation.d.ts +10 -0
- package/dist/_dts/site-commands/src/commands.d.ts +729 -2659
- package/dist/_dts/site-commands/src/domain.d.ts +1 -1
- package/dist/_dts/site-commands/src/eventCommandContent.d.ts +11 -0
- package/dist/_dts/site-commands/src/exposure.d.ts +1 -1
- package/dist/_dts/site-commands/src/index.d.ts +6 -0
- package/dist/_dts/site-commands/src/metadata.d.ts +1 -27
- package/dist/_dts/site-commands/src/planner.d.ts +1 -1
- package/dist/_dts/site-commands/src/refContributions.d.ts +1 -1
- package/dist/_dts/site-commands/src/refs.d.ts +1 -4
- package/dist/_dts/site-commands/src/siteStyleCommandSchema.d.ts +378 -0
- package/dist/_dts/site-commands/src/siteStyleSelectionSchemaBuilder.d.ts +46 -0
- package/dist/_dts/site-commands/src/staticExecutionGaps.d.ts +2 -2
- package/dist/_dts/site-commands/src/venueCommandMapping.d.ts +21 -0
- package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +58 -0
- package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +1 -0
- package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
- package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +47 -24
- package/dist/cli/index.mjs +7267 -8479
- package/dist/cli/init-docs/content/cli-reference.md +5 -21
- package/dist/cli/init-docs/content/content-management.md +4 -5
- package/dist/client/{DiscountCodeDisclosure-DIWj-P9v.mjs → DiscountCodeDisclosure-CyPpekBp.mjs} +2 -2
- package/dist/client/{EventCombined.client-De8YWBSr.mjs → EventCombined.client-zywit-60.mjs} +5 -16
- package/dist/client/{EventListing.client-seHTjimY.mjs → EventListing.client-J2nLhkKT.mjs} +3 -10
- package/dist/client/{LeafletStaticMap-BmQxFcJW.mjs → LeafletStaticMap-CSubXWt6.mjs} +1 -1
- package/dist/client/{MagicLinkForm-OoJAIUIj.mjs → MagicLinkForm-DDLIfiq9.mjs} +2 -2
- package/dist/client/{StepIndicator-CiZ8kdPk.mjs → StepIndicator-DE8EvHIp.mjs} +2 -2
- package/dist/client/{accordion-6lnN__XJ.mjs → accordion-Ct5T5NiA.mjs} +1 -1
- package/dist/client/{bookingForm-5uyqhONU.mjs → bookingForm-DMxtLPxw.mjs} +6 -6
- package/dist/client/bookings.mjs +753 -818
- package/dist/client/{carousel-Dtnifil_.mjs → carousel--FMqgvob.mjs} +1 -1
- package/dist/client/{cart-5Tc5S7NV.mjs → cart-BKX1bWiU.mjs} +3 -3
- package/dist/client/{checkout-CYKKN5Hr.mjs → checkout-B_jxi4WW.mjs} +3 -3
- package/dist/client/client.mjs +6876 -7150
- package/dist/client/{context-BGZNlGXB.mjs → context-CJz1Vlsz.mjs} +40 -43
- package/dist/client/{courseRegistration-CxCBybB4.mjs → courseRegistration-DH4MlkRD.mjs} +606 -621
- package/dist/client/{eventCalendar-Xj2jZS9X.mjs → eventCalendar-BQILwAcL.mjs} +5 -13
- package/dist/client/{eventCombined-CgcMoOgM.mjs → eventCombined-DFFW_Vmo.mjs} +3 -3
- package/dist/client/{eventDetails-CEAH8Edc.mjs → eventDetails-B045CTSJ.mjs} +147 -118
- package/dist/client/{eventListing-qyPVQ0wP.mjs → eventListing-BDMYNVzS.mjs} +3 -3
- package/dist/client/{eventRegistration-DDu79CtL.mjs → eventRegistration-CQ2-BSnB.mjs} +165 -68
- package/dist/client/{form-Bc7JKI7I.mjs → form-DJKuyZgN.mjs} +2 -2
- package/dist/client/{headerSection-vTku_LEl.mjs → headerSection-DeTjfiDo.mjs} +2 -2
- package/dist/client/hooks.mjs +3454 -2363
- package/dist/client/{locationMap-Bg7X4Jna.mjs → locationMap-i2wDA8gB.mjs} +2 -2
- package/dist/client/{newsletterForm-lpylVdp5.mjs → newsletterForm-DKiueauk.mjs} +2 -2
- package/dist/client/{pricing-DE8fjJiT.mjs → pricing-C01J3Epx.mjs} +3 -19
- package/dist/client/{productDetail-D7Bo2RMH.mjs → productDetail-Dfc1sZaX.mjs} +3 -3
- package/dist/client/{productList-VjnZqiqN.mjs → productList-BXbvXWTF.mjs} +3 -3
- package/dist/client/{propsDecoder-DreFXjNP.mjs → propsDecoder-CIR5DQ1l.mjs} +213 -376
- package/dist/client/rendering/client.mjs +3036 -3292
- package/dist/client/rendering/islands.mjs +18 -18
- package/dist/client/rendering.mjs +5489 -4585
- package/dist/client/{shop-IRsHHbf7.mjs → shop-BbNwPKM-.mjs} +6 -6
- package/dist/client/{shop-commerce-gnI8PieZ.mjs → shop-commerce-XO-XMFEt.mjs} +5 -5
- package/dist/client/{shop-commerce-store-BTbrhObn.mjs → shop-commerce-store-Byh6OUGK.mjs} +1 -1
- package/dist/client/{shopShared-D6KS2_qk.mjs → shopShared-Bbq39mwr.mjs} +3 -3
- package/dist/client/{useDiscountCodeUi-DCccGCxV.mjs → useDiscountCodeUi-Bcyh4508.mjs} +2 -2
- package/dist/client/{useEventFilters-eGs3rPZQ.mjs → useEventFilters-C8OOJ3el.mjs} +59 -124
- package/dist/client/{usePolling-CvSU2sur.mjs → usePolling-CyJVo9kF.mjs} +2 -2
- package/dist/preview-next/before-render.mjs +1115 -1044
- package/dist/preview-next/client/runtime.mjs +4 -4
- package/dist/preview-next/middleware.mjs +1118 -1047
- package/dist/{previewAuthStore-ShY26RNz.mjs → previewAuthStore-CJX21dGi.mjs} +1121 -1047
- package/dist/{sdk-runtime-CJxkFq2B.mjs → sdk-runtime-BGhyuE-E.mjs} +2 -2
- package/dist/{separator-CoFmo8uA.mjs → separator-BFs-Kmv5.mjs} +1 -1
- package/dist/server/components.mjs +5909 -5011
- package/dist/server/config-validation.mjs +3456 -2354
- package/dist/server/config.mjs +3456 -2354
- package/dist/server/data.mjs +3454 -2365
- package/dist/server/index.mjs +1501 -1491
- package/dist/server/next.mjs +7534 -8067
- package/dist/server/page-converter.mjs +1900 -2038
- package/dist/server/prebuild.mjs +1 -1
- package/dist/server/rendering/server.mjs +5618 -4723
- package/dist/server/rendering.mjs +6238 -5393
- package/dist/server/routing.mjs +3616 -2507
- package/dist/server/server.mjs +3300 -3477
- package/package.json +1 -1
- package/dist/_dts/api/src/previewContentContract.d.ts +0 -4
- package/dist/_dts/sdk/src/cli/commands/course.d.ts +0 -6
- package/dist/_dts/sdk/src/cli/commands/push/scopes/courses.d.ts +0 -4
- package/dist/_dts/sdk/src/client/management/courses.d.ts +0 -10
- package/dist/_dts/sdk/src/routing/resolveEntrySubroute.d.ts +0 -36
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { $ as confirmAutosaveBatch, $a as toLocationMapHydrationProps, $c as cn, $n as uiTransforms, $o as CircleMinusIcon, $r as productItemKey, $s as mapCurrentValueForSelect, $t as undoHistory, Aa as eventCalendarDefaultViewSchema, Al as unsafeAsFormId, An as deriveLaunchReadiness, Ao as mediaSchema, Ar as buildGiftingInteractiveIslandProps, As as parseThemeButtonVariantId, At as ReferenceField, Ba as eventBlockKindValues, Bi as getGradientPreset, Bl as Star, Bn as mergeContentWithBlockStyleOverrides, Bo as isObjectRecord, Br as buildProductListInteractiveIslandProps, Bs as assertNever$6, Bt as hideThemeV2RawStyleFields, Ca as resolveEventListPaginationAction, Cc as Dialog, Ci as formatSiteChromeBackgroundTokenLabel, Cl as assertNever$5, Cn as useMediaEditorOptional, Co as defineProgressiveBlockRuntime, Cr as resolveDiscountContext, Cs as siblingPath, Ct as IconPickerField, Da as calendarTabViewsSchema, Dc as DialogHeader, Di as retargetCompiledRuntimeFieldsForContentAdjacency, Dl as unsafeAsAppointmentResourceId, Do as splitPositioningClasses, Dr as getStepNumber$1, Dt as ButtonWidgetProvider, Ea as normalizeOptionalId, Ec as DialogFooter, Ei as retargetCompiledBoundaryRuntimeForContentAdjacency, El as parseSiteId, En as getPageDesignEditorState, Eo as markEditableSurfaceForwarding, Er as WIZARD_STEPS$1, Et as ButtonVariantField, Fa as eventCalendarListLayoutCompatibleDisplayModeValues, Fc as createCollapsibleScope, Fl as Upload, Fn as createCustomBlockRegistry, Fo as parseBlockIconValue, Fr as checkoutBlockDefinition, Fs as resolveOnColorForThemeToken, Ft as EditorProvider, Ga as normalizeEventScheduleScope, Gc as createCollection, Gi as sectionTransitionVariantForBoundaryOptionId, Gn as siteHeaderManifest, Go as isInlineTextEmpty, Gr as buildProductDetailDisplay, Gs as mergeStyles, Gt as useEditorUiStore, Ha as eventSurfaceScopeValues, Hi as defaultSectionTransitionVariantForFamily, Hn as getBlockDefinition, Ho as logger, Hr as getShopDisplayForItems, Hs as normalizeBoxStylesCardVariant, Ht as stripTopLevelRoutingUi, Ia as eventCalendarListLayoutOptions, In as buildThemeRuntime, Io as resolveBlockIconRenderValue, Ir as cartBlockDefinition, Is as resolveTokenOrCssColorValue, It as useEditor, Ja as normalizeEventSurfaceScope, Jc as composeEventHandlers, Ji as backgroundAppearanceQuickColorTokenNames, Jn as planSiteOverlayHeaderClearance, Jo as isBlockButtonRole, Jr as EMPTY_COMMERCE_CART_STATE, Js as getFieldIntent, Jt as canRedoHistory, Ka as normalizeEventStaffMemberId, Kc as useControllableState, Ki as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, Kl as Plus, Kn as SITE_CHROME_VISIBLE_HEADER_SELECTOR, Ko as parseInlineTextFromUnknown, Kr as formatCommercePrice, Ks as rgbColorValue, Kt as useEditorUiStoreInstance, La as el, Li as gradientToCss, Ln as DEFAULT_THEME_RESPONSIVE_MODE, Lo as parseGeneratedIconAssetId, Lr as buildCartInteractiveIslandProps, Ls as isThemeV2NormalEditorRawStyleFieldName, Lt as LinkField, Ma as filterAutoShowSchema, Mc as Content, Ml as err$2, Mn as isSupportedLoaderEndpoint, Mo as resolveFeatureCardGeneratedIconSizePx, Mr as buildCourseRegistrationInteractiveIslandProps, Ms as parseThemeForPersistence, Mt as useRichTextImagePicker, Na as previewStageSchema, Nc as Root, Ni as surfaceResolutionContextFromTheme, Nl as ok$3, Nn as ThemeScope, No as shouldReserveFeatureCardIconZone, Nr as normalizeEventRegistrationPageSurfaceSubject, Ns as getTextColorForBackground, Nt as RichTextField, Oa as columnOptionSchema, Oc as DialogTitle, Oi as planPageDesignLayoutLookCompatibility, Ol as unsafeAsAppointmentServiceId, On as decodePublicProductCategorySelectorQuery, Oo as planSiteChromePlacement, Or as getWizardStepsForContext$1, Ot as FileField, Pa as weekStartSchema, Pc as Trigger, Pl as X, Pn as containerResponsiveThemeCss, Po as buildGeneratedBlockIconRenderAssetLookupFromUnknown, Pr as resolveEventRegistrationScopedEvents, Ps as isCssColorLiteral, Pt as RichTextWidgetProvider, Q as beginAutosaveBatch, Qa as normalizeLocationMapProps, Qc as useComposedRefs, Qn as layoutTransforms, Qo as ChevronDownIcon, Qr as parseStoredCommerceCartState, Qs as hasEmptyOption, Qt as redoHistory, Ra as when, Ri as GRADIENT_PRESETS, Rl as Ticket, Rn as getResponsiveScopeSpec, Ro as parseGeneratedIconSetId, Rr as buildCheckoutInteractiveIslandProps, Rs as pageDesignEditorBackgroundOverrideOwner, Rt as LinkWidgetProvider, S as usePreviewThemeOverlay, Sa as resolveEventCalendarListPageSize, Sc as TabsTrigger, Si as resolveBackgroundColorValue, Sl as formatCurrencyAmount, Sn as MediaEditorContextProvider, So as defineClientOwnedBlockRuntime, Sr as findPreSelectedEvent, Ss as getAtPath, St as InlineTextField, Ta as normalizeCsvString, Tc as DialogDescription, Ti as compileEditorModelRuntime, Tl as parseMediaAssetId, Tn as applyPageDesignEditorAction, To as composeHeaderSectionWrapperClassName, Tr as resolveRegistrationTarget, Tt as EntryPickerWidgetProvider, Ua as normalizeEventBlockKind, Uc as useId$1, Ui as sectionTransitionFamilies, Un as projectRecurringSchedule, Uo as coerceInlineTextWithFallback, Ur as buildCartDisplay, Us as normalizeCardVariantRole, Ut as getBlockManifestFromSdkConfig, Va as eventScheduleScopeValues, Vi as parseGradientPresetId, Vl as Sparkles, Vn as generateDefaultAccordionSystem, Vo as isRecord$20, Vr as buildShopInteractiveIslandProps, Vs as ICON_CONFIG, Vt as prepareBlockEditorManifest, Wa as normalizeEventCategoryIdsCsv, Wc as useDirection, Wi as sectionTransitionFamilyForBoundaryOptionId, Wl as RotateCcw, Wn as siteFooterManifest, Wo as inlineTextToPlainText, Wr as buildProductCardDisplay, Ws as backgroundColorStyle, Xa as publicEventSchema, Xc as Button, Xi as parseBackgroundAppearanceColorToken, Xn as contentTransforms, Xo as ArrowDownIcon, Xr as buildProductCartItem, Xs as SdkConfigProvider, Xt as createHistoryState, Ya as normalizeEventVenueId, Yc as Primitive, Yi as foregroundTokenForBackgroundAppearanceColorToken, Yn as visibleHeaderClearancePx, Yo as getIconComponent, Yr as buildPassCartItem, Ys as isHeaderField, Yt as canUndoHistory, Za as buildGoogleMapsDirectionsUrl, Zi as defaultThemeTokens, Zl as Minus, Zn as mediaTransforms, Zo as ArrowRightIcon, Zr as deriveCommerceCheckoutState, Zs as useSdkConfig, Zt as pushHistoryEntry, _a as resolveSpacing, _i as defineFragment, _l as publicEventPricingCurrency, _o as blockBookingPaymentTermsSchema, _r as buildFormInteractiveIslandProps, _s as resolveMediaNodeResponsiveImage, _t as createSiteOptionWidgetAdapters, aa as runTransforms, ai as faqHeadingFragment, al as formatBookingDate, an as createSnapshotFromPageRecord, ao as formatEventTeacherLine, ar as shopBlockDefinition, as as FileSpreadsheetIcon, at as resolvePreviewSidebarTab, au as CirclePlus, ba as eventPageSizeSchema, bc as TabsContent, bi as boxStylesTransforms, bl as publicEventScalarPrice, bn as createStoreBackend, bo as defineInteractiveIslandMetaKeys, br as toRegistrationEvents, bs as SECTION_BACKGROUND_MIN_SOURCE_WIDTH, bt as OfferingsPreviewGroupOrderField, cc as SelectContent, ci as formEmbedFragment, cl as formatBookingTime, cn as parseReferenceKind, co as getContainerClass, cr as newsletterSignupBlockDefinition, cs as PlusIcon, ct as PreviewInlineTextEditor, cu as ChevronLeft, da as buildOfferingsPreviewRenderStates, dc as SelectValue, di as testimonialsHeadingFragment, dl as parseBookingLocalDate, do as resolveEventLinkProps, dr as buildEventListingInteractiveIslandProps, ds as buildResolveImageUrlContext, dt as useUISelector, du as ArrowDown, ec as mapOptionValueForSelect, ei as reduceCommerceCart, el as clsx, en as unsafeAsLinkedContentEntryId, eo as formatDate$3, er as formattingTransforms, es as CirclePlusIcon, et as deriveTransactionCapabilities, eu as Image, f as PREVIEW_DESIGN_SAVE_ERROR_MESSAGE, fa as normalizeOfferingsPreviewItemLimit, fi as ctaCopyFragment, fl as resolveBookingTimeZoneId, fn as PaletteProvider, fo as getEventAvailability, fr as eventCalendarBlockDefinition, fs as computeMediaTransformStyle, ft as EditableBlockProvider, fu as __exportAll, ga as isSemanticSpacing, gi as bodyCopyFragment, gl as formatBookingPriceDisplay, gn as createManifestFormAdapter, go as resolveRuntimeEventPricing, gr as formBlockDefinition, gs as resolveImageUrlWithContext, gt as createSiteOptionApiLoader, ha as resolveOfferingsPreviewGroups, hi as heroCopyFragment, hl as parseEventPageSurfaceSubject, ho as getLocalMinuteOfDay, hr as buildEventCalendarListingRender, hs as renderVideo, ht as useEntryEditorController, i as usePreviewDesignHistoryOrder, ia as createTransformRegistry, ii as faqAccordionFragment, il as addLocalScheduleDays, in as createRoutingHelpers, io as formatEventPriceDisplay, ir as NAV_DROPDOWN_SHIFT_PROPERTY, is as FileAudioIcon, iu as CreditCard, ja as eventLayoutSchema, ji as designRuntimeRulesForTheme, jl as unsafeAsPassId, jn as AMBIENT_BACKGROUND_ROLES, jo as FEATURE_CARD_ICON_TREATMENTS, jr as courseRegistrationBlockDefinition, js as themeButtonClassName, jt as ReferenceWidgetProvider, ka as eventButtonVariantSchema, ki as componentRuntimeRulesForTheme, kl as unsafeAsCustomerPassId, kn as DEFAULT_LAUNCH_READINESS_INPUT, ko as PUBLIC_DOWNLOAD_MEDIA_TYPES, kr as giftingBlockDefinition, ks as AFFORDANCE_SUPPRESS_CLASS, kt as MediaField, lc as SelectItem, li as formCopyFragment, ll as formatLocalScheduleDate, lo as groupEventsByDate, lr as buildNewsletterFormInteractiveIslandProps, ls as ImagePresets, lt as PreviewTextEditor, lu as ChevronDown, ma as resolveOfferingsPreviewGroupCta, mi as ctaRowFragment, ml as toScheduledBookingDateTime, mn as validateBlockManifestIssues, mo as getLocalDateKey, mr as buildEventCalendarListingDisplay, ms as renderAudio, n as useSiteChromeCustomizeOptional, nc as FieldFrame, ni as headingFragment, nl as unsafeAsEditorBlockId, no as formatEventDateParts, nr as ImageResolveContextProvider, ns as DownloadIcon, nt as idleEditorTransactionQueueState, oa as ctaButton, oi as blogFeaturedPostFragment, ol as formatBookingDateTime, on as BUILT_IN_REFERENCE_KINDS, oo as formatTime$3, or as productListBlockDefinition, os as FileTextIcon, ou as CircleMinus, p as reportPreviewDesignError, pa as resolveOfferingsPreviewCoursePath, pi as heroCtaRowFragment, pl as toBookingTimeZone, pn as usePalette, po as getEventAvailabilityStatus, pr as buildEventCalendarInteractiveIslandProps, ps as getCurrentResolveImageUrlContext, pt as EntryControllerProvider, qa as normalizeEventSurfacePresetsCsv, qc as createContextScope, qi as backgroundAppearanceColorTokenNames, qn as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, qo as canonicalizePersistedBlockButtonRole, qr as formatInterval, qs as textColorStyle, qt as useOptionalEditorUiStoreInstance, r as PreviewDesignHistoryOrderProvider, rc as useField, ri as cardFragment, rl as unsafeAsEditorBlockValues, rn as useDebouncedLatestSave, ro as formatEventPrice, rr as useImageResolveContextOptional, rs as FileArchiveIcon, rt as rejectAutosaveBatch, sc as Select, si as singleButtonFragment, sl as formatBookingInstant, so as getCardOrientation, sr as productDetailBlockDefinition, ss as MinusIcon, st as PreviewRichTextEditor, su as ChevronRight, t as SiteChromeCustomizeProvider, tc as unmapValueFromSelect, ti as richTextFragment, tl as parseFooterModuleId, tn as recordsEqual, to as formatEventCompactDateRail, tr as createManifestValidator, ts as ClockIcon$1, tt as enqueueTransaction, tu as GripVertical, u as PREVIEW_DESIGN_LOAD_ERROR_MESSAGE, ua as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, uc as SelectTrigger, ui as testimonialsCarouselFragment, ul as getBookingLocalDateKey, uo as resolveEventCta, ur as eventListingBlockDefinition, us as MediaPlaceholder, va as buildEventRuntimeFilters, vi as BACKGROUND_POSITION_PRESET_VALUES, vl as publicEventPricingMode, vn as FormRenderer, vo as buildInteractiveIslandProps, vr as eventRegistrationBlockDefinition, vs as resolveMediaStorageUrl, vt as SiteOptionPickerField, wa as normalizeCsvIds, wc as DialogContent, wi as applyCompiledRuntimeFieldsToContent, wl as expectParsedBrandedId, wn as useApiMediaUploader, wr as resolveEventRequiresPayment, wt as EntryPickerField, x as PreviewThemeOverlayProvider, xa as getEventRuntimeFiltersKey, xc as TabsList, xi as resolveSurfaceForegroundStyles, xl as publicEventTicketTypes, xn as MediaEditor, xo as createZodCodec, xr as findEventByOccurrenceId, xs as attachRenderableMediaAssetFields, xt as OfferingsPreviewWidgetProvider, y as PreviewDesignCoordinatorProvider, ya as eventListPaginationActionSchema, yc as Tabs, yi as getAnchorClasses, yl as publicEventPricingType, yn as evaluateVisibility, yo as createInteractiveIslandCodec, yr as buildEventRegistrationInteractiveIslandProps, ys as setContextResolveImageUrlContext, yt as SiteOptionWidgetProvider, za as bindingSchema, zi as GRADIENT_PRESET_IDS, zn as escapeStyleContent, zo as RichTextDocSchema, zr as buildProductDetailInteractiveIslandProps, zs as asDesignBlockId } from "./SiteChromeCustomizeContext-4hn4A0HX.mjs";
|
|
3
|
-
import { i as useOptionalPreviewLayout, t as PreviewQueryProvider } from "./PreviewQueryProvider-
|
|
4
|
-
import { _ as API_ENDPOINTS, a as usePreviewToken, c as createBearerAPIClient, d as unwrapResponse, g as resolveSurfaceDocumentAttributes, h as SURFACE_IDS, i as usePreviewAuthFetch, m as SURFACE_DOCUMENT_DATA_ATTRIBUTE, n as markPreviewAuthExpired, o as isPreviewRuntimeSessionEditable, r as usePreviewAuth, s as ApiRequestError, t as initPreviewAuth } from "./previewAuthStore-
|
|
2
|
+
import { $ as beginAutosaveBatch, $a as resolveRuntimeEventPricing, $c as toScheduledBookingDateTime, $n as layoutTransforms, $o as renderAudio, $r as reduceCommerceCart, $t as redoHistory, Aa as bindingSchema, Ac as createCollection, Ai as designRuntimeRulesForTheme, An as DEFAULT_LAUNCH_READINESS_INPUT, Ao as isInlineTextEmpty, Ar as giftingBlockDefinition, As as mergeStyles, At as MediaField, Ba as formatEventPrice, Bc as parseFooterModuleId, Bi as sectionTransitionFamilies, Bl as GripVertical, Bn as escapeStyleContent, Bo as ClockIcon$1, Br as buildShopInteractiveIslandProps, Bs as unmapValueFromSelect, C as usePreviewThemeOverlay, Ca as buildEventRuntimeFilters, Ci as applyCompiledRuntimeFieldsToContent, Cl as Ticket, Cn as MediaEditorContextProvider, Co as parseGeneratedIconSetId, Cr as findPreSelectedEvent, Cs as pageDesignEditorBackgroundOverrideOwner, Ct as InlineTextField, Da as normalizeOptionalId, Di as planPageDesignLayoutLookCompatibility, Dn as getPageDesignEditorState, Do as logger, Dr as WIZARD_STEPS$1, Ds as normalizeBoxStylesCardVariant, Dt as ButtonVariantField, Ea as normalizeCsvString, Ei as retargetCompiledRuntimeFieldsForContentAdjacency, El as Sparkles, En as applyPageDesignEditorAction, Eo as isRecord$20, Er as resolveRegistrationTarget, Es as ICON_CONFIG, Et as EntryPickerWidgetProvider, Fa as normalizeLocationMapProps, Fc as Button, Fi as GRADIENT_PRESETS, Fn as containerResponsiveThemeCss, Fo as ArrowDownIcon, Fr as cartBlockDefinition, Fs as SdkConfigProvider, Ft as RichTextWidgetProvider, Ga as getContainerClass, Gc as formatBookingDateTime, Gi as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, Gl as CircleMinus, Gn as siteFooterManifest, Go as FileTextIcon, Gr as formatCommercePrice, Ha as formatEventTeacherLine, Hc as unsafeAsEditorBlockValues, Hi as sectionTransitionVariantForBoundaryOptionId, Hn as generateDefaultAccordionSystem, Ho as FileArchiveIcon, Hr as buildCartDisplay, Hs as useField, Ht as prepareBlockEditorManifest, Ia as toLocationMapHydrationProps, Ii as GRADIENT_PRESET_IDS, Il as Minus, In as createCustomBlockRegistry, Io as ArrowRightIcon, Ir as buildCartInteractiveIslandProps, Is as useSdkConfig, It as EditorProvider, Ja as resolveEventLinkProps, Jc as formatLocalScheduleDate, Ji as foregroundTokenForBackgroundAppearanceColorToken, Jl as ChevronDown, Jn as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, Jo as ImagePresets, Jr as buildPassCartItem, Js as SelectItem, Jt as useOptionalEditorUiStoreInstance, Ka as groupEventsByDate, Kc as formatBookingInstant, Ki as backgroundAppearanceColorTokenNames, Kl as ChevronRight, Kn as siteHeaderManifest, Ko as MinusIcon, Kr as formatInterval, Ks as Select, Kt as useEditorUiStore, La as formatDate$3, Lc as useComposedRefs, Li as getGradientPreset, Ln as buildThemeRuntime, Lo as ChevronDownIcon, Lr as buildCheckoutInteractiveIslandProps, Ls as hasEmptyOption, Lt as useEditor, Ma as eventCalendarListLayoutCompatibleDisplayModeValues, Mc as createContextScope, Mi as surfaceResolutionContextFromTheme, Mn as AMBIENT_BACKGROUND_ROLES, Mo as canonicalizePersistedBlockButtonRole, Mr as courseRegistrationBlockDefinition, Ms as textColorStyle, Mt as ReferenceWidgetProvider, Na as eventCalendarListLayoutOptions, Nc as composeEventHandlers, Nn as isSupportedLoaderEndpoint, No as isBlockButtonRole, Nr as buildCourseRegistrationInteractiveIslandProps, Ns as getFieldIntent, Nt as useRichTextImagePicker, Oa as el, Oc as useId$1, Oi as componentRuntimeRulesForTheme, Oo as coerceInlineTextWithFallback, Or as getStepNumber$1, Os as normalizeCardVariantRole, Ot as ButtonWidgetProvider, Pa as buildGoogleMapsDirectionsUrl, Pc as Primitive, Pi as gradientToCss, Pn as ThemeScope, Po as getIconComponent, Pr as checkoutBlockDefinition, Ps as isHeaderField, Pt as RichTextField, Qa as getLocalMinuteOfDay, Qc as toBookingTimeZone, Qn as mediaTransforms, Qo as getCurrentResolveImageUrlContext, Qr as productItemKey, Qt as pushHistoryEntry, Ra as formatEventCompactDateRail, Rc as cn, Ri as parseGradientPresetId, Rn as DEFAULT_THEME_RESPONSIVE_MODE, Ro as CircleMinusIcon, Rr as buildProductDetailInteractiveIslandProps, Rs as mapCurrentValueForSelect, Rt as LinkField, S as PreviewThemeOverlayProvider, Sa as eventCollectionSourceSchemaShape, Si as formatSiteChromeBackgroundTokenLabel, Sn as MediaEditor, So as parseGeneratedIconAssetId, Sr as findEventByOccurrenceId, Ss as isThemeV2NormalEditorRawStyleFieldName, St as OfferingsPreviewWidgetProvider, Ta as normalizeCsvIds, Ti as retargetCompiledBoundaryRuntimeForContentAdjacency, Tl as Star, Tn as useApiMediaUploader, To as isObjectRecord, Tr as resolveEventRequiresPayment, Ts as assertNever$6, Tt as EntryPickerField, Ua as formatTime$3, Uc as addLocalScheduleDays, Ul as CreditCard, Un as getBlockDefinition, Uo as FileAudioIcon, Ur as buildProductCardDisplay, Ut as stripTopLevelRoutingUi, Va as formatEventPriceDisplay, Vc as unsafeAsEditorBlockId, Vi as sectionTransitionFamilyForBoundaryOptionId, Vn as mergeContentWithBlockStyleOverrides, Vo as DownloadIcon, Vr as getShopDisplayForItems, Vs as FieldFrame, Vt as hideThemeV2RawStyleFields, Wa as getCardOrientation, Wc as formatBookingDate, Wl as CirclePlus, Wn as projectRecurringSchedule, Wo as FileSpreadsheetIcon, Wr as buildProductDetailDisplay, Wt as getBlockManifestFromSdkConfig, Xa as getEventAvailabilityStatus, Xc as parseBookingLocalDate, Xi as defaultThemeTokens, Xl as ArrowDown, Xn as visibleHeaderClearancePx, Xo as buildResolveImageUrlContext, Xr as deriveCommerceCheckoutState, Xs as SelectValue, Xt as canUndoHistory, Ya as getEventAvailability, Yc as getBookingLocalDateKey, Yi as parseBackgroundAppearanceColorToken, Yn as planSiteOverlayHeaderClearance, Yo as MediaPlaceholder, Yr as buildProductCartItem, Ys as SelectTrigger, Yt as canRedoHistory, Za as getLocalDateKey, Zc as resolveBookingTimeZoneId, Zl as __exportAll, Zn as contentTransforms, Zo as computeMediaTransformStyle, Zr as parseStoredCommerceCartState, Zt as createHistoryState, _a as buildEventCollectionDisplay, _c as Content, _i as BACKGROUND_POSITION_PRESET_VALUES, _l as err$2, _n as createManifestFormAdapter, _o as resolveFeatureCardGeneratedIconSizePx, _r as formBlockDefinition, _s as parseThemeForPersistence, _t as createSiteOptionApiLoader, aa as ctaButton, ac as TabsContent, ai as blogFeaturedPostFragment, al as publicEventScalarPrice, an as createRoutingHelpers, ao as defineInteractiveIslandMetaKeys, ar as NAV_DROPDOWN_SHIFT_PROPERTY, as as SECTION_BACKGROUND_MIN_SOURCE_WIDTH, b as PreviewDesignCoordinatorProvider, ba as eventCollectionDisplaySchemaShape, bc as createCollapsibleScope, bi as resolveSurfaceForegroundStyles, bl as Upload, bn as evaluateVisibility, bo as parseBlockIconValue, br as buildEventRegistrationInteractiveIslandProps, bs as resolveOnColorForThemeToken, bt as SiteOptionWidgetProvider, cc as Dialog, ci as formCopyFragment, cl as assertNever$5, co as defineProgressiveBlockRuntime, cr as productDetailBlockDefinition, cs as siblingPath, ct as PreviewRichTextEditor, da as normalizeOfferingsPreviewItemLimit, dc as DialogFooter, di as ctaCopyFragment, dl as parseSiteId, do as markEditableSurfaceForwarding, dr as eventListingBlockDefinition, ei as richTextFragment, el as parseEventPageSurfaceSubject, en as undoHistory, eo as normalizeEventRegistrationPageSurfaceSubject, er as uiTransforms, es as renderVideo, et as confirmAutosaveBatch, f as PREVIEW_DESIGN_SAVE_ERROR_MESSAGE, fa as resolveOfferingsPreviewCoursePath, fc as DialogHeader, fi as heroCtaRowFragment, fl as unsafeAsAppointmentResourceId, fo as splitPositioningClasses, fr as buildEventListingInteractiveIslandProps, ft as useUISelector, ga as resolveSpacing, gi as defineFragment, gl as unsafeAsPassId, go as FEATURE_CARD_ICON_TREATMENTS, gr as buildEventCalendarListingRender, gs as themeButtonClassName, gt as useEntryEditorController, ha as isSemanticSpacing, hi as bodyCopyFragment, hl as unsafeAsFormId, hn as validateBlockManifestIssues, ho as mediaSchema, hr as buildEventCalendarListingDisplay, hs as parseThemeButtonVariantId, i as usePreviewDesignHistoryOrder, ia as runTransforms, ic as Tabs, ii as faqHeadingFragment, il as publicEventPricingType, in as useDebouncedLatestSave, io as createInteractiveIslandCodec, ir as useImageResolveContextOptional, is as setContextResolveImageUrlContext, it as rejectAutosaveBatch, ja as previewStageSchema, jc as useControllableState, jl as Plus, jn as deriveLaunchReadiness, jo as parseInlineTextFromUnknown, jr as buildGiftingInteractiveIslandProps, js as rgbColorValue, jt as ReferenceField, ka as when, kc as useDirection, kl as RotateCcw, kn as decodePublicProductCategorySelectorQuery, ko as inlineTextToPlainText, kr as getWizardStepsForContext$1, ks as backgroundColorStyle, kt as FileField, la as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, lc as DialogContent, li as testimonialsCarouselFragment, ll as expectParsedBrandedId, ln as parseReferenceKind, lr as newsletterSignupBlockDefinition, lt as PreviewInlineTextEditor, ma as resolveOfferingsPreviewGroups, mi as heroCopyFragment, ml as unsafeAsCustomerPassId, mn as usePalette, mo as PUBLIC_DOWNLOAD_MEDIA_TYPES, mr as buildEventCalendarInteractiveIslandProps, ms as AFFORDANCE_SUPPRESS_CLASS, mt as EntryControllerProvider, n as useSiteChromeCustomizeOptional, ni as cardFragment, nl as publicEventPricingCurrency, nn as recordsEqual, no as blockBookingPaymentTermsSchema, nr as createManifestValidator, ns as resolveMediaNodeResponsiveImage, nt as enqueueTransaction, oc as TabsList, oi as singleButtonFragment, ol as publicEventTicketTypes, on as createSnapshotFromPageRecord, oo as createZodCodec, or as shopBlockDefinition, os as attachRenderableMediaAssetFields, ot as resolvePreviewSidebarTab, p as reportPreviewDesignError, pa as resolveOfferingsPreviewGroupCta, pc as DialogTitle, pi as ctaRowFragment, pl as unsafeAsAppointmentServiceId, pn as PaletteProvider, po as planSiteChromePlacement, pr as eventCalendarBlockDefinition, pt as EditableBlockProvider, qa as resolveEventCta, qc as formatBookingTime, qi as backgroundAppearanceQuickColorTokenNames, ql as ChevronLeft, qn as SITE_CHROME_VISIBLE_HEADER_SELECTOR, qo as PlusIcon, qr as EMPTY_COMMERCE_CART_STATE, qs as SelectContent, qt as useEditorUiStoreInstance, r as PreviewDesignHistoryOrderProvider, ra as createTransformRegistry, ri as faqAccordionFragment, rl as publicEventPricingMode, ro as buildInteractiveIslandProps, rr as ImageResolveContextProvider, rs as resolveMediaStorageUrl, rt as idleEditorTransactionQueueState, sc as TabsTrigger, si as formEmbedFragment, sl as formatCurrencyAmount, sn as BUILT_IN_REFERENCE_KINDS, so as defineClientOwnedBlockRuntime, sr as productListBlockDefinition, ss as getAtPath, t as SiteChromeCustomizeProvider, ti as headingFragment, tl as formatBookingPriceDisplay, tn as unsafeAsLinkedContentEntryId, to as resolveEventRegistrationScopedEvents, tr as formattingTransforms, ts as resolveImageUrlWithContext, tt as deriveTransactionCapabilities, u as PREVIEW_DESIGN_LOAD_ERROR_MESSAGE, ua as buildOfferingsPreviewRenderStates, uc as DialogDescription, ui as testimonialsHeadingFragment, ul as parseMediaAssetId, uo as composeHeaderSectionWrapperClassName, ur as buildNewsletterFormInteractiveIslandProps, ut as PreviewTextEditor, va as buildEventCollectionHydration, vc as Root, vi as getAnchorClasses, vl as ok$3, vo as shouldReserveFeatureCardIconZone, vr as buildFormInteractiveIslandProps, vs as getTextColorForBackground, vt as createSiteOptionWidgetAdapters, wa as getEventRuntimeFiltersKey, wi as compileEditorModelRuntime, wn as useMediaEditorOptional, wo as RichTextDocSchema, wr as resolveDiscountContext, ws as asDesignBlockId, wt as IconPickerField, xa as eventCollectionHydrationSchema, xi as resolveBackgroundColorValue, xn as createStoreBackend, xo as resolveBlockIconRenderValue, xr as toRegistrationEvents, xs as resolveTokenOrCssColorValue, xt as OfferingsPreviewGroupOrderField, ya as buildEventCollectionListingDisplay, yc as Trigger, yi as boxStylesTransforms, yl as X, yn as FormRenderer, yo as buildGeneratedBlockIconRenderAssetLookupFromUnknown, yr as eventRegistrationBlockDefinition, ys as isCssColorLiteral, yt as SiteOptionPickerField, za as formatEventDateParts, zc as clsx, zi as defaultSectionTransitionVariantForFamily, zl as Image, zn as getResponsiveScopeSpec, zo as CirclePlusIcon, zr as buildProductListInteractiveIslandProps, zs as mapOptionValueForSelect, zt as LinkWidgetProvider } from "./SiteChromeCustomizeContext-BHF-KANn.mjs";
|
|
3
|
+
import { i as useOptionalPreviewLayout, t as PreviewQueryProvider } from "./PreviewQueryProvider-BH-3-jSj.mjs";
|
|
4
|
+
import { _ as API_ENDPOINTS, a as usePreviewToken, c as createBearerAPIClient, d as unwrapResponse, g as resolveSurfaceDocumentAttributes, h as SURFACE_IDS, i as usePreviewAuthFetch, m as SURFACE_DOCUMENT_DATA_ATTRIBUTE, n as markPreviewAuthExpired, o as isPreviewRuntimeSessionEditable, r as usePreviewAuth, s as ApiRequestError, t as initPreviewAuth } from "./previewAuthStore-CJX21dGi.mjs";
|
|
5
5
|
import * as React$1 from "react";
|
|
6
6
|
import React, { Children, Component, Fragment, cloneElement, createContext, createElement, forwardRef, isValidElement, startTransition, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
|
|
7
7
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -487,23 +487,23 @@ const EVENTS = {
|
|
|
487
487
|
method: "GET"
|
|
488
488
|
}
|
|
489
489
|
};
|
|
490
|
-
const
|
|
490
|
+
const WHOLE_SERIES = {
|
|
491
491
|
list: {
|
|
492
|
-
path: "/public/sites/{siteId}/
|
|
492
|
+
path: "/public/sites/{siteId}/dated-offerings/whole-series",
|
|
493
493
|
method: "GET"
|
|
494
494
|
},
|
|
495
495
|
enroll: {
|
|
496
|
-
path: "/public/sites/{siteId}/
|
|
496
|
+
path: "/public/sites/{siteId}/dated-offerings/whole-series/enroll",
|
|
497
497
|
method: "POST",
|
|
498
498
|
authScope: "portal"
|
|
499
499
|
},
|
|
500
500
|
checkout: {
|
|
501
|
-
path: "/public/sites/{siteId}/
|
|
501
|
+
path: "/public/sites/{siteId}/dated-offerings/whole-series/checkout",
|
|
502
502
|
method: "POST",
|
|
503
503
|
authScope: "portal"
|
|
504
504
|
},
|
|
505
505
|
checkEligibility: {
|
|
506
|
-
path: "/public/sites/{siteId}/
|
|
506
|
+
path: "/public/sites/{siteId}/dated-offerings/whole-series/check-eligibility",
|
|
507
507
|
method: "POST",
|
|
508
508
|
authScope: "portal"
|
|
509
509
|
},
|
|
@@ -513,7 +513,7 @@ const COURSES = {
|
|
|
513
513
|
authScope: "portal"
|
|
514
514
|
},
|
|
515
515
|
registrationStatus: {
|
|
516
|
-
path: "/public/sites/{siteId}/
|
|
516
|
+
path: "/public/sites/{siteId}/dated-offerings/whole-series/registration-status",
|
|
517
517
|
method: "GET",
|
|
518
518
|
authScope: "portal"
|
|
519
519
|
}
|
|
@@ -669,26 +669,26 @@ const PORTAL = {
|
|
|
669
669
|
authScope: "portal",
|
|
670
670
|
skipPreviewStage: true
|
|
671
671
|
},
|
|
672
|
-
|
|
673
|
-
path: "/portal/
|
|
672
|
+
getWholeSeriesRegistrations: {
|
|
673
|
+
path: "/portal/dated-offerings/whole-series",
|
|
674
674
|
method: "GET",
|
|
675
675
|
authScope: "portal",
|
|
676
676
|
skipPreviewStage: true
|
|
677
677
|
},
|
|
678
|
-
|
|
679
|
-
path: "/portal/
|
|
678
|
+
getWholeSeriesBookingQuestions: {
|
|
679
|
+
path: "/portal/dated-offerings/whole-series/{enrollmentId}/booking-questions",
|
|
680
680
|
method: "GET",
|
|
681
681
|
authScope: "portal",
|
|
682
682
|
skipPreviewStage: true
|
|
683
683
|
},
|
|
684
|
-
|
|
685
|
-
path: "/portal/
|
|
684
|
+
updateWholeSeriesBookingQuestions: {
|
|
685
|
+
path: "/portal/dated-offerings/whole-series/{enrollmentId}/booking-questions",
|
|
686
686
|
method: "PUT",
|
|
687
687
|
authScope: "portal",
|
|
688
688
|
skipPreviewStage: true
|
|
689
689
|
},
|
|
690
|
-
|
|
691
|
-
path: "/portal/
|
|
690
|
+
cancelWholeSeriesRegistration: {
|
|
691
|
+
path: "/portal/dated-offerings/whole-series/{enrollmentId}/cancel",
|
|
692
692
|
method: "POST",
|
|
693
693
|
authScope: "portal",
|
|
694
694
|
skipPreviewStage: true
|
|
@@ -1041,14 +1041,12 @@ function createBlockApi(config) {
|
|
|
1041
1041
|
afterId: params?.afterId,
|
|
1042
1042
|
limit: params?.limit,
|
|
1043
1043
|
stage: params?.stage,
|
|
1044
|
-
kind: params?.kind,
|
|
1045
1044
|
eventSurface: params?.eventSurface,
|
|
1046
1045
|
eventPresets: params?.eventPresets,
|
|
1047
1046
|
scheduleScope: params?.scheduleScope,
|
|
1048
1047
|
categoryIds: params?.categoryIds,
|
|
1049
1048
|
venueId: params?.venueId,
|
|
1050
1049
|
staffMemberId: params?.staffMemberId,
|
|
1051
|
-
entryId: params?.entryId,
|
|
1052
1050
|
seriesId: params?.seriesId,
|
|
1053
1051
|
includeOccurrenceId: params?.includeOccurrenceId,
|
|
1054
1052
|
detailLevel: params?.detailLevel
|
|
@@ -1064,7 +1062,6 @@ function createBlockApi(config) {
|
|
|
1064
1062
|
categoryIds: params?.categoryIds,
|
|
1065
1063
|
venueId: params?.venueId,
|
|
1066
1064
|
staffMemberId: params?.staffMemberId,
|
|
1067
|
-
kind: params?.kind,
|
|
1068
1065
|
eventSurface: params?.eventSurface,
|
|
1069
1066
|
eventPresets: params?.eventPresets,
|
|
1070
1067
|
scheduleScope: params?.scheduleScope
|
|
@@ -1104,37 +1101,37 @@ function createBlockApi(config) {
|
|
|
1104
1101
|
skipDedup: true
|
|
1105
1102
|
});
|
|
1106
1103
|
},
|
|
1107
|
-
async
|
|
1104
|
+
async registerForWholeSeries(data) {
|
|
1108
1105
|
const sid = requireSiteId();
|
|
1109
|
-
const path = buildPath(
|
|
1110
|
-
return request(
|
|
1106
|
+
const path = buildPath(WHOLE_SERIES.enroll.path, { siteId: sid });
|
|
1107
|
+
return request(WHOLE_SERIES.enroll, {
|
|
1111
1108
|
path,
|
|
1112
1109
|
body: withRequestOverrides(data, shouldUsePreviewStageForNonPortalRequests ? { stage: "preview" } : {})
|
|
1113
1110
|
});
|
|
1114
1111
|
},
|
|
1115
|
-
async
|
|
1112
|
+
async checkWholeSeriesEligibility(data) {
|
|
1116
1113
|
const sid = requireSiteId();
|
|
1117
|
-
const path = buildPath(
|
|
1118
|
-
return request(
|
|
1114
|
+
const path = buildPath(WHOLE_SERIES.checkEligibility.path, { siteId: sid });
|
|
1115
|
+
return request(WHOLE_SERIES.checkEligibility, {
|
|
1119
1116
|
path,
|
|
1120
1117
|
body: data
|
|
1121
1118
|
});
|
|
1122
1119
|
},
|
|
1123
1120
|
async resolveWaitlistClaim(data) {
|
|
1124
1121
|
const sid = requireSiteId();
|
|
1125
|
-
const path = buildPath(
|
|
1126
|
-
return request(
|
|
1122
|
+
const path = buildPath(WHOLE_SERIES.waitlistClaimResolve.path, { siteId: sid });
|
|
1123
|
+
return request(WHOLE_SERIES.waitlistClaimResolve, {
|
|
1127
1124
|
path,
|
|
1128
1125
|
body: { claimToken: data.claimToken }
|
|
1129
1126
|
});
|
|
1130
1127
|
},
|
|
1131
|
-
async
|
|
1128
|
+
async createWholeSeriesCheckout(data) {
|
|
1132
1129
|
const sid = requireSiteId();
|
|
1133
|
-
const path = buildPath(
|
|
1134
|
-
return request(
|
|
1130
|
+
const path = buildPath(WHOLE_SERIES.checkout.path, { siteId: sid });
|
|
1131
|
+
return request(WHOLE_SERIES.checkout, {
|
|
1135
1132
|
path,
|
|
1136
1133
|
body: {
|
|
1137
|
-
|
|
1134
|
+
eventSeriesId: data.eventSeriesId,
|
|
1138
1135
|
...data.pricingOptionId ? { pricingOptionId: data.pricingOptionId } : {},
|
|
1139
1136
|
...data.selectedSlidingAmount !== void 0 ? { selectedSlidingAmount: data.selectedSlidingAmount } : {},
|
|
1140
1137
|
email: data.email,
|
|
@@ -1149,10 +1146,10 @@ function createBlockApi(config) {
|
|
|
1149
1146
|
}
|
|
1150
1147
|
});
|
|
1151
1148
|
},
|
|
1152
|
-
async
|
|
1149
|
+
async getWholeSeriesRegistrationStatus(params) {
|
|
1153
1150
|
const sid = requireSiteId();
|
|
1154
|
-
const path = buildPath(
|
|
1155
|
-
return request(
|
|
1151
|
+
const path = buildPath(WHOLE_SERIES.registrationStatus.path, { siteId: sid });
|
|
1152
|
+
return request(WHOLE_SERIES.registrationStatus, {
|
|
1156
1153
|
path,
|
|
1157
1154
|
query: { sessionId: params.sessionId },
|
|
1158
1155
|
skipDedup: true
|
|
@@ -1325,23 +1322,23 @@ function createBlockApi(config) {
|
|
|
1325
1322
|
body: data
|
|
1326
1323
|
})).task;
|
|
1327
1324
|
},
|
|
1328
|
-
async
|
|
1329
|
-
return (await request(PORTAL.
|
|
1325
|
+
async getPortalWholeSeriesRegistrations() {
|
|
1326
|
+
return (await request(PORTAL.getWholeSeriesRegistrations)).enrollments;
|
|
1330
1327
|
},
|
|
1331
|
-
async
|
|
1332
|
-
const path = buildPath(PORTAL.
|
|
1333
|
-
return (await request(PORTAL.
|
|
1328
|
+
async getPortalWholeSeriesBookingQuestions(enrollmentId) {
|
|
1329
|
+
const path = buildPath(PORTAL.getWholeSeriesBookingQuestions.path, { enrollmentId });
|
|
1330
|
+
return (await request(PORTAL.getWholeSeriesBookingQuestions, { path })).task;
|
|
1334
1331
|
},
|
|
1335
|
-
async
|
|
1336
|
-
const path = buildPath(PORTAL.
|
|
1337
|
-
return (await request(PORTAL.
|
|
1332
|
+
async updatePortalWholeSeriesBookingQuestions(enrollmentId, data) {
|
|
1333
|
+
const path = buildPath(PORTAL.updateWholeSeriesBookingQuestions.path, { enrollmentId });
|
|
1334
|
+
return (await request(PORTAL.updateWholeSeriesBookingQuestions, {
|
|
1338
1335
|
path,
|
|
1339
1336
|
body: data
|
|
1340
1337
|
})).task;
|
|
1341
1338
|
},
|
|
1342
|
-
async
|
|
1343
|
-
const path = buildPath(PORTAL.
|
|
1344
|
-
return (await request(PORTAL.
|
|
1339
|
+
async cancelWholeSeriesRegistration(enrollmentId, options) {
|
|
1340
|
+
const path = buildPath(PORTAL.cancelWholeSeriesRegistration.path, { enrollmentId });
|
|
1341
|
+
return (await request(PORTAL.cancelWholeSeriesRegistration, {
|
|
1345
1342
|
path,
|
|
1346
1343
|
body: options ?? {}
|
|
1347
1344
|
})).result;
|
|
@@ -3685,7 +3682,10 @@ function uniqByOccurrenceId(events) {
|
|
|
3685
3682
|
return out;
|
|
3686
3683
|
}
|
|
3687
3684
|
function selectEventDetails(args) {
|
|
3688
|
-
const all = uniqByOccurrenceId((args.events ?? []).filter(Boolean)
|
|
3685
|
+
const all = uniqByOccurrenceId(resolveEventRegistrationScopedEvents((args.events ?? []).filter(Boolean), {
|
|
3686
|
+
occurrenceContext: args.occurrenceContext,
|
|
3687
|
+
subject: args.subject
|
|
3688
|
+
}));
|
|
3689
3689
|
const occurrenceContext = args.occurrenceContext ?? null;
|
|
3690
3690
|
const otherLimit = parseLimit$1(args.otherDatesLimit, 5);
|
|
3691
3691
|
const selectedFromContext = (() => {
|
|
@@ -3742,7 +3742,7 @@ function toExactOrFreeDisplay(amount, currency) {
|
|
|
3742
3742
|
};
|
|
3743
3743
|
}
|
|
3744
3744
|
function getSelectableCoursePricingOptionsForNow(course, now) {
|
|
3745
|
-
if (
|
|
3745
|
+
if (course.pricing.pricingStrategy !== "tiered") return [];
|
|
3746
3746
|
return [...course.pricing.options].filter((option) => isSaleWindowOpen(option, now)).sort((left, right) => {
|
|
3747
3747
|
if (left.sortOrder !== right.sortOrder) return left.sortOrder - right.sortOrder;
|
|
3748
3748
|
if (left.priceAmount !== right.priceAmount) return left.priceAmount - right.priceAmount;
|
|
@@ -3752,23 +3752,7 @@ function getSelectableCoursePricingOptionsForNow(course, now) {
|
|
|
3752
3752
|
function resolveCoursePricingState(course, selectedPricingOptionId, selectedSlidingAmountOrNowInput, nowInput = {}) {
|
|
3753
3753
|
const selectedSlidingAmount = typeof selectedSlidingAmountOrNowInput === "number" || selectedSlidingAmountOrNowInput === null ? selectedSlidingAmountOrNowInput : null;
|
|
3754
3754
|
const effectiveNowInput = typeof selectedSlidingAmountOrNowInput === "object" && selectedSlidingAmountOrNowInput !== null ? selectedSlidingAmountOrNowInput : nowInput;
|
|
3755
|
-
const currency = course.pricing
|
|
3756
|
-
if (!course.pricing) {
|
|
3757
|
-
const legacyAmount = course.priceCents ?? 0;
|
|
3758
|
-
return {
|
|
3759
|
-
currency,
|
|
3760
|
-
display: toExactOrFreeDisplay(legacyAmount, currency),
|
|
3761
|
-
selectableOptions: [],
|
|
3762
|
-
requiresSelection: false,
|
|
3763
|
-
selectedOption: null,
|
|
3764
|
-
slidingScale: null,
|
|
3765
|
-
selectedSlidingAmount: null,
|
|
3766
|
-
selectedPriceAmount: legacyAmount,
|
|
3767
|
-
selectedRequiresPayment: legacyAmount > 0,
|
|
3768
|
-
hasPaidSelection: legacyAmount > 0,
|
|
3769
|
-
hasFreeSelection: legacyAmount <= 0
|
|
3770
|
-
};
|
|
3771
|
-
}
|
|
3755
|
+
const currency = course.pricing.currency;
|
|
3772
3756
|
switch (course.pricing.pricingStrategy) {
|
|
3773
3757
|
case "free": return {
|
|
3774
3758
|
currency,
|
|
@@ -4461,6 +4445,123 @@ function TicketTypePriceList({ ticketTypes, currency }) {
|
|
|
4461
4445
|
}, ticketType.id))
|
|
4462
4446
|
});
|
|
4463
4447
|
}
|
|
4448
|
+
function EventPricingDetails({ isDropIn, coursePricing, acceptedItems, eventCostLabel, eventPricingCurrency, ticketTypes, autoApplyDiscount }) {
|
|
4449
|
+
if (isDropIn) return /* @__PURE__ */ jsxs("div", {
|
|
4450
|
+
className: "rb-mt-6",
|
|
4451
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
4452
|
+
className: "rb-label rb-mb-2",
|
|
4453
|
+
children: "Registration"
|
|
4454
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
4455
|
+
className: "rb-caption status-muted",
|
|
4456
|
+
children: "No registration required - just show up"
|
|
4457
|
+
})]
|
|
4458
|
+
});
|
|
4459
|
+
if (coursePricing) return /* @__PURE__ */ jsx(CoursePricingDisplay, {
|
|
4460
|
+
pricing: coursePricing,
|
|
4461
|
+
acceptedItems: [...acceptedItems]
|
|
4462
|
+
});
|
|
4463
|
+
if (eventCostLabel) return /* @__PURE__ */ jsxs("div", {
|
|
4464
|
+
className: "rb-mt-6",
|
|
4465
|
+
children: [
|
|
4466
|
+
/* @__PURE__ */ jsx("div", {
|
|
4467
|
+
className: "rb-label rb-mb-2",
|
|
4468
|
+
children: "Cost"
|
|
4469
|
+
}),
|
|
4470
|
+
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: eventCostLabel }) }),
|
|
4471
|
+
autoApplyDiscount ? /* @__PURE__ */ jsx("p", {
|
|
4472
|
+
className: "rb-caption rb-mt-1",
|
|
4473
|
+
children: formatAutoApplyDiscountLine(autoApplyDiscount, eventPricingCurrency)
|
|
4474
|
+
}) : null,
|
|
4475
|
+
/* @__PURE__ */ jsx(TicketTypePriceList, {
|
|
4476
|
+
ticketTypes,
|
|
4477
|
+
currency: eventPricingCurrency
|
|
4478
|
+
}),
|
|
4479
|
+
acceptedItems.length > 0 ? /* @__PURE__ */ jsxs("p", {
|
|
4480
|
+
className: "rb-caption rb-mt-1",
|
|
4481
|
+
children: ["You can also attend with: ", acceptedItems.join(", ")]
|
|
4482
|
+
}) : null
|
|
4483
|
+
]
|
|
4484
|
+
});
|
|
4485
|
+
return acceptedItems.length > 0 ? /* @__PURE__ */ jsx("div", {
|
|
4486
|
+
className: "rb-mt-6",
|
|
4487
|
+
children: /* @__PURE__ */ jsxs("p", {
|
|
4488
|
+
className: "rb-caption",
|
|
4489
|
+
children: ["You can also attend with: ", acceptedItems.join(", ")]
|
|
4490
|
+
})
|
|
4491
|
+
}) : null;
|
|
4492
|
+
}
|
|
4493
|
+
function EventFacts({ selection, selected, venue, teamMembers, pricing }) {
|
|
4494
|
+
const { date, timeRange } = formatEventDateParts({
|
|
4495
|
+
startsAt: selected.startsAt,
|
|
4496
|
+
endsAt: selected.endsAt,
|
|
4497
|
+
timeZone: selection.timeZone
|
|
4498
|
+
});
|
|
4499
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
4500
|
+
className: "rb-flex rb-flex-col rb-gap-4",
|
|
4501
|
+
children: [
|
|
4502
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4503
|
+
/* @__PURE__ */ jsx("div", {
|
|
4504
|
+
className: "rb-label rb-mb-2",
|
|
4505
|
+
children: selection.mode === "next" ? "Next date" : "Date"
|
|
4506
|
+
}),
|
|
4507
|
+
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: date }) }),
|
|
4508
|
+
/* @__PURE__ */ jsx("p", {
|
|
4509
|
+
className: "rb-caption",
|
|
4510
|
+
children: timeRange
|
|
4511
|
+
})
|
|
4512
|
+
] }),
|
|
4513
|
+
venue ? /* @__PURE__ */ jsxs("div", {
|
|
4514
|
+
className: "rb-mt-6",
|
|
4515
|
+
children: [
|
|
4516
|
+
/* @__PURE__ */ jsx("div", {
|
|
4517
|
+
className: "rb-label rb-mb-2",
|
|
4518
|
+
children: "Venue"
|
|
4519
|
+
}),
|
|
4520
|
+
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: venue.name }) }),
|
|
4521
|
+
venue.address ? /* @__PURE__ */ jsx("p", {
|
|
4522
|
+
className: "rb-caption",
|
|
4523
|
+
children: venue.address
|
|
4524
|
+
}) : null
|
|
4525
|
+
]
|
|
4526
|
+
}) : null,
|
|
4527
|
+
teamMembers.length > 0 ? /* @__PURE__ */ jsxs("div", {
|
|
4528
|
+
className: "rb-mt-6",
|
|
4529
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
4530
|
+
className: "rb-label rb-mb-2",
|
|
4531
|
+
children: "With"
|
|
4532
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
4533
|
+
className: "rb-flex rb-flex-col rb-gap-3",
|
|
4534
|
+
children: teamMembers.map((member) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName$1, {
|
|
4535
|
+
name: member.name,
|
|
4536
|
+
profilePath: member.profilePath
|
|
4537
|
+
}) }), member.summary ? /* @__PURE__ */ jsx("p", {
|
|
4538
|
+
className: "rb-caption status-muted",
|
|
4539
|
+
children: member.summary
|
|
4540
|
+
}) : null] }, member.id))
|
|
4541
|
+
})]
|
|
4542
|
+
}) : null,
|
|
4543
|
+
pricing
|
|
4544
|
+
]
|
|
4545
|
+
});
|
|
4546
|
+
}
|
|
4547
|
+
function OtherEventDates({ selection }) {
|
|
4548
|
+
if (selection.otherDates.length === 0) return null;
|
|
4549
|
+
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
|
|
4550
|
+
className: "rb-label",
|
|
4551
|
+
children: "Other dates"
|
|
4552
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
4553
|
+
className: "rb-mt-2 rb-tiles-grid",
|
|
4554
|
+
children: selection.otherDates.map((event) => /* @__PURE__ */ jsx("a", {
|
|
4555
|
+
className: "rb-tile rb-tile--interactive",
|
|
4556
|
+
...resolveEventLinkProps(event),
|
|
4557
|
+
children: /* @__PURE__ */ jsx(DateTimeTile, {
|
|
4558
|
+
startsAt: event.startsAt,
|
|
4559
|
+
endsAt: event.endsAt,
|
|
4560
|
+
timeZone: selection.timeZone
|
|
4561
|
+
})
|
|
4562
|
+
}, event.occurrenceId || event.id))
|
|
4563
|
+
})] });
|
|
4564
|
+
}
|
|
4464
4565
|
function EventDetailsView({ selection, showVenue, showMap, showOtherDates, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, applicablePasses = [], applicableMemberships = [], autoApplyDiscount = null, mapHeight = 200, mapClassName = "event-details-map", renderVenueMap }) {
|
|
4465
4566
|
const selected = selection.selected;
|
|
4466
4567
|
if (!selected) return /* @__PURE__ */ jsx("p", {
|
|
@@ -4468,147 +4569,57 @@ function EventDetailsView({ selection, showVenue, showMap, showOtherDates, showC
|
|
|
4468
4569
|
children: "No upcoming dates scheduled."
|
|
4469
4570
|
});
|
|
4470
4571
|
const venue = showVenue ? selected.venue : void 0;
|
|
4471
|
-
const isDropIn = selected.
|
|
4572
|
+
const isDropIn = selected.bookingScope === "single_occurrence" && selected.requiresRegistration === false;
|
|
4472
4573
|
const teamMembers = selected.teamMembers ?? [];
|
|
4473
|
-
const coursePricing = selected.
|
|
4474
|
-
pricing: selected.
|
|
4475
|
-
|
|
4476
|
-
currency: selected.course.currency
|
|
4574
|
+
const coursePricing = selected.bookingScope === "whole_series" && selected.wholeSeries ? resolveCoursePricingState({
|
|
4575
|
+
pricing: selected.wholeSeries.pricing,
|
|
4576
|
+
currency: selected.wholeSeries.currency
|
|
4477
4577
|
}) : null;
|
|
4478
4578
|
const eventPricing = resolveRuntimeEventPricing(selected);
|
|
4479
4579
|
const eventPricingType = publicEventPricingType(eventPricing);
|
|
4480
4580
|
const eventPricingCurrency = publicEventPricingCurrency(eventPricing) ?? "USD";
|
|
4481
|
-
const
|
|
4482
|
-
const shouldShowCoursePricing = showCost && !isDropIn && coursePricing !== null;
|
|
4483
|
-
const shouldShowEventCost = showCost && isPaid && !isDropIn && coursePricing === null;
|
|
4581
|
+
const shouldShowEventCost = showCost && eventPricingType === "paid" && !isDropIn && coursePricing === null;
|
|
4484
4582
|
const eventCostLabel = shouldShowEventCost ? formatEventPrice(selected) : null;
|
|
4485
4583
|
const ticketTypes = shouldShowEventCost ? getActiveTicketTypes$1(selected) : [];
|
|
4486
4584
|
const acceptedItems = [];
|
|
4487
4585
|
if (showAcceptedPasses) acceptedItems.push(...applicablePasses.map((p) => p.name));
|
|
4488
4586
|
if (showAcceptedMemberships) acceptedItems.push(...applicableMemberships.map((m) => m.name));
|
|
4489
|
-
const hasAcceptedItems = acceptedItems.length > 0;
|
|
4490
4587
|
return /* @__PURE__ */ jsxs("div", {
|
|
4491
4588
|
className: "rb-flex rb-flex-col rb-gap-6 rb-text-left",
|
|
4492
4589
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
4493
4590
|
className: "rb-grid rb-grid-cols-1 rb-gap-6 rb-items-start rb-sm-grid-cols-2",
|
|
4494
|
-
children: [/* @__PURE__ */
|
|
4495
|
-
|
|
4496
|
-
|
|
4497
|
-
|
|
4498
|
-
|
|
4499
|
-
|
|
4500
|
-
|
|
4501
|
-
|
|
4502
|
-
|
|
4503
|
-
|
|
4504
|
-
|
|
4505
|
-
|
|
4506
|
-
|
|
4507
|
-
|
|
4508
|
-
children: timeRange
|
|
4509
|
-
})] });
|
|
4510
|
-
})()] }),
|
|
4511
|
-
venue ? /* @__PURE__ */ jsxs("div", {
|
|
4512
|
-
className: "rb-mt-6",
|
|
4513
|
-
children: [
|
|
4514
|
-
/* @__PURE__ */ jsx("div", {
|
|
4515
|
-
className: "rb-label rb-mb-2",
|
|
4516
|
-
children: "Venue"
|
|
4517
|
-
}),
|
|
4518
|
-
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: venue.name }) }),
|
|
4519
|
-
venue.address ? /* @__PURE__ */ jsx("p", {
|
|
4520
|
-
className: "rb-caption",
|
|
4521
|
-
children: venue.address
|
|
4522
|
-
}) : null
|
|
4523
|
-
]
|
|
4524
|
-
}) : null,
|
|
4525
|
-
teamMembers.length > 0 ? /* @__PURE__ */ jsxs("div", {
|
|
4526
|
-
className: "rb-mt-6",
|
|
4527
|
-
children: [/* @__PURE__ */ jsx("div", {
|
|
4528
|
-
className: "rb-label rb-mb-2",
|
|
4529
|
-
children: "With"
|
|
4530
|
-
}), /* @__PURE__ */ jsx("div", {
|
|
4531
|
-
className: "rb-flex rb-flex-col rb-gap-3",
|
|
4532
|
-
children: teamMembers.map((teamMember) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName$1, {
|
|
4533
|
-
name: teamMember.name,
|
|
4534
|
-
profilePath: teamMember.profilePath
|
|
4535
|
-
}) }), teamMember.summary ? /* @__PURE__ */ jsx("p", {
|
|
4536
|
-
className: "rb-caption status-muted",
|
|
4537
|
-
children: teamMember.summary
|
|
4538
|
-
}) : null] }, teamMember.id))
|
|
4539
|
-
})]
|
|
4540
|
-
}) : null,
|
|
4541
|
-
isDropIn ? /* @__PURE__ */ jsxs("div", {
|
|
4542
|
-
className: "rb-mt-6",
|
|
4543
|
-
children: [/* @__PURE__ */ jsx("div", {
|
|
4544
|
-
className: "rb-label rb-mb-2",
|
|
4545
|
-
children: "Registration"
|
|
4546
|
-
}), /* @__PURE__ */ jsx("p", {
|
|
4547
|
-
className: "rb-caption status-muted",
|
|
4548
|
-
children: "No registration required - just show up"
|
|
4549
|
-
})]
|
|
4550
|
-
}) : shouldShowCoursePricing ? /* @__PURE__ */ jsx(CoursePricingDisplay, {
|
|
4551
|
-
pricing: coursePricing,
|
|
4552
|
-
acceptedItems
|
|
4553
|
-
}) : shouldShowEventCost ? /* @__PURE__ */ jsxs("div", {
|
|
4554
|
-
className: "rb-mt-6",
|
|
4555
|
-
children: [
|
|
4556
|
-
/* @__PURE__ */ jsx("div", {
|
|
4557
|
-
className: "rb-label rb-mb-2",
|
|
4558
|
-
children: "Cost"
|
|
4559
|
-
}),
|
|
4560
|
-
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: eventCostLabel }) }),
|
|
4561
|
-
autoApplyDiscount ? /* @__PURE__ */ jsx("p", {
|
|
4562
|
-
className: "rb-caption rb-mt-1",
|
|
4563
|
-
children: formatAutoApplyDiscountLine(autoApplyDiscount, eventPricingCurrency)
|
|
4564
|
-
}) : null,
|
|
4565
|
-
/* @__PURE__ */ jsx(TicketTypePriceList, {
|
|
4566
|
-
ticketTypes,
|
|
4567
|
-
currency: eventPricingCurrency
|
|
4568
|
-
}),
|
|
4569
|
-
hasAcceptedItems ? /* @__PURE__ */ jsxs("p", {
|
|
4570
|
-
className: "rb-caption rb-mt-1",
|
|
4571
|
-
children: ["You can also attend with: ", acceptedItems.join(", ")]
|
|
4572
|
-
}) : null
|
|
4573
|
-
]
|
|
4574
|
-
}) : hasAcceptedItems ? /* @__PURE__ */ jsx("div", {
|
|
4575
|
-
className: "rb-mt-6",
|
|
4576
|
-
children: /* @__PURE__ */ jsxs("p", {
|
|
4577
|
-
className: "rb-caption",
|
|
4578
|
-
children: ["You can also attend with: ", acceptedItems.join(", ")]
|
|
4579
|
-
})
|
|
4580
|
-
}) : null
|
|
4581
|
-
]
|
|
4591
|
+
children: [/* @__PURE__ */ jsx(EventFacts, {
|
|
4592
|
+
selection,
|
|
4593
|
+
selected,
|
|
4594
|
+
venue,
|
|
4595
|
+
teamMembers,
|
|
4596
|
+
pricing: /* @__PURE__ */ jsx(EventPricingDetails, {
|
|
4597
|
+
isDropIn,
|
|
4598
|
+
coursePricing: showCost ? coursePricing : null,
|
|
4599
|
+
acceptedItems,
|
|
4600
|
+
eventCostLabel,
|
|
4601
|
+
eventPricingCurrency,
|
|
4602
|
+
ticketTypes,
|
|
4603
|
+
autoApplyDiscount
|
|
4604
|
+
})
|
|
4582
4605
|
}), showMap && renderVenueMap && venue?.location ? /* @__PURE__ */ jsx(Fragment$1, { children: renderVenueMap({
|
|
4583
4606
|
venueName: venue.name,
|
|
4584
4607
|
location: venue.location,
|
|
4585
4608
|
className: mapClassName,
|
|
4586
4609
|
height: mapHeight
|
|
4587
4610
|
}) }) : null]
|
|
4588
|
-
}), showOtherDates
|
|
4589
|
-
className: "rb-label",
|
|
4590
|
-
children: "Other dates"
|
|
4591
|
-
}), /* @__PURE__ */ jsx("div", {
|
|
4592
|
-
className: "rb-mt-2 rb-tiles-grid",
|
|
4593
|
-
children: selection.otherDates.map((e) => /* @__PURE__ */ jsx("a", {
|
|
4594
|
-
className: "rb-tile rb-tile--interactive",
|
|
4595
|
-
...resolveEventLinkProps(e),
|
|
4596
|
-
children: /* @__PURE__ */ jsx(DateTimeTile, {
|
|
4597
|
-
startsAt: e.startsAt,
|
|
4598
|
-
endsAt: e.endsAt,
|
|
4599
|
-
timeZone: selection.timeZone
|
|
4600
|
-
})
|
|
4601
|
-
}, e.occurrenceId || e.id))
|
|
4602
|
-
})] }) : null]
|
|
4611
|
+
}), showOtherDates ? /* @__PURE__ */ jsx(OtherEventDates, { selection }) : null]
|
|
4603
4612
|
});
|
|
4604
4613
|
}
|
|
4605
4614
|
//#endregion
|
|
4606
4615
|
//#region ../blocks/src/system/runtime/nodes/event-details.server.tsx
|
|
4607
|
-
function EventDetailsSSR({ blockId, occurrenceContext, events, showVenue = true, showMap = true, showOtherDates = true, otherDatesLimit, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, sitePasses, siteMemberships, autoApplyDiscount, className, children }) {
|
|
4616
|
+
function EventDetailsSSR({ blockId, occurrenceContext, subject, events, showVenue = true, showMap = true, showOtherDates = true, otherDatesLimit, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, sitePasses, siteMemberships, autoApplyDiscount, className, children }) {
|
|
4608
4617
|
const nowIso = (/* @__PURE__ */ new Date()).toISOString();
|
|
4618
|
+
const normalizedSubject = normalizeEventRegistrationPageSurfaceSubject(subject);
|
|
4609
4619
|
const selection = selectEventDetails({
|
|
4610
4620
|
events: events ?? null,
|
|
4611
4621
|
occurrenceContext: occurrenceContext ?? null,
|
|
4622
|
+
subject: normalizedSubject,
|
|
4612
4623
|
nowIso,
|
|
4613
4624
|
otherDatesLimit
|
|
4614
4625
|
});
|
|
@@ -4623,6 +4634,7 @@ function EventDetailsSSR({ blockId, occurrenceContext, events, showVenue = true,
|
|
|
4623
4634
|
children: [
|
|
4624
4635
|
/* @__PURE__ */ jsx(IslandPropsScript, { value: {
|
|
4625
4636
|
occurrenceContext,
|
|
4637
|
+
subject: normalizedSubject,
|
|
4626
4638
|
events,
|
|
4627
4639
|
showVenue,
|
|
4628
4640
|
showMap,
|
|
@@ -4763,7 +4775,7 @@ function resolveCoursePageSurfaceScope(courses, subjectValue) {
|
|
|
4763
4775
|
return {
|
|
4764
4776
|
kind: "scoped",
|
|
4765
4777
|
subject: parsed.value,
|
|
4766
|
-
courses: courses.filter((course) => allowedSeriesIds.has(course.
|
|
4778
|
+
courses: courses.filter((course) => allowedSeriesIds.has(course.eventSeriesId))
|
|
4767
4779
|
};
|
|
4768
4780
|
}
|
|
4769
4781
|
function eventSeriesIdsForSubject(subject) {
|
|
@@ -4775,43 +4787,8 @@ function eventSeriesIdsForSubject(subject) {
|
|
|
4775
4787
|
}
|
|
4776
4788
|
//#endregion
|
|
4777
4789
|
//#region ../blocks/src/system/runtime/nodes/course-details/logic.ts
|
|
4778
|
-
function coerceContentEntry(value) {
|
|
4779
|
-
if (!value || typeof value !== "object") return null;
|
|
4780
|
-
const obj = value;
|
|
4781
|
-
return {
|
|
4782
|
-
id: typeof obj.id === "string" ? obj.id : null,
|
|
4783
|
-
slug: typeof obj.slug === "string" ? obj.slug : null
|
|
4784
|
-
};
|
|
4785
|
-
}
|
|
4786
|
-
function coerceEntrySubrouteContext(value) {
|
|
4787
|
-
if (!value || typeof value !== "object") return null;
|
|
4788
|
-
const obj = value;
|
|
4789
|
-
const kind = typeof obj.kind === "string" ? obj.kind : null;
|
|
4790
|
-
if (!kind) return null;
|
|
4791
|
-
if (kind === "course-run") {
|
|
4792
|
-
const run = obj.run && typeof obj.run === "object" ? obj.run : null;
|
|
4793
|
-
return {
|
|
4794
|
-
kind: "course-run",
|
|
4795
|
-
run: { courseId: typeof run?.courseId === "string" ? run.courseId : null }
|
|
4796
|
-
};
|
|
4797
|
-
}
|
|
4798
|
-
if (kind === "event-occurrence") return { kind: "event-occurrence" };
|
|
4799
|
-
return null;
|
|
4800
|
-
}
|
|
4801
4790
|
function selectCourseDetails(args) {
|
|
4802
|
-
const
|
|
4803
|
-
const contentEntry = coerceContentEntry(args.contentEntry);
|
|
4804
|
-
const entrySubrouteContext = coerceEntrySubrouteContext(args.entrySubrouteContext);
|
|
4805
|
-
const slugOverride = (args.courseSlug ?? "").trim() || null;
|
|
4806
|
-
if (entrySubrouteContext?.kind === "course-run" && entrySubrouteContext.run?.courseId) {
|
|
4807
|
-
const byCourseId = courses.find((c) => c.id === entrySubrouteContext.run?.courseId) ?? null;
|
|
4808
|
-
if (byCourseId) return {
|
|
4809
|
-
mode: "runContext",
|
|
4810
|
-
selected: byCourseId,
|
|
4811
|
-
scoped: [byCourseId]
|
|
4812
|
-
};
|
|
4813
|
-
}
|
|
4814
|
-
const pageSurfaceScope = resolveCoursePageSurfaceScope(courses, args.subject);
|
|
4791
|
+
const pageSurfaceScope = resolveCoursePageSurfaceScope((args.courses ?? []).filter(Boolean), args.subject);
|
|
4815
4792
|
if (pageSurfaceScope.kind === "unsupported") return {
|
|
4816
4793
|
mode: "unsupportedPageSurfaceSubject",
|
|
4817
4794
|
selected: null,
|
|
@@ -4825,42 +4802,8 @@ function selectCourseDetails(args) {
|
|
|
4825
4802
|
scoped
|
|
4826
4803
|
};
|
|
4827
4804
|
}
|
|
4828
|
-
if (contentEntry?.id) {
|
|
4829
|
-
const scoped = courses.filter((c) => c.contentEntryId === contentEntry.id);
|
|
4830
|
-
if (scoped.length === 1) return {
|
|
4831
|
-
mode: "contentEntry",
|
|
4832
|
-
selected: scoped[0] ?? null,
|
|
4833
|
-
scoped
|
|
4834
|
-
};
|
|
4835
|
-
if (scoped.length > 1) return {
|
|
4836
|
-
mode: "contentEntry",
|
|
4837
|
-
selected: null,
|
|
4838
|
-
scoped
|
|
4839
|
-
};
|
|
4840
|
-
}
|
|
4841
|
-
if (slugOverride) {
|
|
4842
|
-
const bySlug = courses.find((c) => c.slug === slugOverride) ?? null;
|
|
4843
|
-
if (bySlug) return {
|
|
4844
|
-
mode: "slugOverride",
|
|
4845
|
-
selected: bySlug,
|
|
4846
|
-
scoped: [bySlug]
|
|
4847
|
-
};
|
|
4848
|
-
}
|
|
4849
|
-
if (contentEntry?.slug) {
|
|
4850
|
-
const bySlug = courses.find((c) => c.slug === contentEntry.slug) ?? null;
|
|
4851
|
-
if (bySlug) return {
|
|
4852
|
-
mode: "contentEntry",
|
|
4853
|
-
selected: bySlug,
|
|
4854
|
-
scoped: [bySlug]
|
|
4855
|
-
};
|
|
4856
|
-
}
|
|
4857
|
-
if (courses.length === 1) return {
|
|
4858
|
-
mode: "single",
|
|
4859
|
-
selected: courses[0] ?? null,
|
|
4860
|
-
scoped: courses
|
|
4861
|
-
};
|
|
4862
4805
|
return {
|
|
4863
|
-
mode: "
|
|
4806
|
+
mode: "unsupportedPageSurfaceSubject",
|
|
4864
4807
|
selected: null,
|
|
4865
4808
|
scoped: []
|
|
4866
4809
|
};
|
|
@@ -4872,12 +4815,6 @@ function toValidDate(value) {
|
|
|
4872
4815
|
const date = new Date(value);
|
|
4873
4816
|
return Number.isNaN(date.getTime()) ? null : date;
|
|
4874
4817
|
}
|
|
4875
|
-
function getEntryBasePath(contentEntry) {
|
|
4876
|
-
if (!contentEntry) return null;
|
|
4877
|
-
const path = contentEntry.path ?? contentEntry._entryPath ?? null;
|
|
4878
|
-
if (!path) return null;
|
|
4879
|
-
return path.startsWith("/") ? path : `/${path}`;
|
|
4880
|
-
}
|
|
4881
4818
|
function getCourseDateRange(course) {
|
|
4882
4819
|
const datedSessions = (course.sessions ?? []).map((session) => ({
|
|
4883
4820
|
session,
|
|
@@ -5055,17 +4992,13 @@ function CourseDetailsView(props) {
|
|
|
5055
4992
|
}
|
|
5056
4993
|
//#endregion
|
|
5057
4994
|
//#region ../blocks/src/system/runtime/nodes/course-details.server.tsx
|
|
5058
|
-
function CourseDetailsSSR({ courses,
|
|
4995
|
+
function CourseDetailsSSR({ courses, subject, showTitle, showDescription, showSessions, sessionsLimit, showVenue, showPrice, showCapacity, showEnrollmentStatus, showMembershipNote, className, children }) {
|
|
5059
4996
|
const selection = selectCourseDetails({
|
|
5060
4997
|
courses: courses ?? null,
|
|
5061
|
-
|
|
5062
|
-
entrySubrouteContext,
|
|
5063
|
-
subject,
|
|
5064
|
-
courseSlug
|
|
4998
|
+
subject
|
|
5065
4999
|
});
|
|
5066
5000
|
const parsedSubject = parseEventPageSurfaceSubject(subject);
|
|
5067
5001
|
const awaitingOfferingRuns = parsedSubject.ok && parsedSubject.value.kind === "eventOffering" && parsedSubject.value.availableEventSeriesIds.length === 0;
|
|
5068
|
-
const basePath = getEntryBasePath(contentEntry);
|
|
5069
5002
|
const now = /* @__PURE__ */ new Date();
|
|
5070
5003
|
const scopedWithRange = selection.scoped.map((c) => ({
|
|
5071
5004
|
course: c,
|
|
@@ -5106,7 +5039,6 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
|
|
|
5106
5039
|
const start = range.start;
|
|
5107
5040
|
const end = range.end;
|
|
5108
5041
|
const isInProgress = Boolean(start && end && start <= now && end > now);
|
|
5109
|
-
const href = basePath ? `${basePath.replace(/\/$/, "")}/${course.slug}` : null;
|
|
5110
5042
|
return /* @__PURE__ */ jsx("li", {
|
|
5111
5043
|
className: "rb-rounded-md rb-border rb-p-3",
|
|
5112
5044
|
children: /* @__PURE__ */ jsx("div", {
|
|
@@ -5115,11 +5047,7 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
|
|
|
5115
5047
|
className: "rb-flex rb-items-center rb-justify-between rb-gap-3",
|
|
5116
5048
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
5117
5049
|
className: "rb-min-w-0",
|
|
5118
|
-
children: [
|
|
5119
|
-
href,
|
|
5120
|
-
className: "rb-truncate",
|
|
5121
|
-
children: /* @__PURE__ */ jsx("strong", { children: course.title })
|
|
5122
|
-
}) : /* @__PURE__ */ jsx("div", {
|
|
5050
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
5123
5051
|
className: "rb-truncate",
|
|
5124
5052
|
children: /* @__PURE__ */ jsx("strong", { children: course.title })
|
|
5125
5053
|
}), /* @__PURE__ */ jsx("div", {
|
|
@@ -5132,7 +5060,7 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
|
|
|
5132
5060
|
})]
|
|
5133
5061
|
})
|
|
5134
5062
|
})
|
|
5135
|
-
}, course.
|
|
5063
|
+
}, course.eventSeriesId);
|
|
5136
5064
|
})
|
|
5137
5065
|
}) : /* @__PURE__ */ jsx("p", {
|
|
5138
5066
|
className: "rb-caption status-muted",
|
|
@@ -5524,80 +5452,13 @@ const EventSpotlight = ({ events, layout = "grid", columns = "3", cardVariant =
|
|
|
5524
5452
|
};
|
|
5525
5453
|
//#endregion
|
|
5526
5454
|
//#region ../blocks/src/system/runtime/nodes/events/EventCombined.interactive.ts
|
|
5527
|
-
const
|
|
5528
|
-
const eventSurfaceScopeSchema = z$1.enum(eventSurfaceScopeValues);
|
|
5529
|
-
const eventScheduleScopeSchema = z$1.enum(eventScheduleScopeValues);
|
|
5530
|
-
const eventCombinedSourceSchema = z$1.object({
|
|
5531
|
-
events: z$1.array(publicEventSchema).nullable().optional(),
|
|
5532
|
-
siteId: z$1.string(),
|
|
5533
|
-
apiBaseUrl: z$1.string().optional(),
|
|
5534
|
-
stage: previewStageSchema.optional(),
|
|
5535
|
-
listLayout: eventLayoutSchema.optional(),
|
|
5536
|
-
listColumns: columnOptionSchema.optional(),
|
|
5537
|
-
eventsPerPage: z$1.string().optional(),
|
|
5538
|
-
paginationMode: z$1.enum(["loadMore", "seeAllLink"]).optional(),
|
|
5539
|
-
seeAllUrl: z$1.string().optional(),
|
|
5540
|
-
loadMoreText: z$1.string().optional(),
|
|
5541
|
-
startOfWeek: weekStartSchema.optional(),
|
|
5542
|
-
calendarTabViews: calendarTabViewsSchema.optional(),
|
|
5543
|
-
defaultCalendarView: eventCalendarDefaultViewSchema.optional(),
|
|
5544
|
-
showFilters: z$1.boolean().nullable().optional(),
|
|
5545
|
-
showCategoryFilter: filterAutoShowSchema.optional(),
|
|
5546
|
-
showVenueFilter: z$1.boolean().nullable().optional(),
|
|
5547
|
-
showStaffFilter: z$1.boolean().nullable().optional(),
|
|
5548
|
-
eventKind: eventBlockKindSchema.nullable().optional(),
|
|
5549
|
-
eventSurface: eventSurfaceScopeSchema.nullable().optional(),
|
|
5550
|
-
filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
|
|
5551
|
-
scheduleScope: eventScheduleScopeSchema.nullable().optional(),
|
|
5552
|
-
filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
|
|
5553
|
-
filterStaffMemberId: z$1.string().nullable().optional(),
|
|
5554
|
-
filterVenueId: z$1.string().nullable().optional(),
|
|
5555
|
-
showVenue: z$1.boolean().nullable().optional(),
|
|
5556
|
-
showMap: z$1.boolean().nullable().optional(),
|
|
5557
|
-
showCapacity: z$1.boolean().nullable().optional(),
|
|
5558
|
-
buttonVariant: eventButtonVariantSchema.optional(),
|
|
5559
|
-
buttonText: z$1.string().optional(),
|
|
5560
|
-
emptyMessage: z$1.string().optional(),
|
|
5561
|
-
className: z$1.string().optional()
|
|
5562
|
-
});
|
|
5455
|
+
const eventCombinedSourceSchema = z$1.object({ ...eventCollectionSourceSchemaShape });
|
|
5563
5456
|
const eventCombinedDisplaySchema = z$1.object({
|
|
5564
5457
|
kind: z$1.literal("event-combined"),
|
|
5565
5458
|
className: z$1.string().nullable(),
|
|
5566
|
-
|
|
5567
|
-
listLayout: eventLayoutSchema,
|
|
5568
|
-
listColumns: columnOptionSchema,
|
|
5569
|
-
eventsPerPage: eventPageSizeSchema,
|
|
5570
|
-
paginationAction: eventListPaginationActionSchema,
|
|
5571
|
-
startOfWeek: weekStartSchema,
|
|
5572
|
-
calendarTabViews: calendarTabViewsSchema,
|
|
5573
|
-
defaultCalendarView: eventCalendarDefaultViewSchema,
|
|
5574
|
-
showFilters: z$1.boolean(),
|
|
5575
|
-
showCategoryFilter: filterAutoShowSchema,
|
|
5576
|
-
showVenueFilter: z$1.boolean(),
|
|
5577
|
-
showStaffFilter: z$1.boolean(),
|
|
5578
|
-
eventKind: eventBlockKindSchema,
|
|
5579
|
-
eventSurface: eventSurfaceScopeSchema,
|
|
5580
|
-
filterEventPresets: z$1.string().nullable(),
|
|
5581
|
-
scheduleScope: eventScheduleScopeSchema,
|
|
5582
|
-
filterCategoryIds: z$1.string().nullable(),
|
|
5583
|
-
filterStaffMemberId: z$1.string().nullable(),
|
|
5584
|
-
filterVenueId: z$1.string().nullable(),
|
|
5585
|
-
showVenue: z$1.boolean(),
|
|
5586
|
-
showMap: z$1.boolean(),
|
|
5587
|
-
showCapacity: z$1.boolean(),
|
|
5588
|
-
buttonVariant: eventButtonVariantSchema,
|
|
5589
|
-
buttonText: z$1.string(),
|
|
5590
|
-
emptyMessage: z$1.string()
|
|
5591
|
-
});
|
|
5592
|
-
const eventCombinedHydrationSchema = z$1.object({
|
|
5593
|
-
siteId: z$1.string(),
|
|
5594
|
-
stage: previewStageSchema.optional(),
|
|
5595
|
-
prefetchedEvents: z$1.boolean(),
|
|
5596
|
-
eventKind: eventBlockKindSchema,
|
|
5597
|
-
eventSurface: eventSurfaceScopeSchema,
|
|
5598
|
-
filterEventPresets: z$1.string().nullable(),
|
|
5599
|
-
scheduleScope: eventScheduleScopeSchema
|
|
5459
|
+
...eventCollectionDisplaySchemaShape
|
|
5600
5460
|
});
|
|
5461
|
+
const eventCombinedHydrationSchema = eventCollectionHydrationSchema;
|
|
5601
5462
|
const eventCombinedRenderSchema = z$1.object({
|
|
5602
5463
|
display: eventCombinedDisplaySchema,
|
|
5603
5464
|
hydration: eventCombinedHydrationSchema
|
|
@@ -5609,62 +5470,14 @@ const eventCombinedIslandMetaCodec = createZodCodec(z$1.object({
|
|
|
5609
5470
|
}));
|
|
5610
5471
|
const eventCombinedIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "stage");
|
|
5611
5472
|
function buildEventCombinedDisplay(source) {
|
|
5612
|
-
const listLayout = source.listLayout ?? "stack";
|
|
5613
5473
|
return {
|
|
5474
|
+
...buildEventCollectionDisplay(source),
|
|
5614
5475
|
kind: "event-combined",
|
|
5615
|
-
className: source.className ?? null
|
|
5616
|
-
events: Array.isArray(source.events) ? [...source.events] : [],
|
|
5617
|
-
listLayout,
|
|
5618
|
-
listColumns: source.listColumns ?? "3",
|
|
5619
|
-
eventsPerPage: resolveEventCalendarListPageSize({ eventsPerPage: source.eventsPerPage }),
|
|
5620
|
-
paginationAction: resolveEventListPaginationAction({
|
|
5621
|
-
paginationMode: source.paginationMode,
|
|
5622
|
-
seeAllUrl: source.seeAllUrl,
|
|
5623
|
-
loadMoreText: source.loadMoreText
|
|
5624
|
-
}),
|
|
5625
|
-
startOfWeek: source.startOfWeek ?? "monday",
|
|
5626
|
-
calendarTabViews: source.calendarTabViews ?? "both",
|
|
5627
|
-
defaultCalendarView: source.defaultCalendarView ?? "month",
|
|
5628
|
-
showFilters: source.showFilters ?? true,
|
|
5629
|
-
showCategoryFilter: source.showCategoryFilter ?? "auto",
|
|
5630
|
-
showVenueFilter: source.showVenueFilter ?? false,
|
|
5631
|
-
showStaffFilter: source.showStaffFilter ?? true,
|
|
5632
|
-
eventKind: normalizeEventBlockKind(source.eventKind),
|
|
5633
|
-
eventSurface: normalizeEventSurfaceScope(source.eventSurface),
|
|
5634
|
-
filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
|
|
5635
|
-
scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
|
|
5636
|
-
filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
|
|
5637
|
-
filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
|
|
5638
|
-
filterVenueId: normalizeEventVenueId(source.filterVenueId),
|
|
5639
|
-
showVenue: source.showVenue ?? true,
|
|
5640
|
-
showMap: source.showMap ?? true,
|
|
5641
|
-
showCapacity: source.showCapacity ?? true,
|
|
5642
|
-
buttonVariant: source.buttonVariant ?? "primary",
|
|
5643
|
-
buttonText: source.buttonText ?? "Book",
|
|
5644
|
-
emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
|
|
5476
|
+
className: source.className ?? null
|
|
5645
5477
|
};
|
|
5646
5478
|
}
|
|
5647
5479
|
function buildEventCombinedListingDisplay(render, className = "event-combined-content") {
|
|
5648
|
-
|
|
5649
|
-
const pageSize = display.eventsPerPage;
|
|
5650
|
-
const initialEvents = display.events.slice(0, pageSize);
|
|
5651
|
-
return {
|
|
5652
|
-
kind: "event-listing",
|
|
5653
|
-
state: initialEvents.length === 0 ? hydration.prefetchedEvents ? "empty" : "loading" : "ready",
|
|
5654
|
-
listLayout: display.listLayout,
|
|
5655
|
-
className,
|
|
5656
|
-
emptyMessage: display.emptyMessage,
|
|
5657
|
-
loadingMessage: "Loading events…",
|
|
5658
|
-
containerClass: getContainerClass(display.listLayout, display.listColumns),
|
|
5659
|
-
cardVariant: "default",
|
|
5660
|
-
buttonVariant: display.buttonVariant,
|
|
5661
|
-
buttonText: display.buttonText,
|
|
5662
|
-
showVenue: display.showVenue,
|
|
5663
|
-
showMap: display.showMap,
|
|
5664
|
-
showCapacity: display.showCapacity,
|
|
5665
|
-
orientation: getCardOrientation(display.listLayout),
|
|
5666
|
-
events: initialEvents
|
|
5667
|
-
};
|
|
5480
|
+
return buildEventCollectionListingDisplay(render.display, render.hydration.prefetchedEvents, className);
|
|
5668
5481
|
}
|
|
5669
5482
|
const eventCombinedBlockRuntime = defineProgressiveBlockRuntime({
|
|
5670
5483
|
kind: "progressive",
|
|
@@ -5674,15 +5487,7 @@ const eventCombinedBlockRuntime = defineProgressiveBlockRuntime({
|
|
|
5674
5487
|
},
|
|
5675
5488
|
buildRender: (source) => ({
|
|
5676
5489
|
display: buildEventCombinedDisplay(source),
|
|
5677
|
-
hydration:
|
|
5678
|
-
siteId: source.siteId,
|
|
5679
|
-
stage: source.stage,
|
|
5680
|
-
prefetchedEvents: source.events != null,
|
|
5681
|
-
eventKind: normalizeEventBlockKind(source.eventKind),
|
|
5682
|
-
eventSurface: normalizeEventSurfaceScope(source.eventSurface),
|
|
5683
|
-
filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
|
|
5684
|
-
scheduleScope: normalizeEventScheduleScope(source.scheduleScope)
|
|
5685
|
-
}
|
|
5490
|
+
hydration: buildEventCollectionHydration(source)
|
|
5686
5491
|
})
|
|
5687
5492
|
});
|
|
5688
5493
|
createInteractiveIslandCodec({
|
|
@@ -6112,7 +5917,7 @@ function renderOfferingCompactItem(item, options) {
|
|
|
6112
5917
|
case "course": return /* @__PURE__ */ jsx(CourseCompactRow, {
|
|
6113
5918
|
course: item.course,
|
|
6114
5919
|
path: item.path
|
|
6115
|
-
}, item.course.
|
|
5920
|
+
}, item.course.eventSeriesId);
|
|
6116
5921
|
}
|
|
6117
5922
|
}
|
|
6118
5923
|
function renderSingleOfferingCard(item, options) {
|
|
@@ -6130,7 +5935,7 @@ function renderSingleOfferingCard(item, options) {
|
|
|
6130
5935
|
path: item.path,
|
|
6131
5936
|
buttonVariant: options.buttonVariant,
|
|
6132
5937
|
buttonText: options.buttonText
|
|
6133
|
-
}, item.course.
|
|
5938
|
+
}, item.course.eventSeriesId);
|
|
6134
5939
|
}
|
|
6135
5940
|
}
|
|
6136
5941
|
function CourseCompactRow({ course, path }) {
|
|
@@ -7098,13 +6903,11 @@ function CheckoutSSR({ blockId, siteId, apiBaseUrl, stage, children, ...rest })
|
|
|
7098
6903
|
* Server-safe placeholder for course registration.
|
|
7099
6904
|
* Provides a static container for island hydration without importing client hooks.
|
|
7100
6905
|
*/
|
|
7101
|
-
function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken,
|
|
6906
|
+
function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, subject, courses, className, showSessions, showPrice, showCapacity, showVenue, successMessage, waitlistMessage, membershipMessage, buttonText, buttonVariant, stage, children }) {
|
|
7102
6907
|
const islandProps = buildCourseRegistrationInteractiveIslandProps({
|
|
7103
6908
|
siteId,
|
|
7104
6909
|
apiBaseUrl,
|
|
7105
6910
|
portalToken,
|
|
7106
|
-
contentEntry,
|
|
7107
|
-
entrySubrouteContext,
|
|
7108
6911
|
subject,
|
|
7109
6912
|
courses,
|
|
7110
6913
|
className,
|
|
@@ -8072,14 +7875,13 @@ function cx(...classes) {
|
|
|
8072
7875
|
* Server-safe placeholder for event registration.
|
|
8073
7876
|
* Provides a static container for island hydration without importing client hooks.
|
|
8074
7877
|
*/
|
|
8075
|
-
function EventRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, previewToken, occurrenceContext,
|
|
7878
|
+
function EventRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, previewToken, occurrenceContext, subject, events, className, buttonText, maxTickets, showVenue, showCapacity, successMessage, waitlistMessage, buttonVariant, overlayEnabled, spamProtectionEnabled, stage, supportEmail, sitePasses, siteMemberships, children }) {
|
|
8076
7879
|
const islandProps = buildEventRegistrationInteractiveIslandProps({
|
|
8077
7880
|
siteId,
|
|
8078
7881
|
apiBaseUrl,
|
|
8079
7882
|
portalToken,
|
|
8080
7883
|
previewToken,
|
|
8081
7884
|
occurrenceContext,
|
|
8082
|
-
contentEntry,
|
|
8083
7885
|
subject: normalizeEventRegistrationPageSurfaceSubject(subject),
|
|
8084
7886
|
events,
|
|
8085
7887
|
className,
|
|
@@ -9440,7 +9242,7 @@ function useBookingSubmission(_siteId) {
|
|
|
9440
9242
|
};
|
|
9441
9243
|
}
|
|
9442
9244
|
//#endregion
|
|
9443
|
-
//#region ../blocks/src/system/runtime/api/types.ts
|
|
9245
|
+
//#region ../blocks/src/system/runtime/api/types/discounts.ts
|
|
9444
9246
|
function discountAvailabilityHasDiscounts(availability) {
|
|
9445
9247
|
return availability.type !== "none";
|
|
9446
9248
|
}
|
|
@@ -9472,7 +9274,7 @@ function getDiscountContextKey(context) {
|
|
|
9472
9274
|
context.ticketsCount ?? ""
|
|
9473
9275
|
].join(":");
|
|
9474
9276
|
case "appointment": return [context.type, context.serviceId].join(":");
|
|
9475
|
-
case "
|
|
9277
|
+
case "whole_series": return [context.type, context.eventSeriesId].join(":");
|
|
9476
9278
|
case "pass": return [context.type, context.passId].join(":");
|
|
9477
9279
|
case "membership": return [context.type, context.membershipId].join(":");
|
|
9478
9280
|
case "product": return [
|
|
@@ -13270,6 +13072,23 @@ function areEntitlementsDisabledForTicketCount(ticketsCount) {
|
|
|
13270
13072
|
return ticketsCount > 1;
|
|
13271
13073
|
}
|
|
13272
13074
|
/**
|
|
13075
|
+
* Describe what redeeming a pass costs the customer.
|
|
13076
|
+
*
|
|
13077
|
+
* The balance is what they hold *before* this booking, so "1 of 5" means four
|
|
13078
|
+
* are left afterwards. Spelling out the balance is what stops people missing
|
|
13079
|
+
* that a credit is being spent at all.
|
|
13080
|
+
*
|
|
13081
|
+
* Always one credit: passes are only redeemable for single-ticket bookings,
|
|
13082
|
+
* per {@link areEntitlementsDisabledForTicketCount}.
|
|
13083
|
+
*
|
|
13084
|
+
* @param creditsRemaining - Credits on the pass before this booking, if known
|
|
13085
|
+
*/
|
|
13086
|
+
function formatPassCreditUsageLabel(creditsRemaining) {
|
|
13087
|
+
if (typeof creditsRemaining !== "number" || creditsRemaining <= 0) return "Uses 1 pass credit";
|
|
13088
|
+
if (creditsRemaining === 1) return "Uses your last credit";
|
|
13089
|
+
return `Uses 1 of ${creditsRemaining} credits`;
|
|
13090
|
+
}
|
|
13091
|
+
/**
|
|
13273
13092
|
* Transform API eligibility response to internal eligibility data.
|
|
13274
13093
|
*
|
|
13275
13094
|
* @param response - The raw API response from checkEligibility
|
|
@@ -14240,6 +14059,23 @@ function isDirectPaymentOptionSelected(option, selectionState) {
|
|
|
14240
14059
|
return selectionState.kind === "valid" && selectionState.selection.collectionOptionKind === option.kind;
|
|
14241
14060
|
}
|
|
14242
14061
|
/**
|
|
14062
|
+
* Label for the button that acts on the chosen payment method.
|
|
14063
|
+
*
|
|
14064
|
+
* A pass redemption spends a credit the moment it is pressed, so the label
|
|
14065
|
+
* names the pass instead of describing the step.
|
|
14066
|
+
*/
|
|
14067
|
+
function resolvePaymentButtonText(method) {
|
|
14068
|
+
switch (method) {
|
|
14069
|
+
case "stripe": return "Continue to Payment";
|
|
14070
|
+
case "pass": return "Book using class pass";
|
|
14071
|
+
case "pass_bundle":
|
|
14072
|
+
case "membership_bundle": return "Purchase & Register";
|
|
14073
|
+
case "free":
|
|
14074
|
+
case "membership":
|
|
14075
|
+
case null: return "Complete Registration";
|
|
14076
|
+
}
|
|
14077
|
+
}
|
|
14078
|
+
/**
|
|
14243
14079
|
* Payment Selection Step
|
|
14244
14080
|
*
|
|
14245
14081
|
* Shows payment options based on event pricing type and user eligibility.
|
|
@@ -14279,11 +14115,7 @@ const PaymentSelectionStep = ({ event, occurrenceContext, ticketsCount, email, i
|
|
|
14279
14115
|
collectionOptionKind: directPaymentFallbackKind
|
|
14280
14116
|
});
|
|
14281
14117
|
}, [directPaymentFallbackKind, onSelectionChange]);
|
|
14282
|
-
const getButtonText = useCallback(() =>
|
|
14283
|
-
if (selectedMethod === "stripe") return "Continue to Payment";
|
|
14284
|
-
if (selectedMethod === "pass_bundle" || selectedMethod === "membership_bundle") return "Purchase & Register";
|
|
14285
|
-
return "Complete Registration";
|
|
14286
|
-
}, [selectedMethod]);
|
|
14118
|
+
const getButtonText = useCallback(() => resolvePaymentButtonText(selectedMethod), [selectedMethod]);
|
|
14287
14119
|
useEffect(() => {
|
|
14288
14120
|
if (!onStateChange) return;
|
|
14289
14121
|
let status = "ready";
|
|
@@ -14830,6 +14662,21 @@ function EventRegistrationWizardContent(props) {
|
|
|
14830
14662
|
}
|
|
14831
14663
|
//#endregion
|
|
14832
14664
|
//#region ../blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.tsx
|
|
14665
|
+
/**
|
|
14666
|
+
* Label for the button that submits the details step.
|
|
14667
|
+
*
|
|
14668
|
+
* When a pass covers the booking there is no payment step to follow, so this
|
|
14669
|
+
* button is the last thing read before a credit is spent — it names the pass
|
|
14670
|
+
* rather than leaving that to the summary above it.
|
|
14671
|
+
*/
|
|
14672
|
+
function resolveDetailsButtonText(input) {
|
|
14673
|
+
const { wizard } = input;
|
|
14674
|
+
if (wizard.eligibility?.canJoinWaitlist) return "Join Waitlist";
|
|
14675
|
+
if (!input.hasWaitlistClaim && wizard.eligibility?.isFull) return "Sold out";
|
|
14676
|
+
if (wizard.paymentSelection.method === "pass") return "Book using class pass";
|
|
14677
|
+
if (wizard.paymentSelection.method === "membership") return input.fallbackText;
|
|
14678
|
+
return wizard.eventRequiresPayment ? "Continue to Payment" : input.fallbackText;
|
|
14679
|
+
}
|
|
14833
14680
|
function EventRegistrationWizardActions(props) {
|
|
14834
14681
|
const { wizard } = props;
|
|
14835
14682
|
const nextStepAfterTickets = "enter-details";
|
|
@@ -14837,12 +14684,11 @@ function EventRegistrationWizardActions(props) {
|
|
|
14837
14684
|
const hasWaitlistClaim = wizard.waitlistClaim.claim !== null;
|
|
14838
14685
|
const currentEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
|
|
14839
14686
|
const isSoldOutWithoutWaitlist = !hasWaitlistClaim && currentEvent?.availableSpots === 0 && currentEvent.waitlistEnabled !== true;
|
|
14840
|
-
const getDetailsButtonText = () => {
|
|
14841
|
-
|
|
14842
|
-
|
|
14843
|
-
|
|
14844
|
-
|
|
14845
|
-
};
|
|
14687
|
+
const getDetailsButtonText = () => resolveDetailsButtonText({
|
|
14688
|
+
wizard,
|
|
14689
|
+
hasWaitlistClaim,
|
|
14690
|
+
fallbackText: props.buttonText
|
|
14691
|
+
});
|
|
14846
14692
|
switch (wizard.step) {
|
|
14847
14693
|
case "error":
|
|
14848
14694
|
case "success":
|
|
@@ -14938,6 +14784,41 @@ function isProductMethod(method) {
|
|
|
14938
14784
|
"membership_bundle"
|
|
14939
14785
|
].includes(method);
|
|
14940
14786
|
}
|
|
14787
|
+
/** Credits held on the pass the customer is about to redeem, before this booking. */
|
|
14788
|
+
function getSelectedPassCreditsRemaining(wizard) {
|
|
14789
|
+
const { method, passId } = wizard.paymentSelection;
|
|
14790
|
+
if (method !== "pass" || !passId) return null;
|
|
14791
|
+
return (wizard.eligibility?.eligiblePasses ?? []).find((candidate) => candidate.id === passId)?.creditsRemaining ?? null;
|
|
14792
|
+
}
|
|
14793
|
+
/**
|
|
14794
|
+
* Copy describing how a pass or membership covers the booking.
|
|
14795
|
+
*
|
|
14796
|
+
* Pass redemptions spend something, so they say so and name the balance;
|
|
14797
|
+
* memberships already include the class, so "Included" stays accurate.
|
|
14798
|
+
*/
|
|
14799
|
+
function resolveEntitlementSummaryCopy(method, passCreditsRemaining) {
|
|
14800
|
+
switch (method) {
|
|
14801
|
+
case "pass": return {
|
|
14802
|
+
productPrice: "1 credit",
|
|
14803
|
+
pricingNote: formatPassCreditUsageLabel(passCreditsRemaining)
|
|
14804
|
+
};
|
|
14805
|
+
case "pass_bundle": return {
|
|
14806
|
+
productPrice: null,
|
|
14807
|
+
pricingNote: "1 pass credit"
|
|
14808
|
+
};
|
|
14809
|
+
case "membership": return {
|
|
14810
|
+
productPrice: "Included",
|
|
14811
|
+
pricingNote: "Included in membership"
|
|
14812
|
+
};
|
|
14813
|
+
case "membership_bundle":
|
|
14814
|
+
case "free":
|
|
14815
|
+
case "stripe":
|
|
14816
|
+
case null: return {
|
|
14817
|
+
productPrice: null,
|
|
14818
|
+
pricingNote: "Included in membership"
|
|
14819
|
+
};
|
|
14820
|
+
}
|
|
14821
|
+
}
|
|
14941
14822
|
function getSummaryRow(option, label) {
|
|
14942
14823
|
return option.summaryRows.find((row) => row.label === label)?.value ?? null;
|
|
14943
14824
|
}
|
|
@@ -14954,6 +14835,35 @@ function getSelectedDirectPaymentOption(input) {
|
|
|
14954
14835
|
const requestedKind = input.wizard.paymentSelection.collectionOptionKind ?? "upfront";
|
|
14955
14836
|
return options.find((option) => option.kind === requestedKind) ?? options.find((option) => option.kind === "upfront") ?? options[0] ?? null;
|
|
14956
14837
|
}
|
|
14838
|
+
/** Product row naming the pass or membership that covers this booking. */
|
|
14839
|
+
function EntitlementSummaryRow(props) {
|
|
14840
|
+
const { paymentSelection } = props.wizard;
|
|
14841
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
14842
|
+
className: "er-summary-bar-product",
|
|
14843
|
+
children: [/* @__PURE__ */ jsxs("div", { children: [
|
|
14844
|
+
/* @__PURE__ */ jsx("div", {
|
|
14845
|
+
className: "er-summary-bar-product-name",
|
|
14846
|
+
children: paymentSelection.productName
|
|
14847
|
+
}),
|
|
14848
|
+
props.showPassEscape && /* @__PURE__ */ jsx("button", {
|
|
14849
|
+
type: "button",
|
|
14850
|
+
className: "er-summary-bar-pass-escape",
|
|
14851
|
+
onClick: props.wizard.handleUseCardInsteadOfPass,
|
|
14852
|
+
children: "Pay by card instead"
|
|
14853
|
+
}),
|
|
14854
|
+
paymentSelection.productInterval && /* @__PURE__ */ jsx("div", {
|
|
14855
|
+
className: "er-summary-bar-product-detail",
|
|
14856
|
+
children: paymentSelection.productInterval
|
|
14857
|
+
})
|
|
14858
|
+
] }), /* @__PURE__ */ jsx("div", {
|
|
14859
|
+
className: "er-summary-bar-product-price",
|
|
14860
|
+
children: props.copy.productPrice ? /* @__PURE__ */ jsx("span", {
|
|
14861
|
+
className: "er-summary-bar-included",
|
|
14862
|
+
children: props.copy.productPrice
|
|
14863
|
+
}) : paymentSelection.productPrice ? formatPrice(paymentSelection.productPrice, paymentSelection.productCurrency ?? "usd") : null
|
|
14864
|
+
})]
|
|
14865
|
+
});
|
|
14866
|
+
}
|
|
14957
14867
|
function EventRegistrationSummaryBar(props) {
|
|
14958
14868
|
const { wizard } = props;
|
|
14959
14869
|
const summaryEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
|
|
@@ -14981,30 +14891,13 @@ function EventRegistrationSummaryBar(props) {
|
|
|
14981
14891
|
} : null;
|
|
14982
14892
|
if (!summaryTitle) return null;
|
|
14983
14893
|
const productMethod = isProductMethod(wizard.paymentSelection.method);
|
|
14984
|
-
|
|
14985
|
-
|
|
14986
|
-
|
|
14987
|
-
|
|
14988
|
-
|
|
14989
|
-
|
|
14990
|
-
|
|
14991
|
-
wizard.paymentSelection.method === "pass" && wizard.step === "enter-details" && /* @__PURE__ */ jsx("button", {
|
|
14992
|
-
type: "button",
|
|
14993
|
-
className: "er-summary-bar-pass-escape",
|
|
14994
|
-
onClick: wizard.handleUseCardInsteadOfPass,
|
|
14995
|
-
children: "Don't want to use your pass?"
|
|
14996
|
-
}),
|
|
14997
|
-
wizard.paymentSelection.productInterval && /* @__PURE__ */ jsx("div", {
|
|
14998
|
-
className: "er-summary-bar-product-detail",
|
|
14999
|
-
children: wizard.paymentSelection.productInterval
|
|
15000
|
-
})
|
|
15001
|
-
] }), /* @__PURE__ */ jsx("div", {
|
|
15002
|
-
className: "er-summary-bar-product-price",
|
|
15003
|
-
children: wizard.paymentSelection.method === "pass" || wizard.paymentSelection.method === "membership" ? /* @__PURE__ */ jsx("span", {
|
|
15004
|
-
className: "er-summary-bar-included",
|
|
15005
|
-
children: "Included"
|
|
15006
|
-
}) : wizard.paymentSelection.productPrice ? formatPrice(wizard.paymentSelection.productPrice, wizard.paymentSelection.productCurrency ?? "usd") : null
|
|
15007
|
-
})]
|
|
14894
|
+
const isPassRedemption = wizard.paymentSelection.method === "pass";
|
|
14895
|
+
const entitlementCopy = resolveEntitlementSummaryCopy(wizard.paymentSelection.method, getSelectedPassCreditsRemaining(wizard));
|
|
14896
|
+
const showPassEscape = isPassRedemption && (wizard.step === "enter-details" || wizard.step === "select-tickets");
|
|
14897
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [productMethod && wizard.paymentSelection.productName && /* @__PURE__ */ jsx(EntitlementSummaryRow, {
|
|
14898
|
+
wizard,
|
|
14899
|
+
copy: entitlementCopy,
|
|
14900
|
+
showPassEscape
|
|
15008
14901
|
}), /* @__PURE__ */ jsxs("div", {
|
|
15009
14902
|
className: "er-summary-bar",
|
|
15010
14903
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
@@ -15035,7 +14928,7 @@ function EventRegistrationSummaryBar(props) {
|
|
|
15035
14928
|
children: formatPrice(subtotalCents, summaryCurrency)
|
|
15036
14929
|
}), /* @__PURE__ */ jsx("div", {
|
|
15037
14930
|
className: "er-summary-bar-included",
|
|
15038
|
-
children:
|
|
14931
|
+
children: entitlementCopy.pricingNote
|
|
15039
14932
|
})] }) : flexibleBalanceSummary ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
15040
14933
|
flexibleBalanceSummary.total ? /* @__PURE__ */ jsxs("div", {
|
|
15041
14934
|
className: "er-summary-bar-product-detail",
|
|
@@ -15781,6 +15674,33 @@ const eventRegistrationSubmitDeps = { savePendingRegistration };
|
|
|
15781
15674
|
function useEventRegistrationSubmit(options) {
|
|
15782
15675
|
return useEventRegistrationSubmitWithDeps(options, eventRegistrationSubmitDeps);
|
|
15783
15676
|
}
|
|
15677
|
+
/**
|
|
15678
|
+
* Describe a completed registration to the success step.
|
|
15679
|
+
*
|
|
15680
|
+
* Only pass redemptions adopt the server's message: it names the credits spent
|
|
15681
|
+
* and the balance left, which the block's copy cannot. Every other method keeps
|
|
15682
|
+
* whatever success message the site configured.
|
|
15683
|
+
*/
|
|
15684
|
+
function toRegistrationResult(result) {
|
|
15685
|
+
if (result.alreadyRegistered) {
|
|
15686
|
+
const waitlisted = result.status === "waitlist";
|
|
15687
|
+
return {
|
|
15688
|
+
status: result.status,
|
|
15689
|
+
variant: "info",
|
|
15690
|
+
title: waitlisted ? "Already waitlisted" : "Already registered",
|
|
15691
|
+
message: result.message ?? (waitlisted ? "You are already on the waitlist for this event." : "You are already registered for this event.")
|
|
15692
|
+
};
|
|
15693
|
+
}
|
|
15694
|
+
if (result.status === "waitlist") return {
|
|
15695
|
+
status: "waitlist",
|
|
15696
|
+
title: "Added to waitlist",
|
|
15697
|
+
message: result.message ?? (typeof result.waitlistPosition === "number" ? `You've been added to the waitlist (position ${result.waitlistPosition}).` : "You've been added to the waitlist.")
|
|
15698
|
+
};
|
|
15699
|
+
return {
|
|
15700
|
+
status: result.status,
|
|
15701
|
+
message: result.paymentMethod === "pass" ? result.message : void 0
|
|
15702
|
+
};
|
|
15703
|
+
}
|
|
15784
15704
|
function useEventRegistrationSubmitWithDeps(options, deps) {
|
|
15785
15705
|
return async (method, passId, membershipId, selection, submitOptions) => {
|
|
15786
15706
|
const submitOccurrenceId = options.registrationTarget?.occurrenceId;
|
|
@@ -15890,23 +15810,7 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
|
|
|
15890
15810
|
}
|
|
15891
15811
|
};
|
|
15892
15812
|
}
|
|
15893
|
-
|
|
15894
|
-
const title = result.status === "waitlist" ? "Already waitlisted" : "Already registered";
|
|
15895
|
-
const fallbackMessage = result.status === "waitlist" ? "You are already on the waitlist for this event." : "You are already registered for this event.";
|
|
15896
|
-
options.setRegistrationResult({
|
|
15897
|
-
status: result.status,
|
|
15898
|
-
variant: "info",
|
|
15899
|
-
title,
|
|
15900
|
-
message: result.message ?? fallbackMessage
|
|
15901
|
-
});
|
|
15902
|
-
} else if (result.status === "waitlist") {
|
|
15903
|
-
const waitlistMessage = typeof result.waitlistPosition === "number" ? `You've been added to the waitlist (position ${result.waitlistPosition}).` : "You've been added to the waitlist.";
|
|
15904
|
-
options.setRegistrationResult({
|
|
15905
|
-
status: "waitlist",
|
|
15906
|
-
title: "Added to waitlist",
|
|
15907
|
-
message: result.message ?? waitlistMessage
|
|
15908
|
-
});
|
|
15909
|
-
} else options.setRegistrationResult({ status: result.status });
|
|
15813
|
+
options.setRegistrationResult(toRegistrationResult(result));
|
|
15910
15814
|
options.setStep("success");
|
|
15911
15815
|
return {
|
|
15912
15816
|
ok: true,
|
|
@@ -15969,16 +15873,13 @@ function useEventRegistrationWizardWithDeps(options, deps) {
|
|
|
15969
15873
|
const scopedEvents = useMemo(() => {
|
|
15970
15874
|
return resolveEventRegistrationScopedEvents(registrationEvents, {
|
|
15971
15875
|
occurrenceContext: options.occurrenceContext,
|
|
15972
|
-
subject: options.subject
|
|
15973
|
-
contentEntry: options.contentEntry
|
|
15876
|
+
subject: options.subject
|
|
15974
15877
|
});
|
|
15975
15878
|
}, [
|
|
15976
15879
|
registrationEvents,
|
|
15977
15880
|
options.occurrenceContext?.seriesId,
|
|
15978
15881
|
options.subject?.kind,
|
|
15979
|
-
options.subject?.kind === "eventSeries" ? options.subject.eventSeriesId : options.subject?.kind === "eventOffering" ? `${options.subject.eventOfferingId}:${options.subject.availableEventSeriesIds.join(",")}` : options.subject?.reason
|
|
15980
|
-
options.contentEntry?.slug,
|
|
15981
|
-
options.contentEntry?.contentTypeSlug
|
|
15882
|
+
options.subject?.kind === "eventSeries" ? options.subject.eventSeriesId : options.subject?.kind === "eventOffering" ? `${options.subject.eventOfferingId}:${options.subject.availableEventSeriesIds.join(",")}` : options.subject?.reason
|
|
15982
15883
|
]);
|
|
15983
15884
|
const preSelectedEvent = useMemo(() => findPreSelectedEvent({
|
|
15984
15885
|
scopedEvents,
|
|
@@ -16518,7 +16419,6 @@ function useEventRegistrationWizardWithDeps(options, deps) {
|
|
|
16518
16419
|
anchorId: options.anchorId,
|
|
16519
16420
|
occurrenceContext: options.occurrenceContext,
|
|
16520
16421
|
registrationTarget,
|
|
16521
|
-
contentEntry: options.contentEntry,
|
|
16522
16422
|
subject: options.subject,
|
|
16523
16423
|
events: options.events,
|
|
16524
16424
|
maxTicketsNum: waitlistClaim.claim ? 1 : options.maxTicketsNum,
|
|
@@ -16862,7 +16762,7 @@ function formatTicketTypePrice(ticketType, currency) {
|
|
|
16862
16762
|
return formatCurrencyAmount(ticketType.priceAmount, currency, { decimals: "auto" });
|
|
16863
16763
|
}
|
|
16864
16764
|
function EventRegistrationWizard(props) {
|
|
16865
|
-
const { occurrenceContext,
|
|
16765
|
+
const { occurrenceContext, subject, events, maxTickets = "5", showVenue = true, showCapacity = true, successMessage = "Thank you for registering! Check your email for confirmation details.", waitlistMessage: _waitlistMessage = "You've been added to the waitlist. We'll email you a claim link if a spot opens up.", buttonText = "Complete Registration", buttonVariant = "primary", className, spamProtectionEnabled, supportEmail, sitePasses, siteMemberships } = props;
|
|
16866
16766
|
const maxTicketsNum = normalizeEventRegistrationMaxTickets(maxTickets);
|
|
16867
16767
|
const showSpamProtection = spamProtectionEnabled ?? isSpamProtectionEnabled();
|
|
16868
16768
|
const buttonClass = themeButtonClassName({
|
|
@@ -16874,7 +16774,6 @@ function EventRegistrationWizard(props) {
|
|
|
16874
16774
|
const wizard = useEventRegistrationWizard({
|
|
16875
16775
|
anchorId: EVENT_REGISTRATION_ANCHOR_ID,
|
|
16876
16776
|
occurrenceContext: occurrenceContext ?? null,
|
|
16877
|
-
contentEntry: contentEntry ?? null,
|
|
16878
16777
|
subject: subject ?? null,
|
|
16879
16778
|
events: events ?? [],
|
|
16880
16779
|
maxTicketsNum
|
|
@@ -17626,6 +17525,37 @@ function EnrollmentForm({ formData, errors, onChange, isEmailLocked, isLoading,
|
|
|
17626
17525
|
] });
|
|
17627
17526
|
}
|
|
17628
17527
|
//#endregion
|
|
17528
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/pricing.ts
|
|
17529
|
+
function parseCurrencyInputToCents(value) {
|
|
17530
|
+
const trimmed = value.trim();
|
|
17531
|
+
if (!trimmed) return null;
|
|
17532
|
+
const amount = Number(trimmed);
|
|
17533
|
+
if (!Number.isFinite(amount) || amount < 0) return null;
|
|
17534
|
+
return Math.round(amount * 100);
|
|
17535
|
+
}
|
|
17536
|
+
function formatCentsAsCurrencyInput(amount) {
|
|
17537
|
+
const major = amount / 100;
|
|
17538
|
+
return Number.isInteger(major) ? String(major) : major.toFixed(2);
|
|
17539
|
+
}
|
|
17540
|
+
function getMissingCoursePricingSelectionMessage(pricing) {
|
|
17541
|
+
if (pricing?.requiresSelection && !pricing.selectedOption) return pricing.slidingScale ? "Choose an amount to continue." : "Choose a pricing option to continue.";
|
|
17542
|
+
const selectedAmount = pricing?.selectedSlidingAmount;
|
|
17543
|
+
const scale = pricing?.slidingScale;
|
|
17544
|
+
if (scale && selectedAmount !== null && selectedAmount !== void 0 && (selectedAmount < scale.minAmount || selectedAmount > scale.maxAmount)) return "Choose an amount within the sliding scale.";
|
|
17545
|
+
return null;
|
|
17546
|
+
}
|
|
17547
|
+
function buildCoursePricingOptionPayload(pricing) {
|
|
17548
|
+
if (pricing?.selectedOption) return { pricingOptionId: pricing.selectedOption.id };
|
|
17549
|
+
if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null) return { selectedSlidingAmount: pricing.selectedSlidingAmount };
|
|
17550
|
+
return {};
|
|
17551
|
+
}
|
|
17552
|
+
function defaultCoursePricingSelection(pricing, previousOptionId) {
|
|
17553
|
+
return {
|
|
17554
|
+
pricingOptionId: previousOptionId && pricing.selectableOptions.some((option) => option.id === previousOptionId) ? previousOptionId : pricing.selectedOption?.id ?? null,
|
|
17555
|
+
slidingAmountInput: pricing.slidingScale?.suggestedAmount !== null && pricing.slidingScale?.suggestedAmount !== void 0 ? formatCentsAsCurrencyInput(pricing.slidingScale.suggestedAmount) : ""
|
|
17556
|
+
};
|
|
17557
|
+
}
|
|
17558
|
+
//#endregion
|
|
17629
17559
|
//#region ../blocks/src/system/runtime/nodes/course-registration/wizardSteps.ts
|
|
17630
17560
|
/**
|
|
17631
17561
|
* Steps that are part of the main wizard and should show the step indicator.
|
|
@@ -17698,654 +17628,608 @@ function getStepLabels(steps) {
|
|
|
17698
17628
|
return steps.map((step) => STEP_LABELS[step] ?? step);
|
|
17699
17629
|
}
|
|
17700
17630
|
//#endregion
|
|
17701
|
-
//#region ../blocks/src/system/runtime/nodes/course-registration/
|
|
17702
|
-
function
|
|
17703
|
-
const
|
|
17704
|
-
|
|
17705
|
-
const
|
|
17706
|
-
|
|
17707
|
-
|
|
17631
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.ts
|
|
17632
|
+
function deriveCourseRegistrationViewState(input) {
|
|
17633
|
+
const hasCoursePayment = resolveCoursePaymentRequirement(input.pricing);
|
|
17634
|
+
const canUseMembership = hasCoursePayment && input.selectedCourse?.acceptsMemberships === true && input.portalAuthState === "authenticated" && input.eligibleMembershipCount > 0;
|
|
17635
|
+
const hasPreSelectedCourse = input.scopedCourses.length === 1;
|
|
17636
|
+
const fastTrack = canUseMembership && input.eligibleMembershipCount === 1 && input.bookingMode === "membership";
|
|
17637
|
+
const wizardSteps = getWizardStepsForContext(hasPreSelectedCourse, hasCoursePayment, canUseMembership, input.bookingMode, fastTrack);
|
|
17638
|
+
const showPortalAuthSidebar = shouldShowPortalAuthSidebar({
|
|
17639
|
+
...input,
|
|
17640
|
+
hasCoursePayment
|
|
17641
|
+
});
|
|
17642
|
+
return {
|
|
17643
|
+
hasCoursePayment,
|
|
17644
|
+
canUseMembership,
|
|
17645
|
+
hasPreSelectedCourse,
|
|
17646
|
+
wizardSteps,
|
|
17647
|
+
currentStepNumber: getStepNumber(input.step, wizardSteps),
|
|
17648
|
+
totalSteps: wizardSteps.length,
|
|
17649
|
+
stepLabels: getStepLabels(wizardSteps),
|
|
17650
|
+
showPortalAuthSidebar
|
|
17651
|
+
};
|
|
17708
17652
|
}
|
|
17709
|
-
function
|
|
17710
|
-
|
|
17711
|
-
return
|
|
17653
|
+
function resolveCoursePaymentRequirement(pricing) {
|
|
17654
|
+
if (!pricing) return false;
|
|
17655
|
+
return pricing.selectedOption ? pricing.selectedRequiresPayment : pricing.hasPaidSelection;
|
|
17712
17656
|
}
|
|
17713
|
-
function
|
|
17714
|
-
if (
|
|
17715
|
-
if (
|
|
17716
|
-
|
|
17717
|
-
const needsWaitlistAvailabilityCheck = course.availableSpots !== null && course.availableSpots <= 0;
|
|
17718
|
-
return needsMembershipEligibility || needsWaitlistAvailabilityCheck;
|
|
17657
|
+
function shouldShowPortalAuthSidebar(input) {
|
|
17658
|
+
if (input.portalAuthState !== "unauthenticated") return false;
|
|
17659
|
+
if (input.step === "success" || input.step === "waitlist" || input.step === "error") return false;
|
|
17660
|
+
return input.waitlistRequiresPortalLogin || input.hasCoursePayment && input.selectedCourse?.acceptsMemberships === true && input.step !== "select-course";
|
|
17719
17661
|
}
|
|
17720
|
-
|
|
17721
|
-
|
|
17722
|
-
|
|
17723
|
-
|
|
17724
|
-
|
|
17725
|
-
|
|
17726
|
-
|
|
17727
|
-
|
|
17728
|
-
|
|
17729
|
-
|
|
17730
|
-
|
|
17662
|
+
//#endregion
|
|
17663
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.ts
|
|
17664
|
+
function shouldFetchEligibility(input) {
|
|
17665
|
+
if (!input.course || input.portalAuthState === "checking" || input.hasWaitlistClaimToken) return false;
|
|
17666
|
+
const membershipCheck = input.portalAuthState === "authenticated" && input.hasPaidSelection && input.course.acceptsMemberships;
|
|
17667
|
+
const capacityCheck = input.course.availableSpots !== null && input.course.availableSpots <= 0;
|
|
17668
|
+
return membershipCheck || capacityCheck;
|
|
17669
|
+
}
|
|
17670
|
+
function useCourseEligibility(input) {
|
|
17671
|
+
const [loading, setLoading] = useState(false);
|
|
17672
|
+
const [error, setError] = useState(null);
|
|
17673
|
+
const [eligibility, setEligibility] = useState(null);
|
|
17674
|
+
const [memberships, setMemberships] = useState([]);
|
|
17675
|
+
const [paymentChoice, setPaymentChoice] = useState("checkout");
|
|
17676
|
+
const [selectedMembershipId, setSelectedMembershipId] = useState(null);
|
|
17677
|
+
const choosePaymentChoice = useCallback((choice) => {
|
|
17678
|
+
setPaymentChoice(choice);
|
|
17679
|
+
}, []);
|
|
17680
|
+
const chooseMembership = useCallback((membershipId) => {
|
|
17681
|
+
setSelectedMembershipId(membershipId);
|
|
17682
|
+
}, []);
|
|
17683
|
+
useEffect(() => {
|
|
17684
|
+
let cancelled = false;
|
|
17685
|
+
setEligibility(null);
|
|
17686
|
+
setMemberships([]);
|
|
17687
|
+
setSelectedMembershipId(null);
|
|
17688
|
+
setError(null);
|
|
17689
|
+
setPaymentChoice("checkout");
|
|
17690
|
+
const eligibilityInput = {
|
|
17691
|
+
course: input.selectedCourse,
|
|
17692
|
+
hasPaidSelection: input.hasPaidSelection,
|
|
17693
|
+
portalAuthState: input.portalAuthState,
|
|
17694
|
+
hasWaitlistClaimToken: input.waitlistClaimToken !== null
|
|
17695
|
+
};
|
|
17696
|
+
if (!shouldFetchEligibility(eligibilityInput)) return;
|
|
17697
|
+
const course = eligibilityInput.course;
|
|
17698
|
+
setLoading(true);
|
|
17699
|
+
input.api.checkWholeSeriesEligibility({ eventSeriesId: course.eventSeriesId }).then((result) => {
|
|
17700
|
+
if (cancelled) return;
|
|
17701
|
+
const eligibleMemberships = result.eligibleMemberships ?? [];
|
|
17702
|
+
setEligibility(result);
|
|
17703
|
+
setMemberships(eligibleMemberships);
|
|
17704
|
+
if (input.portalAuthState === "authenticated" && eligibleMemberships.length > 0) {
|
|
17705
|
+
setPaymentChoice("membership");
|
|
17706
|
+
if (eligibleMemberships.length === 1) setSelectedMembershipId(eligibleMemberships[0]?.customerMembershipId ?? null);
|
|
17707
|
+
}
|
|
17708
|
+
}).catch((cause) => {
|
|
17709
|
+
if (!cancelled) setError(cause instanceof Error ? cause.message : "Failed to check membership eligibility");
|
|
17710
|
+
}).finally(() => {
|
|
17711
|
+
if (!cancelled) setLoading(false);
|
|
17712
|
+
});
|
|
17713
|
+
return () => {
|
|
17714
|
+
cancelled = true;
|
|
17715
|
+
};
|
|
17716
|
+
}, [
|
|
17717
|
+
input.api,
|
|
17718
|
+
input.hasPaidSelection,
|
|
17719
|
+
input.portalAuthState,
|
|
17720
|
+
input.selectedCourse,
|
|
17721
|
+
input.waitlistClaimToken
|
|
17722
|
+
]);
|
|
17723
|
+
return {
|
|
17724
|
+
eligibilityLoading: loading,
|
|
17725
|
+
eligibilityError: error,
|
|
17726
|
+
courseEligibility: eligibility,
|
|
17727
|
+
eligibleMemberships: memberships,
|
|
17728
|
+
paymentChoice,
|
|
17729
|
+
choosePaymentChoice,
|
|
17730
|
+
selectedMembershipId,
|
|
17731
|
+
chooseMembership
|
|
17732
|
+
};
|
|
17733
|
+
}
|
|
17734
|
+
//#endregion
|
|
17735
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.ts
|
|
17736
|
+
function selectScopedCourses(props) {
|
|
17737
|
+
const surfaceScope = resolveCoursePageSurfaceScope(props.courses ?? [], props.subject);
|
|
17738
|
+
if (surfaceScope.kind === "unsupported") return [];
|
|
17739
|
+
if (surfaceScope.kind === "scoped") return surfaceScope.courses;
|
|
17740
|
+
return [];
|
|
17741
|
+
}
|
|
17742
|
+
function getCourseCheckoutSessionId() {
|
|
17731
17743
|
const fromSearch = new URLSearchParams(window.location.search).get("session_id");
|
|
17732
17744
|
if (fromSearch) return fromSearch;
|
|
17733
17745
|
return window.location.hash.match(/[?&]session_id=([^&]+)/)?.[1] ?? null;
|
|
17734
17746
|
}
|
|
17735
|
-
function
|
|
17736
|
-
if (
|
|
17737
|
-
|
|
17738
|
-
return "Choose a pricing option to continue.";
|
|
17739
|
-
}
|
|
17740
|
-
if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null && pricing.selectedSlidingAmount < pricing.slidingScale.minAmount) return "Choose an amount within the sliding scale.";
|
|
17741
|
-
if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null && pricing.selectedSlidingAmount > pricing.slidingScale.maxAmount) return "Choose an amount within the sliding scale.";
|
|
17742
|
-
return null;
|
|
17743
|
-
}
|
|
17744
|
-
function buildCoursePricingOptionPayload(pricing) {
|
|
17745
|
-
if (pricing?.selectedOption) return { pricingOptionId: pricing.selectedOption.id };
|
|
17746
|
-
if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null) return { selectedSlidingAmount: pricing.selectedSlidingAmount };
|
|
17747
|
-
return {};
|
|
17748
|
-
}
|
|
17749
|
-
function resolveHasCoursePayment(pricing) {
|
|
17750
|
-
if (!pricing) return false;
|
|
17751
|
-
if (pricing.selectedOption) return pricing.selectedRequiresPayment;
|
|
17752
|
-
return pricing.hasPaidSelection;
|
|
17747
|
+
function initialStep(courses) {
|
|
17748
|
+
if (new URLSearchParams(window.location.search).get("enrollment") === "success" && getCourseCheckoutSessionId()) return "verifying-payment";
|
|
17749
|
+
return courses.length === 1 ? "enter-details" : "select-course";
|
|
17753
17750
|
}
|
|
17754
|
-
function
|
|
17755
|
-
const
|
|
17756
|
-
const
|
|
17757
|
-
const scopedCourses = useMemo(() => {
|
|
17758
|
-
const allCourses = courses ?? [];
|
|
17759
|
-
if (entrySubrouteContext?.kind === "course-run") {
|
|
17760
|
-
const matched = allCourses.find((c) => c.id === entrySubrouteContext.run.courseId) ?? null;
|
|
17761
|
-
if (matched) return [matched];
|
|
17762
|
-
}
|
|
17763
|
-
const pageSurfaceScope = resolveCoursePageSurfaceScope(allCourses, subject);
|
|
17764
|
-
if (pageSurfaceScope.kind === "unsupported") return [];
|
|
17765
|
-
if (pageSurfaceScope.kind === "scoped") return [...pageSurfaceScope.courses];
|
|
17766
|
-
if (contentEntry?.id) {
|
|
17767
|
-
const matchedCourses = allCourses.filter((c) => c.contentEntryId === contentEntry.id);
|
|
17768
|
-
if (matchedCourses.length > 0) return matchedCourses;
|
|
17769
|
-
}
|
|
17770
|
-
if (contentEntry?.slug) {
|
|
17771
|
-
const matchedCourse = allCourses.find((c) => c.slug === contentEntry.slug);
|
|
17772
|
-
if (matchedCourse) return [matchedCourse];
|
|
17773
|
-
}
|
|
17774
|
-
return allCourses;
|
|
17775
|
-
}, [
|
|
17776
|
-
courses,
|
|
17777
|
-
contentEntry?.id,
|
|
17778
|
-
contentEntry?.slug,
|
|
17779
|
-
entrySubrouteContext,
|
|
17780
|
-
subject
|
|
17781
|
-
]);
|
|
17782
|
-
const [step, setStep] = useState(() => {
|
|
17783
|
-
const enrollment = new URLSearchParams(window.location.search).get("enrollment");
|
|
17784
|
-
const sessionId = getSessionIdFromUrl();
|
|
17785
|
-
if (enrollment === "success" && sessionId) return "verifying-payment";
|
|
17786
|
-
return scopedCourses.length === 1 ? "enter-details" : "select-course";
|
|
17787
|
-
});
|
|
17751
|
+
function useCourseRegistrationSelection(props) {
|
|
17752
|
+
const scopedCourses = useMemo(() => selectScopedCourses(props), [props.courses, props.subject]);
|
|
17753
|
+
const [step, setStep] = useState(() => initialStep(scopedCourses));
|
|
17788
17754
|
const [selectedCourse, setSelectedCourse] = useState(scopedCourses.length === 1 ? scopedCourses[0] ?? null : null);
|
|
17789
17755
|
const [selectedPricingOptionId, setSelectedPricingOptionId] = useState(null);
|
|
17790
17756
|
const [selectedSlidingAmountInput, setSelectedSlidingAmountInput] = useState("");
|
|
17791
|
-
const
|
|
17792
|
-
|
|
17793
|
-
|
|
17794
|
-
|
|
17795
|
-
|
|
17796
|
-
});
|
|
17797
|
-
const
|
|
17798
|
-
|
|
17799
|
-
|
|
17800
|
-
const
|
|
17801
|
-
|
|
17802
|
-
|
|
17803
|
-
const [eligibilityLoading, setEligibilityLoading] = useState(false);
|
|
17804
|
-
const [eligibilityError, setEligibilityError] = useState(null);
|
|
17805
|
-
const [courseEligibility, setCourseEligibility] = useState(null);
|
|
17806
|
-
const [eligibleMemberships, setEligibleMemberships] = useState([]);
|
|
17807
|
-
const [paymentChoice, setPaymentChoice] = useState("checkout");
|
|
17808
|
-
const [selectedMembershipId, setSelectedMembershipId] = useState(null);
|
|
17809
|
-
const [bookingMode, setBookingMode] = useState(null);
|
|
17810
|
-
const waitlistClaim = useWaitlistClaim();
|
|
17757
|
+
const goToStep = useCallback((nextStep) => {
|
|
17758
|
+
setStep(nextStep);
|
|
17759
|
+
}, []);
|
|
17760
|
+
const chooseCourse = useCallback((course) => {
|
|
17761
|
+
setSelectedCourse(course);
|
|
17762
|
+
}, []);
|
|
17763
|
+
const choosePricingOption = useCallback((pricingOptionId) => {
|
|
17764
|
+
setSelectedPricingOptionId(pricingOptionId);
|
|
17765
|
+
}, []);
|
|
17766
|
+
const changeSlidingAmount = useCallback((amount) => {
|
|
17767
|
+
setSelectedSlidingAmountInput(amount);
|
|
17768
|
+
}, []);
|
|
17811
17769
|
const selectedCoursePricing = useMemo(() => selectedCourse ? resolveCoursePricingState(selectedCourse, selectedPricingOptionId, parseCurrencyInputToCents(selectedSlidingAmountInput)) : null, [
|
|
17812
17770
|
selectedCourse,
|
|
17813
17771
|
selectedPricingOptionId,
|
|
17814
17772
|
selectedSlidingAmountInput
|
|
17815
17773
|
]);
|
|
17816
|
-
const missingPricingSelectionMessage = getMissingCoursePricingSelectionMessage(selectedCoursePricing);
|
|
17817
|
-
const selectedCoursePricingPayload = buildCoursePricingOptionPayload(selectedCoursePricing);
|
|
17818
|
-
const showSoldOutCourseError = () => {
|
|
17819
|
-
setErrorMessage(courseEligibility?.reason ?? "This course is fully booked.");
|
|
17820
|
-
setStep("error");
|
|
17821
|
-
return true;
|
|
17822
|
-
};
|
|
17823
|
-
useEffect(() => {
|
|
17824
|
-
let cancelled = false;
|
|
17825
|
-
async function checkPortalAuth() {
|
|
17826
|
-
if (!(api.config.auth.type === "bearer" || api.config.authOverrides?.portal?.type === "bearer")) {
|
|
17827
|
-
setPortalAuthState("unauthenticated");
|
|
17828
|
-
return;
|
|
17829
|
-
}
|
|
17830
|
-
setPortalAuthState("checking");
|
|
17831
|
-
try {
|
|
17832
|
-
const me = await api.getPortalProfile();
|
|
17833
|
-
if (cancelled) return;
|
|
17834
|
-
setPortalAuthState("authenticated");
|
|
17835
|
-
setFormData((prev) => ({
|
|
17836
|
-
...prev,
|
|
17837
|
-
email: me.profile.email,
|
|
17838
|
-
name: prev.name || me.profile.name,
|
|
17839
|
-
phone: prev.phone || me.profile.phone || ""
|
|
17840
|
-
}));
|
|
17841
|
-
} catch {
|
|
17842
|
-
if (cancelled) return;
|
|
17843
|
-
setPortalAuthState("unauthenticated");
|
|
17844
|
-
}
|
|
17845
|
-
}
|
|
17846
|
-
checkPortalAuth();
|
|
17847
|
-
return () => {
|
|
17848
|
-
cancelled = true;
|
|
17849
|
-
};
|
|
17850
|
-
}, [api]);
|
|
17851
|
-
useEffect(() => {
|
|
17852
|
-
const claim = waitlistClaim.claim;
|
|
17853
|
-
if (!claim || claim.subject.kind !== "course") return;
|
|
17854
|
-
const courseId = claim.subject.courseId;
|
|
17855
|
-
const matchedCourse = scopedCourses.find((course) => course.id === courseId) ?? null;
|
|
17856
|
-
if (!matchedCourse) {
|
|
17857
|
-
setErrorMessage("This waitlist claim is for a different course.");
|
|
17858
|
-
setStep("error");
|
|
17859
|
-
return;
|
|
17860
|
-
}
|
|
17861
|
-
setSelectedCourse(matchedCourse);
|
|
17862
|
-
setFormData((prev) => ({
|
|
17863
|
-
...prev,
|
|
17864
|
-
email: claim.prefill.email,
|
|
17865
|
-
name: claim.prefill.name,
|
|
17866
|
-
phone: claim.prefill.phone ?? "",
|
|
17867
|
-
notes: claim.prefill.notes ?? ""
|
|
17868
|
-
}));
|
|
17869
|
-
if (step === "select-course") setStep("enter-details");
|
|
17870
|
-
}, [
|
|
17871
|
-
waitlistClaim.claim,
|
|
17872
|
-
scopedCourses,
|
|
17873
|
-
step
|
|
17874
|
-
]);
|
|
17875
|
-
useEffect(() => {
|
|
17876
|
-
if (waitlistClaim.requiresPortalLogin) return;
|
|
17877
|
-
if (!waitlistClaim.error) return;
|
|
17878
|
-
setErrorMessage(waitlistClaim.error);
|
|
17879
|
-
setStep("error");
|
|
17880
|
-
}, [waitlistClaim.error, waitlistClaim.requiresPortalLogin]);
|
|
17881
17774
|
useEffect(() => {
|
|
17882
17775
|
if (!selectedCourse) {
|
|
17883
17776
|
setSelectedPricingOptionId(null);
|
|
17884
17777
|
setSelectedSlidingAmountInput("");
|
|
17885
17778
|
return;
|
|
17886
17779
|
}
|
|
17887
|
-
const
|
|
17888
|
-
|
|
17889
|
-
|
|
17890
|
-
if (previous && defaultPricing.selectableOptions.some((option) => option.id === previous)) return previous;
|
|
17891
|
-
return defaultPricing.selectedOption?.id ?? null;
|
|
17892
|
-
});
|
|
17780
|
+
const selection = defaultCoursePricingSelection(resolveCoursePricingState(selectedCourse, null), selectedPricingOptionId);
|
|
17781
|
+
setSelectedPricingOptionId(selection.pricingOptionId);
|
|
17782
|
+
setSelectedSlidingAmountInput(selection.slidingAmountInput);
|
|
17893
17783
|
}, [selectedCourse]);
|
|
17894
|
-
|
|
17895
|
-
|
|
17896
|
-
|
|
17897
|
-
|
|
17898
|
-
|
|
17899
|
-
|
|
17900
|
-
|
|
17901
|
-
|
|
17902
|
-
|
|
17903
|
-
|
|
17904
|
-
|
|
17905
|
-
|
|
17906
|
-
|
|
17907
|
-
|
|
17908
|
-
|
|
17909
|
-
|
|
17910
|
-
|
|
17911
|
-
|
|
17912
|
-
|
|
17913
|
-
|
|
17914
|
-
|
|
17915
|
-
|
|
17916
|
-
|
|
17917
|
-
|
|
17918
|
-
|
|
17919
|
-
|
|
17920
|
-
|
|
17784
|
+
return {
|
|
17785
|
+
scopedCourses,
|
|
17786
|
+
step,
|
|
17787
|
+
goToStep,
|
|
17788
|
+
selectedCourse,
|
|
17789
|
+
chooseCourse,
|
|
17790
|
+
selectedPricingOptionId,
|
|
17791
|
+
choosePricingOption,
|
|
17792
|
+
selectedSlidingAmountInput,
|
|
17793
|
+
changeSlidingAmount,
|
|
17794
|
+
selectedCoursePricing
|
|
17795
|
+
};
|
|
17796
|
+
}
|
|
17797
|
+
//#endregion
|
|
17798
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.ts
|
|
17799
|
+
function applyTerminalStatus(status, setters) {
|
|
17800
|
+
if (status === "enrolled" || status === "completed") {
|
|
17801
|
+
setters.setEnrollmentResult({
|
|
17802
|
+
status: "enrolled",
|
|
17803
|
+
usedMembership: false
|
|
17804
|
+
});
|
|
17805
|
+
setters.setStep("success");
|
|
17806
|
+
return true;
|
|
17807
|
+
}
|
|
17808
|
+
if (status === "waitlist") {
|
|
17809
|
+
setters.setEnrollmentResult({
|
|
17810
|
+
status: "waitlist",
|
|
17811
|
+
usedMembership: false
|
|
17812
|
+
});
|
|
17813
|
+
setters.setStep("waitlist");
|
|
17814
|
+
return true;
|
|
17815
|
+
}
|
|
17816
|
+
setters.setErrorMessage("Payment did not complete. Please try again.");
|
|
17817
|
+
setters.setStep("error");
|
|
17818
|
+
return true;
|
|
17819
|
+
}
|
|
17820
|
+
async function pollCourseRegistrationStatus(api, sessionId, setters, isCancelled) {
|
|
17821
|
+
const startedAt = Date.now();
|
|
17822
|
+
while (!isCancelled()) {
|
|
17823
|
+
try {
|
|
17824
|
+
const result = await api.getWholeSeriesRegistrationStatus({ sessionId });
|
|
17825
|
+
if (isCancelled()) return;
|
|
17826
|
+
if (result.status !== "pending_payment") {
|
|
17827
|
+
applyTerminalStatus(result.status, setters);
|
|
17828
|
+
return;
|
|
17921
17829
|
}
|
|
17830
|
+
} catch (cause) {
|
|
17831
|
+
setters.setErrorMessage(cause instanceof Error ? cause.message : "Failed to verify payment");
|
|
17922
17832
|
}
|
|
17923
|
-
|
|
17924
|
-
|
|
17925
|
-
|
|
17926
|
-
|
|
17927
|
-
|
|
17928
|
-
|
|
17929
|
-
|
|
17930
|
-
|
|
17931
|
-
|
|
17932
|
-
waitlistClaim.token
|
|
17933
|
-
]);
|
|
17833
|
+
if (Date.now() - startedAt > 3e4) {
|
|
17834
|
+
setters.setErrorMessage("Payment is still processing. Please check your email for confirmation.");
|
|
17835
|
+
setters.setStep("error");
|
|
17836
|
+
return;
|
|
17837
|
+
}
|
|
17838
|
+
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
17839
|
+
}
|
|
17840
|
+
}
|
|
17841
|
+
function useCoursePaymentVerification(api, setters) {
|
|
17934
17842
|
useEffect(() => {
|
|
17935
17843
|
let cancelled = false;
|
|
17936
|
-
|
|
17937
|
-
|
|
17938
|
-
|
|
17939
|
-
if (enrollment === "cancelled") {
|
|
17940
|
-
scrollToBlock(COURSE_REGISTRATION_ANCHOR_ID);
|
|
17941
|
-
setErrorMessage("Payment was cancelled. You can try again.");
|
|
17942
|
-
setStep("error");
|
|
17943
|
-
return;
|
|
17944
|
-
}
|
|
17945
|
-
if (enrollment !== "success" || !sessionId) return;
|
|
17844
|
+
const enrollment = new URLSearchParams(window.location.search).get("enrollment");
|
|
17845
|
+
const sessionId = getCourseCheckoutSessionId();
|
|
17846
|
+
if (enrollment === "cancelled") {
|
|
17946
17847
|
scrollToBlock(COURSE_REGISTRATION_ANCHOR_ID);
|
|
17947
|
-
|
|
17948
|
-
|
|
17949
|
-
|
|
17950
|
-
while (!cancelled) {
|
|
17951
|
-
try {
|
|
17952
|
-
const status = await api.getCourseRegistrationStatus({ sessionId });
|
|
17953
|
-
if (cancelled) return;
|
|
17954
|
-
if (status.status === "enrolled" || status.status === "completed") {
|
|
17955
|
-
setEnrollmentResult({
|
|
17956
|
-
status: "enrolled",
|
|
17957
|
-
usedMembership: false
|
|
17958
|
-
});
|
|
17959
|
-
setStep("success");
|
|
17960
|
-
return;
|
|
17961
|
-
}
|
|
17962
|
-
if (status.status === "waitlist") {
|
|
17963
|
-
setEnrollmentResult({
|
|
17964
|
-
status: "waitlist",
|
|
17965
|
-
usedMembership: false
|
|
17966
|
-
});
|
|
17967
|
-
setStep("waitlist");
|
|
17968
|
-
return;
|
|
17969
|
-
}
|
|
17970
|
-
if (status.status === "cancelled") {
|
|
17971
|
-
setErrorMessage("Payment did not complete. Please try again.");
|
|
17972
|
-
setStep("error");
|
|
17973
|
-
return;
|
|
17974
|
-
}
|
|
17975
|
-
} catch (error) {
|
|
17976
|
-
setErrorMessage(error instanceof Error ? error.message : "Failed to verify payment");
|
|
17977
|
-
}
|
|
17978
|
-
if (Date.now() - startedAt > timeoutMs) {
|
|
17979
|
-
setErrorMessage("Payment is still processing. Please check your email for confirmation.");
|
|
17980
|
-
setStep("error");
|
|
17981
|
-
return;
|
|
17982
|
-
}
|
|
17983
|
-
await new Promise((r) => setTimeout(r, 1500));
|
|
17984
|
-
}
|
|
17848
|
+
setters.setErrorMessage("Payment was cancelled. You can try again.");
|
|
17849
|
+
setters.setStep("error");
|
|
17850
|
+
return;
|
|
17985
17851
|
}
|
|
17986
|
-
|
|
17852
|
+
if (enrollment !== "success" || !sessionId) return;
|
|
17853
|
+
scrollToBlock(COURSE_REGISTRATION_ANCHOR_ID);
|
|
17854
|
+
setters.setStep("verifying-payment");
|
|
17855
|
+
pollCourseRegistrationStatus(api, sessionId, setters, () => cancelled);
|
|
17987
17856
|
return () => {
|
|
17988
17857
|
cancelled = true;
|
|
17989
17858
|
};
|
|
17990
|
-
}, [
|
|
17991
|
-
|
|
17992
|
-
|
|
17993
|
-
|
|
17994
|
-
|
|
17859
|
+
}, [
|
|
17860
|
+
api,
|
|
17861
|
+
setters.setEnrollmentResult,
|
|
17862
|
+
setters.setErrorMessage,
|
|
17863
|
+
setters.setStep
|
|
17864
|
+
]);
|
|
17865
|
+
}
|
|
17866
|
+
//#endregion
|
|
17867
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.ts
|
|
17868
|
+
function blocked(message, setters) {
|
|
17869
|
+
setters.setErrorMessage(message);
|
|
17870
|
+
setters.setStep("error");
|
|
17871
|
+
return {
|
|
17872
|
+
kind: "blocked",
|
|
17873
|
+
message
|
|
17995
17874
|
};
|
|
17996
|
-
|
|
17997
|
-
|
|
17998
|
-
|
|
17875
|
+
}
|
|
17876
|
+
function validateSubmission(state, setters) {
|
|
17877
|
+
if (!state.selectedCourse) return {
|
|
17878
|
+
kind: "blocked",
|
|
17879
|
+
message: "Choose an available set of dates to continue."
|
|
17880
|
+
};
|
|
17881
|
+
const errors = validateFormData$1(state.formData);
|
|
17882
|
+
setters.setErrors(errors);
|
|
17883
|
+
if (Object.keys(errors).length > 0) return { kind: "validation-failed" };
|
|
17884
|
+
const pricingMessage = getMissingCoursePricingSelectionMessage(state.pricing);
|
|
17885
|
+
if (pricingMessage) return blocked(pricingMessage, setters);
|
|
17886
|
+
if (!state.hasClaim && state.eligibility?.isFull && !state.eligibility.canJoinWaitlist) return blocked(state.eligibility.reason ?? "This course is fully booked.", setters);
|
|
17887
|
+
if (isSpamProtectionEnabled() && !state.altchaSolution) return blocked("Please complete the verification check.", setters);
|
|
17888
|
+
return null;
|
|
17889
|
+
}
|
|
17890
|
+
function enrollmentPayload(state, payment) {
|
|
17891
|
+
return {
|
|
17892
|
+
...registrantPayload(state),
|
|
17893
|
+
paymentMethod: payment.method,
|
|
17894
|
+
...payment.method === "membership" ? { customerMembershipId: payment.membershipId } : {}
|
|
17999
17895
|
};
|
|
18000
|
-
|
|
18001
|
-
|
|
18002
|
-
|
|
18003
|
-
|
|
18004
|
-
|
|
18005
|
-
|
|
18006
|
-
|
|
18007
|
-
|
|
18008
|
-
|
|
18009
|
-
|
|
18010
|
-
|
|
18011
|
-
|
|
18012
|
-
|
|
18013
|
-
|
|
18014
|
-
|
|
18015
|
-
|
|
18016
|
-
|
|
18017
|
-
|
|
18018
|
-
|
|
18019
|
-
|
|
18020
|
-
|
|
18021
|
-
|
|
18022
|
-
|
|
18023
|
-
|
|
18024
|
-
|
|
18025
|
-
|
|
18026
|
-
|
|
18027
|
-
|
|
17896
|
+
}
|
|
17897
|
+
function registrantPayload(state) {
|
|
17898
|
+
return {
|
|
17899
|
+
eventSeriesId: state.selectedCourse.eventSeriesId,
|
|
17900
|
+
...buildCoursePricingOptionPayload(state.pricing),
|
|
17901
|
+
email: state.formData.email.trim().toLowerCase(),
|
|
17902
|
+
name: state.formData.name.trim(),
|
|
17903
|
+
phone: state.formData.phone.trim() || void 0,
|
|
17904
|
+
formData: { notes: state.formData.notes.trim() || void 0 },
|
|
17905
|
+
altchaSolution: state.altchaSolution,
|
|
17906
|
+
claimToken: state.claimToken ?? void 0
|
|
17907
|
+
};
|
|
17908
|
+
}
|
|
17909
|
+
async function enroll(state, setters, payment) {
|
|
17910
|
+
setters.setStep("submitting");
|
|
17911
|
+
try {
|
|
17912
|
+
const result = await state.api.registerForWholeSeries(enrollmentPayload(state, payment));
|
|
17913
|
+
setters.setEnrollmentResult({
|
|
17914
|
+
status: result.status,
|
|
17915
|
+
waitlistPosition: result.waitlistPosition ?? void 0,
|
|
17916
|
+
usedMembership: payment.method === "membership"
|
|
17917
|
+
});
|
|
17918
|
+
setters.setStep(result.status === "waitlist" ? "waitlist" : "success");
|
|
17919
|
+
return { kind: "state-updated" };
|
|
17920
|
+
} catch (cause) {
|
|
17921
|
+
const message = cause instanceof Error ? cause.message : "Booking failed";
|
|
17922
|
+
setters.setErrorMessage(message);
|
|
17923
|
+
setters.setStep("error");
|
|
17924
|
+
return {
|
|
17925
|
+
kind: "failed",
|
|
17926
|
+
message
|
|
18028
17927
|
};
|
|
18029
|
-
|
|
18030
|
-
|
|
18031
|
-
|
|
18032
|
-
|
|
18033
|
-
|
|
18034
|
-
|
|
18035
|
-
|
|
18036
|
-
|
|
18037
|
-
|
|
18038
|
-
|
|
18039
|
-
|
|
18040
|
-
|
|
18041
|
-
|
|
18042
|
-
|
|
18043
|
-
|
|
18044
|
-
|
|
18045
|
-
waitlistPosition: result.waitlistPosition ?? void 0,
|
|
18046
|
-
usedMembership: false
|
|
18047
|
-
});
|
|
18048
|
-
setStep(result.status === "waitlist" ? "waitlist" : "success");
|
|
18049
|
-
return { kind: "state-updated" };
|
|
18050
|
-
} catch (error) {
|
|
18051
|
-
const message = error instanceof Error ? error.message : "Booking failed";
|
|
18052
|
-
setErrorMessage(message);
|
|
18053
|
-
setStep("error");
|
|
18054
|
-
return {
|
|
18055
|
-
kind: "failed",
|
|
18056
|
-
message
|
|
18057
|
-
};
|
|
18058
|
-
}
|
|
18059
|
-
}
|
|
18060
|
-
if (requiresPayment && canUseMembership) {
|
|
18061
|
-
setStep("select-payment");
|
|
18062
|
-
return { kind: "state-updated" };
|
|
18063
|
-
}
|
|
18064
|
-
if (requiresPayment) {
|
|
18065
|
-
setStep("submitting");
|
|
18066
|
-
try {
|
|
18067
|
-
const { successUrl, cancelUrl } = buildCheckoutReturnUrls("enrollment", COURSE_REGISTRATION_ANCHOR_ID);
|
|
18068
|
-
const checkoutResult = await api.createCourseCheckout({
|
|
18069
|
-
courseId: selectedCourse.id,
|
|
18070
|
-
...selectedCoursePricingPayload,
|
|
18071
|
-
email: formData.email.trim().toLowerCase(),
|
|
18072
|
-
name: formData.name.trim(),
|
|
18073
|
-
phone: formData.phone.trim() || void 0,
|
|
18074
|
-
formData: { notes: formData.notes.trim() || void 0 },
|
|
18075
|
-
altchaSolution,
|
|
18076
|
-
discountCode: discountCode.trim() ? discountCode.trim() : void 0,
|
|
18077
|
-
successUrl,
|
|
18078
|
-
cancelUrl,
|
|
18079
|
-
claimToken: waitlistClaim.token ?? void 0
|
|
18080
|
-
});
|
|
18081
|
-
if (checkoutResult.bypassed) {
|
|
18082
|
-
setEnrollmentResult({
|
|
18083
|
-
status: "enrolled",
|
|
18084
|
-
waitlistPosition: void 0,
|
|
18085
|
-
usedMembership: false
|
|
18086
|
-
});
|
|
18087
|
-
setStep("success");
|
|
18088
|
-
return { kind: "state-updated" };
|
|
18089
|
-
}
|
|
18090
|
-
if (!checkoutResult.checkoutUrl) throw new Error("Checkout URL missing");
|
|
18091
|
-
setStep("redirecting");
|
|
18092
|
-
if (options.onCheckoutRedirect) options.onCheckoutRedirect(checkoutResult.checkoutUrl);
|
|
18093
|
-
else window.location.href = checkoutResult.checkoutUrl;
|
|
18094
|
-
return {
|
|
18095
|
-
kind: "checkout-redirect",
|
|
18096
|
-
checkoutUrl: checkoutResult.checkoutUrl
|
|
18097
|
-
};
|
|
18098
|
-
} catch (error) {
|
|
18099
|
-
const message = error instanceof Error ? error.message : "Checkout failed";
|
|
18100
|
-
setErrorMessage(message);
|
|
18101
|
-
setStep("error");
|
|
18102
|
-
return {
|
|
18103
|
-
kind: "failed",
|
|
18104
|
-
message
|
|
18105
|
-
};
|
|
18106
|
-
}
|
|
18107
|
-
}
|
|
18108
|
-
setStep("submitting");
|
|
18109
|
-
try {
|
|
18110
|
-
const result = await api.enrollInCourse({
|
|
18111
|
-
courseId: selectedCourse.id,
|
|
18112
|
-
...selectedCoursePricingPayload,
|
|
18113
|
-
email: formData.email.trim().toLowerCase(),
|
|
18114
|
-
name: formData.name.trim(),
|
|
18115
|
-
phone: formData.phone.trim() || void 0,
|
|
18116
|
-
formData: { notes: formData.notes.trim() || void 0 },
|
|
18117
|
-
altchaSolution,
|
|
18118
|
-
paymentMethod: "free",
|
|
18119
|
-
claimToken: waitlistClaim.token ?? void 0
|
|
18120
|
-
});
|
|
18121
|
-
setEnrollmentResult({
|
|
18122
|
-
status: result.status,
|
|
18123
|
-
waitlistPosition: result.waitlistPosition ?? void 0,
|
|
18124
|
-
usedMembership: result.paymentMethod === "membership"
|
|
17928
|
+
}
|
|
17929
|
+
}
|
|
17930
|
+
async function checkout(state, setters) {
|
|
17931
|
+
setters.setStep("submitting");
|
|
17932
|
+
try {
|
|
17933
|
+
const urls = buildCheckoutReturnUrls("enrollment", COURSE_REGISTRATION_ANCHOR_ID);
|
|
17934
|
+
const result = await state.api.createWholeSeriesCheckout({
|
|
17935
|
+
...registrantPayload(state),
|
|
17936
|
+
discountCode: state.discountCode.trim() || void 0,
|
|
17937
|
+
successUrl: urls.successUrl,
|
|
17938
|
+
cancelUrl: urls.cancelUrl
|
|
17939
|
+
});
|
|
17940
|
+
if (result.bypassed) {
|
|
17941
|
+
setters.setEnrollmentResult({
|
|
17942
|
+
status: "enrolled",
|
|
17943
|
+
usedMembership: false
|
|
18125
17944
|
});
|
|
18126
|
-
setStep(
|
|
17945
|
+
setters.setStep("success");
|
|
18127
17946
|
return { kind: "state-updated" };
|
|
18128
|
-
} catch (error) {
|
|
18129
|
-
const message = error instanceof Error ? error.message : "Booking failed";
|
|
18130
|
-
setErrorMessage(message);
|
|
18131
|
-
setStep("error");
|
|
18132
|
-
return {
|
|
18133
|
-
kind: "failed",
|
|
18134
|
-
message
|
|
18135
|
-
};
|
|
18136
17947
|
}
|
|
18137
|
-
|
|
18138
|
-
|
|
18139
|
-
if (
|
|
18140
|
-
|
|
18141
|
-
|
|
17948
|
+
if (!result.checkoutUrl) throw new Error("Checkout URL missing");
|
|
17949
|
+
setters.setStep("redirecting");
|
|
17950
|
+
if (state.options.onCheckoutRedirect) state.options.onCheckoutRedirect(result.checkoutUrl);
|
|
17951
|
+
else window.location.href = result.checkoutUrl;
|
|
17952
|
+
return {
|
|
17953
|
+
kind: "checkout-redirect",
|
|
17954
|
+
checkoutUrl: result.checkoutUrl
|
|
18142
17955
|
};
|
|
18143
|
-
|
|
18144
|
-
|
|
18145
|
-
|
|
18146
|
-
|
|
18147
|
-
|
|
18148
|
-
|
|
18149
|
-
|
|
18150
|
-
};
|
|
18151
|
-
}
|
|
18152
|
-
const requiresPayment = selectedCoursePricing?.selectedRequiresPayment ?? false;
|
|
18153
|
-
if (!waitlistClaim.claim && courseEligibility?.isFull && !courseEligibility.canJoinWaitlist && showSoldOutCourseError()) return {
|
|
18154
|
-
kind: "blocked",
|
|
18155
|
-
message: courseEligibility.reason ?? "This course is fully booked."
|
|
17956
|
+
} catch (cause) {
|
|
17957
|
+
const message = cause instanceof Error ? cause.message : "Checkout failed";
|
|
17958
|
+
setters.setErrorMessage(message);
|
|
17959
|
+
setters.setStep("error");
|
|
17960
|
+
return {
|
|
17961
|
+
kind: "failed",
|
|
17962
|
+
message
|
|
18156
17963
|
};
|
|
18157
|
-
|
|
18158
|
-
|
|
18159
|
-
|
|
18160
|
-
|
|
18161
|
-
|
|
18162
|
-
|
|
18163
|
-
|
|
18164
|
-
|
|
18165
|
-
|
|
18166
|
-
|
|
18167
|
-
|
|
18168
|
-
|
|
18169
|
-
|
|
18170
|
-
|
|
18171
|
-
|
|
18172
|
-
|
|
18173
|
-
|
|
18174
|
-
|
|
18175
|
-
|
|
18176
|
-
|
|
18177
|
-
|
|
18178
|
-
|
|
18179
|
-
|
|
18180
|
-
|
|
18181
|
-
|
|
18182
|
-
|
|
18183
|
-
|
|
18184
|
-
|
|
18185
|
-
|
|
18186
|
-
|
|
18187
|
-
|
|
18188
|
-
|
|
18189
|
-
|
|
18190
|
-
|
|
18191
|
-
|
|
18192
|
-
|
|
18193
|
-
|
|
18194
|
-
|
|
18195
|
-
|
|
18196
|
-
|
|
18197
|
-
|
|
18198
|
-
|
|
18199
|
-
|
|
18200
|
-
|
|
18201
|
-
|
|
18202
|
-
|
|
18203
|
-
|
|
18204
|
-
setStep("error");
|
|
18205
|
-
return {
|
|
18206
|
-
kind: "failed",
|
|
18207
|
-
message
|
|
18208
|
-
};
|
|
18209
|
-
}
|
|
18210
|
-
}
|
|
18211
|
-
setStep("submitting");
|
|
18212
|
-
try {
|
|
18213
|
-
const { successUrl, cancelUrl } = buildCheckoutReturnUrls("enrollment", COURSE_REGISTRATION_ANCHOR_ID);
|
|
18214
|
-
const checkoutResult = await api.createCourseCheckout({
|
|
18215
|
-
courseId: selectedCourse.id,
|
|
18216
|
-
...selectedCoursePricingPayload,
|
|
18217
|
-
email: formData.email.trim().toLowerCase(),
|
|
18218
|
-
name: formData.name.trim(),
|
|
18219
|
-
phone: formData.phone.trim() || void 0,
|
|
18220
|
-
formData: { notes: formData.notes.trim() || void 0 },
|
|
18221
|
-
altchaSolution,
|
|
18222
|
-
discountCode: discountCode.trim() ? discountCode.trim() : void 0,
|
|
18223
|
-
successUrl,
|
|
18224
|
-
cancelUrl,
|
|
18225
|
-
claimToken: waitlistClaim.token ?? void 0
|
|
18226
|
-
});
|
|
18227
|
-
if (checkoutResult.bypassed) {
|
|
18228
|
-
setEnrollmentResult({
|
|
18229
|
-
status: "enrolled",
|
|
18230
|
-
waitlistPosition: void 0,
|
|
18231
|
-
usedMembership: false
|
|
18232
|
-
});
|
|
18233
|
-
setStep("success");
|
|
18234
|
-
return { kind: "state-updated" };
|
|
18235
|
-
}
|
|
18236
|
-
if (!checkoutResult.checkoutUrl) throw new Error("Checkout URL missing");
|
|
18237
|
-
setStep("redirecting");
|
|
18238
|
-
if (options.onCheckoutRedirect) options.onCheckoutRedirect(checkoutResult.checkoutUrl);
|
|
18239
|
-
else window.location.href = checkoutResult.checkoutUrl;
|
|
18240
|
-
return {
|
|
18241
|
-
kind: "checkout-redirect",
|
|
18242
|
-
checkoutUrl: checkoutResult.checkoutUrl
|
|
18243
|
-
};
|
|
18244
|
-
} catch (error) {
|
|
18245
|
-
const message = error instanceof Error ? error.message : "Checkout failed";
|
|
18246
|
-
setErrorMessage(message);
|
|
18247
|
-
setStep("error");
|
|
18248
|
-
return {
|
|
18249
|
-
kind: "failed",
|
|
18250
|
-
message
|
|
18251
|
-
};
|
|
18252
|
-
}
|
|
17964
|
+
}
|
|
17965
|
+
}
|
|
17966
|
+
async function submitDetails(state, setters) {
|
|
17967
|
+
const invalid = validateSubmission(state, setters);
|
|
17968
|
+
if (invalid || !state.selectedCourse) return invalid ?? { kind: "validation-failed" };
|
|
17969
|
+
if (state.eligibility?.canJoinWaitlist) return enroll(state, setters, { method: "free" });
|
|
17970
|
+
const requiresPayment = state.pricing?.selectedRequiresPayment ?? false;
|
|
17971
|
+
const canUseMembership = requiresPayment && state.selectedCourse.acceptsMemberships && state.portalAuthState === "authenticated" && state.eligibleMemberships.length > 0;
|
|
17972
|
+
if (requiresPayment && canUseMembership) {
|
|
17973
|
+
setters.setStep("select-payment");
|
|
17974
|
+
return { kind: "state-updated" };
|
|
17975
|
+
}
|
|
17976
|
+
if (requiresPayment) return checkout(state, setters);
|
|
17977
|
+
return enroll(state, setters, { method: "free" });
|
|
17978
|
+
}
|
|
17979
|
+
async function continuePayment(state, setters) {
|
|
17980
|
+
const invalid = validateSubmission(state, setters);
|
|
17981
|
+
if (invalid || !state.selectedCourse) return invalid ?? { kind: "validation-failed" };
|
|
17982
|
+
if (!state.pricing?.selectedRequiresPayment) {
|
|
17983
|
+
setters.setStep("enter-details");
|
|
17984
|
+
return { kind: "state-updated" };
|
|
17985
|
+
}
|
|
17986
|
+
const selectedState = state;
|
|
17987
|
+
if (state.paymentChoice === "membership") {
|
|
17988
|
+
if (!state.selectedMembershipId) return blocked("Select a membership to sign up.", setters);
|
|
17989
|
+
return enroll(selectedState, setters, {
|
|
17990
|
+
method: "membership",
|
|
17991
|
+
membershipId: state.selectedMembershipId
|
|
17992
|
+
});
|
|
17993
|
+
}
|
|
17994
|
+
return checkout(selectedState, setters);
|
|
17995
|
+
}
|
|
17996
|
+
function useCourseRegistrationActions(state, setStep) {
|
|
17997
|
+
const [errors, setErrors] = useState({});
|
|
17998
|
+
const [enrollmentResult, setEnrollmentResult] = useState(null);
|
|
17999
|
+
const [errorMessage, setErrorMessage] = useState("");
|
|
18000
|
+
const reportError = useCallback((message) => {
|
|
18001
|
+
setErrorMessage(message);
|
|
18002
|
+
}, []);
|
|
18003
|
+
const recordEnrollmentResult = useCallback((result) => {
|
|
18004
|
+
setEnrollmentResult(result);
|
|
18005
|
+
}, []);
|
|
18006
|
+
const setters = {
|
|
18007
|
+
setStep,
|
|
18008
|
+
setErrors,
|
|
18009
|
+
setEnrollmentResult,
|
|
18010
|
+
setErrorMessage
|
|
18253
18011
|
};
|
|
18254
|
-
|
|
18255
|
-
|
|
18256
|
-
|
|
18012
|
+
return {
|
|
18013
|
+
errors,
|
|
18014
|
+
enrollmentResult,
|
|
18015
|
+
errorMessage,
|
|
18016
|
+
reportError,
|
|
18017
|
+
recordEnrollmentResult,
|
|
18018
|
+
handleSubmit: () => submitDetails(state, setters),
|
|
18019
|
+
handlePaymentContinue: () => continuePayment(state, setters)
|
|
18257
18020
|
};
|
|
18258
|
-
|
|
18259
|
-
|
|
18260
|
-
|
|
18261
|
-
|
|
18021
|
+
}
|
|
18022
|
+
//#endregion
|
|
18023
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.ts
|
|
18024
|
+
const EMPTY_FORM$1 = {
|
|
18025
|
+
name: "",
|
|
18026
|
+
email: "",
|
|
18027
|
+
phone: "",
|
|
18028
|
+
notes: ""
|
|
18029
|
+
};
|
|
18030
|
+
function useCourseRegistrationPortal(api) {
|
|
18031
|
+
const [formData, setFormData] = useState(EMPTY_FORM$1);
|
|
18032
|
+
const [portalAuthState, setPortalAuthState] = useState("checking");
|
|
18033
|
+
const updateFormData = useCallback((updater) => {
|
|
18034
|
+
setFormData(updater);
|
|
18035
|
+
}, []);
|
|
18036
|
+
useEffect(() => {
|
|
18037
|
+
let cancelled = false;
|
|
18038
|
+
if (!(api.config.auth.type === "bearer" || api.config.authOverrides?.portal?.type === "bearer")) {
|
|
18039
|
+
setPortalAuthState("unauthenticated");
|
|
18040
|
+
return;
|
|
18041
|
+
}
|
|
18042
|
+
setPortalAuthState("checking");
|
|
18043
|
+
api.getPortalProfile().then((result) => {
|
|
18044
|
+
if (cancelled) return;
|
|
18045
|
+
setPortalAuthState("authenticated");
|
|
18046
|
+
setFormData((current) => ({
|
|
18047
|
+
...current,
|
|
18048
|
+
email: result.profile.email,
|
|
18049
|
+
name: current.name || result.profile.name,
|
|
18050
|
+
phone: current.phone || result.profile.phone || ""
|
|
18051
|
+
}));
|
|
18052
|
+
}).catch(() => {
|
|
18053
|
+
if (!cancelled) setPortalAuthState("unauthenticated");
|
|
18054
|
+
});
|
|
18055
|
+
return () => {
|
|
18056
|
+
cancelled = true;
|
|
18057
|
+
};
|
|
18058
|
+
}, [api]);
|
|
18059
|
+
return {
|
|
18060
|
+
formData,
|
|
18061
|
+
updateFormData,
|
|
18062
|
+
portalAuthState
|
|
18262
18063
|
};
|
|
18064
|
+
}
|
|
18065
|
+
//#endregion
|
|
18066
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.ts
|
|
18067
|
+
function useCourseWaitlistSelection(input) {
|
|
18068
|
+
useEffect(() => {
|
|
18069
|
+
const claim = input.waitlistClaim.claim;
|
|
18070
|
+
if (!claim || claim.subject.kind !== "whole_series") return;
|
|
18071
|
+
const eventSeriesId = claim.subject.eventSeriesId;
|
|
18072
|
+
const course = input.scopedCourses.find((candidate) => candidate.eventSeriesId === eventSeriesId);
|
|
18073
|
+
if (!course) {
|
|
18074
|
+
input.reportError("This waitlist claim is for a different course.");
|
|
18075
|
+
input.goToStep("error");
|
|
18076
|
+
return;
|
|
18077
|
+
}
|
|
18078
|
+
input.chooseCourse(course);
|
|
18079
|
+
input.updateFormData((current) => ({
|
|
18080
|
+
...current,
|
|
18081
|
+
email: claim.prefill.email,
|
|
18082
|
+
name: claim.prefill.name,
|
|
18083
|
+
phone: claim.prefill.phone ?? "",
|
|
18084
|
+
notes: claim.prefill.notes ?? ""
|
|
18085
|
+
}));
|
|
18086
|
+
if (input.step === "select-course") input.goToStep("enter-details");
|
|
18087
|
+
}, [
|
|
18088
|
+
input.chooseCourse,
|
|
18089
|
+
input.goToStep,
|
|
18090
|
+
input.reportError,
|
|
18091
|
+
input.scopedCourses,
|
|
18092
|
+
input.step,
|
|
18093
|
+
input.updateFormData,
|
|
18094
|
+
input.waitlistClaim.claim
|
|
18095
|
+
]);
|
|
18096
|
+
useEffect(() => {
|
|
18097
|
+
if (input.waitlistClaim.requiresPortalLogin || !input.waitlistClaim.error) return;
|
|
18098
|
+
input.reportError(input.waitlistClaim.error);
|
|
18099
|
+
input.goToStep("error");
|
|
18100
|
+
}, [
|
|
18101
|
+
input.goToStep,
|
|
18102
|
+
input.reportError,
|
|
18103
|
+
input.waitlistClaim.error,
|
|
18104
|
+
input.waitlistClaim.requiresPortalLogin
|
|
18105
|
+
]);
|
|
18106
|
+
}
|
|
18107
|
+
//#endregion
|
|
18108
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.ts
|
|
18109
|
+
function useCourseRegistrationWizard(props, options = {}) {
|
|
18110
|
+
const api = useBlockApi();
|
|
18111
|
+
const selection = useCourseRegistrationSelection(props);
|
|
18112
|
+
const portal = useCourseRegistrationPortal(api);
|
|
18113
|
+
const waitlistClaim = useWaitlistClaim();
|
|
18114
|
+
const [bookingMode, setBookingMode] = useState(null);
|
|
18115
|
+
const [altchaSolution, setAltchaSolution] = useState(null);
|
|
18116
|
+
const eligibility = useCourseEligibility({
|
|
18117
|
+
api,
|
|
18118
|
+
selectedCourse: selection.selectedCourse,
|
|
18119
|
+
hasPaidSelection: selection.selectedCoursePricing?.hasPaidSelection ?? false,
|
|
18120
|
+
portalAuthState: portal.portalAuthState,
|
|
18121
|
+
waitlistClaimToken: waitlistClaim.token
|
|
18122
|
+
});
|
|
18263
18123
|
const discountUi = useDiscountCodeUi({
|
|
18264
18124
|
api,
|
|
18265
|
-
discountContext: useMemo(() => {
|
|
18266
|
-
|
|
18267
|
-
|
|
18268
|
-
|
|
18269
|
-
|
|
18270
|
-
|
|
18271
|
-
|
|
18272
|
-
};
|
|
18273
|
-
}, [
|
|
18274
|
-
selectedCourse,
|
|
18275
|
-
selectedCoursePricing?.selectedRequiresPayment,
|
|
18276
|
-
paymentChoice
|
|
18125
|
+
discountContext: useMemo(() => selection.selectedCourse && selection.selectedCoursePricing?.selectedRequiresPayment && eligibility.paymentChoice === "checkout" ? {
|
|
18126
|
+
type: "whole_series",
|
|
18127
|
+
eventSeriesId: selection.selectedCourse.eventSeriesId
|
|
18128
|
+
} : null, [
|
|
18129
|
+
eligibility.paymentChoice,
|
|
18130
|
+
selection.selectedCourse,
|
|
18131
|
+
selection.selectedCoursePricing?.selectedRequiresPayment
|
|
18277
18132
|
]),
|
|
18278
|
-
subtotalCents: selectedCoursePricing?.selectedPriceAmount ?? void 0
|
|
18279
|
-
});
|
|
18280
|
-
const
|
|
18281
|
-
const hasCoursePayment = resolveHasCoursePayment(selectedCoursePricing);
|
|
18282
|
-
const canUseMembership = hasCoursePayment && selectedCourse?.acceptsMemberships === true && portalAuthState === "authenticated" && eligibleMemberships.length > 0;
|
|
18283
|
-
const hasPreSelectedCourse = scopedCourses.length === 1;
|
|
18284
|
-
const isMembershipFastTrack = canUseMembership && eligibleMemberships.length === 1 && bookingMode === "membership";
|
|
18285
|
-
const wizardSteps = useMemo(() => getWizardStepsForContext(hasPreSelectedCourse, hasCoursePayment, canUseMembership, bookingMode, isMembershipFastTrack), [
|
|
18286
|
-
hasPreSelectedCourse,
|
|
18287
|
-
hasCoursePayment,
|
|
18288
|
-
canUseMembership,
|
|
18289
|
-
bookingMode,
|
|
18290
|
-
isMembershipFastTrack
|
|
18291
|
-
]);
|
|
18292
|
-
const currentStepNumber = getStepNumber(step, wizardSteps);
|
|
18293
|
-
const totalSteps = wizardSteps.length;
|
|
18294
|
-
const stepLabels = getStepLabels(wizardSteps);
|
|
18295
|
-
const canShowPortalAuthSidebarOnCurrentStep = step !== "success" && step !== "waitlist" && step !== "error";
|
|
18296
|
-
const showPortalAuthSidebar = portalAuthState === "unauthenticated" && waitlistClaim.requiresPortalLogin && canShowPortalAuthSidebarOnCurrentStep || portalAuthState === "unauthenticated" && hasCoursePayment && selectedCourse?.acceptsMemberships === true && step !== "select-course" && canShowPortalAuthSidebarOnCurrentStep;
|
|
18297
|
-
return {
|
|
18133
|
+
subtotalCents: selection.selectedCoursePricing?.selectedPriceAmount ?? void 0
|
|
18134
|
+
});
|
|
18135
|
+
const actions = useCourseRegistrationActions({
|
|
18298
18136
|
api,
|
|
18299
|
-
|
|
18300
|
-
|
|
18301
|
-
|
|
18302
|
-
|
|
18303
|
-
|
|
18304
|
-
|
|
18305
|
-
|
|
18306
|
-
|
|
18307
|
-
|
|
18308
|
-
|
|
18309
|
-
formData,
|
|
18310
|
-
setFormData,
|
|
18311
|
-
errors,
|
|
18312
|
-
enrollmentResult,
|
|
18313
|
-
errorMessage,
|
|
18314
|
-
portalAuthState,
|
|
18315
|
-
handleLogout: portalAuthState === "authenticated" ? () => logoutPortal(COURSE_REGISTRATION_ANCHOR_ID) : void 0,
|
|
18137
|
+
selectedCourse: selection.selectedCourse,
|
|
18138
|
+
pricing: selection.selectedCoursePricing,
|
|
18139
|
+
formData: portal.formData,
|
|
18140
|
+
portalAuthState: portal.portalAuthState,
|
|
18141
|
+
eligibility: eligibility.courseEligibility,
|
|
18142
|
+
eligibleMemberships: eligibility.eligibleMemberships,
|
|
18143
|
+
paymentChoice: eligibility.paymentChoice,
|
|
18144
|
+
selectedMembershipId: eligibility.selectedMembershipId,
|
|
18145
|
+
claimToken: waitlistClaim.token,
|
|
18146
|
+
hasClaim: waitlistClaim.claim !== null,
|
|
18316
18147
|
altchaSolution,
|
|
18317
|
-
setAltchaSolution,
|
|
18318
|
-
showSpamProtection,
|
|
18319
|
-
eligibilityLoading,
|
|
18320
|
-
eligibilityError,
|
|
18321
|
-
courseEligibility,
|
|
18322
|
-
eligibleMemberships,
|
|
18323
|
-
paymentChoice,
|
|
18324
|
-
setPaymentChoice,
|
|
18325
|
-
selectedMembershipId,
|
|
18326
|
-
setSelectedMembershipId,
|
|
18327
|
-
discountUiOpen: discountUi.discountUiOpen,
|
|
18328
|
-
setDiscountUiOpen: discountUi.setDiscountUiOpen,
|
|
18329
18148
|
discountCode: discountUi.discountCode,
|
|
18330
|
-
|
|
18331
|
-
|
|
18332
|
-
|
|
18333
|
-
|
|
18334
|
-
|
|
18149
|
+
options
|
|
18150
|
+
}, selection.goToStep);
|
|
18151
|
+
useCourseRegistrationEffects({
|
|
18152
|
+
api,
|
|
18153
|
+
actions,
|
|
18154
|
+
portal,
|
|
18155
|
+
selection,
|
|
18156
|
+
waitlistClaim
|
|
18157
|
+
});
|
|
18158
|
+
return buildCourseRegistrationWizardResult({
|
|
18159
|
+
api,
|
|
18160
|
+
selection,
|
|
18161
|
+
portal,
|
|
18162
|
+
eligibility,
|
|
18163
|
+
actions,
|
|
18164
|
+
discountUi,
|
|
18335
18165
|
waitlistClaim,
|
|
18166
|
+
view: deriveCourseRegistrationViewState({
|
|
18167
|
+
scopedCourses: selection.scopedCourses,
|
|
18168
|
+
selectedCourse: selection.selectedCourse,
|
|
18169
|
+
pricing: selection.selectedCoursePricing,
|
|
18170
|
+
portalAuthState: portal.portalAuthState,
|
|
18171
|
+
eligibleMembershipCount: eligibility.eligibleMemberships.length,
|
|
18172
|
+
bookingMode,
|
|
18173
|
+
step: selection.step,
|
|
18174
|
+
waitlistRequiresPortalLogin: waitlistClaim.requiresPortalLogin
|
|
18175
|
+
}),
|
|
18336
18176
|
bookingMode,
|
|
18337
|
-
|
|
18338
|
-
|
|
18339
|
-
|
|
18340
|
-
|
|
18341
|
-
|
|
18342
|
-
|
|
18343
|
-
|
|
18344
|
-
|
|
18345
|
-
|
|
18346
|
-
|
|
18347
|
-
|
|
18348
|
-
|
|
18177
|
+
setBookingMode,
|
|
18178
|
+
altchaSolution,
|
|
18179
|
+
setAltchaSolution
|
|
18180
|
+
});
|
|
18181
|
+
}
|
|
18182
|
+
function useCourseRegistrationEffects(input) {
|
|
18183
|
+
useCoursePaymentVerification(input.api, {
|
|
18184
|
+
setStep: input.selection.goToStep,
|
|
18185
|
+
setErrorMessage: input.actions.reportError,
|
|
18186
|
+
setEnrollmentResult: input.actions.recordEnrollmentResult
|
|
18187
|
+
});
|
|
18188
|
+
useCourseWaitlistSelection({
|
|
18189
|
+
waitlistClaim: input.waitlistClaim,
|
|
18190
|
+
scopedCourses: input.selection.scopedCourses,
|
|
18191
|
+
step: input.selection.step,
|
|
18192
|
+
goToStep: input.selection.goToStep,
|
|
18193
|
+
chooseCourse: input.selection.chooseCourse,
|
|
18194
|
+
updateFormData: input.portal.updateFormData,
|
|
18195
|
+
reportError: input.actions.reportError
|
|
18196
|
+
});
|
|
18197
|
+
}
|
|
18198
|
+
function buildCourseRegistrationWizardResult(parts) {
|
|
18199
|
+
const handleBookingModeChange = (mode) => {
|
|
18200
|
+
parts.setBookingMode(mode);
|
|
18201
|
+
parts.eligibility.choosePaymentChoice(mode === "membership" ? "membership" : "checkout");
|
|
18202
|
+
};
|
|
18203
|
+
return {
|
|
18204
|
+
api: parts.api,
|
|
18205
|
+
...parts.selection,
|
|
18206
|
+
...parts.portal,
|
|
18207
|
+
...parts.eligibility,
|
|
18208
|
+
...parts.actions,
|
|
18209
|
+
waitlistClaim: parts.waitlistClaim,
|
|
18210
|
+
bookingMode: parts.bookingMode,
|
|
18211
|
+
altchaSolution: parts.altchaSolution,
|
|
18212
|
+
setAltchaSolution: parts.setAltchaSolution,
|
|
18213
|
+
showSpamProtection: isSpamProtectionEnabled(),
|
|
18214
|
+
discountUiOpen: parts.discountUi.discountUiOpen,
|
|
18215
|
+
setDiscountUiOpen: parts.discountUi.setDiscountUiOpen,
|
|
18216
|
+
discountCode: parts.discountUi.discountCode,
|
|
18217
|
+
setDiscountCode: parts.discountUi.setDiscountCode,
|
|
18218
|
+
discountsAvailable: parts.discountUi.discountsAvailable,
|
|
18219
|
+
manualCodeEntryAllowed: parts.discountUi.manualCodeEntryAllowed,
|
|
18220
|
+
discountsAvailableLoading: parts.discountUi.discountsAvailableLoading,
|
|
18221
|
+
...parts.view,
|
|
18222
|
+
handleCourseSelect: (course) => {
|
|
18223
|
+
parts.selection.chooseCourse(course);
|
|
18224
|
+
parts.selection.goToStep("enter-details");
|
|
18225
|
+
},
|
|
18226
|
+
handleRetry: () => {
|
|
18227
|
+
parts.selection.goToStep(parts.selection.scopedCourses.length === 1 ? "enter-details" : "select-course");
|
|
18228
|
+
parts.actions.reportError("");
|
|
18229
|
+
},
|
|
18230
|
+
handleBookingModeChange,
|
|
18231
|
+
handleLogout: parts.portal.portalAuthState === "authenticated" ? () => logoutPortal(COURSE_REGISTRATION_ANCHOR_ID) : void 0,
|
|
18232
|
+
selectedCoursePricingPayload: buildCoursePricingOptionPayload(parts.selection.selectedCoursePricing)
|
|
18349
18233
|
};
|
|
18350
18234
|
}
|
|
18351
18235
|
//#endregion
|
|
@@ -18761,7 +18645,7 @@ function getCourseSlidingScaleMessage(pricing) {
|
|
|
18761
18645
|
}
|
|
18762
18646
|
function CourseRegistrationWizard(props) {
|
|
18763
18647
|
const { showSessions = true, showPrice = true, showCapacity = true, showVenue = true, successMessage = "You're booked in! Check your email for confirmation and session details.", waitlistMessage = "You've been added to the waitlist. We'll email you a claim link if a spot opens up.", membershipMessage = "Booked using your membership! Check your email for session details.", buttonText = "Sign up", buttonVariant = "primary", className } = props;
|
|
18764
|
-
const { api, scopedCourses, step,
|
|
18648
|
+
const { api, scopedCourses, step, goToStep, selectedCourse, selectedPricingOptionId, choosePricingOption, selectedSlidingAmountInput, changeSlidingAmount, selectedCoursePricing, formData, updateFormData, errors, enrollmentResult, errorMessage, portalAuthState, handleLogout, altchaSolution: _altchaSolution, setAltchaSolution, showSpamProtection, eligibilityLoading, eligibilityError, courseEligibility, eligibleMemberships, paymentChoice, choosePaymentChoice, selectedMembershipId, chooseMembership, discountUiOpen, setDiscountUiOpen, discountCode, setDiscountCode, discountsAvailable, manualCodeEntryAllowed, discountsAvailableLoading, waitlistClaim, canUseMembership: _canUseMembership, bookingMode, currentStepNumber, totalSteps, stepLabels, showPortalAuthSidebar, hasPreSelectedCourse: _hasPreSelectedCourse, hasCoursePayment: _hasCoursePayment, handleCourseSelect, handleSubmit, handlePaymentContinue, handleRetry, handleBookingModeChange } = useCourseRegistrationWizard(props);
|
|
18765
18649
|
const buttonClass = themeButtonClassName({
|
|
18766
18650
|
variant: buttonVariant,
|
|
18767
18651
|
size: "md"
|
|
@@ -18826,13 +18710,13 @@ function CourseRegistrationWizard(props) {
|
|
|
18826
18710
|
className: "cr-course-list",
|
|
18827
18711
|
children: scopedCourses.map((course) => /* @__PURE__ */ jsx(CourseCard, {
|
|
18828
18712
|
course,
|
|
18829
|
-
isSelected: selectedCourse?.
|
|
18713
|
+
isSelected: selectedCourse?.eventSeriesId === course.eventSeriesId,
|
|
18830
18714
|
onSelect: () => handleCourseSelect(course),
|
|
18831
18715
|
showSessions,
|
|
18832
18716
|
showPrice,
|
|
18833
18717
|
showCapacity,
|
|
18834
18718
|
showVenue
|
|
18835
|
-
}, course.
|
|
18719
|
+
}, course.eventSeriesId))
|
|
18836
18720
|
}),
|
|
18837
18721
|
step === "enter-details" && selectedCourseWithPricing && /* @__PURE__ */ jsxs("div", {
|
|
18838
18722
|
className: "cr-details",
|
|
@@ -18849,7 +18733,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18849
18733
|
className: "cr-actions",
|
|
18850
18734
|
children: /* @__PURE__ */ jsx("button", {
|
|
18851
18735
|
type: "button",
|
|
18852
|
-
onClick: () =>
|
|
18736
|
+
onClick: () => goToStep("select-course"),
|
|
18853
18737
|
className: "cr-back-btn",
|
|
18854
18738
|
children: "← Back"
|
|
18855
18739
|
})
|
|
@@ -18868,7 +18752,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18868
18752
|
/* @__PURE__ */ jsx(EnrollmentForm, {
|
|
18869
18753
|
formData,
|
|
18870
18754
|
errors,
|
|
18871
|
-
onChange:
|
|
18755
|
+
onChange: updateFormData,
|
|
18872
18756
|
isEmailLocked: portalAuthState === "authenticated" || waitlistClaim.claim !== null,
|
|
18873
18757
|
isLoading: portalAuthState === "checking" || waitlistClaim.isLoading,
|
|
18874
18758
|
onLogout: handleLogout
|
|
@@ -18876,12 +18760,12 @@ function CourseRegistrationWizard(props) {
|
|
|
18876
18760
|
/* @__PURE__ */ jsx(CoursePricingSelector, {
|
|
18877
18761
|
pricing: selectedCourseWithPricing.pricing,
|
|
18878
18762
|
selectedPricingOptionId,
|
|
18879
|
-
onSelect:
|
|
18763
|
+
onSelect: choosePricingOption
|
|
18880
18764
|
}),
|
|
18881
18765
|
/* @__PURE__ */ jsx(CourseSlidingScaleInput, {
|
|
18882
18766
|
pricing: selectedCourseWithPricing.pricing,
|
|
18883
18767
|
value: selectedSlidingAmountInput,
|
|
18884
|
-
onChange:
|
|
18768
|
+
onChange: changeSlidingAmount
|
|
18885
18769
|
}),
|
|
18886
18770
|
showSpamProtection && /* @__PURE__ */ jsx("div", {
|
|
18887
18771
|
className: "cr-altcha",
|
|
@@ -18906,7 +18790,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18906
18790
|
className: "cr-actions",
|
|
18907
18791
|
children: [scopedCourses.length > 1 && /* @__PURE__ */ jsx("button", {
|
|
18908
18792
|
type: "button",
|
|
18909
|
-
onClick: () =>
|
|
18793
|
+
onClick: () => goToStep("select-course"),
|
|
18910
18794
|
className: "cr-back-btn",
|
|
18911
18795
|
children: "← Back"
|
|
18912
18796
|
}), /* @__PURE__ */ jsx("button", {
|
|
@@ -18956,7 +18840,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18956
18840
|
onBookingModeChange: handleBookingModeChange,
|
|
18957
18841
|
eligibleMemberships,
|
|
18958
18842
|
selectedMembershipId,
|
|
18959
|
-
onMembershipSelect:
|
|
18843
|
+
onMembershipSelect: chooseMembership,
|
|
18960
18844
|
priceCents: selectedCoursePricing?.selectedPriceAmount ?? null,
|
|
18961
18845
|
currency: selectedCourseWithPricing.course.currency ?? "GBP"
|
|
18962
18846
|
}),
|
|
@@ -18964,7 +18848,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18964
18848
|
className: "cr-actions",
|
|
18965
18849
|
children: [/* @__PURE__ */ jsx("button", {
|
|
18966
18850
|
type: "button",
|
|
18967
|
-
onClick: () =>
|
|
18851
|
+
onClick: () => goToStep("enter-details"),
|
|
18968
18852
|
className: "cr-back-btn",
|
|
18969
18853
|
children: "← Back"
|
|
18970
18854
|
}), /* @__PURE__ */ jsx("button", {
|
|
@@ -19003,7 +18887,7 @@ function CourseRegistrationWizard(props) {
|
|
|
19003
18887
|
type: "radio",
|
|
19004
18888
|
name: "paymentChoice",
|
|
19005
18889
|
checked: paymentChoice === "membership",
|
|
19006
|
-
onChange: () =>
|
|
18890
|
+
onChange: () => choosePaymentChoice("membership")
|
|
19007
18891
|
}), /* @__PURE__ */ jsx("span", { children: "Use a membership (free)" })]
|
|
19008
18892
|
}),
|
|
19009
18893
|
paymentChoice === "membership" && eligibleMemberships.length > 1 && /* @__PURE__ */ jsxs("div", {
|
|
@@ -19016,7 +18900,7 @@ function CourseRegistrationWizard(props) {
|
|
|
19016
18900
|
id: "cr-membership",
|
|
19017
18901
|
className: "cr-form__input",
|
|
19018
18902
|
value: selectedMembershipId ?? "",
|
|
19019
|
-
onChange: (e) =>
|
|
18903
|
+
onChange: (e) => chooseMembership(e.target.value || null),
|
|
19020
18904
|
children: [/* @__PURE__ */ jsx("option", {
|
|
19021
18905
|
value: "",
|
|
19022
18906
|
disabled: true,
|
|
@@ -19033,7 +18917,7 @@ function CourseRegistrationWizard(props) {
|
|
|
19033
18917
|
type: "radio",
|
|
19034
18918
|
name: "paymentChoice",
|
|
19035
18919
|
checked: paymentChoice === "checkout",
|
|
19036
|
-
onChange: () =>
|
|
18920
|
+
onChange: () => choosePaymentChoice("checkout")
|
|
19037
18921
|
}), /* @__PURE__ */ jsx("span", { children: "Pay by card" })]
|
|
19038
18922
|
})
|
|
19039
18923
|
]
|
|
@@ -19055,7 +18939,7 @@ function CourseRegistrationWizard(props) {
|
|
|
19055
18939
|
className: "cr-actions",
|
|
19056
18940
|
children: [/* @__PURE__ */ jsx("button", {
|
|
19057
18941
|
type: "button",
|
|
19058
|
-
onClick: () =>
|
|
18942
|
+
onClick: () => goToStep("enter-details"),
|
|
19059
18943
|
className: "cr-back-btn",
|
|
19060
18944
|
children: "← Back"
|
|
19061
18945
|
}), /* @__PURE__ */ jsx("button", {
|
|
@@ -19287,7 +19171,7 @@ const LeafletStaticMap = ({ location, label, className = "", height = 200, zoom
|
|
|
19287
19171
|
function toEventDetailsClientProps(props) {
|
|
19288
19172
|
return {
|
|
19289
19173
|
occurrenceContext: props.occurrenceContext,
|
|
19290
|
-
|
|
19174
|
+
subject: props.subject,
|
|
19291
19175
|
events: props.events ? [...props.events] : props.events,
|
|
19292
19176
|
showVenue: props.showVenue,
|
|
19293
19177
|
showMap: props.showMap,
|
|
@@ -19303,10 +19187,11 @@ function toEventDetailsClientProps(props) {
|
|
|
19303
19187
|
nowIso: props.nowIso
|
|
19304
19188
|
};
|
|
19305
19189
|
}
|
|
19306
|
-
function EventDetailsClient({ occurrenceContext, events, showVenue = true, showMap = true, showOtherDates = true, otherDatesLimit, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, sitePasses, siteMemberships, autoApplyDiscount, className, nowIso, children }) {
|
|
19190
|
+
function EventDetailsClient({ occurrenceContext, subject, events, showVenue = true, showMap = true, showOtherDates = true, otherDatesLimit, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, sitePasses, siteMemberships, autoApplyDiscount, className, nowIso, children }) {
|
|
19307
19191
|
const selection = selectEventDetails({
|
|
19308
19192
|
events: events ?? null,
|
|
19309
19193
|
occurrenceContext: occurrenceContext ?? null,
|
|
19194
|
+
subject,
|
|
19310
19195
|
nowIso: nowIso ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
19311
19196
|
otherDatesLimit
|
|
19312
19197
|
});
|
|
@@ -24186,7 +24071,7 @@ var header_section_client_default = markEditableSurfaceForwarding(HeaderSectionN
|
|
|
24186
24071
|
* Renders category filter buttons and venue dropdown for event lists.
|
|
24187
24072
|
* Uses semantic CSS classes for styling.
|
|
24188
24073
|
*/
|
|
24189
|
-
const EventFilters = ({ categories, venues, staffMembers,
|
|
24074
|
+
const EventFilters = ({ categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, showCategoryFilter, showVenueFilter, showStaffFilter, onCategoryChange, onStaffMemberChange, onVenueChange, loading, idBase, className }) => {
|
|
24190
24075
|
const reactId = useId();
|
|
24191
24076
|
const baseId = idBase ?? reactId;
|
|
24192
24077
|
const staffSelectId = `${baseId}-event-staff-filter`;
|
|
@@ -24204,29 +24089,19 @@ const EventFilters = ({ categories, venues, staffMembers, selectedKind, selected
|
|
|
24204
24089
|
className: "event-category-buttons",
|
|
24205
24090
|
role: "group",
|
|
24206
24091
|
"aria-label": "Filter by category",
|
|
24207
|
-
children: [
|
|
24208
|
-
|
|
24209
|
-
|
|
24210
|
-
|
|
24211
|
-
|
|
24212
|
-
|
|
24213
|
-
|
|
24214
|
-
|
|
24215
|
-
|
|
24216
|
-
|
|
24217
|
-
|
|
24218
|
-
|
|
24219
|
-
|
|
24220
|
-
children: courseOptionLabel
|
|
24221
|
-
}) : null,
|
|
24222
|
-
categories.map((category) => /* @__PURE__ */ jsx("button", {
|
|
24223
|
-
type: "button",
|
|
24224
|
-
className: `event-category-btn ${selectedKind !== "courses" && selectedCategoryId === category.id ? "event-category-btn--active" : ""}`,
|
|
24225
|
-
onClick: () => onCategoryChange(category.id),
|
|
24226
|
-
disabled: loading,
|
|
24227
|
-
children: category.name
|
|
24228
|
-
}, category.id))
|
|
24229
|
-
]
|
|
24092
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
24093
|
+
type: "button",
|
|
24094
|
+
className: `event-category-btn ${selectedCategoryId === "all" ? "event-category-btn--active" : ""}`,
|
|
24095
|
+
onClick: () => onCategoryChange("all"),
|
|
24096
|
+
disabled: loading,
|
|
24097
|
+
children: "All"
|
|
24098
|
+
}), categories.map((category) => /* @__PURE__ */ jsx("button", {
|
|
24099
|
+
type: "button",
|
|
24100
|
+
className: `event-category-btn ${selectedCategoryId === category.id ? "event-category-btn--active" : ""}`,
|
|
24101
|
+
onClick: () => onCategoryChange(category.id),
|
|
24102
|
+
disabled: loading,
|
|
24103
|
+
children: category.name
|
|
24104
|
+
}, category.id))]
|
|
24230
24105
|
})]
|
|
24231
24106
|
}),
|
|
24232
24107
|
showStaffFilter && /* @__PURE__ */ jsxs("div", {
|
|
@@ -24482,7 +24357,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
|
|
|
24482
24357
|
const normalizedCategoryIds = normalizeCsvString(filters?.categoryIds);
|
|
24483
24358
|
const normalizedStaffMemberId = normalizeOptionalId(filters?.staffMemberId);
|
|
24484
24359
|
const normalizedVenueId = normalizeOptionalId(filters?.venueId);
|
|
24485
|
-
const kind = filters?.kind;
|
|
24486
24360
|
const eventSurface = filters?.eventSurface;
|
|
24487
24361
|
const eventPresets = normalizeCsvString(filters?.eventPresets);
|
|
24488
24362
|
const scheduleScope = filters?.scheduleScope;
|
|
@@ -24518,7 +24392,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
|
|
|
24518
24392
|
limit: pageSize,
|
|
24519
24393
|
stage,
|
|
24520
24394
|
detailLevel: "listing",
|
|
24521
|
-
kind,
|
|
24522
24395
|
eventSurface,
|
|
24523
24396
|
eventPresets: eventPresets ?? void 0,
|
|
24524
24397
|
scheduleScope,
|
|
@@ -24549,7 +24422,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
|
|
|
24549
24422
|
getPublicEvents,
|
|
24550
24423
|
pageSize,
|
|
24551
24424
|
stage,
|
|
24552
|
-
kind,
|
|
24553
24425
|
eventSurface,
|
|
24554
24426
|
eventPresets,
|
|
24555
24427
|
scheduleScope,
|
|
@@ -24629,8 +24501,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
|
|
|
24629
24501
|
const EMPTY_EVENT_FILTERS = Object.freeze({
|
|
24630
24502
|
categories: [],
|
|
24631
24503
|
venues: [],
|
|
24632
|
-
staffMembers: []
|
|
24633
|
-
labels: Object.freeze({ courseOption: "Course" })
|
|
24504
|
+
staffMembers: []
|
|
24634
24505
|
});
|
|
24635
24506
|
function createInitialEventFiltersLoadState() {
|
|
24636
24507
|
return {
|
|
@@ -24701,13 +24572,12 @@ function getEventFiltersError(state) {
|
|
|
24701
24572
|
* const events = await api.getPublicEvents(params);
|
|
24702
24573
|
* ```
|
|
24703
24574
|
*/
|
|
24704
|
-
function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId,
|
|
24575
|
+
function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
|
|
24705
24576
|
const api = useBlockApi();
|
|
24706
24577
|
const [loadState, dispatchLoadState] = useReducer(eventFiltersLoadReducer, void 0, createInitialEventFiltersLoadState);
|
|
24707
24578
|
const filters = getEventFiltersData(loadState);
|
|
24708
24579
|
const loading = isEventFiltersLoading(loadState);
|
|
24709
24580
|
const error = getEventFiltersError(loadState);
|
|
24710
|
-
const [selectedKind, setSelectedKindState] = useState("all");
|
|
24711
24581
|
const [selectedCategoryId, setSelectedCategoryId] = useState("all");
|
|
24712
24582
|
const [selectedStaffMemberId, setSelectedStaffMemberId] = useState("all");
|
|
24713
24583
|
const [selectedVenueId, setSelectedVenueId] = useState("all");
|
|
@@ -24715,21 +24585,19 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24715
24585
|
const allowedCategorySet = useMemo(() => new Set(allowedCategoryIds), [allowedCategoryIds.join(",")]);
|
|
24716
24586
|
const fixedVenueId = useMemo(() => normalizeOptionalId(preFilterVenueId), [preFilterVenueId]);
|
|
24717
24587
|
const fixedStaffMemberId = useMemo(() => normalizeOptionalId(preFilterStaffMemberId), [preFilterStaffMemberId]);
|
|
24718
|
-
const fixedKind = useMemo(() => normalizeEventBlockKind(preFilterKind), [preFilterKind]);
|
|
24719
24588
|
const fixedEventSurface = preFilterEventSurface && preFilterEventSurface !== "all" ? preFilterEventSurface : void 0;
|
|
24720
24589
|
const fixedEventPresets = preFilterEventPresets?.trim() || void 0;
|
|
24721
24590
|
const fixedScheduleScope = preFilterScheduleScope && preFilterScheduleScope !== "any" ? preFilterScheduleScope : void 0;
|
|
24722
24591
|
const hasFetchedRef = useRef(false);
|
|
24723
24592
|
useEffect(() => {
|
|
24724
24593
|
if (hasFetchedRef.current) return;
|
|
24725
|
-
if (!(showCategoryFilter !== "never"
|
|
24594
|
+
if (!(showCategoryFilter !== "never" || showVenueFilter || showStaffFilter)) return;
|
|
24726
24595
|
hasFetchedRef.current = true;
|
|
24727
24596
|
dispatchLoadState({ type: "started" });
|
|
24728
24597
|
api.getEventFilters({
|
|
24729
24598
|
categoryIds: allowedCategoryIds.length > 0 ? allowedCategoryIds.join(",") : void 0,
|
|
24730
24599
|
venueId: fixedVenueId ?? void 0,
|
|
24731
24600
|
staffMemberId: fixedStaffMemberId ?? void 0,
|
|
24732
|
-
kind: fixedKind === "all" ? void 0 : fixedKind,
|
|
24733
24601
|
eventSurface: fixedEventSurface,
|
|
24734
24602
|
eventPresets: fixedEventPresets,
|
|
24735
24603
|
scheduleScope: fixedScheduleScope
|
|
@@ -24749,7 +24617,6 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24749
24617
|
api,
|
|
24750
24618
|
fixedEventPresets,
|
|
24751
24619
|
fixedEventSurface,
|
|
24752
|
-
fixedKind,
|
|
24753
24620
|
fixedScheduleScope,
|
|
24754
24621
|
fixedStaffMemberId,
|
|
24755
24622
|
fixedVenueId,
|
|
@@ -24777,23 +24644,10 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24777
24644
|
return available.filter((staffMember) => staffMember.id === fixedStaffMemberId);
|
|
24778
24645
|
}, [filters.staffMembers, fixedStaffMemberId]);
|
|
24779
24646
|
useEffect(() => {
|
|
24780
|
-
if ((fixedKind === "courses" || selectedKind === "courses") && selectedCategoryId !== "all") {
|
|
24781
|
-
setSelectedCategoryId("all");
|
|
24782
|
-
return;
|
|
24783
|
-
}
|
|
24784
|
-
if (fixedKind !== "all" && selectedKind === "courses") {
|
|
24785
|
-
setSelectedKindState("all");
|
|
24786
|
-
return;
|
|
24787
|
-
}
|
|
24788
24647
|
if (selectedCategoryId !== "all") {
|
|
24789
24648
|
if (!categoriesForSelect.some((c) => c.id === selectedCategoryId)) setSelectedCategoryId("all");
|
|
24790
24649
|
}
|
|
24791
|
-
}, [
|
|
24792
|
-
categoriesForSelect,
|
|
24793
|
-
fixedKind,
|
|
24794
|
-
selectedCategoryId,
|
|
24795
|
-
selectedKind
|
|
24796
|
-
]);
|
|
24650
|
+
}, [categoriesForSelect, selectedCategoryId]);
|
|
24797
24651
|
useEffect(() => {
|
|
24798
24652
|
if (fixedVenueId) {
|
|
24799
24653
|
setSelectedVenueId("all");
|
|
@@ -24822,12 +24676,10 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24822
24676
|
]);
|
|
24823
24677
|
const shouldShowCategoryFilter = (() => {
|
|
24824
24678
|
if (showCategoryFilter === "never") return false;
|
|
24825
|
-
if (fixedKind === "courses") return false;
|
|
24826
24679
|
if (allowedCategoryIds.length > 0 && allowedCategoryIds.length <= 1) return false;
|
|
24827
24680
|
if (showCategoryFilter === "always") return categoriesForSelect.length > 0;
|
|
24828
24681
|
return categoriesForSelect.length > 1;
|
|
24829
24682
|
})();
|
|
24830
|
-
const showCourseOption = fixedKind === "all" && !Boolean(fixedEventSurface || fixedEventPresets || fixedScheduleScope);
|
|
24831
24683
|
const shouldShowVenueFilter = (() => {
|
|
24832
24684
|
if (!showVenueFilter) return false;
|
|
24833
24685
|
if (fixedVenueId) return false;
|
|
@@ -24838,76 +24690,13 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24838
24690
|
if (fixedStaffMemberId) return false;
|
|
24839
24691
|
return staffMembersForSelect.length > 1;
|
|
24840
24692
|
})();
|
|
24841
|
-
const setSelectedKind = useCallback((kind) => {
|
|
24842
|
-
if (fixedKind !== "all") return;
|
|
24843
|
-
setSelectedKindState(kind);
|
|
24844
|
-
if (kind === "courses") setSelectedCategoryId("all");
|
|
24845
|
-
if (kind === "all") setSelectedCategoryId("all");
|
|
24846
|
-
}, [fixedKind]);
|
|
24847
24693
|
const setSelectedCategory = useCallback((id) => {
|
|
24848
|
-
if (fixedKind === "courses") return;
|
|
24849
24694
|
setSelectedCategoryId(id);
|
|
24850
|
-
|
|
24851
|
-
else setSelectedKindState("events");
|
|
24852
|
-
}, [fixedKind]);
|
|
24853
|
-
const hasActiveFilters = useMemo(() => {
|
|
24854
|
-
return selectedKind !== "all" || selectedCategoryId !== "all" || selectedStaffMemberId !== "all" || selectedVenueId !== "all";
|
|
24855
|
-
}, [
|
|
24856
|
-
selectedCategoryId,
|
|
24857
|
-
selectedKind,
|
|
24858
|
-
selectedStaffMemberId,
|
|
24859
|
-
selectedVenueId
|
|
24860
|
-
]);
|
|
24861
|
-
const resetFilters = useCallback(() => {
|
|
24862
|
-
setSelectedKindState(fixedKind !== "all" ? fixedKind : "all");
|
|
24863
|
-
setSelectedCategoryId("all");
|
|
24864
|
-
setSelectedStaffMemberId("all");
|
|
24865
|
-
setSelectedVenueId("all");
|
|
24866
|
-
}, [fixedKind]);
|
|
24867
|
-
const getFilterParams = useCallback(() => {
|
|
24868
|
-
const params = {};
|
|
24869
|
-
const effectiveKind = fixedKind === "all" ? selectedKind : fixedKind;
|
|
24870
|
-
if (fixedEventSurface) params.eventSurface = fixedEventSurface;
|
|
24871
|
-
if (fixedEventPresets) params.eventPresets = fixedEventPresets;
|
|
24872
|
-
if (fixedScheduleScope) params.scheduleScope = fixedScheduleScope;
|
|
24873
|
-
if (effectiveKind === "courses") {
|
|
24874
|
-
params.kind = "courses";
|
|
24875
|
-
if (fixedVenueId) params.venueId = fixedVenueId;
|
|
24876
|
-
if (selectedVenueId !== "all") params.venueId = selectedVenueId;
|
|
24877
|
-
params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
|
|
24878
|
-
return params;
|
|
24879
|
-
}
|
|
24880
|
-
if (allowedCategoryIds.length > 0) params.categoryIds = allowedCategoryIds.join(",");
|
|
24881
|
-
if (effectiveKind === "events") params.kind = "events";
|
|
24882
|
-
if (selectedCategoryId !== "all") {
|
|
24883
|
-
if (allowedCategoryIds.length === 0 || allowedCategorySet.has(selectedCategoryId)) {
|
|
24884
|
-
params.categoryIds = selectedCategoryId;
|
|
24885
|
-
params.kind = "events";
|
|
24886
|
-
}
|
|
24887
|
-
}
|
|
24888
|
-
if (fixedVenueId) params.venueId = fixedVenueId;
|
|
24889
|
-
if (selectedVenueId !== "all") params.venueId = selectedVenueId;
|
|
24890
|
-
params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
|
|
24891
|
-
return params;
|
|
24892
|
-
}, [
|
|
24893
|
-
allowedCategoryIds,
|
|
24894
|
-
allowedCategorySet,
|
|
24895
|
-
fixedEventPresets,
|
|
24896
|
-
fixedEventSurface,
|
|
24897
|
-
fixedKind,
|
|
24898
|
-
fixedScheduleScope,
|
|
24899
|
-
fixedStaffMemberId,
|
|
24900
|
-
fixedVenueId,
|
|
24901
|
-
selectedCategoryId,
|
|
24902
|
-
selectedKind,
|
|
24903
|
-
selectedStaffMemberId,
|
|
24904
|
-
selectedVenueId
|
|
24905
|
-
]);
|
|
24695
|
+
}, []);
|
|
24906
24696
|
return {
|
|
24907
24697
|
categories: categoriesForSelect,
|
|
24908
24698
|
venues: venuesForSelect,
|
|
24909
24699
|
staffMembers: staffMembersForSelect,
|
|
24910
|
-
selectedKind,
|
|
24911
24700
|
selectedCategoryId,
|
|
24912
24701
|
selectedStaffMemberId,
|
|
24913
24702
|
selectedVenueId,
|
|
@@ -24916,15 +24705,46 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24916
24705
|
shouldShowCategoryFilter,
|
|
24917
24706
|
shouldShowVenueFilter,
|
|
24918
24707
|
shouldShowStaffFilter,
|
|
24919
|
-
|
|
24920
|
-
|
|
24921
|
-
|
|
24922
|
-
|
|
24708
|
+
hasActiveFilters: useMemo(() => {
|
|
24709
|
+
return selectedCategoryId !== "all" || selectedStaffMemberId !== "all" || selectedVenueId !== "all";
|
|
24710
|
+
}, [
|
|
24711
|
+
selectedCategoryId,
|
|
24712
|
+
selectedStaffMemberId,
|
|
24713
|
+
selectedVenueId
|
|
24714
|
+
]),
|
|
24923
24715
|
setSelectedCategoryId: setSelectedCategory,
|
|
24924
24716
|
setSelectedStaffMemberId,
|
|
24925
24717
|
setSelectedVenueId,
|
|
24926
|
-
resetFilters
|
|
24927
|
-
|
|
24718
|
+
resetFilters: useCallback(() => {
|
|
24719
|
+
setSelectedCategoryId("all");
|
|
24720
|
+
setSelectedStaffMemberId("all");
|
|
24721
|
+
setSelectedVenueId("all");
|
|
24722
|
+
}, []),
|
|
24723
|
+
getFilterParams: useCallback(() => {
|
|
24724
|
+
const params = {};
|
|
24725
|
+
if (fixedEventSurface) params.eventSurface = fixedEventSurface;
|
|
24726
|
+
if (fixedEventPresets) params.eventPresets = fixedEventPresets;
|
|
24727
|
+
if (fixedScheduleScope) params.scheduleScope = fixedScheduleScope;
|
|
24728
|
+
if (allowedCategoryIds.length > 0) params.categoryIds = allowedCategoryIds.join(",");
|
|
24729
|
+
if (selectedCategoryId !== "all") {
|
|
24730
|
+
if (allowedCategoryIds.length === 0 || allowedCategorySet.has(selectedCategoryId)) params.categoryIds = selectedCategoryId;
|
|
24731
|
+
}
|
|
24732
|
+
if (fixedVenueId) params.venueId = fixedVenueId;
|
|
24733
|
+
if (selectedVenueId !== "all") params.venueId = selectedVenueId;
|
|
24734
|
+
params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
|
|
24735
|
+
return params;
|
|
24736
|
+
}, [
|
|
24737
|
+
allowedCategoryIds,
|
|
24738
|
+
allowedCategorySet,
|
|
24739
|
+
fixedEventPresets,
|
|
24740
|
+
fixedEventSurface,
|
|
24741
|
+
fixedScheduleScope,
|
|
24742
|
+
fixedStaffMemberId,
|
|
24743
|
+
fixedVenueId,
|
|
24744
|
+
selectedCategoryId,
|
|
24745
|
+
selectedStaffMemberId,
|
|
24746
|
+
selectedVenueId
|
|
24747
|
+
])
|
|
24928
24748
|
};
|
|
24929
24749
|
}
|
|
24930
24750
|
//#endregion
|
|
@@ -24938,7 +24758,6 @@ const EventListingController = ({ render }) => {
|
|
|
24938
24758
|
const filtersIdBase = useId();
|
|
24939
24759
|
const initialListEvents = useMemo(() => [...display.events], [display.events]);
|
|
24940
24760
|
const initialListFilters = useMemo(() => buildEventRuntimeFilters({
|
|
24941
|
-
eventKind: hydration.eventKind,
|
|
24942
24761
|
eventSurface: hydration.eventSurface,
|
|
24943
24762
|
filterEventPresets: hydration.filterEventPresets,
|
|
24944
24763
|
scheduleScope: hydration.scheduleScope,
|
|
@@ -24946,7 +24765,6 @@ const EventListingController = ({ render }) => {
|
|
|
24946
24765
|
filterStaffMemberId: hydration.filterStaffMemberId,
|
|
24947
24766
|
filterVenueId: hydration.filterVenueId
|
|
24948
24767
|
}), [
|
|
24949
|
-
hydration.eventKind,
|
|
24950
24768
|
hydration.eventSurface,
|
|
24951
24769
|
hydration.filterEventPresets,
|
|
24952
24770
|
hydration.scheduleScope,
|
|
@@ -24954,14 +24772,13 @@ const EventListingController = ({ render }) => {
|
|
|
24954
24772
|
hydration.filterStaffMemberId,
|
|
24955
24773
|
hydration.filterVenueId
|
|
24956
24774
|
]);
|
|
24957
|
-
const { categories, venues, staffMembers,
|
|
24775
|
+
const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
|
|
24958
24776
|
showCategoryFilter: hydration.showFilters ? hydration.showCategoryFilter : "never",
|
|
24959
24777
|
showVenueFilter: hydration.showFilters ? hydration.showVenueFilter : false,
|
|
24960
24778
|
showStaffFilter: hydration.showFilters ? hydration.showStaffFilter : false,
|
|
24961
24779
|
preFilterCategoryIds: hydration.filterCategoryIds ?? void 0,
|
|
24962
24780
|
preFilterStaffMemberId: hydration.filterStaffMemberId ?? void 0,
|
|
24963
24781
|
preFilterVenueId: hydration.filterVenueId ?? void 0,
|
|
24964
|
-
preFilterKind: hydration.eventKind,
|
|
24965
24782
|
preFilterEventSurface: hydration.eventSurface,
|
|
24966
24783
|
preFilterEventPresets: hydration.filterEventPresets,
|
|
24967
24784
|
preFilterScheduleScope: hydration.scheduleScope
|
|
@@ -24982,16 +24799,12 @@ const EventListingController = ({ render }) => {
|
|
|
24982
24799
|
categories,
|
|
24983
24800
|
venues,
|
|
24984
24801
|
staffMembers,
|
|
24985
|
-
selectedKind,
|
|
24986
24802
|
selectedCategoryId,
|
|
24987
24803
|
selectedStaffMemberId,
|
|
24988
24804
|
selectedVenueId,
|
|
24989
24805
|
showCategoryFilter: shouldShowCategoryFilter,
|
|
24990
24806
|
showVenueFilter: shouldShowVenueFilter,
|
|
24991
24807
|
showStaffFilter: shouldShowStaffFilter,
|
|
24992
|
-
showCourseOption,
|
|
24993
|
-
courseOptionLabel,
|
|
24994
|
-
onKindChange: setSelectedKind,
|
|
24995
24808
|
onCategoryChange: setSelectedCategoryId,
|
|
24996
24809
|
onStaffMemberChange: setSelectedStaffMemberId,
|
|
24997
24810
|
onVenueChange: setSelectedVenueId,
|
|
@@ -25161,7 +24974,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
|
|
|
25161
24974
|
filters?.categoryIds,
|
|
25162
24975
|
filters?.eventPresets,
|
|
25163
24976
|
filters?.eventSurface,
|
|
25164
|
-
filters?.kind,
|
|
25165
24977
|
filters?.scheduleScope,
|
|
25166
24978
|
filters?.staffMemberId,
|
|
25167
24979
|
filters?.venueId
|
|
@@ -25198,7 +25010,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
|
|
|
25198
25010
|
limit: CALENDAR_FETCH_LIMIT,
|
|
25199
25011
|
stage,
|
|
25200
25012
|
detailLevel: "listing",
|
|
25201
|
-
kind: filters?.kind,
|
|
25202
25013
|
eventSurface: filters?.eventSurface,
|
|
25203
25014
|
eventPresets: filters?.eventPresets,
|
|
25204
25015
|
scheduleScope: filters?.scheduleScope,
|
|
@@ -25232,7 +25043,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
|
|
|
25232
25043
|
filters?.categoryIds,
|
|
25233
25044
|
filters?.eventPresets,
|
|
25234
25045
|
filters?.eventSurface,
|
|
25235
|
-
filters?.kind,
|
|
25236
25046
|
filters?.scheduleScope,
|
|
25237
25047
|
filters?.staffMemberId,
|
|
25238
25048
|
filters?.venueId,
|
|
@@ -25640,7 +25450,6 @@ function toEventCombinedControllerProps(props) {
|
|
|
25640
25450
|
showCategoryFilter: props.render.display.showCategoryFilter,
|
|
25641
25451
|
showVenueFilter: props.render.display.showVenueFilter,
|
|
25642
25452
|
showStaffFilter: props.render.display.showStaffFilter,
|
|
25643
|
-
eventKind: props.render.display.eventKind,
|
|
25644
25453
|
eventSurface: props.render.display.eventSurface,
|
|
25645
25454
|
filterEventPresets: props.render.display.filterEventPresets,
|
|
25646
25455
|
scheduleScope: props.render.display.scheduleScope,
|
|
@@ -25665,7 +25474,7 @@ function toEventCombinedControllerProps(props) {
|
|
|
25665
25474
|
const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout = "stack", listColumns = "3", eventsPerPage = 12, paginationAction = {
|
|
25666
25475
|
kind: "loadMore",
|
|
25667
25476
|
label: "Load more events"
|
|
25668
|
-
}, startOfWeek = "monday", calendarTabViews = "both", defaultCalendarView, showFilters, showCategoryFilter = "auto", showVenueFilter, showStaffFilter,
|
|
25477
|
+
}, startOfWeek = "monday", calendarTabViews = "both", defaultCalendarView, showFilters, showCategoryFilter = "auto", showVenueFilter, showStaffFilter, eventSurface, filterEventPresets, scheduleScope, filterCategoryIds, filterStaffMemberId, filterVenueId, showVenue, showMap, showCapacity, buttonVariant = "primary", buttonText = "Book", emptyMessage = "No upcoming events scheduled.", className }) => {
|
|
25669
25478
|
const fetchInitialEventsOnMount = initialEvents == null;
|
|
25670
25479
|
const resolvedShowFilters = showFilters ?? true;
|
|
25671
25480
|
const resolvedShowVenueFilter = showVenueFilter ?? false;
|
|
@@ -25686,20 +25495,18 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
|
|
|
25686
25495
|
setCalendarView(initialCalendarView);
|
|
25687
25496
|
}, [initialCalendarView]);
|
|
25688
25497
|
const filtersIdBase = useId();
|
|
25689
|
-
const { categories, venues, staffMembers,
|
|
25498
|
+
const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
|
|
25690
25499
|
showCategoryFilter: resolvedShowFilters ? showCategoryFilter : "never",
|
|
25691
25500
|
showVenueFilter: resolvedShowFilters ? resolvedShowVenueFilter : false,
|
|
25692
25501
|
showStaffFilter: resolvedShowFilters ? resolvedShowStaffFilter : false,
|
|
25693
25502
|
preFilterCategoryIds: filterCategoryIds,
|
|
25694
25503
|
preFilterStaffMemberId: filterStaffMemberId,
|
|
25695
25504
|
preFilterVenueId: filterVenueId,
|
|
25696
|
-
preFilterKind: eventKind,
|
|
25697
25505
|
preFilterEventSurface: resolvedEventSurface,
|
|
25698
25506
|
preFilterEventPresets: filterEventPresets,
|
|
25699
25507
|
preFilterScheduleScope: resolvedScheduleScope
|
|
25700
25508
|
});
|
|
25701
25509
|
const initialListFilters = useMemo(() => buildEventRuntimeFilters({
|
|
25702
|
-
eventKind,
|
|
25703
25510
|
eventSurface: resolvedEventSurface,
|
|
25704
25511
|
filterEventPresets,
|
|
25705
25512
|
scheduleScope: resolvedScheduleScope,
|
|
@@ -25707,7 +25514,6 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
|
|
|
25707
25514
|
filterStaffMemberId,
|
|
25708
25515
|
filterVenueId
|
|
25709
25516
|
}), [
|
|
25710
|
-
eventKind,
|
|
25711
25517
|
resolvedEventSurface,
|
|
25712
25518
|
filterCategoryIds,
|
|
25713
25519
|
filterEventPresets,
|
|
@@ -25784,16 +25590,12 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
|
|
|
25784
25590
|
categories,
|
|
25785
25591
|
venues,
|
|
25786
25592
|
staffMembers,
|
|
25787
|
-
selectedKind,
|
|
25788
25593
|
selectedCategoryId,
|
|
25789
25594
|
selectedStaffMemberId,
|
|
25790
25595
|
selectedVenueId,
|
|
25791
25596
|
showCategoryFilter: shouldShowCategoryFilter,
|
|
25792
25597
|
showVenueFilter: shouldShowVenueFilter,
|
|
25793
25598
|
showStaffFilter: shouldShowStaffFilter,
|
|
25794
|
-
showCourseOption,
|
|
25795
|
-
courseOptionLabel,
|
|
25796
|
-
onKindChange: setSelectedKind,
|
|
25797
25599
|
onCategoryChange: setSelectedCategoryId,
|
|
25798
25600
|
onStaffMemberChange: setSelectedStaffMemberId,
|
|
25799
25601
|
onVenueChange: setSelectedVenueId,
|
|
@@ -26077,7 +25879,6 @@ const EventCalendarClient = ({ render }) => {
|
|
|
26077
25879
|
showCategoryFilter: display.showCategoryFilter,
|
|
26078
25880
|
showVenueFilter: display.showVenueFilter,
|
|
26079
25881
|
showStaffFilter: display.showStaffFilter,
|
|
26080
|
-
eventKind: display.eventKind,
|
|
26081
25882
|
eventSurface: display.eventSurface,
|
|
26082
25883
|
filterEventPresets: display.filterEventPresets,
|
|
26083
25884
|
scheduleScope: display.scheduleScope,
|
|
@@ -26218,7 +26019,6 @@ function useEventCalendarFilterState(display) {
|
|
|
26218
26019
|
preFilterCategoryIds: display.filterCategoryIds,
|
|
26219
26020
|
preFilterStaffMemberId: display.filterStaffMemberId,
|
|
26220
26021
|
preFilterVenueId: display.filterVenueId,
|
|
26221
|
-
preFilterKind: display.eventKind,
|
|
26222
26022
|
preFilterEventSurface: display.eventSurface,
|
|
26223
26023
|
preFilterEventPresets: display.filterEventPresets,
|
|
26224
26024
|
preFilterScheduleScope: display.scheduleScope
|
|
@@ -26230,16 +26030,12 @@ function useEventCalendarFilterState(display) {
|
|
|
26230
26030
|
categories: filterState.categories,
|
|
26231
26031
|
venues: filterState.venues,
|
|
26232
26032
|
staffMembers: filterState.staffMembers,
|
|
26233
|
-
selectedKind: filterState.selectedKind,
|
|
26234
26033
|
selectedCategoryId: filterState.selectedCategoryId,
|
|
26235
26034
|
selectedStaffMemberId: filterState.selectedStaffMemberId,
|
|
26236
26035
|
selectedVenueId: filterState.selectedVenueId,
|
|
26237
26036
|
showCategoryFilter: filterState.shouldShowCategoryFilter,
|
|
26238
26037
|
showVenueFilter: filterState.shouldShowVenueFilter,
|
|
26239
26038
|
showStaffFilter: filterState.shouldShowStaffFilter,
|
|
26240
|
-
showCourseOption: filterState.showCourseOption,
|
|
26241
|
-
courseOptionLabel: filterState.courseOptionLabel,
|
|
26242
|
-
onKindChange: filterState.setSelectedKind,
|
|
26243
26039
|
onCategoryChange: filterState.setSelectedCategoryId,
|
|
26244
26040
|
onStaffMemberChange: filterState.setSelectedStaffMemberId,
|
|
26245
26041
|
onVenueChange: filterState.setSelectedVenueId,
|
|
@@ -26250,7 +26046,6 @@ function useEventCalendarFilterState(display) {
|
|
|
26250
26046
|
}
|
|
26251
26047
|
function usePrefetchedCalendarEvents(display, listFilters) {
|
|
26252
26048
|
const initialFilters = useMemo(() => buildDisplayFilterParams(display), [
|
|
26253
|
-
display.eventKind,
|
|
26254
26049
|
display.eventSurface,
|
|
26255
26050
|
display.filterCategoryIds,
|
|
26256
26051
|
display.filterEventPresets,
|
|
@@ -26268,7 +26063,6 @@ function usePrefetchedCalendarEvents(display, listFilters) {
|
|
|
26268
26063
|
}
|
|
26269
26064
|
function buildDisplayFilterParams(display) {
|
|
26270
26065
|
return buildEventRuntimeFilters({
|
|
26271
|
-
eventKind: display.eventKind,
|
|
26272
26066
|
eventSurface: display.eventSurface,
|
|
26273
26067
|
filterEventPresets: display.filterEventPresets,
|
|
26274
26068
|
scheduleScope: display.scheduleScope,
|
|
@@ -36850,10 +36644,10 @@ function LinkedEntryEditEventBridge() {
|
|
|
36850
36644
|
//#region ../preview-next/src/client/preview/PreviewShellLayout.tsx
|
|
36851
36645
|
const previewContainerResponsiveEnabled = process.env.NEXT_PUBLIC_ENABLE_PREVIEW_CONTAINER_RESPONSIVE !== "false";
|
|
36852
36646
|
const PreviewEditorSidebar = React.lazy(async () => {
|
|
36853
|
-
return { default: (await import("./PreviewEditorSidebar-
|
|
36647
|
+
return { default: (await import("./PreviewEditorSidebar-BezDOtQ7.mjs")).PreviewEditorSidebar };
|
|
36854
36648
|
});
|
|
36855
36649
|
const PreviewEditorUI = React.lazy(async () => {
|
|
36856
|
-
return { default: (await import("./PreviewEditorUI-
|
|
36650
|
+
return { default: (await import("./PreviewEditorUI-CgSqmfo2.mjs")).PreviewEditorUI };
|
|
36857
36651
|
});
|
|
36858
36652
|
const previewPaneContainmentStyle = {
|
|
36859
36653
|
contain: "layout paint",
|
|
@@ -39343,7 +39137,7 @@ async function callDirectLoaderApiEndpoint(dashboardApiClient, endpoint, params)
|
|
|
39343
39137
|
}
|
|
39344
39138
|
}
|
|
39345
39139
|
function isBatchableEndpoint(endpoint) {
|
|
39346
|
-
return endpoint === "listPublicEvents" || endpoint === "getPublicEventDetails" || endpoint === "
|
|
39140
|
+
return endpoint === "listPublicEvents" || endpoint === "getPublicEventDetails" || endpoint === "listPublicWholeSeriesOfferings" || endpoint === "listPublicRouteCandidates" || endpoint === "listPublicTeamMembers" || endpoint === "listPublicProducts" || endpoint === "getPublicBookingServices" || endpoint === "getPublicWeeklySlotAvailability" || endpoint === "getPublicFormById";
|
|
39347
39141
|
}
|
|
39348
39142
|
function buildBatchLoaderRequest(id, endpoint, params) {
|
|
39349
39143
|
switch (endpoint) {
|
|
@@ -39369,7 +39163,7 @@ function buildBatchLoaderRequest(id, endpoint, params) {
|
|
|
39369
39163
|
endpoint
|
|
39370
39164
|
};
|
|
39371
39165
|
}
|
|
39372
|
-
case "
|
|
39166
|
+
case "listPublicWholeSeriesOfferings": {
|
|
39373
39167
|
const typedParams = params;
|
|
39374
39168
|
return typedParams ? {
|
|
39375
39169
|
id,
|
|
@@ -39475,7 +39269,7 @@ function toBatchParams(endpoint, params) {
|
|
|
39475
39269
|
});
|
|
39476
39270
|
return Object.keys(p).length ? p : void 0;
|
|
39477
39271
|
}
|
|
39478
|
-
if (endpoint === "
|
|
39272
|
+
if (endpoint === "listPublicWholeSeriesOfferings") {
|
|
39479
39273
|
const p = stripUndefined({ limit: params.limit || void 0 });
|
|
39480
39274
|
return Object.keys(p).length ? p : void 0;
|
|
39481
39275
|
}
|