@riverbankcms/sdk 0.123.0 → 0.124.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-DBmAJJkQ.mjs} +22 -39
- package/dist/{PreviewEditorUI-DVHP4bCo.mjs → PreviewEditorUI-CfGaz9cY.mjs} +3 -3
- package/dist/{PreviewQueryProvider-07EE4uWL.mjs → PreviewQueryProvider-BH-3-jSj.mjs} +1 -1
- package/dist/{SdkPreviewModeRuntime-BE5eFayo.mjs → SdkPreviewModeRuntime-BW9Z8j8T.mjs} +1020 -1234
- package/dist/{SiteChromeCustomizeContext-4hn4A0HX.mjs → SiteChromeCustomizeContext-2z8moxYf.mjs} +1900 -1959
- package/dist/_dts/ai/src/contracts/proposals.d.ts +1236 -4152
- 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/sitePlatformEndpoints.d.ts +1 -38
- package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -4
- 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 +0 -16
- package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +6 -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 +19 -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.client.d.ts +1 -2
- package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +0 -1
- 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 +1580 -120
- 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 +7250 -8478
- 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-DxvjKvck.mjs} +2 -2
- package/dist/client/{EventCombined.client-De8YWBSr.mjs → EventCombined.client-BydMGc4c.mjs} +5 -16
- package/dist/client/{EventListing.client-seHTjimY.mjs → EventListing.client-vpzhhysN.mjs} +3 -10
- package/dist/client/{LeafletStaticMap-BmQxFcJW.mjs → LeafletStaticMap-CB07rpf8.mjs} +1 -1
- package/dist/client/{MagicLinkForm-OoJAIUIj.mjs → MagicLinkForm-BzyRJ8VF.mjs} +2 -2
- package/dist/client/{StepIndicator-CiZ8kdPk.mjs → StepIndicator-CTcGf8Be.mjs} +2 -2
- package/dist/client/{accordion-6lnN__XJ.mjs → accordion-B-DUDLRD.mjs} +1 -1
- package/dist/client/{bookingForm-5uyqhONU.mjs → bookingForm-DSbClLcZ.mjs} +6 -6
- package/dist/client/bookings.mjs +753 -818
- package/dist/client/{carousel-Dtnifil_.mjs → carousel-B6Ccdx8M.mjs} +1 -1
- package/dist/client/{cart-5Tc5S7NV.mjs → cart-BZh8G8wM.mjs} +3 -3
- package/dist/client/{checkout-CYKKN5Hr.mjs → checkout-o6zaC-kM.mjs} +3 -3
- package/dist/client/client.mjs +6859 -7149
- package/dist/client/{context-BGZNlGXB.mjs → context-CJz1Vlsz.mjs} +40 -43
- package/dist/client/{courseRegistration-CxCBybB4.mjs → courseRegistration-Cf11pNDs.mjs} +606 -621
- package/dist/client/{eventCalendar-Xj2jZS9X.mjs → eventCalendar-BeXrdsSE.mjs} +5 -13
- package/dist/client/{eventCombined-CgcMoOgM.mjs → eventCombined-DA76PZgG.mjs} +3 -3
- package/dist/client/{eventDetails-CEAH8Edc.mjs → eventDetails-BLxg0rok.mjs} +140 -116
- package/dist/client/{eventListing-qyPVQ0wP.mjs → eventListing-tO9LheBX.mjs} +3 -3
- package/dist/client/{eventRegistration-DDu79CtL.mjs → eventRegistration-Cnene9D9.mjs} +165 -68
- package/dist/client/{form-Bc7JKI7I.mjs → form-DZf72CHB.mjs} +2 -2
- package/dist/client/{headerSection-vTku_LEl.mjs → headerSection-Hioja5Cr.mjs} +2 -2
- package/dist/client/hooks.mjs +3452 -2365
- package/dist/client/{locationMap-Bg7X4Jna.mjs → locationMap-DwhUXEix.mjs} +2 -2
- package/dist/client/{newsletterForm-lpylVdp5.mjs → newsletterForm-C350bEQf.mjs} +2 -2
- package/dist/client/{pricing-DE8fjJiT.mjs → pricing-BYWN_ATa.mjs} +3 -19
- package/dist/client/{productDetail-D7Bo2RMH.mjs → productDetail-CCqCyXgU.mjs} +3 -3
- package/dist/client/{productList-VjnZqiqN.mjs → productList-BAiNJrOU.mjs} +3 -3
- package/dist/client/{propsDecoder-DreFXjNP.mjs → propsDecoder-DeunRj6m.mjs} +210 -378
- package/dist/client/rendering/client.mjs +2541 -2813
- package/dist/client/rendering/islands.mjs +18 -18
- package/dist/client/rendering.mjs +5622 -4734
- package/dist/client/{shop-IRsHHbf7.mjs → shop-DUmCdBtw.mjs} +6 -6
- package/dist/client/{shop-commerce-gnI8PieZ.mjs → shop-commerce-CY27mEUr.mjs} +5 -5
- package/dist/client/{shop-commerce-store-BTbrhObn.mjs → shop-commerce-store-ChXPbWfa.mjs} +1 -1
- package/dist/client/{shopShared-D6KS2_qk.mjs → shopShared-q0kin1cv.mjs} +3 -3
- package/dist/client/{useDiscountCodeUi-DCccGCxV.mjs → useDiscountCodeUi-I-92-x2V.mjs} +2 -2
- package/dist/client/{useEventFilters-eGs3rPZQ.mjs → useEventFilters-DlcVluZh.mjs} +59 -124
- package/dist/client/{usePolling-CvSU2sur.mjs → usePolling-Bz7GFV_a.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-OnPM8Z69.mjs} +2 -2
- package/dist/{separator-CoFmo8uA.mjs → separator-CPtfzHqA.mjs} +1 -1
- package/dist/server/components.mjs +4560 -3672
- package/dist/server/config-validation.mjs +3454 -2356
- package/dist/server/config.mjs +3454 -2356
- package/dist/server/data.mjs +3452 -2367
- package/dist/server/index.mjs +1501 -1491
- package/dist/server/next.mjs +7524 -8067
- package/dist/server/page-converter.mjs +1898 -2040
- package/dist/server/prebuild.mjs +1 -1
- package/dist/server/rendering/server.mjs +4258 -3373
- package/dist/server/rendering.mjs +6228 -5393
- package/dist/server/routing.mjs +3614 -2509
- package/dist/server/server.mjs +3298 -3479
- 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 getLocalDateKey, $c as toScheduledBookingDateTime, $n as layoutTransforms, $o as renderAudio, $r as parseStoredCommerceCartState, $t as redoHistory, Aa as el, Ac as createCollection, Ai as componentRuntimeRulesForTheme, An as DEFAULT_LAUNCH_READINESS_INPUT, Ao as isInlineTextEmpty, Ar as giftingBlockDefinition, As as mergeStyles, At as MediaField, Ba as formatEventCompactDateRail, Bc as parseFooterModuleId, Bi as parseGradientPresetId, Bl as GripVertical, Bn as escapeStyleContent, Bo as ClockIcon$1, Br as buildProductDetailInteractiveIslandProps, Bs as unmapValueFromSelect, C as usePreviewThemeOverlay, Ca as eventCollectionHydrationSchema, Ci as resolveBackgroundColorValue, Cl as Ticket, Cn as MediaEditorContextProvider, Co as parseGeneratedIconSetId, Cr as findPreSelectedEvent, Cs as pageDesignEditorBackgroundOverrideOwner, Ct as InlineTextField, Da as normalizeCsvIds, Di as retargetCompiledBoundaryRuntimeForContentAdjacency, Dn as getPageDesignEditorState, Do as logger, Dr as WIZARD_STEPS$1, Ds as normalizeBoxStylesCardVariant, Dt as ButtonVariantField, Ea as getEventRuntimeFiltersKey, Ei as compileEditorModelRuntime, El as Sparkles, En as applyPageDesignEditorAction, Eo as isRecord$20, Er as resolveRegistrationTarget, Es as ICON_CONFIG, Et as EntryPickerWidgetProvider, Fa as eventCalendarListLayoutOptions, Fc as Button, Fn as containerResponsiveThemeCss, Fo as ArrowDownIcon, Fr as resolveEventRegistrationScopedEvents, Fs as SdkConfigProvider, Ft as RichTextWidgetProvider, Ga as formatTime$3, Gc as formatBookingDateTime, Gl as CircleMinus, Gn as siteFooterManifest, Go as FileTextIcon, Gr as buildProductCardDisplay, Ha as formatEventPrice, Hc as unsafeAsEditorBlockValues, Hi as sectionTransitionFamilies, Hn as generateDefaultAccordionSystem, Ho as FileArchiveIcon, Hr as buildShopInteractiveIslandProps, Hs as useField, Ht as prepareBlockEditorManifest, Ia as buildGoogleMapsDirectionsUrl, Ii as gradientToCss, Il as Minus, In as createCustomBlockRegistry, Io as ArrowRightIcon, Ir as checkoutBlockDefinition, Is as useSdkConfig, It as EditorProvider, Ja as groupEventsByDate, Jc as formatLocalScheduleDate, Ji as backgroundAppearanceColorTokenNames, Jl as ChevronDown, Jn as SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR, Jo as ImagePresets, Jr as formatInterval, Js as SelectItem, Jt as useOptionalEditorUiStoreInstance, Ka as getCardOrientation, Kc as formatBookingInstant, Kl as ChevronRight, Kn as siteHeaderManifest, Ko as MinusIcon, Kr as buildProductDetailDisplay, Ks as Select, Kt as useEditorUiStore, La as normalizeLocationMapProps, Lc as useComposedRefs, Li as GRADIENT_PRESETS, Ln as buildThemeRuntime, Lo as ChevronDownIcon, Lr as cartBlockDefinition, Ls as hasEmptyOption, Lt as useEditor, Ma as bindingSchema, Mc as createContextScope, Mi as designRuntimeRulesForTheme, Mn as AMBIENT_BACKGROUND_ROLES, Mo as canonicalizePersistedBlockButtonRole, Mr as courseRegistrationBlockDefinition, Ms as textColorStyle, Mt as ReferenceWidgetProvider, Na as previewStageSchema, Nc as composeEventHandlers, Nn as isSupportedLoaderEndpoint, No as isBlockButtonRole, Nr as buildCourseRegistrationInteractiveIslandProps, Ns as getFieldIntent, Nt as useRichTextImagePicker, Oa as normalizeCsvString, Oc as useId$1, Oi as retargetCompiledRuntimeFieldsForContentAdjacency, Oo as coerceInlineTextWithFallback, Or as getStepNumber$1, Os as normalizeCardVariantRole, Ot as ButtonWidgetProvider, Pa as eventCalendarListLayoutCompatibleDisplayModeValues, Pc as Primitive, Pi as surfaceResolutionContextFromTheme, Pn as ThemeScope, Po as getIconComponent, Pr as normalizeEventRegistrationPageSurfaceSubject, Ps as isHeaderField, Pt as RichTextField, Qa as getEventAvailabilityStatus, Qc as toBookingTimeZone, Qi as defaultThemeTokens, Qn as mediaTransforms, Qo as getCurrentResolveImageUrlContext, Qr as deriveCommerceCheckoutState, Qt as pushHistoryEntry, Ra as toLocationMapHydrationProps, Rc as cn, Ri as GRADIENT_PRESET_IDS, Rn as DEFAULT_THEME_RESPONSIVE_MODE, Ro as CircleMinusIcon, Rr as buildCartInteractiveIslandProps, Rs as mapCurrentValueForSelect, Rt as LinkField, S as PreviewThemeOverlayProvider, Sa as eventCollectionDisplaySchemaShape, Si as resolveSurfaceForegroundStyles, Sn as MediaEditor, So as parseGeneratedIconAssetId, Sr as findEventByOccurrenceId, Ss as isThemeV2NormalEditorRawStyleFieldName, St as OfferingsPreviewWidgetProvider, Ta as buildEventRuntimeFilters, Ti as applyCompiledRuntimeFieldsToContent, Tl as Star, Tn as useApiMediaUploader, To as isObjectRecord, Tr as resolveEventRequiresPayment, Ts as assertNever$6, Tt as EntryPickerField, Ua as formatEventPriceDisplay, Uc as addLocalScheduleDays, Ui as sectionTransitionFamilyForBoundaryOptionId, Ul as CreditCard, Un as getBlockDefinition, Uo as FileAudioIcon, Ur as getShopDisplayForItems, Ut as stripTopLevelRoutingUi, Va as formatEventDateParts, Vc as unsafeAsEditorBlockId, Vi as defaultSectionTransitionVariantForFamily, Vn as mergeContentWithBlockStyleOverrides, Vo as DownloadIcon, Vr as buildProductListInteractiveIslandProps, Vs as FieldFrame, Vt as hideThemeV2RawStyleFields, Wa as formatEventTeacherLine, Wc as formatBookingDate, Wi as sectionTransitionVariantForBoundaryOptionId, Wl as CirclePlus, Wn as projectRecurringSchedule, Wo as FileSpreadsheetIcon, Wr as buildCartDisplay, Wt as getBlockManifestFromSdkConfig, Xa as resolveEventLinkProps, Xc as parseBookingLocalDate, Xi as foregroundTokenForBackgroundAppearanceColorToken, Xl as ArrowDown, Xn as visibleHeaderClearancePx, Xo as buildResolveImageUrlContext, Xr as buildPassCartItem, Xs as SelectValue, Xt as canUndoHistory, Ya as resolveEventCta, Yc as getBookingLocalDateKey, Yi as backgroundAppearanceQuickColorTokenNames, Yn as planSiteOverlayHeaderClearance, Yo as MediaPlaceholder, Yr as EMPTY_COMMERCE_CART_STATE, Ys as SelectTrigger, Yt as canRedoHistory, Za as getEventAvailability, Zc as resolveBookingTimeZoneId, Zi as parseBackgroundAppearanceColorToken, Zl as __exportAll, Zn as contentTransforms, Zo as computeMediaTransformStyle, Zr as buildProductCartItem, Zt as createHistoryState, _a as isSemanticSpacing, _c as Content, _i as bodyCopyFragment, _l as err$2, _n as createManifestFormAdapter, _o as resolveFeatureCardGeneratedIconSizePx, _r as formBlockDefinition, _s as parseThemeForPersistence, _t as createSiteOptionApiLoader, aa as createTransformRegistry, ac as TabsContent, ai as faqAccordionFragment, 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 buildEventCollectionHydration, bc as createCollapsibleScope, bi as getAnchorClasses, bl as Upload, bn as evaluateVisibility, bo as parseBlockIconValue, br as buildEventRegistrationInteractiveIslandProps, bs as resolveOnColorForThemeToken, bt as SiteOptionWidgetProvider, cc as Dialog, ci as singleButtonFragment, cl as assertNever$5, co as defineProgressiveBlockRuntime, cr as productDetailBlockDefinition, cs as siblingPath, ct as PreviewRichTextEditor, da as OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS, dc as DialogFooter, di as testimonialsCarouselFragment, dl as parseSiteId, do as markEditableSurfaceForwarding, dr as eventListingBlockDefinition, ei as productItemKey, el as parseEventPageSurfaceSubject, en as undoHistory, eo as getLocalMinuteOfDay, er as uiTransforms, es as renderVideo, et as confirmAutosaveBatch, f as PREVIEW_DESIGN_SAVE_ERROR_MESSAGE, fa as buildOfferingsPreviewRenderStates, fc as DialogHeader, fi as testimonialsHeadingFragment, fl as unsafeAsAppointmentResourceId, fo as splitPositioningClasses, fr as buildEventListingInteractiveIslandProps, ft as useUISelector, ga as resolveOfferingsPreviewGroups, gi as heroCopyFragment, gl as unsafeAsPassId, go as FEATURE_CARD_ICON_TREATMENTS, gr as buildEventCalendarListingRender, gs as themeButtonClassName, gt as useEntryEditorController, ha as resolveOfferingsPreviewGroupCta, hi as ctaRowFragment, hl as unsafeAsFormId, hn as validateBlockManifestIssues, ho as mediaSchema, hr as buildEventCalendarListingDisplay, hs as parseThemeButtonVariantId, i as usePreviewDesignHistoryOrder, ic as Tabs, ii as cardFragment, il as publicEventPricingType, in as useDebouncedLatestSave, io as createInteractiveIslandCodec, ir as useImageResolveContextOptional, is as setContextResolveImageUrlContext, it as rejectAutosaveBatch, ja as when, jc as useControllableState, jl as Plus, jn as deriveLaunchReadiness, jo as parseInlineTextFromUnknown, jr as buildGiftingInteractiveIslandProps, js as rgbColorValue, jt as ReferenceField, ka as normalizeOptionalId, kc as useDirection, ki as planPageDesignLayoutLookCompatibility, kl as RotateCcw, kn as decodePublicProductCategorySelectorQuery, ko as inlineTextToPlainText, kr as getWizardStepsForContext$1, ks as backgroundColorStyle, kt as FileField, lc as DialogContent, li as formEmbedFragment, ll as expectParsedBrandedId, ln as parseReferenceKind, lr as newsletterSignupBlockDefinition, lt as PreviewInlineTextEditor, ma as resolveOfferingsPreviewCoursePath, mi as heroCtaRowFragment, 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 richTextFragment, nl as publicEventPricingCurrency, nn as recordsEqual, no as blockBookingPaymentTermsSchema, nr as createManifestValidator, ns as resolveMediaNodeResponsiveImage, nt as enqueueTransaction, oa as runTransforms, oc as TabsList, oi as faqHeadingFragment, ol as publicEventTicketTypes, on as createSnapshotFromPageRecord, oo as createZodCodec, or as shopBlockDefinition, os as attachRenderableMediaAssetFields, ot as resolvePreviewSidebarTab, p as reportPreviewDesignError, pa as normalizeOfferingsPreviewItemLimit, pc as DialogTitle, pi as ctaCopyFragment, pl as unsafeAsAppointmentServiceId, pn as PaletteProvider, po as planSiteChromePlacement, pr as eventCalendarBlockDefinition, pt as EditableBlockProvider, qa as getContainerClass, qc as formatBookingTime, qi as BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO, ql as ChevronLeft, qn as SITE_CHROME_VISIBLE_HEADER_SELECTOR, qo as PlusIcon, qr as formatCommercePrice, qs as SelectContent, qt as useEditorUiStoreInstance, r as PreviewDesignHistoryOrderProvider, ri as headingFragment, rl as publicEventPricingMode, ro as buildInteractiveIslandProps, rr as ImageResolveContextProvider, rs as resolveMediaStorageUrl, rt as idleEditorTransactionQueueState, sa as ctaButton, sc as TabsTrigger, si as blogFeaturedPostFragment, sl as formatCurrencyAmount, sn as BUILT_IN_REFERENCE_KINDS, so as defineClientOwnedBlockRuntime, sr as productListBlockDefinition, ss as getAtPath, t as SiteChromeCustomizeProvider, ti as reduceCommerceCart, tl as formatBookingPriceDisplay, tn as unsafeAsLinkedContentEntryId, to as resolveRuntimeEventPricing, tr as formattingTransforms, ts as resolveImageUrlWithContext, tt as deriveTransactionCapabilities, u as PREVIEW_DESIGN_LOAD_ERROR_MESSAGE, uc as DialogDescription, ui as formCopyFragment, ul as parseMediaAssetId, uo as composeHeaderSectionWrapperClassName, ur as buildNewsletterFormInteractiveIslandProps, ut as PreviewTextEditor, va as resolveSpacing, vc as Root, vi as defineFragment, vl as ok$3, vo as shouldReserveFeatureCardIconZone, vr as buildFormInteractiveIslandProps, vs as getTextColorForBackground, vt as createSiteOptionWidgetAdapters, wa as eventCollectionSourceSchemaShape, wi as formatSiteChromeBackgroundTokenLabel, wn as useMediaEditorOptional, wo as RichTextDocSchema, wr as resolveDiscountContext, ws as asDesignBlockId, wt as IconPickerField, xa as buildEventCollectionListingDisplay, xi as boxStylesTransforms, xn as createStoreBackend, xo as resolveBlockIconRenderValue, xr as toRegistrationEvents, xs as resolveTokenOrCssColorValue, xt as OfferingsPreviewGroupOrderField, ya as buildEventCollectionDisplay, yc as Trigger, yi as BACKGROUND_POSITION_PRESET_VALUES, yl as X, yn as FormRenderer, yo as buildGeneratedBlockIconRenderAssetLookupFromUnknown, yr as eventRegistrationBlockDefinition, ys as isCssColorLiteral, yt as SiteOptionPickerField, za as formatDate$3, zc as clsx, zi as getGradientPreset, zl as Image, zn as getResponsiveScopeSpec, zo as CirclePlusIcon, zr as buildCheckoutInteractiveIslandProps, zs as mapOptionValueForSelect, zt as LinkWidgetProvider } from "./SiteChromeCustomizeContext-2z8moxYf.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;
|
|
@@ -3742,7 +3739,7 @@ function toExactOrFreeDisplay(amount, currency) {
|
|
|
3742
3739
|
};
|
|
3743
3740
|
}
|
|
3744
3741
|
function getSelectableCoursePricingOptionsForNow(course, now) {
|
|
3745
|
-
if (
|
|
3742
|
+
if (course.pricing.pricingStrategy !== "tiered") return [];
|
|
3746
3743
|
return [...course.pricing.options].filter((option) => isSaleWindowOpen(option, now)).sort((left, right) => {
|
|
3747
3744
|
if (left.sortOrder !== right.sortOrder) return left.sortOrder - right.sortOrder;
|
|
3748
3745
|
if (left.priceAmount !== right.priceAmount) return left.priceAmount - right.priceAmount;
|
|
@@ -3752,23 +3749,7 @@ function getSelectableCoursePricingOptionsForNow(course, now) {
|
|
|
3752
3749
|
function resolveCoursePricingState(course, selectedPricingOptionId, selectedSlidingAmountOrNowInput, nowInput = {}) {
|
|
3753
3750
|
const selectedSlidingAmount = typeof selectedSlidingAmountOrNowInput === "number" || selectedSlidingAmountOrNowInput === null ? selectedSlidingAmountOrNowInput : null;
|
|
3754
3751
|
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
|
-
}
|
|
3752
|
+
const currency = course.pricing.currency;
|
|
3772
3753
|
switch (course.pricing.pricingStrategy) {
|
|
3773
3754
|
case "free": return {
|
|
3774
3755
|
currency,
|
|
@@ -4461,6 +4442,123 @@ function TicketTypePriceList({ ticketTypes, currency }) {
|
|
|
4461
4442
|
}, ticketType.id))
|
|
4462
4443
|
});
|
|
4463
4444
|
}
|
|
4445
|
+
function EventPricingDetails({ isDropIn, coursePricing, acceptedItems, eventCostLabel, eventPricingCurrency, ticketTypes, autoApplyDiscount }) {
|
|
4446
|
+
if (isDropIn) return /* @__PURE__ */ jsxs("div", {
|
|
4447
|
+
className: "rb-mt-6",
|
|
4448
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
4449
|
+
className: "rb-label rb-mb-2",
|
|
4450
|
+
children: "Registration"
|
|
4451
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
4452
|
+
className: "rb-caption status-muted",
|
|
4453
|
+
children: "No registration required - just show up"
|
|
4454
|
+
})]
|
|
4455
|
+
});
|
|
4456
|
+
if (coursePricing) return /* @__PURE__ */ jsx(CoursePricingDisplay, {
|
|
4457
|
+
pricing: coursePricing,
|
|
4458
|
+
acceptedItems: [...acceptedItems]
|
|
4459
|
+
});
|
|
4460
|
+
if (eventCostLabel) return /* @__PURE__ */ jsxs("div", {
|
|
4461
|
+
className: "rb-mt-6",
|
|
4462
|
+
children: [
|
|
4463
|
+
/* @__PURE__ */ jsx("div", {
|
|
4464
|
+
className: "rb-label rb-mb-2",
|
|
4465
|
+
children: "Cost"
|
|
4466
|
+
}),
|
|
4467
|
+
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: eventCostLabel }) }),
|
|
4468
|
+
autoApplyDiscount ? /* @__PURE__ */ jsx("p", {
|
|
4469
|
+
className: "rb-caption rb-mt-1",
|
|
4470
|
+
children: formatAutoApplyDiscountLine(autoApplyDiscount, eventPricingCurrency)
|
|
4471
|
+
}) : null,
|
|
4472
|
+
/* @__PURE__ */ jsx(TicketTypePriceList, {
|
|
4473
|
+
ticketTypes,
|
|
4474
|
+
currency: eventPricingCurrency
|
|
4475
|
+
}),
|
|
4476
|
+
acceptedItems.length > 0 ? /* @__PURE__ */ jsxs("p", {
|
|
4477
|
+
className: "rb-caption rb-mt-1",
|
|
4478
|
+
children: ["You can also attend with: ", acceptedItems.join(", ")]
|
|
4479
|
+
}) : null
|
|
4480
|
+
]
|
|
4481
|
+
});
|
|
4482
|
+
return acceptedItems.length > 0 ? /* @__PURE__ */ jsx("div", {
|
|
4483
|
+
className: "rb-mt-6",
|
|
4484
|
+
children: /* @__PURE__ */ jsxs("p", {
|
|
4485
|
+
className: "rb-caption",
|
|
4486
|
+
children: ["You can also attend with: ", acceptedItems.join(", ")]
|
|
4487
|
+
})
|
|
4488
|
+
}) : null;
|
|
4489
|
+
}
|
|
4490
|
+
function EventFacts({ selection, selected, venue, teamMembers, pricing }) {
|
|
4491
|
+
const { date, timeRange } = formatEventDateParts({
|
|
4492
|
+
startsAt: selected.startsAt,
|
|
4493
|
+
endsAt: selected.endsAt,
|
|
4494
|
+
timeZone: selection.timeZone
|
|
4495
|
+
});
|
|
4496
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
4497
|
+
className: "rb-flex rb-flex-col rb-gap-4",
|
|
4498
|
+
children: [
|
|
4499
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
4500
|
+
/* @__PURE__ */ jsx("div", {
|
|
4501
|
+
className: "rb-label rb-mb-2",
|
|
4502
|
+
children: selection.mode === "next" ? "Next date" : "Date"
|
|
4503
|
+
}),
|
|
4504
|
+
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: date }) }),
|
|
4505
|
+
/* @__PURE__ */ jsx("p", {
|
|
4506
|
+
className: "rb-caption",
|
|
4507
|
+
children: timeRange
|
|
4508
|
+
})
|
|
4509
|
+
] }),
|
|
4510
|
+
venue ? /* @__PURE__ */ jsxs("div", {
|
|
4511
|
+
className: "rb-mt-6",
|
|
4512
|
+
children: [
|
|
4513
|
+
/* @__PURE__ */ jsx("div", {
|
|
4514
|
+
className: "rb-label rb-mb-2",
|
|
4515
|
+
children: "Venue"
|
|
4516
|
+
}),
|
|
4517
|
+
/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("strong", { children: venue.name }) }),
|
|
4518
|
+
venue.address ? /* @__PURE__ */ jsx("p", {
|
|
4519
|
+
className: "rb-caption",
|
|
4520
|
+
children: venue.address
|
|
4521
|
+
}) : null
|
|
4522
|
+
]
|
|
4523
|
+
}) : null,
|
|
4524
|
+
teamMembers.length > 0 ? /* @__PURE__ */ jsxs("div", {
|
|
4525
|
+
className: "rb-mt-6",
|
|
4526
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
4527
|
+
className: "rb-label rb-mb-2",
|
|
4528
|
+
children: "With"
|
|
4529
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
4530
|
+
className: "rb-flex rb-flex-col rb-gap-3",
|
|
4531
|
+
children: teamMembers.map((member) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx(TeamMemberName$1, {
|
|
4532
|
+
name: member.name,
|
|
4533
|
+
profilePath: member.profilePath
|
|
4534
|
+
}) }), member.summary ? /* @__PURE__ */ jsx("p", {
|
|
4535
|
+
className: "rb-caption status-muted",
|
|
4536
|
+
children: member.summary
|
|
4537
|
+
}) : null] }, member.id))
|
|
4538
|
+
})]
|
|
4539
|
+
}) : null,
|
|
4540
|
+
pricing
|
|
4541
|
+
]
|
|
4542
|
+
});
|
|
4543
|
+
}
|
|
4544
|
+
function OtherEventDates({ selection }) {
|
|
4545
|
+
if (selection.otherDates.length === 0) return null;
|
|
4546
|
+
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
|
|
4547
|
+
className: "rb-label",
|
|
4548
|
+
children: "Other dates"
|
|
4549
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
4550
|
+
className: "rb-mt-2 rb-tiles-grid",
|
|
4551
|
+
children: selection.otherDates.map((event) => /* @__PURE__ */ jsx("a", {
|
|
4552
|
+
className: "rb-tile rb-tile--interactive",
|
|
4553
|
+
...resolveEventLinkProps(event),
|
|
4554
|
+
children: /* @__PURE__ */ jsx(DateTimeTile, {
|
|
4555
|
+
startsAt: event.startsAt,
|
|
4556
|
+
endsAt: event.endsAt,
|
|
4557
|
+
timeZone: selection.timeZone
|
|
4558
|
+
})
|
|
4559
|
+
}, event.occurrenceId || event.id))
|
|
4560
|
+
})] });
|
|
4561
|
+
}
|
|
4464
4562
|
function EventDetailsView({ selection, showVenue, showMap, showOtherDates, showCost = true, showAcceptedPasses = true, showAcceptedMemberships = true, applicablePasses = [], applicableMemberships = [], autoApplyDiscount = null, mapHeight = 200, mapClassName = "event-details-map", renderVenueMap }) {
|
|
4465
4563
|
const selected = selection.selected;
|
|
4466
4564
|
if (!selected) return /* @__PURE__ */ jsx("p", {
|
|
@@ -4468,138 +4566,46 @@ function EventDetailsView({ selection, showVenue, showMap, showOtherDates, showC
|
|
|
4468
4566
|
children: "No upcoming dates scheduled."
|
|
4469
4567
|
});
|
|
4470
4568
|
const venue = showVenue ? selected.venue : void 0;
|
|
4471
|
-
const isDropIn = selected.
|
|
4569
|
+
const isDropIn = selected.bookingScope === "single_occurrence" && selected.requiresRegistration === false;
|
|
4472
4570
|
const teamMembers = selected.teamMembers ?? [];
|
|
4473
|
-
const coursePricing = selected.
|
|
4474
|
-
pricing: selected.
|
|
4475
|
-
|
|
4476
|
-
currency: selected.course.currency
|
|
4571
|
+
const coursePricing = selected.bookingScope === "whole_series" && selected.wholeSeries ? resolveCoursePricingState({
|
|
4572
|
+
pricing: selected.wholeSeries.pricing,
|
|
4573
|
+
currency: selected.wholeSeries.currency
|
|
4477
4574
|
}) : null;
|
|
4478
4575
|
const eventPricing = resolveRuntimeEventPricing(selected);
|
|
4479
4576
|
const eventPricingType = publicEventPricingType(eventPricing);
|
|
4480
4577
|
const eventPricingCurrency = publicEventPricingCurrency(eventPricing) ?? "USD";
|
|
4481
|
-
const
|
|
4482
|
-
const shouldShowCoursePricing = showCost && !isDropIn && coursePricing !== null;
|
|
4483
|
-
const shouldShowEventCost = showCost && isPaid && !isDropIn && coursePricing === null;
|
|
4578
|
+
const shouldShowEventCost = showCost && eventPricingType === "paid" && !isDropIn && coursePricing === null;
|
|
4484
4579
|
const eventCostLabel = shouldShowEventCost ? formatEventPrice(selected) : null;
|
|
4485
4580
|
const ticketTypes = shouldShowEventCost ? getActiveTicketTypes$1(selected) : [];
|
|
4486
4581
|
const acceptedItems = [];
|
|
4487
4582
|
if (showAcceptedPasses) acceptedItems.push(...applicablePasses.map((p) => p.name));
|
|
4488
4583
|
if (showAcceptedMemberships) acceptedItems.push(...applicableMemberships.map((m) => m.name));
|
|
4489
|
-
const hasAcceptedItems = acceptedItems.length > 0;
|
|
4490
4584
|
return /* @__PURE__ */ jsxs("div", {
|
|
4491
4585
|
className: "rb-flex rb-flex-col rb-gap-6 rb-text-left",
|
|
4492
4586
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
4493
4587
|
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
|
-
]
|
|
4588
|
+
children: [/* @__PURE__ */ jsx(EventFacts, {
|
|
4589
|
+
selection,
|
|
4590
|
+
selected,
|
|
4591
|
+
venue,
|
|
4592
|
+
teamMembers,
|
|
4593
|
+
pricing: /* @__PURE__ */ jsx(EventPricingDetails, {
|
|
4594
|
+
isDropIn,
|
|
4595
|
+
coursePricing: showCost ? coursePricing : null,
|
|
4596
|
+
acceptedItems,
|
|
4597
|
+
eventCostLabel,
|
|
4598
|
+
eventPricingCurrency,
|
|
4599
|
+
ticketTypes,
|
|
4600
|
+
autoApplyDiscount
|
|
4601
|
+
})
|
|
4582
4602
|
}), showMap && renderVenueMap && venue?.location ? /* @__PURE__ */ jsx(Fragment$1, { children: renderVenueMap({
|
|
4583
4603
|
venueName: venue.name,
|
|
4584
4604
|
location: venue.location,
|
|
4585
4605
|
className: mapClassName,
|
|
4586
4606
|
height: mapHeight
|
|
4587
4607
|
}) }) : 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]
|
|
4608
|
+
}), showOtherDates ? /* @__PURE__ */ jsx(OtherEventDates, { selection }) : null]
|
|
4603
4609
|
});
|
|
4604
4610
|
}
|
|
4605
4611
|
//#endregion
|
|
@@ -4763,7 +4769,7 @@ function resolveCoursePageSurfaceScope(courses, subjectValue) {
|
|
|
4763
4769
|
return {
|
|
4764
4770
|
kind: "scoped",
|
|
4765
4771
|
subject: parsed.value,
|
|
4766
|
-
courses: courses.filter((course) => allowedSeriesIds.has(course.
|
|
4772
|
+
courses: courses.filter((course) => allowedSeriesIds.has(course.eventSeriesId))
|
|
4767
4773
|
};
|
|
4768
4774
|
}
|
|
4769
4775
|
function eventSeriesIdsForSubject(subject) {
|
|
@@ -4775,43 +4781,8 @@ function eventSeriesIdsForSubject(subject) {
|
|
|
4775
4781
|
}
|
|
4776
4782
|
//#endregion
|
|
4777
4783
|
//#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
4784
|
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);
|
|
4785
|
+
const pageSurfaceScope = resolveCoursePageSurfaceScope((args.courses ?? []).filter(Boolean), args.subject);
|
|
4815
4786
|
if (pageSurfaceScope.kind === "unsupported") return {
|
|
4816
4787
|
mode: "unsupportedPageSurfaceSubject",
|
|
4817
4788
|
selected: null,
|
|
@@ -4825,42 +4796,8 @@ function selectCourseDetails(args) {
|
|
|
4825
4796
|
scoped
|
|
4826
4797
|
};
|
|
4827
4798
|
}
|
|
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
4799
|
return {
|
|
4863
|
-
mode: "
|
|
4800
|
+
mode: "unsupportedPageSurfaceSubject",
|
|
4864
4801
|
selected: null,
|
|
4865
4802
|
scoped: []
|
|
4866
4803
|
};
|
|
@@ -4872,12 +4809,6 @@ function toValidDate(value) {
|
|
|
4872
4809
|
const date = new Date(value);
|
|
4873
4810
|
return Number.isNaN(date.getTime()) ? null : date;
|
|
4874
4811
|
}
|
|
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
4812
|
function getCourseDateRange(course) {
|
|
4882
4813
|
const datedSessions = (course.sessions ?? []).map((session) => ({
|
|
4883
4814
|
session,
|
|
@@ -5055,17 +4986,13 @@ function CourseDetailsView(props) {
|
|
|
5055
4986
|
}
|
|
5056
4987
|
//#endregion
|
|
5057
4988
|
//#region ../blocks/src/system/runtime/nodes/course-details.server.tsx
|
|
5058
|
-
function CourseDetailsSSR({ courses,
|
|
4989
|
+
function CourseDetailsSSR({ courses, subject, showTitle, showDescription, showSessions, sessionsLimit, showVenue, showPrice, showCapacity, showEnrollmentStatus, showMembershipNote, className, children }) {
|
|
5059
4990
|
const selection = selectCourseDetails({
|
|
5060
4991
|
courses: courses ?? null,
|
|
5061
|
-
|
|
5062
|
-
entrySubrouteContext,
|
|
5063
|
-
subject,
|
|
5064
|
-
courseSlug
|
|
4992
|
+
subject
|
|
5065
4993
|
});
|
|
5066
4994
|
const parsedSubject = parseEventPageSurfaceSubject(subject);
|
|
5067
4995
|
const awaitingOfferingRuns = parsedSubject.ok && parsedSubject.value.kind === "eventOffering" && parsedSubject.value.availableEventSeriesIds.length === 0;
|
|
5068
|
-
const basePath = getEntryBasePath(contentEntry);
|
|
5069
4996
|
const now = /* @__PURE__ */ new Date();
|
|
5070
4997
|
const scopedWithRange = selection.scoped.map((c) => ({
|
|
5071
4998
|
course: c,
|
|
@@ -5106,7 +5033,6 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
|
|
|
5106
5033
|
const start = range.start;
|
|
5107
5034
|
const end = range.end;
|
|
5108
5035
|
const isInProgress = Boolean(start && end && start <= now && end > now);
|
|
5109
|
-
const href = basePath ? `${basePath.replace(/\/$/, "")}/${course.slug}` : null;
|
|
5110
5036
|
return /* @__PURE__ */ jsx("li", {
|
|
5111
5037
|
className: "rb-rounded-md rb-border rb-p-3",
|
|
5112
5038
|
children: /* @__PURE__ */ jsx("div", {
|
|
@@ -5115,11 +5041,7 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
|
|
|
5115
5041
|
className: "rb-flex rb-items-center rb-justify-between rb-gap-3",
|
|
5116
5042
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
5117
5043
|
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", {
|
|
5044
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
5123
5045
|
className: "rb-truncate",
|
|
5124
5046
|
children: /* @__PURE__ */ jsx("strong", { children: course.title })
|
|
5125
5047
|
}), /* @__PURE__ */ jsx("div", {
|
|
@@ -5132,7 +5054,7 @@ function CourseDetailsSSR({ courses, contentEntry, entrySubrouteContext, subject
|
|
|
5132
5054
|
})]
|
|
5133
5055
|
})
|
|
5134
5056
|
})
|
|
5135
|
-
}, course.
|
|
5057
|
+
}, course.eventSeriesId);
|
|
5136
5058
|
})
|
|
5137
5059
|
}) : /* @__PURE__ */ jsx("p", {
|
|
5138
5060
|
className: "rb-caption status-muted",
|
|
@@ -5524,80 +5446,13 @@ const EventSpotlight = ({ events, layout = "grid", columns = "3", cardVariant =
|
|
|
5524
5446
|
};
|
|
5525
5447
|
//#endregion
|
|
5526
5448
|
//#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
|
-
});
|
|
5449
|
+
const eventCombinedSourceSchema = z$1.object({ ...eventCollectionSourceSchemaShape });
|
|
5563
5450
|
const eventCombinedDisplaySchema = z$1.object({
|
|
5564
5451
|
kind: z$1.literal("event-combined"),
|
|
5565
5452
|
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
|
|
5453
|
+
...eventCollectionDisplaySchemaShape
|
|
5600
5454
|
});
|
|
5455
|
+
const eventCombinedHydrationSchema = eventCollectionHydrationSchema;
|
|
5601
5456
|
const eventCombinedRenderSchema = z$1.object({
|
|
5602
5457
|
display: eventCombinedDisplaySchema,
|
|
5603
5458
|
hydration: eventCombinedHydrationSchema
|
|
@@ -5609,62 +5464,14 @@ const eventCombinedIslandMetaCodec = createZodCodec(z$1.object({
|
|
|
5609
5464
|
}));
|
|
5610
5465
|
const eventCombinedIslandMetaKeys = defineInteractiveIslandMetaKeys("siteId", "apiBaseUrl", "stage");
|
|
5611
5466
|
function buildEventCombinedDisplay(source) {
|
|
5612
|
-
const listLayout = source.listLayout ?? "stack";
|
|
5613
5467
|
return {
|
|
5468
|
+
...buildEventCollectionDisplay(source),
|
|
5614
5469
|
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."
|
|
5470
|
+
className: source.className ?? null
|
|
5645
5471
|
};
|
|
5646
5472
|
}
|
|
5647
5473
|
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
|
-
};
|
|
5474
|
+
return buildEventCollectionListingDisplay(render.display, render.hydration.prefetchedEvents, className);
|
|
5668
5475
|
}
|
|
5669
5476
|
const eventCombinedBlockRuntime = defineProgressiveBlockRuntime({
|
|
5670
5477
|
kind: "progressive",
|
|
@@ -5674,15 +5481,7 @@ const eventCombinedBlockRuntime = defineProgressiveBlockRuntime({
|
|
|
5674
5481
|
},
|
|
5675
5482
|
buildRender: (source) => ({
|
|
5676
5483
|
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
|
-
}
|
|
5484
|
+
hydration: buildEventCollectionHydration(source)
|
|
5686
5485
|
})
|
|
5687
5486
|
});
|
|
5688
5487
|
createInteractiveIslandCodec({
|
|
@@ -6112,7 +5911,7 @@ function renderOfferingCompactItem(item, options) {
|
|
|
6112
5911
|
case "course": return /* @__PURE__ */ jsx(CourseCompactRow, {
|
|
6113
5912
|
course: item.course,
|
|
6114
5913
|
path: item.path
|
|
6115
|
-
}, item.course.
|
|
5914
|
+
}, item.course.eventSeriesId);
|
|
6116
5915
|
}
|
|
6117
5916
|
}
|
|
6118
5917
|
function renderSingleOfferingCard(item, options) {
|
|
@@ -6130,7 +5929,7 @@ function renderSingleOfferingCard(item, options) {
|
|
|
6130
5929
|
path: item.path,
|
|
6131
5930
|
buttonVariant: options.buttonVariant,
|
|
6132
5931
|
buttonText: options.buttonText
|
|
6133
|
-
}, item.course.
|
|
5932
|
+
}, item.course.eventSeriesId);
|
|
6134
5933
|
}
|
|
6135
5934
|
}
|
|
6136
5935
|
function CourseCompactRow({ course, path }) {
|
|
@@ -7098,13 +6897,11 @@ function CheckoutSSR({ blockId, siteId, apiBaseUrl, stage, children, ...rest })
|
|
|
7098
6897
|
* Server-safe placeholder for course registration.
|
|
7099
6898
|
* Provides a static container for island hydration without importing client hooks.
|
|
7100
6899
|
*/
|
|
7101
|
-
function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken,
|
|
6900
|
+
function CourseRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, subject, courses, className, showSessions, showPrice, showCapacity, showVenue, successMessage, waitlistMessage, membershipMessage, buttonText, buttonVariant, stage, children }) {
|
|
7102
6901
|
const islandProps = buildCourseRegistrationInteractiveIslandProps({
|
|
7103
6902
|
siteId,
|
|
7104
6903
|
apiBaseUrl,
|
|
7105
6904
|
portalToken,
|
|
7106
|
-
contentEntry,
|
|
7107
|
-
entrySubrouteContext,
|
|
7108
6905
|
subject,
|
|
7109
6906
|
courses,
|
|
7110
6907
|
className,
|
|
@@ -8072,14 +7869,13 @@ function cx(...classes) {
|
|
|
8072
7869
|
* Server-safe placeholder for event registration.
|
|
8073
7870
|
* Provides a static container for island hydration without importing client hooks.
|
|
8074
7871
|
*/
|
|
8075
|
-
function EventRegistrationSSR({ blockId, siteId, apiBaseUrl, portalToken, previewToken, occurrenceContext,
|
|
7872
|
+
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
7873
|
const islandProps = buildEventRegistrationInteractiveIslandProps({
|
|
8077
7874
|
siteId,
|
|
8078
7875
|
apiBaseUrl,
|
|
8079
7876
|
portalToken,
|
|
8080
7877
|
previewToken,
|
|
8081
7878
|
occurrenceContext,
|
|
8082
|
-
contentEntry,
|
|
8083
7879
|
subject: normalizeEventRegistrationPageSurfaceSubject(subject),
|
|
8084
7880
|
events,
|
|
8085
7881
|
className,
|
|
@@ -9440,7 +9236,7 @@ function useBookingSubmission(_siteId) {
|
|
|
9440
9236
|
};
|
|
9441
9237
|
}
|
|
9442
9238
|
//#endregion
|
|
9443
|
-
//#region ../blocks/src/system/runtime/api/types.ts
|
|
9239
|
+
//#region ../blocks/src/system/runtime/api/types/discounts.ts
|
|
9444
9240
|
function discountAvailabilityHasDiscounts(availability) {
|
|
9445
9241
|
return availability.type !== "none";
|
|
9446
9242
|
}
|
|
@@ -9472,7 +9268,7 @@ function getDiscountContextKey(context) {
|
|
|
9472
9268
|
context.ticketsCount ?? ""
|
|
9473
9269
|
].join(":");
|
|
9474
9270
|
case "appointment": return [context.type, context.serviceId].join(":");
|
|
9475
|
-
case "
|
|
9271
|
+
case "whole_series": return [context.type, context.eventSeriesId].join(":");
|
|
9476
9272
|
case "pass": return [context.type, context.passId].join(":");
|
|
9477
9273
|
case "membership": return [context.type, context.membershipId].join(":");
|
|
9478
9274
|
case "product": return [
|
|
@@ -13270,6 +13066,23 @@ function areEntitlementsDisabledForTicketCount(ticketsCount) {
|
|
|
13270
13066
|
return ticketsCount > 1;
|
|
13271
13067
|
}
|
|
13272
13068
|
/**
|
|
13069
|
+
* Describe what redeeming a pass costs the customer.
|
|
13070
|
+
*
|
|
13071
|
+
* The balance is what they hold *before* this booking, so "1 of 5" means four
|
|
13072
|
+
* are left afterwards. Spelling out the balance is what stops people missing
|
|
13073
|
+
* that a credit is being spent at all.
|
|
13074
|
+
*
|
|
13075
|
+
* Always one credit: passes are only redeemable for single-ticket bookings,
|
|
13076
|
+
* per {@link areEntitlementsDisabledForTicketCount}.
|
|
13077
|
+
*
|
|
13078
|
+
* @param creditsRemaining - Credits on the pass before this booking, if known
|
|
13079
|
+
*/
|
|
13080
|
+
function formatPassCreditUsageLabel(creditsRemaining) {
|
|
13081
|
+
if (typeof creditsRemaining !== "number" || creditsRemaining <= 0) return "Uses 1 pass credit";
|
|
13082
|
+
if (creditsRemaining === 1) return "Uses your last credit";
|
|
13083
|
+
return `Uses 1 of ${creditsRemaining} credits`;
|
|
13084
|
+
}
|
|
13085
|
+
/**
|
|
13273
13086
|
* Transform API eligibility response to internal eligibility data.
|
|
13274
13087
|
*
|
|
13275
13088
|
* @param response - The raw API response from checkEligibility
|
|
@@ -14240,6 +14053,23 @@ function isDirectPaymentOptionSelected(option, selectionState) {
|
|
|
14240
14053
|
return selectionState.kind === "valid" && selectionState.selection.collectionOptionKind === option.kind;
|
|
14241
14054
|
}
|
|
14242
14055
|
/**
|
|
14056
|
+
* Label for the button that acts on the chosen payment method.
|
|
14057
|
+
*
|
|
14058
|
+
* A pass redemption spends a credit the moment it is pressed, so the label
|
|
14059
|
+
* names the pass instead of describing the step.
|
|
14060
|
+
*/
|
|
14061
|
+
function resolvePaymentButtonText(method) {
|
|
14062
|
+
switch (method) {
|
|
14063
|
+
case "stripe": return "Continue to Payment";
|
|
14064
|
+
case "pass": return "Book using class pass";
|
|
14065
|
+
case "pass_bundle":
|
|
14066
|
+
case "membership_bundle": return "Purchase & Register";
|
|
14067
|
+
case "free":
|
|
14068
|
+
case "membership":
|
|
14069
|
+
case null: return "Complete Registration";
|
|
14070
|
+
}
|
|
14071
|
+
}
|
|
14072
|
+
/**
|
|
14243
14073
|
* Payment Selection Step
|
|
14244
14074
|
*
|
|
14245
14075
|
* Shows payment options based on event pricing type and user eligibility.
|
|
@@ -14279,11 +14109,7 @@ const PaymentSelectionStep = ({ event, occurrenceContext, ticketsCount, email, i
|
|
|
14279
14109
|
collectionOptionKind: directPaymentFallbackKind
|
|
14280
14110
|
});
|
|
14281
14111
|
}, [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]);
|
|
14112
|
+
const getButtonText = useCallback(() => resolvePaymentButtonText(selectedMethod), [selectedMethod]);
|
|
14287
14113
|
useEffect(() => {
|
|
14288
14114
|
if (!onStateChange) return;
|
|
14289
14115
|
let status = "ready";
|
|
@@ -14830,6 +14656,21 @@ function EventRegistrationWizardContent(props) {
|
|
|
14830
14656
|
}
|
|
14831
14657
|
//#endregion
|
|
14832
14658
|
//#region ../blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.tsx
|
|
14659
|
+
/**
|
|
14660
|
+
* Label for the button that submits the details step.
|
|
14661
|
+
*
|
|
14662
|
+
* When a pass covers the booking there is no payment step to follow, so this
|
|
14663
|
+
* button is the last thing read before a credit is spent — it names the pass
|
|
14664
|
+
* rather than leaving that to the summary above it.
|
|
14665
|
+
*/
|
|
14666
|
+
function resolveDetailsButtonText(input) {
|
|
14667
|
+
const { wizard } = input;
|
|
14668
|
+
if (wizard.eligibility?.canJoinWaitlist) return "Join Waitlist";
|
|
14669
|
+
if (!input.hasWaitlistClaim && wizard.eligibility?.isFull) return "Sold out";
|
|
14670
|
+
if (wizard.paymentSelection.method === "pass") return "Book using class pass";
|
|
14671
|
+
if (wizard.paymentSelection.method === "membership") return input.fallbackText;
|
|
14672
|
+
return wizard.eventRequiresPayment ? "Continue to Payment" : input.fallbackText;
|
|
14673
|
+
}
|
|
14833
14674
|
function EventRegistrationWizardActions(props) {
|
|
14834
14675
|
const { wizard } = props;
|
|
14835
14676
|
const nextStepAfterTickets = "enter-details";
|
|
@@ -14837,12 +14678,11 @@ function EventRegistrationWizardActions(props) {
|
|
|
14837
14678
|
const hasWaitlistClaim = wizard.waitlistClaim.claim !== null;
|
|
14838
14679
|
const currentEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
|
|
14839
14680
|
const isSoldOutWithoutWaitlist = !hasWaitlistClaim && currentEvent?.availableSpots === 0 && currentEvent.waitlistEnabled !== true;
|
|
14840
|
-
const getDetailsButtonText = () => {
|
|
14841
|
-
|
|
14842
|
-
|
|
14843
|
-
|
|
14844
|
-
|
|
14845
|
-
};
|
|
14681
|
+
const getDetailsButtonText = () => resolveDetailsButtonText({
|
|
14682
|
+
wizard,
|
|
14683
|
+
hasWaitlistClaim,
|
|
14684
|
+
fallbackText: props.buttonText
|
|
14685
|
+
});
|
|
14846
14686
|
switch (wizard.step) {
|
|
14847
14687
|
case "error":
|
|
14848
14688
|
case "success":
|
|
@@ -14938,6 +14778,41 @@ function isProductMethod(method) {
|
|
|
14938
14778
|
"membership_bundle"
|
|
14939
14779
|
].includes(method);
|
|
14940
14780
|
}
|
|
14781
|
+
/** Credits held on the pass the customer is about to redeem, before this booking. */
|
|
14782
|
+
function getSelectedPassCreditsRemaining(wizard) {
|
|
14783
|
+
const { method, passId } = wizard.paymentSelection;
|
|
14784
|
+
if (method !== "pass" || !passId) return null;
|
|
14785
|
+
return (wizard.eligibility?.eligiblePasses ?? []).find((candidate) => candidate.id === passId)?.creditsRemaining ?? null;
|
|
14786
|
+
}
|
|
14787
|
+
/**
|
|
14788
|
+
* Copy describing how a pass or membership covers the booking.
|
|
14789
|
+
*
|
|
14790
|
+
* Pass redemptions spend something, so they say so and name the balance;
|
|
14791
|
+
* memberships already include the class, so "Included" stays accurate.
|
|
14792
|
+
*/
|
|
14793
|
+
function resolveEntitlementSummaryCopy(method, passCreditsRemaining) {
|
|
14794
|
+
switch (method) {
|
|
14795
|
+
case "pass": return {
|
|
14796
|
+
productPrice: "1 credit",
|
|
14797
|
+
pricingNote: formatPassCreditUsageLabel(passCreditsRemaining)
|
|
14798
|
+
};
|
|
14799
|
+
case "pass_bundle": return {
|
|
14800
|
+
productPrice: null,
|
|
14801
|
+
pricingNote: "1 pass credit"
|
|
14802
|
+
};
|
|
14803
|
+
case "membership": return {
|
|
14804
|
+
productPrice: "Included",
|
|
14805
|
+
pricingNote: "Included in membership"
|
|
14806
|
+
};
|
|
14807
|
+
case "membership_bundle":
|
|
14808
|
+
case "free":
|
|
14809
|
+
case "stripe":
|
|
14810
|
+
case null: return {
|
|
14811
|
+
productPrice: null,
|
|
14812
|
+
pricingNote: "Included in membership"
|
|
14813
|
+
};
|
|
14814
|
+
}
|
|
14815
|
+
}
|
|
14941
14816
|
function getSummaryRow(option, label) {
|
|
14942
14817
|
return option.summaryRows.find((row) => row.label === label)?.value ?? null;
|
|
14943
14818
|
}
|
|
@@ -14954,6 +14829,35 @@ function getSelectedDirectPaymentOption(input) {
|
|
|
14954
14829
|
const requestedKind = input.wizard.paymentSelection.collectionOptionKind ?? "upfront";
|
|
14955
14830
|
return options.find((option) => option.kind === requestedKind) ?? options.find((option) => option.kind === "upfront") ?? options[0] ?? null;
|
|
14956
14831
|
}
|
|
14832
|
+
/** Product row naming the pass or membership that covers this booking. */
|
|
14833
|
+
function EntitlementSummaryRow(props) {
|
|
14834
|
+
const { paymentSelection } = props.wizard;
|
|
14835
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
14836
|
+
className: "er-summary-bar-product",
|
|
14837
|
+
children: [/* @__PURE__ */ jsxs("div", { children: [
|
|
14838
|
+
/* @__PURE__ */ jsx("div", {
|
|
14839
|
+
className: "er-summary-bar-product-name",
|
|
14840
|
+
children: paymentSelection.productName
|
|
14841
|
+
}),
|
|
14842
|
+
props.showPassEscape && /* @__PURE__ */ jsx("button", {
|
|
14843
|
+
type: "button",
|
|
14844
|
+
className: "er-summary-bar-pass-escape",
|
|
14845
|
+
onClick: props.wizard.handleUseCardInsteadOfPass,
|
|
14846
|
+
children: "Pay by card instead"
|
|
14847
|
+
}),
|
|
14848
|
+
paymentSelection.productInterval && /* @__PURE__ */ jsx("div", {
|
|
14849
|
+
className: "er-summary-bar-product-detail",
|
|
14850
|
+
children: paymentSelection.productInterval
|
|
14851
|
+
})
|
|
14852
|
+
] }), /* @__PURE__ */ jsx("div", {
|
|
14853
|
+
className: "er-summary-bar-product-price",
|
|
14854
|
+
children: props.copy.productPrice ? /* @__PURE__ */ jsx("span", {
|
|
14855
|
+
className: "er-summary-bar-included",
|
|
14856
|
+
children: props.copy.productPrice
|
|
14857
|
+
}) : paymentSelection.productPrice ? formatPrice(paymentSelection.productPrice, paymentSelection.productCurrency ?? "usd") : null
|
|
14858
|
+
})]
|
|
14859
|
+
});
|
|
14860
|
+
}
|
|
14957
14861
|
function EventRegistrationSummaryBar(props) {
|
|
14958
14862
|
const { wizard } = props;
|
|
14959
14863
|
const summaryEvent = wizard.selectedEvent ?? wizard.preSelectedEvent;
|
|
@@ -14981,30 +14885,13 @@ function EventRegistrationSummaryBar(props) {
|
|
|
14981
14885
|
} : null;
|
|
14982
14886
|
if (!summaryTitle) return null;
|
|
14983
14887
|
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
|
-
})]
|
|
14888
|
+
const isPassRedemption = wizard.paymentSelection.method === "pass";
|
|
14889
|
+
const entitlementCopy = resolveEntitlementSummaryCopy(wizard.paymentSelection.method, getSelectedPassCreditsRemaining(wizard));
|
|
14890
|
+
const showPassEscape = isPassRedemption && (wizard.step === "enter-details" || wizard.step === "select-tickets");
|
|
14891
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [productMethod && wizard.paymentSelection.productName && /* @__PURE__ */ jsx(EntitlementSummaryRow, {
|
|
14892
|
+
wizard,
|
|
14893
|
+
copy: entitlementCopy,
|
|
14894
|
+
showPassEscape
|
|
15008
14895
|
}), /* @__PURE__ */ jsxs("div", {
|
|
15009
14896
|
className: "er-summary-bar",
|
|
15010
14897
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
@@ -15035,7 +14922,7 @@ function EventRegistrationSummaryBar(props) {
|
|
|
15035
14922
|
children: formatPrice(subtotalCents, summaryCurrency)
|
|
15036
14923
|
}), /* @__PURE__ */ jsx("div", {
|
|
15037
14924
|
className: "er-summary-bar-included",
|
|
15038
|
-
children:
|
|
14925
|
+
children: entitlementCopy.pricingNote
|
|
15039
14926
|
})] }) : flexibleBalanceSummary ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
15040
14927
|
flexibleBalanceSummary.total ? /* @__PURE__ */ jsxs("div", {
|
|
15041
14928
|
className: "er-summary-bar-product-detail",
|
|
@@ -15781,6 +15668,33 @@ const eventRegistrationSubmitDeps = { savePendingRegistration };
|
|
|
15781
15668
|
function useEventRegistrationSubmit(options) {
|
|
15782
15669
|
return useEventRegistrationSubmitWithDeps(options, eventRegistrationSubmitDeps);
|
|
15783
15670
|
}
|
|
15671
|
+
/**
|
|
15672
|
+
* Describe a completed registration to the success step.
|
|
15673
|
+
*
|
|
15674
|
+
* Only pass redemptions adopt the server's message: it names the credits spent
|
|
15675
|
+
* and the balance left, which the block's copy cannot. Every other method keeps
|
|
15676
|
+
* whatever success message the site configured.
|
|
15677
|
+
*/
|
|
15678
|
+
function toRegistrationResult(result) {
|
|
15679
|
+
if (result.alreadyRegistered) {
|
|
15680
|
+
const waitlisted = result.status === "waitlist";
|
|
15681
|
+
return {
|
|
15682
|
+
status: result.status,
|
|
15683
|
+
variant: "info",
|
|
15684
|
+
title: waitlisted ? "Already waitlisted" : "Already registered",
|
|
15685
|
+
message: result.message ?? (waitlisted ? "You are already on the waitlist for this event." : "You are already registered for this event.")
|
|
15686
|
+
};
|
|
15687
|
+
}
|
|
15688
|
+
if (result.status === "waitlist") return {
|
|
15689
|
+
status: "waitlist",
|
|
15690
|
+
title: "Added to waitlist",
|
|
15691
|
+
message: result.message ?? (typeof result.waitlistPosition === "number" ? `You've been added to the waitlist (position ${result.waitlistPosition}).` : "You've been added to the waitlist.")
|
|
15692
|
+
};
|
|
15693
|
+
return {
|
|
15694
|
+
status: result.status,
|
|
15695
|
+
message: result.paymentMethod === "pass" ? result.message : void 0
|
|
15696
|
+
};
|
|
15697
|
+
}
|
|
15784
15698
|
function useEventRegistrationSubmitWithDeps(options, deps) {
|
|
15785
15699
|
return async (method, passId, membershipId, selection, submitOptions) => {
|
|
15786
15700
|
const submitOccurrenceId = options.registrationTarget?.occurrenceId;
|
|
@@ -15890,23 +15804,7 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
|
|
|
15890
15804
|
}
|
|
15891
15805
|
};
|
|
15892
15806
|
}
|
|
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 });
|
|
15807
|
+
options.setRegistrationResult(toRegistrationResult(result));
|
|
15910
15808
|
options.setStep("success");
|
|
15911
15809
|
return {
|
|
15912
15810
|
ok: true,
|
|
@@ -15969,16 +15867,13 @@ function useEventRegistrationWizardWithDeps(options, deps) {
|
|
|
15969
15867
|
const scopedEvents = useMemo(() => {
|
|
15970
15868
|
return resolveEventRegistrationScopedEvents(registrationEvents, {
|
|
15971
15869
|
occurrenceContext: options.occurrenceContext,
|
|
15972
|
-
subject: options.subject
|
|
15973
|
-
contentEntry: options.contentEntry
|
|
15870
|
+
subject: options.subject
|
|
15974
15871
|
});
|
|
15975
15872
|
}, [
|
|
15976
15873
|
registrationEvents,
|
|
15977
15874
|
options.occurrenceContext?.seriesId,
|
|
15978
15875
|
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
|
|
15876
|
+
options.subject?.kind === "eventSeries" ? options.subject.eventSeriesId : options.subject?.kind === "eventOffering" ? `${options.subject.eventOfferingId}:${options.subject.availableEventSeriesIds.join(",")}` : options.subject?.reason
|
|
15982
15877
|
]);
|
|
15983
15878
|
const preSelectedEvent = useMemo(() => findPreSelectedEvent({
|
|
15984
15879
|
scopedEvents,
|
|
@@ -16518,7 +16413,6 @@ function useEventRegistrationWizardWithDeps(options, deps) {
|
|
|
16518
16413
|
anchorId: options.anchorId,
|
|
16519
16414
|
occurrenceContext: options.occurrenceContext,
|
|
16520
16415
|
registrationTarget,
|
|
16521
|
-
contentEntry: options.contentEntry,
|
|
16522
16416
|
subject: options.subject,
|
|
16523
16417
|
events: options.events,
|
|
16524
16418
|
maxTicketsNum: waitlistClaim.claim ? 1 : options.maxTicketsNum,
|
|
@@ -16862,7 +16756,7 @@ function formatTicketTypePrice(ticketType, currency) {
|
|
|
16862
16756
|
return formatCurrencyAmount(ticketType.priceAmount, currency, { decimals: "auto" });
|
|
16863
16757
|
}
|
|
16864
16758
|
function EventRegistrationWizard(props) {
|
|
16865
|
-
const { occurrenceContext,
|
|
16759
|
+
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
16760
|
const maxTicketsNum = normalizeEventRegistrationMaxTickets(maxTickets);
|
|
16867
16761
|
const showSpamProtection = spamProtectionEnabled ?? isSpamProtectionEnabled();
|
|
16868
16762
|
const buttonClass = themeButtonClassName({
|
|
@@ -16874,7 +16768,6 @@ function EventRegistrationWizard(props) {
|
|
|
16874
16768
|
const wizard = useEventRegistrationWizard({
|
|
16875
16769
|
anchorId: EVENT_REGISTRATION_ANCHOR_ID,
|
|
16876
16770
|
occurrenceContext: occurrenceContext ?? null,
|
|
16877
|
-
contentEntry: contentEntry ?? null,
|
|
16878
16771
|
subject: subject ?? null,
|
|
16879
16772
|
events: events ?? [],
|
|
16880
16773
|
maxTicketsNum
|
|
@@ -17626,6 +17519,37 @@ function EnrollmentForm({ formData, errors, onChange, isEmailLocked, isLoading,
|
|
|
17626
17519
|
] });
|
|
17627
17520
|
}
|
|
17628
17521
|
//#endregion
|
|
17522
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/pricing.ts
|
|
17523
|
+
function parseCurrencyInputToCents(value) {
|
|
17524
|
+
const trimmed = value.trim();
|
|
17525
|
+
if (!trimmed) return null;
|
|
17526
|
+
const amount = Number(trimmed);
|
|
17527
|
+
if (!Number.isFinite(amount) || amount < 0) return null;
|
|
17528
|
+
return Math.round(amount * 100);
|
|
17529
|
+
}
|
|
17530
|
+
function formatCentsAsCurrencyInput(amount) {
|
|
17531
|
+
const major = amount / 100;
|
|
17532
|
+
return Number.isInteger(major) ? String(major) : major.toFixed(2);
|
|
17533
|
+
}
|
|
17534
|
+
function getMissingCoursePricingSelectionMessage(pricing) {
|
|
17535
|
+
if (pricing?.requiresSelection && !pricing.selectedOption) return pricing.slidingScale ? "Choose an amount to continue." : "Choose a pricing option to continue.";
|
|
17536
|
+
const selectedAmount = pricing?.selectedSlidingAmount;
|
|
17537
|
+
const scale = pricing?.slidingScale;
|
|
17538
|
+
if (scale && selectedAmount !== null && selectedAmount !== void 0 && (selectedAmount < scale.minAmount || selectedAmount > scale.maxAmount)) return "Choose an amount within the sliding scale.";
|
|
17539
|
+
return null;
|
|
17540
|
+
}
|
|
17541
|
+
function buildCoursePricingOptionPayload(pricing) {
|
|
17542
|
+
if (pricing?.selectedOption) return { pricingOptionId: pricing.selectedOption.id };
|
|
17543
|
+
if (pricing?.slidingScale && pricing.selectedSlidingAmount !== null) return { selectedSlidingAmount: pricing.selectedSlidingAmount };
|
|
17544
|
+
return {};
|
|
17545
|
+
}
|
|
17546
|
+
function defaultCoursePricingSelection(pricing, previousOptionId) {
|
|
17547
|
+
return {
|
|
17548
|
+
pricingOptionId: previousOptionId && pricing.selectableOptions.some((option) => option.id === previousOptionId) ? previousOptionId : pricing.selectedOption?.id ?? null,
|
|
17549
|
+
slidingAmountInput: pricing.slidingScale?.suggestedAmount !== null && pricing.slidingScale?.suggestedAmount !== void 0 ? formatCentsAsCurrencyInput(pricing.slidingScale.suggestedAmount) : ""
|
|
17550
|
+
};
|
|
17551
|
+
}
|
|
17552
|
+
//#endregion
|
|
17629
17553
|
//#region ../blocks/src/system/runtime/nodes/course-registration/wizardSteps.ts
|
|
17630
17554
|
/**
|
|
17631
17555
|
* Steps that are part of the main wizard and should show the step indicator.
|
|
@@ -17698,654 +17622,608 @@ function getStepLabels(steps) {
|
|
|
17698
17622
|
return steps.map((step) => STEP_LABELS[step] ?? step);
|
|
17699
17623
|
}
|
|
17700
17624
|
//#endregion
|
|
17701
|
-
//#region ../blocks/src/system/runtime/nodes/course-registration/
|
|
17702
|
-
function
|
|
17703
|
-
const
|
|
17704
|
-
|
|
17705
|
-
const
|
|
17706
|
-
|
|
17707
|
-
|
|
17625
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.ts
|
|
17626
|
+
function deriveCourseRegistrationViewState(input) {
|
|
17627
|
+
const hasCoursePayment = resolveCoursePaymentRequirement(input.pricing);
|
|
17628
|
+
const canUseMembership = hasCoursePayment && input.selectedCourse?.acceptsMemberships === true && input.portalAuthState === "authenticated" && input.eligibleMembershipCount > 0;
|
|
17629
|
+
const hasPreSelectedCourse = input.scopedCourses.length === 1;
|
|
17630
|
+
const fastTrack = canUseMembership && input.eligibleMembershipCount === 1 && input.bookingMode === "membership";
|
|
17631
|
+
const wizardSteps = getWizardStepsForContext(hasPreSelectedCourse, hasCoursePayment, canUseMembership, input.bookingMode, fastTrack);
|
|
17632
|
+
const showPortalAuthSidebar = shouldShowPortalAuthSidebar({
|
|
17633
|
+
...input,
|
|
17634
|
+
hasCoursePayment
|
|
17635
|
+
});
|
|
17636
|
+
return {
|
|
17637
|
+
hasCoursePayment,
|
|
17638
|
+
canUseMembership,
|
|
17639
|
+
hasPreSelectedCourse,
|
|
17640
|
+
wizardSteps,
|
|
17641
|
+
currentStepNumber: getStepNumber(input.step, wizardSteps),
|
|
17642
|
+
totalSteps: wizardSteps.length,
|
|
17643
|
+
stepLabels: getStepLabels(wizardSteps),
|
|
17644
|
+
showPortalAuthSidebar
|
|
17645
|
+
};
|
|
17708
17646
|
}
|
|
17709
|
-
function
|
|
17710
|
-
|
|
17711
|
-
return
|
|
17647
|
+
function resolveCoursePaymentRequirement(pricing) {
|
|
17648
|
+
if (!pricing) return false;
|
|
17649
|
+
return pricing.selectedOption ? pricing.selectedRequiresPayment : pricing.hasPaidSelection;
|
|
17712
17650
|
}
|
|
17713
|
-
function
|
|
17714
|
-
if (
|
|
17715
|
-
if (
|
|
17716
|
-
|
|
17717
|
-
const needsWaitlistAvailabilityCheck = course.availableSpots !== null && course.availableSpots <= 0;
|
|
17718
|
-
return needsMembershipEligibility || needsWaitlistAvailabilityCheck;
|
|
17651
|
+
function shouldShowPortalAuthSidebar(input) {
|
|
17652
|
+
if (input.portalAuthState !== "unauthenticated") return false;
|
|
17653
|
+
if (input.step === "success" || input.step === "waitlist" || input.step === "error") return false;
|
|
17654
|
+
return input.waitlistRequiresPortalLogin || input.hasCoursePayment && input.selectedCourse?.acceptsMemberships === true && input.step !== "select-course";
|
|
17719
17655
|
}
|
|
17720
|
-
|
|
17721
|
-
|
|
17722
|
-
|
|
17723
|
-
|
|
17724
|
-
|
|
17725
|
-
|
|
17726
|
-
|
|
17727
|
-
|
|
17728
|
-
|
|
17729
|
-
|
|
17730
|
-
|
|
17656
|
+
//#endregion
|
|
17657
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.ts
|
|
17658
|
+
function shouldFetchEligibility(input) {
|
|
17659
|
+
if (!input.course || input.portalAuthState === "checking" || input.hasWaitlistClaimToken) return false;
|
|
17660
|
+
const membershipCheck = input.portalAuthState === "authenticated" && input.hasPaidSelection && input.course.acceptsMemberships;
|
|
17661
|
+
const capacityCheck = input.course.availableSpots !== null && input.course.availableSpots <= 0;
|
|
17662
|
+
return membershipCheck || capacityCheck;
|
|
17663
|
+
}
|
|
17664
|
+
function useCourseEligibility(input) {
|
|
17665
|
+
const [loading, setLoading] = useState(false);
|
|
17666
|
+
const [error, setError] = useState(null);
|
|
17667
|
+
const [eligibility, setEligibility] = useState(null);
|
|
17668
|
+
const [memberships, setMemberships] = useState([]);
|
|
17669
|
+
const [paymentChoice, setPaymentChoice] = useState("checkout");
|
|
17670
|
+
const [selectedMembershipId, setSelectedMembershipId] = useState(null);
|
|
17671
|
+
const choosePaymentChoice = useCallback((choice) => {
|
|
17672
|
+
setPaymentChoice(choice);
|
|
17673
|
+
}, []);
|
|
17674
|
+
const chooseMembership = useCallback((membershipId) => {
|
|
17675
|
+
setSelectedMembershipId(membershipId);
|
|
17676
|
+
}, []);
|
|
17677
|
+
useEffect(() => {
|
|
17678
|
+
let cancelled = false;
|
|
17679
|
+
setEligibility(null);
|
|
17680
|
+
setMemberships([]);
|
|
17681
|
+
setSelectedMembershipId(null);
|
|
17682
|
+
setError(null);
|
|
17683
|
+
setPaymentChoice("checkout");
|
|
17684
|
+
const eligibilityInput = {
|
|
17685
|
+
course: input.selectedCourse,
|
|
17686
|
+
hasPaidSelection: input.hasPaidSelection,
|
|
17687
|
+
portalAuthState: input.portalAuthState,
|
|
17688
|
+
hasWaitlistClaimToken: input.waitlistClaimToken !== null
|
|
17689
|
+
};
|
|
17690
|
+
if (!shouldFetchEligibility(eligibilityInput)) return;
|
|
17691
|
+
const course = eligibilityInput.course;
|
|
17692
|
+
setLoading(true);
|
|
17693
|
+
input.api.checkWholeSeriesEligibility({ eventSeriesId: course.eventSeriesId }).then((result) => {
|
|
17694
|
+
if (cancelled) return;
|
|
17695
|
+
const eligibleMemberships = result.eligibleMemberships ?? [];
|
|
17696
|
+
setEligibility(result);
|
|
17697
|
+
setMemberships(eligibleMemberships);
|
|
17698
|
+
if (input.portalAuthState === "authenticated" && eligibleMemberships.length > 0) {
|
|
17699
|
+
setPaymentChoice("membership");
|
|
17700
|
+
if (eligibleMemberships.length === 1) setSelectedMembershipId(eligibleMemberships[0]?.customerMembershipId ?? null);
|
|
17701
|
+
}
|
|
17702
|
+
}).catch((cause) => {
|
|
17703
|
+
if (!cancelled) setError(cause instanceof Error ? cause.message : "Failed to check membership eligibility");
|
|
17704
|
+
}).finally(() => {
|
|
17705
|
+
if (!cancelled) setLoading(false);
|
|
17706
|
+
});
|
|
17707
|
+
return () => {
|
|
17708
|
+
cancelled = true;
|
|
17709
|
+
};
|
|
17710
|
+
}, [
|
|
17711
|
+
input.api,
|
|
17712
|
+
input.hasPaidSelection,
|
|
17713
|
+
input.portalAuthState,
|
|
17714
|
+
input.selectedCourse,
|
|
17715
|
+
input.waitlistClaimToken
|
|
17716
|
+
]);
|
|
17717
|
+
return {
|
|
17718
|
+
eligibilityLoading: loading,
|
|
17719
|
+
eligibilityError: error,
|
|
17720
|
+
courseEligibility: eligibility,
|
|
17721
|
+
eligibleMemberships: memberships,
|
|
17722
|
+
paymentChoice,
|
|
17723
|
+
choosePaymentChoice,
|
|
17724
|
+
selectedMembershipId,
|
|
17725
|
+
chooseMembership
|
|
17726
|
+
};
|
|
17727
|
+
}
|
|
17728
|
+
//#endregion
|
|
17729
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.ts
|
|
17730
|
+
function selectScopedCourses(props) {
|
|
17731
|
+
const surfaceScope = resolveCoursePageSurfaceScope(props.courses ?? [], props.subject);
|
|
17732
|
+
if (surfaceScope.kind === "unsupported") return [];
|
|
17733
|
+
if (surfaceScope.kind === "scoped") return surfaceScope.courses;
|
|
17734
|
+
return [];
|
|
17735
|
+
}
|
|
17736
|
+
function getCourseCheckoutSessionId() {
|
|
17731
17737
|
const fromSearch = new URLSearchParams(window.location.search).get("session_id");
|
|
17732
17738
|
if (fromSearch) return fromSearch;
|
|
17733
17739
|
return window.location.hash.match(/[?&]session_id=([^&]+)/)?.[1] ?? null;
|
|
17734
17740
|
}
|
|
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;
|
|
17741
|
+
function initialStep(courses) {
|
|
17742
|
+
if (new URLSearchParams(window.location.search).get("enrollment") === "success" && getCourseCheckoutSessionId()) return "verifying-payment";
|
|
17743
|
+
return courses.length === 1 ? "enter-details" : "select-course";
|
|
17753
17744
|
}
|
|
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
|
-
});
|
|
17745
|
+
function useCourseRegistrationSelection(props) {
|
|
17746
|
+
const scopedCourses = useMemo(() => selectScopedCourses(props), [props.courses, props.subject]);
|
|
17747
|
+
const [step, setStep] = useState(() => initialStep(scopedCourses));
|
|
17788
17748
|
const [selectedCourse, setSelectedCourse] = useState(scopedCourses.length === 1 ? scopedCourses[0] ?? null : null);
|
|
17789
17749
|
const [selectedPricingOptionId, setSelectedPricingOptionId] = useState(null);
|
|
17790
17750
|
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();
|
|
17751
|
+
const goToStep = useCallback((nextStep) => {
|
|
17752
|
+
setStep(nextStep);
|
|
17753
|
+
}, []);
|
|
17754
|
+
const chooseCourse = useCallback((course) => {
|
|
17755
|
+
setSelectedCourse(course);
|
|
17756
|
+
}, []);
|
|
17757
|
+
const choosePricingOption = useCallback((pricingOptionId) => {
|
|
17758
|
+
setSelectedPricingOptionId(pricingOptionId);
|
|
17759
|
+
}, []);
|
|
17760
|
+
const changeSlidingAmount = useCallback((amount) => {
|
|
17761
|
+
setSelectedSlidingAmountInput(amount);
|
|
17762
|
+
}, []);
|
|
17811
17763
|
const selectedCoursePricing = useMemo(() => selectedCourse ? resolveCoursePricingState(selectedCourse, selectedPricingOptionId, parseCurrencyInputToCents(selectedSlidingAmountInput)) : null, [
|
|
17812
17764
|
selectedCourse,
|
|
17813
17765
|
selectedPricingOptionId,
|
|
17814
17766
|
selectedSlidingAmountInput
|
|
17815
17767
|
]);
|
|
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
17768
|
useEffect(() => {
|
|
17882
17769
|
if (!selectedCourse) {
|
|
17883
17770
|
setSelectedPricingOptionId(null);
|
|
17884
17771
|
setSelectedSlidingAmountInput("");
|
|
17885
17772
|
return;
|
|
17886
17773
|
}
|
|
17887
|
-
const
|
|
17888
|
-
|
|
17889
|
-
|
|
17890
|
-
if (previous && defaultPricing.selectableOptions.some((option) => option.id === previous)) return previous;
|
|
17891
|
-
return defaultPricing.selectedOption?.id ?? null;
|
|
17892
|
-
});
|
|
17774
|
+
const selection = defaultCoursePricingSelection(resolveCoursePricingState(selectedCourse, null), selectedPricingOptionId);
|
|
17775
|
+
setSelectedPricingOptionId(selection.pricingOptionId);
|
|
17776
|
+
setSelectedSlidingAmountInput(selection.slidingAmountInput);
|
|
17893
17777
|
}, [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
|
-
|
|
17778
|
+
return {
|
|
17779
|
+
scopedCourses,
|
|
17780
|
+
step,
|
|
17781
|
+
goToStep,
|
|
17782
|
+
selectedCourse,
|
|
17783
|
+
chooseCourse,
|
|
17784
|
+
selectedPricingOptionId,
|
|
17785
|
+
choosePricingOption,
|
|
17786
|
+
selectedSlidingAmountInput,
|
|
17787
|
+
changeSlidingAmount,
|
|
17788
|
+
selectedCoursePricing
|
|
17789
|
+
};
|
|
17790
|
+
}
|
|
17791
|
+
//#endregion
|
|
17792
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.ts
|
|
17793
|
+
function applyTerminalStatus(status, setters) {
|
|
17794
|
+
if (status === "enrolled" || status === "completed") {
|
|
17795
|
+
setters.setEnrollmentResult({
|
|
17796
|
+
status: "enrolled",
|
|
17797
|
+
usedMembership: false
|
|
17798
|
+
});
|
|
17799
|
+
setters.setStep("success");
|
|
17800
|
+
return true;
|
|
17801
|
+
}
|
|
17802
|
+
if (status === "waitlist") {
|
|
17803
|
+
setters.setEnrollmentResult({
|
|
17804
|
+
status: "waitlist",
|
|
17805
|
+
usedMembership: false
|
|
17806
|
+
});
|
|
17807
|
+
setters.setStep("waitlist");
|
|
17808
|
+
return true;
|
|
17809
|
+
}
|
|
17810
|
+
setters.setErrorMessage("Payment did not complete. Please try again.");
|
|
17811
|
+
setters.setStep("error");
|
|
17812
|
+
return true;
|
|
17813
|
+
}
|
|
17814
|
+
async function pollCourseRegistrationStatus(api, sessionId, setters, isCancelled) {
|
|
17815
|
+
const startedAt = Date.now();
|
|
17816
|
+
while (!isCancelled()) {
|
|
17817
|
+
try {
|
|
17818
|
+
const result = await api.getWholeSeriesRegistrationStatus({ sessionId });
|
|
17819
|
+
if (isCancelled()) return;
|
|
17820
|
+
if (result.status !== "pending_payment") {
|
|
17821
|
+
applyTerminalStatus(result.status, setters);
|
|
17822
|
+
return;
|
|
17921
17823
|
}
|
|
17824
|
+
} catch (cause) {
|
|
17825
|
+
setters.setErrorMessage(cause instanceof Error ? cause.message : "Failed to verify payment");
|
|
17922
17826
|
}
|
|
17923
|
-
|
|
17924
|
-
|
|
17925
|
-
|
|
17926
|
-
|
|
17927
|
-
|
|
17928
|
-
|
|
17929
|
-
|
|
17930
|
-
|
|
17931
|
-
|
|
17932
|
-
waitlistClaim.token
|
|
17933
|
-
]);
|
|
17827
|
+
if (Date.now() - startedAt > 3e4) {
|
|
17828
|
+
setters.setErrorMessage("Payment is still processing. Please check your email for confirmation.");
|
|
17829
|
+
setters.setStep("error");
|
|
17830
|
+
return;
|
|
17831
|
+
}
|
|
17832
|
+
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
17833
|
+
}
|
|
17834
|
+
}
|
|
17835
|
+
function useCoursePaymentVerification(api, setters) {
|
|
17934
17836
|
useEffect(() => {
|
|
17935
17837
|
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;
|
|
17838
|
+
const enrollment = new URLSearchParams(window.location.search).get("enrollment");
|
|
17839
|
+
const sessionId = getCourseCheckoutSessionId();
|
|
17840
|
+
if (enrollment === "cancelled") {
|
|
17946
17841
|
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
|
-
}
|
|
17842
|
+
setters.setErrorMessage("Payment was cancelled. You can try again.");
|
|
17843
|
+
setters.setStep("error");
|
|
17844
|
+
return;
|
|
17985
17845
|
}
|
|
17986
|
-
|
|
17846
|
+
if (enrollment !== "success" || !sessionId) return;
|
|
17847
|
+
scrollToBlock(COURSE_REGISTRATION_ANCHOR_ID);
|
|
17848
|
+
setters.setStep("verifying-payment");
|
|
17849
|
+
pollCourseRegistrationStatus(api, sessionId, setters, () => cancelled);
|
|
17987
17850
|
return () => {
|
|
17988
17851
|
cancelled = true;
|
|
17989
17852
|
};
|
|
17990
|
-
}, [
|
|
17991
|
-
|
|
17992
|
-
|
|
17993
|
-
|
|
17994
|
-
|
|
17853
|
+
}, [
|
|
17854
|
+
api,
|
|
17855
|
+
setters.setEnrollmentResult,
|
|
17856
|
+
setters.setErrorMessage,
|
|
17857
|
+
setters.setStep
|
|
17858
|
+
]);
|
|
17859
|
+
}
|
|
17860
|
+
//#endregion
|
|
17861
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.ts
|
|
17862
|
+
function blocked(message, setters) {
|
|
17863
|
+
setters.setErrorMessage(message);
|
|
17864
|
+
setters.setStep("error");
|
|
17865
|
+
return {
|
|
17866
|
+
kind: "blocked",
|
|
17867
|
+
message
|
|
17995
17868
|
};
|
|
17996
|
-
|
|
17997
|
-
|
|
17998
|
-
|
|
17869
|
+
}
|
|
17870
|
+
function validateSubmission(state, setters) {
|
|
17871
|
+
if (!state.selectedCourse) return {
|
|
17872
|
+
kind: "blocked",
|
|
17873
|
+
message: "Choose an available set of dates to continue."
|
|
17874
|
+
};
|
|
17875
|
+
const errors = validateFormData$1(state.formData);
|
|
17876
|
+
setters.setErrors(errors);
|
|
17877
|
+
if (Object.keys(errors).length > 0) return { kind: "validation-failed" };
|
|
17878
|
+
const pricingMessage = getMissingCoursePricingSelectionMessage(state.pricing);
|
|
17879
|
+
if (pricingMessage) return blocked(pricingMessage, setters);
|
|
17880
|
+
if (!state.hasClaim && state.eligibility?.isFull && !state.eligibility.canJoinWaitlist) return blocked(state.eligibility.reason ?? "This course is fully booked.", setters);
|
|
17881
|
+
if (isSpamProtectionEnabled() && !state.altchaSolution) return blocked("Please complete the verification check.", setters);
|
|
17882
|
+
return null;
|
|
17883
|
+
}
|
|
17884
|
+
function enrollmentPayload(state, payment) {
|
|
17885
|
+
return {
|
|
17886
|
+
...registrantPayload(state),
|
|
17887
|
+
paymentMethod: payment.method,
|
|
17888
|
+
...payment.method === "membership" ? { customerMembershipId: payment.membershipId } : {}
|
|
17999
17889
|
};
|
|
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
|
-
|
|
17890
|
+
}
|
|
17891
|
+
function registrantPayload(state) {
|
|
17892
|
+
return {
|
|
17893
|
+
eventSeriesId: state.selectedCourse.eventSeriesId,
|
|
17894
|
+
...buildCoursePricingOptionPayload(state.pricing),
|
|
17895
|
+
email: state.formData.email.trim().toLowerCase(),
|
|
17896
|
+
name: state.formData.name.trim(),
|
|
17897
|
+
phone: state.formData.phone.trim() || void 0,
|
|
17898
|
+
formData: { notes: state.formData.notes.trim() || void 0 },
|
|
17899
|
+
altchaSolution: state.altchaSolution,
|
|
17900
|
+
claimToken: state.claimToken ?? void 0
|
|
17901
|
+
};
|
|
17902
|
+
}
|
|
17903
|
+
async function enroll(state, setters, payment) {
|
|
17904
|
+
setters.setStep("submitting");
|
|
17905
|
+
try {
|
|
17906
|
+
const result = await state.api.registerForWholeSeries(enrollmentPayload(state, payment));
|
|
17907
|
+
setters.setEnrollmentResult({
|
|
17908
|
+
status: result.status,
|
|
17909
|
+
waitlistPosition: result.waitlistPosition ?? void 0,
|
|
17910
|
+
usedMembership: payment.method === "membership"
|
|
17911
|
+
});
|
|
17912
|
+
setters.setStep(result.status === "waitlist" ? "waitlist" : "success");
|
|
17913
|
+
return { kind: "state-updated" };
|
|
17914
|
+
} catch (cause) {
|
|
17915
|
+
const message = cause instanceof Error ? cause.message : "Booking failed";
|
|
17916
|
+
setters.setErrorMessage(message);
|
|
17917
|
+
setters.setStep("error");
|
|
17918
|
+
return {
|
|
17919
|
+
kind: "failed",
|
|
17920
|
+
message
|
|
18028
17921
|
};
|
|
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"
|
|
17922
|
+
}
|
|
17923
|
+
}
|
|
17924
|
+
async function checkout(state, setters) {
|
|
17925
|
+
setters.setStep("submitting");
|
|
17926
|
+
try {
|
|
17927
|
+
const urls = buildCheckoutReturnUrls("enrollment", COURSE_REGISTRATION_ANCHOR_ID);
|
|
17928
|
+
const result = await state.api.createWholeSeriesCheckout({
|
|
17929
|
+
...registrantPayload(state),
|
|
17930
|
+
discountCode: state.discountCode.trim() || void 0,
|
|
17931
|
+
successUrl: urls.successUrl,
|
|
17932
|
+
cancelUrl: urls.cancelUrl
|
|
17933
|
+
});
|
|
17934
|
+
if (result.bypassed) {
|
|
17935
|
+
setters.setEnrollmentResult({
|
|
17936
|
+
status: "enrolled",
|
|
17937
|
+
usedMembership: false
|
|
18125
17938
|
});
|
|
18126
|
-
setStep(
|
|
17939
|
+
setters.setStep("success");
|
|
18127
17940
|
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
17941
|
}
|
|
18137
|
-
|
|
18138
|
-
|
|
18139
|
-
if (
|
|
18140
|
-
|
|
18141
|
-
|
|
17942
|
+
if (!result.checkoutUrl) throw new Error("Checkout URL missing");
|
|
17943
|
+
setters.setStep("redirecting");
|
|
17944
|
+
if (state.options.onCheckoutRedirect) state.options.onCheckoutRedirect(result.checkoutUrl);
|
|
17945
|
+
else window.location.href = result.checkoutUrl;
|
|
17946
|
+
return {
|
|
17947
|
+
kind: "checkout-redirect",
|
|
17948
|
+
checkoutUrl: result.checkoutUrl
|
|
18142
17949
|
};
|
|
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."
|
|
17950
|
+
} catch (cause) {
|
|
17951
|
+
const message = cause instanceof Error ? cause.message : "Checkout failed";
|
|
17952
|
+
setters.setErrorMessage(message);
|
|
17953
|
+
setters.setStep("error");
|
|
17954
|
+
return {
|
|
17955
|
+
kind: "failed",
|
|
17956
|
+
message
|
|
18156
17957
|
};
|
|
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
|
-
}
|
|
17958
|
+
}
|
|
17959
|
+
}
|
|
17960
|
+
async function submitDetails(state, setters) {
|
|
17961
|
+
const invalid = validateSubmission(state, setters);
|
|
17962
|
+
if (invalid || !state.selectedCourse) return invalid ?? { kind: "validation-failed" };
|
|
17963
|
+
if (state.eligibility?.canJoinWaitlist) return enroll(state, setters, { method: "free" });
|
|
17964
|
+
const requiresPayment = state.pricing?.selectedRequiresPayment ?? false;
|
|
17965
|
+
const canUseMembership = requiresPayment && state.selectedCourse.acceptsMemberships && state.portalAuthState === "authenticated" && state.eligibleMemberships.length > 0;
|
|
17966
|
+
if (requiresPayment && canUseMembership) {
|
|
17967
|
+
setters.setStep("select-payment");
|
|
17968
|
+
return { kind: "state-updated" };
|
|
17969
|
+
}
|
|
17970
|
+
if (requiresPayment) return checkout(state, setters);
|
|
17971
|
+
return enroll(state, setters, { method: "free" });
|
|
17972
|
+
}
|
|
17973
|
+
async function continuePayment(state, setters) {
|
|
17974
|
+
const invalid = validateSubmission(state, setters);
|
|
17975
|
+
if (invalid || !state.selectedCourse) return invalid ?? { kind: "validation-failed" };
|
|
17976
|
+
if (!state.pricing?.selectedRequiresPayment) {
|
|
17977
|
+
setters.setStep("enter-details");
|
|
17978
|
+
return { kind: "state-updated" };
|
|
17979
|
+
}
|
|
17980
|
+
const selectedState = state;
|
|
17981
|
+
if (state.paymentChoice === "membership") {
|
|
17982
|
+
if (!state.selectedMembershipId) return blocked("Select a membership to sign up.", setters);
|
|
17983
|
+
return enroll(selectedState, setters, {
|
|
17984
|
+
method: "membership",
|
|
17985
|
+
membershipId: state.selectedMembershipId
|
|
17986
|
+
});
|
|
17987
|
+
}
|
|
17988
|
+
return checkout(selectedState, setters);
|
|
17989
|
+
}
|
|
17990
|
+
function useCourseRegistrationActions(state, setStep) {
|
|
17991
|
+
const [errors, setErrors] = useState({});
|
|
17992
|
+
const [enrollmentResult, setEnrollmentResult] = useState(null);
|
|
17993
|
+
const [errorMessage, setErrorMessage] = useState("");
|
|
17994
|
+
const reportError = useCallback((message) => {
|
|
17995
|
+
setErrorMessage(message);
|
|
17996
|
+
}, []);
|
|
17997
|
+
const recordEnrollmentResult = useCallback((result) => {
|
|
17998
|
+
setEnrollmentResult(result);
|
|
17999
|
+
}, []);
|
|
18000
|
+
const setters = {
|
|
18001
|
+
setStep,
|
|
18002
|
+
setErrors,
|
|
18003
|
+
setEnrollmentResult,
|
|
18004
|
+
setErrorMessage
|
|
18253
18005
|
};
|
|
18254
|
-
|
|
18255
|
-
|
|
18256
|
-
|
|
18006
|
+
return {
|
|
18007
|
+
errors,
|
|
18008
|
+
enrollmentResult,
|
|
18009
|
+
errorMessage,
|
|
18010
|
+
reportError,
|
|
18011
|
+
recordEnrollmentResult,
|
|
18012
|
+
handleSubmit: () => submitDetails(state, setters),
|
|
18013
|
+
handlePaymentContinue: () => continuePayment(state, setters)
|
|
18257
18014
|
};
|
|
18258
|
-
|
|
18259
|
-
|
|
18260
|
-
|
|
18261
|
-
|
|
18015
|
+
}
|
|
18016
|
+
//#endregion
|
|
18017
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.ts
|
|
18018
|
+
const EMPTY_FORM$1 = {
|
|
18019
|
+
name: "",
|
|
18020
|
+
email: "",
|
|
18021
|
+
phone: "",
|
|
18022
|
+
notes: ""
|
|
18023
|
+
};
|
|
18024
|
+
function useCourseRegistrationPortal(api) {
|
|
18025
|
+
const [formData, setFormData] = useState(EMPTY_FORM$1);
|
|
18026
|
+
const [portalAuthState, setPortalAuthState] = useState("checking");
|
|
18027
|
+
const updateFormData = useCallback((updater) => {
|
|
18028
|
+
setFormData(updater);
|
|
18029
|
+
}, []);
|
|
18030
|
+
useEffect(() => {
|
|
18031
|
+
let cancelled = false;
|
|
18032
|
+
if (!(api.config.auth.type === "bearer" || api.config.authOverrides?.portal?.type === "bearer")) {
|
|
18033
|
+
setPortalAuthState("unauthenticated");
|
|
18034
|
+
return;
|
|
18035
|
+
}
|
|
18036
|
+
setPortalAuthState("checking");
|
|
18037
|
+
api.getPortalProfile().then((result) => {
|
|
18038
|
+
if (cancelled) return;
|
|
18039
|
+
setPortalAuthState("authenticated");
|
|
18040
|
+
setFormData((current) => ({
|
|
18041
|
+
...current,
|
|
18042
|
+
email: result.profile.email,
|
|
18043
|
+
name: current.name || result.profile.name,
|
|
18044
|
+
phone: current.phone || result.profile.phone || ""
|
|
18045
|
+
}));
|
|
18046
|
+
}).catch(() => {
|
|
18047
|
+
if (!cancelled) setPortalAuthState("unauthenticated");
|
|
18048
|
+
});
|
|
18049
|
+
return () => {
|
|
18050
|
+
cancelled = true;
|
|
18051
|
+
};
|
|
18052
|
+
}, [api]);
|
|
18053
|
+
return {
|
|
18054
|
+
formData,
|
|
18055
|
+
updateFormData,
|
|
18056
|
+
portalAuthState
|
|
18262
18057
|
};
|
|
18058
|
+
}
|
|
18059
|
+
//#endregion
|
|
18060
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.ts
|
|
18061
|
+
function useCourseWaitlistSelection(input) {
|
|
18062
|
+
useEffect(() => {
|
|
18063
|
+
const claim = input.waitlistClaim.claim;
|
|
18064
|
+
if (!claim || claim.subject.kind !== "whole_series") return;
|
|
18065
|
+
const eventSeriesId = claim.subject.eventSeriesId;
|
|
18066
|
+
const course = input.scopedCourses.find((candidate) => candidate.eventSeriesId === eventSeriesId);
|
|
18067
|
+
if (!course) {
|
|
18068
|
+
input.reportError("This waitlist claim is for a different course.");
|
|
18069
|
+
input.goToStep("error");
|
|
18070
|
+
return;
|
|
18071
|
+
}
|
|
18072
|
+
input.chooseCourse(course);
|
|
18073
|
+
input.updateFormData((current) => ({
|
|
18074
|
+
...current,
|
|
18075
|
+
email: claim.prefill.email,
|
|
18076
|
+
name: claim.prefill.name,
|
|
18077
|
+
phone: claim.prefill.phone ?? "",
|
|
18078
|
+
notes: claim.prefill.notes ?? ""
|
|
18079
|
+
}));
|
|
18080
|
+
if (input.step === "select-course") input.goToStep("enter-details");
|
|
18081
|
+
}, [
|
|
18082
|
+
input.chooseCourse,
|
|
18083
|
+
input.goToStep,
|
|
18084
|
+
input.reportError,
|
|
18085
|
+
input.scopedCourses,
|
|
18086
|
+
input.step,
|
|
18087
|
+
input.updateFormData,
|
|
18088
|
+
input.waitlistClaim.claim
|
|
18089
|
+
]);
|
|
18090
|
+
useEffect(() => {
|
|
18091
|
+
if (input.waitlistClaim.requiresPortalLogin || !input.waitlistClaim.error) return;
|
|
18092
|
+
input.reportError(input.waitlistClaim.error);
|
|
18093
|
+
input.goToStep("error");
|
|
18094
|
+
}, [
|
|
18095
|
+
input.goToStep,
|
|
18096
|
+
input.reportError,
|
|
18097
|
+
input.waitlistClaim.error,
|
|
18098
|
+
input.waitlistClaim.requiresPortalLogin
|
|
18099
|
+
]);
|
|
18100
|
+
}
|
|
18101
|
+
//#endregion
|
|
18102
|
+
//#region ../blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.ts
|
|
18103
|
+
function useCourseRegistrationWizard(props, options = {}) {
|
|
18104
|
+
const api = useBlockApi();
|
|
18105
|
+
const selection = useCourseRegistrationSelection(props);
|
|
18106
|
+
const portal = useCourseRegistrationPortal(api);
|
|
18107
|
+
const waitlistClaim = useWaitlistClaim();
|
|
18108
|
+
const [bookingMode, setBookingMode] = useState(null);
|
|
18109
|
+
const [altchaSolution, setAltchaSolution] = useState(null);
|
|
18110
|
+
const eligibility = useCourseEligibility({
|
|
18111
|
+
api,
|
|
18112
|
+
selectedCourse: selection.selectedCourse,
|
|
18113
|
+
hasPaidSelection: selection.selectedCoursePricing?.hasPaidSelection ?? false,
|
|
18114
|
+
portalAuthState: portal.portalAuthState,
|
|
18115
|
+
waitlistClaimToken: waitlistClaim.token
|
|
18116
|
+
});
|
|
18263
18117
|
const discountUi = useDiscountCodeUi({
|
|
18264
18118
|
api,
|
|
18265
|
-
discountContext: useMemo(() => {
|
|
18266
|
-
|
|
18267
|
-
|
|
18268
|
-
|
|
18269
|
-
|
|
18270
|
-
|
|
18271
|
-
|
|
18272
|
-
};
|
|
18273
|
-
}, [
|
|
18274
|
-
selectedCourse,
|
|
18275
|
-
selectedCoursePricing?.selectedRequiresPayment,
|
|
18276
|
-
paymentChoice
|
|
18119
|
+
discountContext: useMemo(() => selection.selectedCourse && selection.selectedCoursePricing?.selectedRequiresPayment && eligibility.paymentChoice === "checkout" ? {
|
|
18120
|
+
type: "whole_series",
|
|
18121
|
+
eventSeriesId: selection.selectedCourse.eventSeriesId
|
|
18122
|
+
} : null, [
|
|
18123
|
+
eligibility.paymentChoice,
|
|
18124
|
+
selection.selectedCourse,
|
|
18125
|
+
selection.selectedCoursePricing?.selectedRequiresPayment
|
|
18277
18126
|
]),
|
|
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 {
|
|
18127
|
+
subtotalCents: selection.selectedCoursePricing?.selectedPriceAmount ?? void 0
|
|
18128
|
+
});
|
|
18129
|
+
const actions = useCourseRegistrationActions({
|
|
18298
18130
|
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,
|
|
18131
|
+
selectedCourse: selection.selectedCourse,
|
|
18132
|
+
pricing: selection.selectedCoursePricing,
|
|
18133
|
+
formData: portal.formData,
|
|
18134
|
+
portalAuthState: portal.portalAuthState,
|
|
18135
|
+
eligibility: eligibility.courseEligibility,
|
|
18136
|
+
eligibleMemberships: eligibility.eligibleMemberships,
|
|
18137
|
+
paymentChoice: eligibility.paymentChoice,
|
|
18138
|
+
selectedMembershipId: eligibility.selectedMembershipId,
|
|
18139
|
+
claimToken: waitlistClaim.token,
|
|
18140
|
+
hasClaim: waitlistClaim.claim !== null,
|
|
18316
18141
|
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
18142
|
discountCode: discountUi.discountCode,
|
|
18330
|
-
|
|
18331
|
-
|
|
18332
|
-
|
|
18333
|
-
|
|
18334
|
-
|
|
18143
|
+
options
|
|
18144
|
+
}, selection.goToStep);
|
|
18145
|
+
useCourseRegistrationEffects({
|
|
18146
|
+
api,
|
|
18147
|
+
actions,
|
|
18148
|
+
portal,
|
|
18149
|
+
selection,
|
|
18150
|
+
waitlistClaim
|
|
18151
|
+
});
|
|
18152
|
+
return buildCourseRegistrationWizardResult({
|
|
18153
|
+
api,
|
|
18154
|
+
selection,
|
|
18155
|
+
portal,
|
|
18156
|
+
eligibility,
|
|
18157
|
+
actions,
|
|
18158
|
+
discountUi,
|
|
18335
18159
|
waitlistClaim,
|
|
18160
|
+
view: deriveCourseRegistrationViewState({
|
|
18161
|
+
scopedCourses: selection.scopedCourses,
|
|
18162
|
+
selectedCourse: selection.selectedCourse,
|
|
18163
|
+
pricing: selection.selectedCoursePricing,
|
|
18164
|
+
portalAuthState: portal.portalAuthState,
|
|
18165
|
+
eligibleMembershipCount: eligibility.eligibleMemberships.length,
|
|
18166
|
+
bookingMode,
|
|
18167
|
+
step: selection.step,
|
|
18168
|
+
waitlistRequiresPortalLogin: waitlistClaim.requiresPortalLogin
|
|
18169
|
+
}),
|
|
18336
18170
|
bookingMode,
|
|
18337
|
-
|
|
18338
|
-
|
|
18339
|
-
|
|
18340
|
-
|
|
18341
|
-
|
|
18342
|
-
|
|
18343
|
-
|
|
18344
|
-
|
|
18345
|
-
|
|
18346
|
-
|
|
18347
|
-
|
|
18348
|
-
|
|
18171
|
+
setBookingMode,
|
|
18172
|
+
altchaSolution,
|
|
18173
|
+
setAltchaSolution
|
|
18174
|
+
});
|
|
18175
|
+
}
|
|
18176
|
+
function useCourseRegistrationEffects(input) {
|
|
18177
|
+
useCoursePaymentVerification(input.api, {
|
|
18178
|
+
setStep: input.selection.goToStep,
|
|
18179
|
+
setErrorMessage: input.actions.reportError,
|
|
18180
|
+
setEnrollmentResult: input.actions.recordEnrollmentResult
|
|
18181
|
+
});
|
|
18182
|
+
useCourseWaitlistSelection({
|
|
18183
|
+
waitlistClaim: input.waitlistClaim,
|
|
18184
|
+
scopedCourses: input.selection.scopedCourses,
|
|
18185
|
+
step: input.selection.step,
|
|
18186
|
+
goToStep: input.selection.goToStep,
|
|
18187
|
+
chooseCourse: input.selection.chooseCourse,
|
|
18188
|
+
updateFormData: input.portal.updateFormData,
|
|
18189
|
+
reportError: input.actions.reportError
|
|
18190
|
+
});
|
|
18191
|
+
}
|
|
18192
|
+
function buildCourseRegistrationWizardResult(parts) {
|
|
18193
|
+
const handleBookingModeChange = (mode) => {
|
|
18194
|
+
parts.setBookingMode(mode);
|
|
18195
|
+
parts.eligibility.choosePaymentChoice(mode === "membership" ? "membership" : "checkout");
|
|
18196
|
+
};
|
|
18197
|
+
return {
|
|
18198
|
+
api: parts.api,
|
|
18199
|
+
...parts.selection,
|
|
18200
|
+
...parts.portal,
|
|
18201
|
+
...parts.eligibility,
|
|
18202
|
+
...parts.actions,
|
|
18203
|
+
waitlistClaim: parts.waitlistClaim,
|
|
18204
|
+
bookingMode: parts.bookingMode,
|
|
18205
|
+
altchaSolution: parts.altchaSolution,
|
|
18206
|
+
setAltchaSolution: parts.setAltchaSolution,
|
|
18207
|
+
showSpamProtection: isSpamProtectionEnabled(),
|
|
18208
|
+
discountUiOpen: parts.discountUi.discountUiOpen,
|
|
18209
|
+
setDiscountUiOpen: parts.discountUi.setDiscountUiOpen,
|
|
18210
|
+
discountCode: parts.discountUi.discountCode,
|
|
18211
|
+
setDiscountCode: parts.discountUi.setDiscountCode,
|
|
18212
|
+
discountsAvailable: parts.discountUi.discountsAvailable,
|
|
18213
|
+
manualCodeEntryAllowed: parts.discountUi.manualCodeEntryAllowed,
|
|
18214
|
+
discountsAvailableLoading: parts.discountUi.discountsAvailableLoading,
|
|
18215
|
+
...parts.view,
|
|
18216
|
+
handleCourseSelect: (course) => {
|
|
18217
|
+
parts.selection.chooseCourse(course);
|
|
18218
|
+
parts.selection.goToStep("enter-details");
|
|
18219
|
+
},
|
|
18220
|
+
handleRetry: () => {
|
|
18221
|
+
parts.selection.goToStep(parts.selection.scopedCourses.length === 1 ? "enter-details" : "select-course");
|
|
18222
|
+
parts.actions.reportError("");
|
|
18223
|
+
},
|
|
18224
|
+
handleBookingModeChange,
|
|
18225
|
+
handleLogout: parts.portal.portalAuthState === "authenticated" ? () => logoutPortal(COURSE_REGISTRATION_ANCHOR_ID) : void 0,
|
|
18226
|
+
selectedCoursePricingPayload: buildCoursePricingOptionPayload(parts.selection.selectedCoursePricing)
|
|
18349
18227
|
};
|
|
18350
18228
|
}
|
|
18351
18229
|
//#endregion
|
|
@@ -18761,7 +18639,7 @@ function getCourseSlidingScaleMessage(pricing) {
|
|
|
18761
18639
|
}
|
|
18762
18640
|
function CourseRegistrationWizard(props) {
|
|
18763
18641
|
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,
|
|
18642
|
+
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
18643
|
const buttonClass = themeButtonClassName({
|
|
18766
18644
|
variant: buttonVariant,
|
|
18767
18645
|
size: "md"
|
|
@@ -18826,13 +18704,13 @@ function CourseRegistrationWizard(props) {
|
|
|
18826
18704
|
className: "cr-course-list",
|
|
18827
18705
|
children: scopedCourses.map((course) => /* @__PURE__ */ jsx(CourseCard, {
|
|
18828
18706
|
course,
|
|
18829
|
-
isSelected: selectedCourse?.
|
|
18707
|
+
isSelected: selectedCourse?.eventSeriesId === course.eventSeriesId,
|
|
18830
18708
|
onSelect: () => handleCourseSelect(course),
|
|
18831
18709
|
showSessions,
|
|
18832
18710
|
showPrice,
|
|
18833
18711
|
showCapacity,
|
|
18834
18712
|
showVenue
|
|
18835
|
-
}, course.
|
|
18713
|
+
}, course.eventSeriesId))
|
|
18836
18714
|
}),
|
|
18837
18715
|
step === "enter-details" && selectedCourseWithPricing && /* @__PURE__ */ jsxs("div", {
|
|
18838
18716
|
className: "cr-details",
|
|
@@ -18849,7 +18727,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18849
18727
|
className: "cr-actions",
|
|
18850
18728
|
children: /* @__PURE__ */ jsx("button", {
|
|
18851
18729
|
type: "button",
|
|
18852
|
-
onClick: () =>
|
|
18730
|
+
onClick: () => goToStep("select-course"),
|
|
18853
18731
|
className: "cr-back-btn",
|
|
18854
18732
|
children: "← Back"
|
|
18855
18733
|
})
|
|
@@ -18868,7 +18746,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18868
18746
|
/* @__PURE__ */ jsx(EnrollmentForm, {
|
|
18869
18747
|
formData,
|
|
18870
18748
|
errors,
|
|
18871
|
-
onChange:
|
|
18749
|
+
onChange: updateFormData,
|
|
18872
18750
|
isEmailLocked: portalAuthState === "authenticated" || waitlistClaim.claim !== null,
|
|
18873
18751
|
isLoading: portalAuthState === "checking" || waitlistClaim.isLoading,
|
|
18874
18752
|
onLogout: handleLogout
|
|
@@ -18876,12 +18754,12 @@ function CourseRegistrationWizard(props) {
|
|
|
18876
18754
|
/* @__PURE__ */ jsx(CoursePricingSelector, {
|
|
18877
18755
|
pricing: selectedCourseWithPricing.pricing,
|
|
18878
18756
|
selectedPricingOptionId,
|
|
18879
|
-
onSelect:
|
|
18757
|
+
onSelect: choosePricingOption
|
|
18880
18758
|
}),
|
|
18881
18759
|
/* @__PURE__ */ jsx(CourseSlidingScaleInput, {
|
|
18882
18760
|
pricing: selectedCourseWithPricing.pricing,
|
|
18883
18761
|
value: selectedSlidingAmountInput,
|
|
18884
|
-
onChange:
|
|
18762
|
+
onChange: changeSlidingAmount
|
|
18885
18763
|
}),
|
|
18886
18764
|
showSpamProtection && /* @__PURE__ */ jsx("div", {
|
|
18887
18765
|
className: "cr-altcha",
|
|
@@ -18906,7 +18784,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18906
18784
|
className: "cr-actions",
|
|
18907
18785
|
children: [scopedCourses.length > 1 && /* @__PURE__ */ jsx("button", {
|
|
18908
18786
|
type: "button",
|
|
18909
|
-
onClick: () =>
|
|
18787
|
+
onClick: () => goToStep("select-course"),
|
|
18910
18788
|
className: "cr-back-btn",
|
|
18911
18789
|
children: "← Back"
|
|
18912
18790
|
}), /* @__PURE__ */ jsx("button", {
|
|
@@ -18956,7 +18834,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18956
18834
|
onBookingModeChange: handleBookingModeChange,
|
|
18957
18835
|
eligibleMemberships,
|
|
18958
18836
|
selectedMembershipId,
|
|
18959
|
-
onMembershipSelect:
|
|
18837
|
+
onMembershipSelect: chooseMembership,
|
|
18960
18838
|
priceCents: selectedCoursePricing?.selectedPriceAmount ?? null,
|
|
18961
18839
|
currency: selectedCourseWithPricing.course.currency ?? "GBP"
|
|
18962
18840
|
}),
|
|
@@ -18964,7 +18842,7 @@ function CourseRegistrationWizard(props) {
|
|
|
18964
18842
|
className: "cr-actions",
|
|
18965
18843
|
children: [/* @__PURE__ */ jsx("button", {
|
|
18966
18844
|
type: "button",
|
|
18967
|
-
onClick: () =>
|
|
18845
|
+
onClick: () => goToStep("enter-details"),
|
|
18968
18846
|
className: "cr-back-btn",
|
|
18969
18847
|
children: "← Back"
|
|
18970
18848
|
}), /* @__PURE__ */ jsx("button", {
|
|
@@ -19003,7 +18881,7 @@ function CourseRegistrationWizard(props) {
|
|
|
19003
18881
|
type: "radio",
|
|
19004
18882
|
name: "paymentChoice",
|
|
19005
18883
|
checked: paymentChoice === "membership",
|
|
19006
|
-
onChange: () =>
|
|
18884
|
+
onChange: () => choosePaymentChoice("membership")
|
|
19007
18885
|
}), /* @__PURE__ */ jsx("span", { children: "Use a membership (free)" })]
|
|
19008
18886
|
}),
|
|
19009
18887
|
paymentChoice === "membership" && eligibleMemberships.length > 1 && /* @__PURE__ */ jsxs("div", {
|
|
@@ -19016,7 +18894,7 @@ function CourseRegistrationWizard(props) {
|
|
|
19016
18894
|
id: "cr-membership",
|
|
19017
18895
|
className: "cr-form__input",
|
|
19018
18896
|
value: selectedMembershipId ?? "",
|
|
19019
|
-
onChange: (e) =>
|
|
18897
|
+
onChange: (e) => chooseMembership(e.target.value || null),
|
|
19020
18898
|
children: [/* @__PURE__ */ jsx("option", {
|
|
19021
18899
|
value: "",
|
|
19022
18900
|
disabled: true,
|
|
@@ -19033,7 +18911,7 @@ function CourseRegistrationWizard(props) {
|
|
|
19033
18911
|
type: "radio",
|
|
19034
18912
|
name: "paymentChoice",
|
|
19035
18913
|
checked: paymentChoice === "checkout",
|
|
19036
|
-
onChange: () =>
|
|
18914
|
+
onChange: () => choosePaymentChoice("checkout")
|
|
19037
18915
|
}), /* @__PURE__ */ jsx("span", { children: "Pay by card" })]
|
|
19038
18916
|
})
|
|
19039
18917
|
]
|
|
@@ -19055,7 +18933,7 @@ function CourseRegistrationWizard(props) {
|
|
|
19055
18933
|
className: "cr-actions",
|
|
19056
18934
|
children: [/* @__PURE__ */ jsx("button", {
|
|
19057
18935
|
type: "button",
|
|
19058
|
-
onClick: () =>
|
|
18936
|
+
onClick: () => goToStep("enter-details"),
|
|
19059
18937
|
className: "cr-back-btn",
|
|
19060
18938
|
children: "← Back"
|
|
19061
18939
|
}), /* @__PURE__ */ jsx("button", {
|
|
@@ -19287,7 +19165,6 @@ const LeafletStaticMap = ({ location, label, className = "", height = 200, zoom
|
|
|
19287
19165
|
function toEventDetailsClientProps(props) {
|
|
19288
19166
|
return {
|
|
19289
19167
|
occurrenceContext: props.occurrenceContext,
|
|
19290
|
-
contentEntry: props.contentEntry,
|
|
19291
19168
|
events: props.events ? [...props.events] : props.events,
|
|
19292
19169
|
showVenue: props.showVenue,
|
|
19293
19170
|
showMap: props.showMap,
|
|
@@ -24186,7 +24063,7 @@ var header_section_client_default = markEditableSurfaceForwarding(HeaderSectionN
|
|
|
24186
24063
|
* Renders category filter buttons and venue dropdown for event lists.
|
|
24187
24064
|
* Uses semantic CSS classes for styling.
|
|
24188
24065
|
*/
|
|
24189
|
-
const EventFilters = ({ categories, venues, staffMembers,
|
|
24066
|
+
const EventFilters = ({ categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, showCategoryFilter, showVenueFilter, showStaffFilter, onCategoryChange, onStaffMemberChange, onVenueChange, loading, idBase, className }) => {
|
|
24190
24067
|
const reactId = useId();
|
|
24191
24068
|
const baseId = idBase ?? reactId;
|
|
24192
24069
|
const staffSelectId = `${baseId}-event-staff-filter`;
|
|
@@ -24204,29 +24081,19 @@ const EventFilters = ({ categories, venues, staffMembers, selectedKind, selected
|
|
|
24204
24081
|
className: "event-category-buttons",
|
|
24205
24082
|
role: "group",
|
|
24206
24083
|
"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
|
-
]
|
|
24084
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
24085
|
+
type: "button",
|
|
24086
|
+
className: `event-category-btn ${selectedCategoryId === "all" ? "event-category-btn--active" : ""}`,
|
|
24087
|
+
onClick: () => onCategoryChange("all"),
|
|
24088
|
+
disabled: loading,
|
|
24089
|
+
children: "All"
|
|
24090
|
+
}), categories.map((category) => /* @__PURE__ */ jsx("button", {
|
|
24091
|
+
type: "button",
|
|
24092
|
+
className: `event-category-btn ${selectedCategoryId === category.id ? "event-category-btn--active" : ""}`,
|
|
24093
|
+
onClick: () => onCategoryChange(category.id),
|
|
24094
|
+
disabled: loading,
|
|
24095
|
+
children: category.name
|
|
24096
|
+
}, category.id))]
|
|
24230
24097
|
})]
|
|
24231
24098
|
}),
|
|
24232
24099
|
showStaffFilter && /* @__PURE__ */ jsxs("div", {
|
|
@@ -24482,7 +24349,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
|
|
|
24482
24349
|
const normalizedCategoryIds = normalizeCsvString(filters?.categoryIds);
|
|
24483
24350
|
const normalizedStaffMemberId = normalizeOptionalId(filters?.staffMemberId);
|
|
24484
24351
|
const normalizedVenueId = normalizeOptionalId(filters?.venueId);
|
|
24485
|
-
const kind = filters?.kind;
|
|
24486
24352
|
const eventSurface = filters?.eventSurface;
|
|
24487
24353
|
const eventPresets = normalizeCsvString(filters?.eventPresets);
|
|
24488
24354
|
const scheduleScope = filters?.scheduleScope;
|
|
@@ -24518,7 +24384,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
|
|
|
24518
24384
|
limit: pageSize,
|
|
24519
24385
|
stage,
|
|
24520
24386
|
detailLevel: "listing",
|
|
24521
|
-
kind,
|
|
24522
24387
|
eventSurface,
|
|
24523
24388
|
eventPresets: eventPresets ?? void 0,
|
|
24524
24389
|
scheduleScope,
|
|
@@ -24549,7 +24414,6 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
|
|
|
24549
24414
|
getPublicEvents,
|
|
24550
24415
|
pageSize,
|
|
24551
24416
|
stage,
|
|
24552
|
-
kind,
|
|
24553
24417
|
eventSurface,
|
|
24554
24418
|
eventPresets,
|
|
24555
24419
|
scheduleScope,
|
|
@@ -24629,8 +24493,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
|
|
|
24629
24493
|
const EMPTY_EVENT_FILTERS = Object.freeze({
|
|
24630
24494
|
categories: [],
|
|
24631
24495
|
venues: [],
|
|
24632
|
-
staffMembers: []
|
|
24633
|
-
labels: Object.freeze({ courseOption: "Course" })
|
|
24496
|
+
staffMembers: []
|
|
24634
24497
|
});
|
|
24635
24498
|
function createInitialEventFiltersLoadState() {
|
|
24636
24499
|
return {
|
|
@@ -24701,13 +24564,12 @@ function getEventFiltersError(state) {
|
|
|
24701
24564
|
* const events = await api.getPublicEvents(params);
|
|
24702
24565
|
* ```
|
|
24703
24566
|
*/
|
|
24704
|
-
function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId,
|
|
24567
|
+
function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
|
|
24705
24568
|
const api = useBlockApi();
|
|
24706
24569
|
const [loadState, dispatchLoadState] = useReducer(eventFiltersLoadReducer, void 0, createInitialEventFiltersLoadState);
|
|
24707
24570
|
const filters = getEventFiltersData(loadState);
|
|
24708
24571
|
const loading = isEventFiltersLoading(loadState);
|
|
24709
24572
|
const error = getEventFiltersError(loadState);
|
|
24710
|
-
const [selectedKind, setSelectedKindState] = useState("all");
|
|
24711
24573
|
const [selectedCategoryId, setSelectedCategoryId] = useState("all");
|
|
24712
24574
|
const [selectedStaffMemberId, setSelectedStaffMemberId] = useState("all");
|
|
24713
24575
|
const [selectedVenueId, setSelectedVenueId] = useState("all");
|
|
@@ -24715,21 +24577,19 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24715
24577
|
const allowedCategorySet = useMemo(() => new Set(allowedCategoryIds), [allowedCategoryIds.join(",")]);
|
|
24716
24578
|
const fixedVenueId = useMemo(() => normalizeOptionalId(preFilterVenueId), [preFilterVenueId]);
|
|
24717
24579
|
const fixedStaffMemberId = useMemo(() => normalizeOptionalId(preFilterStaffMemberId), [preFilterStaffMemberId]);
|
|
24718
|
-
const fixedKind = useMemo(() => normalizeEventBlockKind(preFilterKind), [preFilterKind]);
|
|
24719
24580
|
const fixedEventSurface = preFilterEventSurface && preFilterEventSurface !== "all" ? preFilterEventSurface : void 0;
|
|
24720
24581
|
const fixedEventPresets = preFilterEventPresets?.trim() || void 0;
|
|
24721
24582
|
const fixedScheduleScope = preFilterScheduleScope && preFilterScheduleScope !== "any" ? preFilterScheduleScope : void 0;
|
|
24722
24583
|
const hasFetchedRef = useRef(false);
|
|
24723
24584
|
useEffect(() => {
|
|
24724
24585
|
if (hasFetchedRef.current) return;
|
|
24725
|
-
if (!(showCategoryFilter !== "never"
|
|
24586
|
+
if (!(showCategoryFilter !== "never" || showVenueFilter || showStaffFilter)) return;
|
|
24726
24587
|
hasFetchedRef.current = true;
|
|
24727
24588
|
dispatchLoadState({ type: "started" });
|
|
24728
24589
|
api.getEventFilters({
|
|
24729
24590
|
categoryIds: allowedCategoryIds.length > 0 ? allowedCategoryIds.join(",") : void 0,
|
|
24730
24591
|
venueId: fixedVenueId ?? void 0,
|
|
24731
24592
|
staffMemberId: fixedStaffMemberId ?? void 0,
|
|
24732
|
-
kind: fixedKind === "all" ? void 0 : fixedKind,
|
|
24733
24593
|
eventSurface: fixedEventSurface,
|
|
24734
24594
|
eventPresets: fixedEventPresets,
|
|
24735
24595
|
scheduleScope: fixedScheduleScope
|
|
@@ -24749,7 +24609,6 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24749
24609
|
api,
|
|
24750
24610
|
fixedEventPresets,
|
|
24751
24611
|
fixedEventSurface,
|
|
24752
|
-
fixedKind,
|
|
24753
24612
|
fixedScheduleScope,
|
|
24754
24613
|
fixedStaffMemberId,
|
|
24755
24614
|
fixedVenueId,
|
|
@@ -24777,23 +24636,10 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24777
24636
|
return available.filter((staffMember) => staffMember.id === fixedStaffMemberId);
|
|
24778
24637
|
}, [filters.staffMembers, fixedStaffMemberId]);
|
|
24779
24638
|
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
24639
|
if (selectedCategoryId !== "all") {
|
|
24789
24640
|
if (!categoriesForSelect.some((c) => c.id === selectedCategoryId)) setSelectedCategoryId("all");
|
|
24790
24641
|
}
|
|
24791
|
-
}, [
|
|
24792
|
-
categoriesForSelect,
|
|
24793
|
-
fixedKind,
|
|
24794
|
-
selectedCategoryId,
|
|
24795
|
-
selectedKind
|
|
24796
|
-
]);
|
|
24642
|
+
}, [categoriesForSelect, selectedCategoryId]);
|
|
24797
24643
|
useEffect(() => {
|
|
24798
24644
|
if (fixedVenueId) {
|
|
24799
24645
|
setSelectedVenueId("all");
|
|
@@ -24822,12 +24668,10 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24822
24668
|
]);
|
|
24823
24669
|
const shouldShowCategoryFilter = (() => {
|
|
24824
24670
|
if (showCategoryFilter === "never") return false;
|
|
24825
|
-
if (fixedKind === "courses") return false;
|
|
24826
24671
|
if (allowedCategoryIds.length > 0 && allowedCategoryIds.length <= 1) return false;
|
|
24827
24672
|
if (showCategoryFilter === "always") return categoriesForSelect.length > 0;
|
|
24828
24673
|
return categoriesForSelect.length > 1;
|
|
24829
24674
|
})();
|
|
24830
|
-
const showCourseOption = fixedKind === "all" && !Boolean(fixedEventSurface || fixedEventPresets || fixedScheduleScope);
|
|
24831
24675
|
const shouldShowVenueFilter = (() => {
|
|
24832
24676
|
if (!showVenueFilter) return false;
|
|
24833
24677
|
if (fixedVenueId) return false;
|
|
@@ -24838,76 +24682,13 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24838
24682
|
if (fixedStaffMemberId) return false;
|
|
24839
24683
|
return staffMembersForSelect.length > 1;
|
|
24840
24684
|
})();
|
|
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
24685
|
const setSelectedCategory = useCallback((id) => {
|
|
24848
|
-
if (fixedKind === "courses") return;
|
|
24849
24686
|
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
|
-
]);
|
|
24687
|
+
}, []);
|
|
24906
24688
|
return {
|
|
24907
24689
|
categories: categoriesForSelect,
|
|
24908
24690
|
venues: venuesForSelect,
|
|
24909
24691
|
staffMembers: staffMembersForSelect,
|
|
24910
|
-
selectedKind,
|
|
24911
24692
|
selectedCategoryId,
|
|
24912
24693
|
selectedStaffMemberId,
|
|
24913
24694
|
selectedVenueId,
|
|
@@ -24916,15 +24697,46 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
|
|
|
24916
24697
|
shouldShowCategoryFilter,
|
|
24917
24698
|
shouldShowVenueFilter,
|
|
24918
24699
|
shouldShowStaffFilter,
|
|
24919
|
-
|
|
24920
|
-
|
|
24921
|
-
|
|
24922
|
-
|
|
24700
|
+
hasActiveFilters: useMemo(() => {
|
|
24701
|
+
return selectedCategoryId !== "all" || selectedStaffMemberId !== "all" || selectedVenueId !== "all";
|
|
24702
|
+
}, [
|
|
24703
|
+
selectedCategoryId,
|
|
24704
|
+
selectedStaffMemberId,
|
|
24705
|
+
selectedVenueId
|
|
24706
|
+
]),
|
|
24923
24707
|
setSelectedCategoryId: setSelectedCategory,
|
|
24924
24708
|
setSelectedStaffMemberId,
|
|
24925
24709
|
setSelectedVenueId,
|
|
24926
|
-
resetFilters
|
|
24927
|
-
|
|
24710
|
+
resetFilters: useCallback(() => {
|
|
24711
|
+
setSelectedCategoryId("all");
|
|
24712
|
+
setSelectedStaffMemberId("all");
|
|
24713
|
+
setSelectedVenueId("all");
|
|
24714
|
+
}, []),
|
|
24715
|
+
getFilterParams: useCallback(() => {
|
|
24716
|
+
const params = {};
|
|
24717
|
+
if (fixedEventSurface) params.eventSurface = fixedEventSurface;
|
|
24718
|
+
if (fixedEventPresets) params.eventPresets = fixedEventPresets;
|
|
24719
|
+
if (fixedScheduleScope) params.scheduleScope = fixedScheduleScope;
|
|
24720
|
+
if (allowedCategoryIds.length > 0) params.categoryIds = allowedCategoryIds.join(",");
|
|
24721
|
+
if (selectedCategoryId !== "all") {
|
|
24722
|
+
if (allowedCategoryIds.length === 0 || allowedCategorySet.has(selectedCategoryId)) params.categoryIds = selectedCategoryId;
|
|
24723
|
+
}
|
|
24724
|
+
if (fixedVenueId) params.venueId = fixedVenueId;
|
|
24725
|
+
if (selectedVenueId !== "all") params.venueId = selectedVenueId;
|
|
24726
|
+
params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
|
|
24727
|
+
return params;
|
|
24728
|
+
}, [
|
|
24729
|
+
allowedCategoryIds,
|
|
24730
|
+
allowedCategorySet,
|
|
24731
|
+
fixedEventPresets,
|
|
24732
|
+
fixedEventSurface,
|
|
24733
|
+
fixedScheduleScope,
|
|
24734
|
+
fixedStaffMemberId,
|
|
24735
|
+
fixedVenueId,
|
|
24736
|
+
selectedCategoryId,
|
|
24737
|
+
selectedStaffMemberId,
|
|
24738
|
+
selectedVenueId
|
|
24739
|
+
])
|
|
24928
24740
|
};
|
|
24929
24741
|
}
|
|
24930
24742
|
//#endregion
|
|
@@ -24938,7 +24750,6 @@ const EventListingController = ({ render }) => {
|
|
|
24938
24750
|
const filtersIdBase = useId();
|
|
24939
24751
|
const initialListEvents = useMemo(() => [...display.events], [display.events]);
|
|
24940
24752
|
const initialListFilters = useMemo(() => buildEventRuntimeFilters({
|
|
24941
|
-
eventKind: hydration.eventKind,
|
|
24942
24753
|
eventSurface: hydration.eventSurface,
|
|
24943
24754
|
filterEventPresets: hydration.filterEventPresets,
|
|
24944
24755
|
scheduleScope: hydration.scheduleScope,
|
|
@@ -24946,7 +24757,6 @@ const EventListingController = ({ render }) => {
|
|
|
24946
24757
|
filterStaffMemberId: hydration.filterStaffMemberId,
|
|
24947
24758
|
filterVenueId: hydration.filterVenueId
|
|
24948
24759
|
}), [
|
|
24949
|
-
hydration.eventKind,
|
|
24950
24760
|
hydration.eventSurface,
|
|
24951
24761
|
hydration.filterEventPresets,
|
|
24952
24762
|
hydration.scheduleScope,
|
|
@@ -24954,14 +24764,13 @@ const EventListingController = ({ render }) => {
|
|
|
24954
24764
|
hydration.filterStaffMemberId,
|
|
24955
24765
|
hydration.filterVenueId
|
|
24956
24766
|
]);
|
|
24957
|
-
const { categories, venues, staffMembers,
|
|
24767
|
+
const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
|
|
24958
24768
|
showCategoryFilter: hydration.showFilters ? hydration.showCategoryFilter : "never",
|
|
24959
24769
|
showVenueFilter: hydration.showFilters ? hydration.showVenueFilter : false,
|
|
24960
24770
|
showStaffFilter: hydration.showFilters ? hydration.showStaffFilter : false,
|
|
24961
24771
|
preFilterCategoryIds: hydration.filterCategoryIds ?? void 0,
|
|
24962
24772
|
preFilterStaffMemberId: hydration.filterStaffMemberId ?? void 0,
|
|
24963
24773
|
preFilterVenueId: hydration.filterVenueId ?? void 0,
|
|
24964
|
-
preFilterKind: hydration.eventKind,
|
|
24965
24774
|
preFilterEventSurface: hydration.eventSurface,
|
|
24966
24775
|
preFilterEventPresets: hydration.filterEventPresets,
|
|
24967
24776
|
preFilterScheduleScope: hydration.scheduleScope
|
|
@@ -24982,16 +24791,12 @@ const EventListingController = ({ render }) => {
|
|
|
24982
24791
|
categories,
|
|
24983
24792
|
venues,
|
|
24984
24793
|
staffMembers,
|
|
24985
|
-
selectedKind,
|
|
24986
24794
|
selectedCategoryId,
|
|
24987
24795
|
selectedStaffMemberId,
|
|
24988
24796
|
selectedVenueId,
|
|
24989
24797
|
showCategoryFilter: shouldShowCategoryFilter,
|
|
24990
24798
|
showVenueFilter: shouldShowVenueFilter,
|
|
24991
24799
|
showStaffFilter: shouldShowStaffFilter,
|
|
24992
|
-
showCourseOption,
|
|
24993
|
-
courseOptionLabel,
|
|
24994
|
-
onKindChange: setSelectedKind,
|
|
24995
24800
|
onCategoryChange: setSelectedCategoryId,
|
|
24996
24801
|
onStaffMemberChange: setSelectedStaffMemberId,
|
|
24997
24802
|
onVenueChange: setSelectedVenueId,
|
|
@@ -25161,7 +24966,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
|
|
|
25161
24966
|
filters?.categoryIds,
|
|
25162
24967
|
filters?.eventPresets,
|
|
25163
24968
|
filters?.eventSurface,
|
|
25164
|
-
filters?.kind,
|
|
25165
24969
|
filters?.scheduleScope,
|
|
25166
24970
|
filters?.staffMemberId,
|
|
25167
24971
|
filters?.venueId
|
|
@@ -25198,7 +25002,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
|
|
|
25198
25002
|
limit: CALENDAR_FETCH_LIMIT,
|
|
25199
25003
|
stage,
|
|
25200
25004
|
detailLevel: "listing",
|
|
25201
|
-
kind: filters?.kind,
|
|
25202
25005
|
eventSurface: filters?.eventSurface,
|
|
25203
25006
|
eventPresets: filters?.eventPresets,
|
|
25204
25007
|
scheduleScope: filters?.scheduleScope,
|
|
@@ -25232,7 +25035,6 @@ function useCalendarEventCache({ viewDate, initialEvents = [], preloadMonths = 1
|
|
|
25232
25035
|
filters?.categoryIds,
|
|
25233
25036
|
filters?.eventPresets,
|
|
25234
25037
|
filters?.eventSurface,
|
|
25235
|
-
filters?.kind,
|
|
25236
25038
|
filters?.scheduleScope,
|
|
25237
25039
|
filters?.staffMemberId,
|
|
25238
25040
|
filters?.venueId,
|
|
@@ -25640,7 +25442,6 @@ function toEventCombinedControllerProps(props) {
|
|
|
25640
25442
|
showCategoryFilter: props.render.display.showCategoryFilter,
|
|
25641
25443
|
showVenueFilter: props.render.display.showVenueFilter,
|
|
25642
25444
|
showStaffFilter: props.render.display.showStaffFilter,
|
|
25643
|
-
eventKind: props.render.display.eventKind,
|
|
25644
25445
|
eventSurface: props.render.display.eventSurface,
|
|
25645
25446
|
filterEventPresets: props.render.display.filterEventPresets,
|
|
25646
25447
|
scheduleScope: props.render.display.scheduleScope,
|
|
@@ -25665,7 +25466,7 @@ function toEventCombinedControllerProps(props) {
|
|
|
25665
25466
|
const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout = "stack", listColumns = "3", eventsPerPage = 12, paginationAction = {
|
|
25666
25467
|
kind: "loadMore",
|
|
25667
25468
|
label: "Load more events"
|
|
25668
|
-
}, startOfWeek = "monday", calendarTabViews = "both", defaultCalendarView, showFilters, showCategoryFilter = "auto", showVenueFilter, showStaffFilter,
|
|
25469
|
+
}, 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
25470
|
const fetchInitialEventsOnMount = initialEvents == null;
|
|
25670
25471
|
const resolvedShowFilters = showFilters ?? true;
|
|
25671
25472
|
const resolvedShowVenueFilter = showVenueFilter ?? false;
|
|
@@ -25686,20 +25487,18 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
|
|
|
25686
25487
|
setCalendarView(initialCalendarView);
|
|
25687
25488
|
}, [initialCalendarView]);
|
|
25688
25489
|
const filtersIdBase = useId();
|
|
25689
|
-
const { categories, venues, staffMembers,
|
|
25490
|
+
const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
|
|
25690
25491
|
showCategoryFilter: resolvedShowFilters ? showCategoryFilter : "never",
|
|
25691
25492
|
showVenueFilter: resolvedShowFilters ? resolvedShowVenueFilter : false,
|
|
25692
25493
|
showStaffFilter: resolvedShowFilters ? resolvedShowStaffFilter : false,
|
|
25693
25494
|
preFilterCategoryIds: filterCategoryIds,
|
|
25694
25495
|
preFilterStaffMemberId: filterStaffMemberId,
|
|
25695
25496
|
preFilterVenueId: filterVenueId,
|
|
25696
|
-
preFilterKind: eventKind,
|
|
25697
25497
|
preFilterEventSurface: resolvedEventSurface,
|
|
25698
25498
|
preFilterEventPresets: filterEventPresets,
|
|
25699
25499
|
preFilterScheduleScope: resolvedScheduleScope
|
|
25700
25500
|
});
|
|
25701
25501
|
const initialListFilters = useMemo(() => buildEventRuntimeFilters({
|
|
25702
|
-
eventKind,
|
|
25703
25502
|
eventSurface: resolvedEventSurface,
|
|
25704
25503
|
filterEventPresets,
|
|
25705
25504
|
scheduleScope: resolvedScheduleScope,
|
|
@@ -25707,7 +25506,6 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
|
|
|
25707
25506
|
filterStaffMemberId,
|
|
25708
25507
|
filterVenueId
|
|
25709
25508
|
}), [
|
|
25710
|
-
eventKind,
|
|
25711
25509
|
resolvedEventSurface,
|
|
25712
25510
|
filterCategoryIds,
|
|
25713
25511
|
filterEventPresets,
|
|
@@ -25784,16 +25582,12 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
|
|
|
25784
25582
|
categories,
|
|
25785
25583
|
venues,
|
|
25786
25584
|
staffMembers,
|
|
25787
|
-
selectedKind,
|
|
25788
25585
|
selectedCategoryId,
|
|
25789
25586
|
selectedStaffMemberId,
|
|
25790
25587
|
selectedVenueId,
|
|
25791
25588
|
showCategoryFilter: shouldShowCategoryFilter,
|
|
25792
25589
|
showVenueFilter: shouldShowVenueFilter,
|
|
25793
25590
|
showStaffFilter: shouldShowStaffFilter,
|
|
25794
|
-
showCourseOption,
|
|
25795
|
-
courseOptionLabel,
|
|
25796
|
-
onKindChange: setSelectedKind,
|
|
25797
25591
|
onCategoryChange: setSelectedCategoryId,
|
|
25798
25592
|
onStaffMemberChange: setSelectedStaffMemberId,
|
|
25799
25593
|
onVenueChange: setSelectedVenueId,
|
|
@@ -26077,7 +25871,6 @@ const EventCalendarClient = ({ render }) => {
|
|
|
26077
25871
|
showCategoryFilter: display.showCategoryFilter,
|
|
26078
25872
|
showVenueFilter: display.showVenueFilter,
|
|
26079
25873
|
showStaffFilter: display.showStaffFilter,
|
|
26080
|
-
eventKind: display.eventKind,
|
|
26081
25874
|
eventSurface: display.eventSurface,
|
|
26082
25875
|
filterEventPresets: display.filterEventPresets,
|
|
26083
25876
|
scheduleScope: display.scheduleScope,
|
|
@@ -26218,7 +26011,6 @@ function useEventCalendarFilterState(display) {
|
|
|
26218
26011
|
preFilterCategoryIds: display.filterCategoryIds,
|
|
26219
26012
|
preFilterStaffMemberId: display.filterStaffMemberId,
|
|
26220
26013
|
preFilterVenueId: display.filterVenueId,
|
|
26221
|
-
preFilterKind: display.eventKind,
|
|
26222
26014
|
preFilterEventSurface: display.eventSurface,
|
|
26223
26015
|
preFilterEventPresets: display.filterEventPresets,
|
|
26224
26016
|
preFilterScheduleScope: display.scheduleScope
|
|
@@ -26230,16 +26022,12 @@ function useEventCalendarFilterState(display) {
|
|
|
26230
26022
|
categories: filterState.categories,
|
|
26231
26023
|
venues: filterState.venues,
|
|
26232
26024
|
staffMembers: filterState.staffMembers,
|
|
26233
|
-
selectedKind: filterState.selectedKind,
|
|
26234
26025
|
selectedCategoryId: filterState.selectedCategoryId,
|
|
26235
26026
|
selectedStaffMemberId: filterState.selectedStaffMemberId,
|
|
26236
26027
|
selectedVenueId: filterState.selectedVenueId,
|
|
26237
26028
|
showCategoryFilter: filterState.shouldShowCategoryFilter,
|
|
26238
26029
|
showVenueFilter: filterState.shouldShowVenueFilter,
|
|
26239
26030
|
showStaffFilter: filterState.shouldShowStaffFilter,
|
|
26240
|
-
showCourseOption: filterState.showCourseOption,
|
|
26241
|
-
courseOptionLabel: filterState.courseOptionLabel,
|
|
26242
|
-
onKindChange: filterState.setSelectedKind,
|
|
26243
26031
|
onCategoryChange: filterState.setSelectedCategoryId,
|
|
26244
26032
|
onStaffMemberChange: filterState.setSelectedStaffMemberId,
|
|
26245
26033
|
onVenueChange: filterState.setSelectedVenueId,
|
|
@@ -26250,7 +26038,6 @@ function useEventCalendarFilterState(display) {
|
|
|
26250
26038
|
}
|
|
26251
26039
|
function usePrefetchedCalendarEvents(display, listFilters) {
|
|
26252
26040
|
const initialFilters = useMemo(() => buildDisplayFilterParams(display), [
|
|
26253
|
-
display.eventKind,
|
|
26254
26041
|
display.eventSurface,
|
|
26255
26042
|
display.filterCategoryIds,
|
|
26256
26043
|
display.filterEventPresets,
|
|
@@ -26268,7 +26055,6 @@ function usePrefetchedCalendarEvents(display, listFilters) {
|
|
|
26268
26055
|
}
|
|
26269
26056
|
function buildDisplayFilterParams(display) {
|
|
26270
26057
|
return buildEventRuntimeFilters({
|
|
26271
|
-
eventKind: display.eventKind,
|
|
26272
26058
|
eventSurface: display.eventSurface,
|
|
26273
26059
|
filterEventPresets: display.filterEventPresets,
|
|
26274
26060
|
scheduleScope: display.scheduleScope,
|
|
@@ -36850,10 +36636,10 @@ function LinkedEntryEditEventBridge() {
|
|
|
36850
36636
|
//#region ../preview-next/src/client/preview/PreviewShellLayout.tsx
|
|
36851
36637
|
const previewContainerResponsiveEnabled = process.env.NEXT_PUBLIC_ENABLE_PREVIEW_CONTAINER_RESPONSIVE !== "false";
|
|
36852
36638
|
const PreviewEditorSidebar = React.lazy(async () => {
|
|
36853
|
-
return { default: (await import("./PreviewEditorSidebar-
|
|
36639
|
+
return { default: (await import("./PreviewEditorSidebar-DBmAJJkQ.mjs")).PreviewEditorSidebar };
|
|
36854
36640
|
});
|
|
36855
36641
|
const PreviewEditorUI = React.lazy(async () => {
|
|
36856
|
-
return { default: (await import("./PreviewEditorUI-
|
|
36642
|
+
return { default: (await import("./PreviewEditorUI-CfGaz9cY.mjs")).PreviewEditorUI };
|
|
36857
36643
|
});
|
|
36858
36644
|
const previewPaneContainmentStyle = {
|
|
36859
36645
|
contain: "layout paint",
|
|
@@ -39343,7 +39129,7 @@ async function callDirectLoaderApiEndpoint(dashboardApiClient, endpoint, params)
|
|
|
39343
39129
|
}
|
|
39344
39130
|
}
|
|
39345
39131
|
function isBatchableEndpoint(endpoint) {
|
|
39346
|
-
return endpoint === "listPublicEvents" || endpoint === "getPublicEventDetails" || endpoint === "
|
|
39132
|
+
return endpoint === "listPublicEvents" || endpoint === "getPublicEventDetails" || endpoint === "listPublicWholeSeriesOfferings" || endpoint === "listPublicRouteCandidates" || endpoint === "listPublicTeamMembers" || endpoint === "listPublicProducts" || endpoint === "getPublicBookingServices" || endpoint === "getPublicWeeklySlotAvailability" || endpoint === "getPublicFormById";
|
|
39347
39133
|
}
|
|
39348
39134
|
function buildBatchLoaderRequest(id, endpoint, params) {
|
|
39349
39135
|
switch (endpoint) {
|
|
@@ -39369,7 +39155,7 @@ function buildBatchLoaderRequest(id, endpoint, params) {
|
|
|
39369
39155
|
endpoint
|
|
39370
39156
|
};
|
|
39371
39157
|
}
|
|
39372
|
-
case "
|
|
39158
|
+
case "listPublicWholeSeriesOfferings": {
|
|
39373
39159
|
const typedParams = params;
|
|
39374
39160
|
return typedParams ? {
|
|
39375
39161
|
id,
|
|
@@ -39475,7 +39261,7 @@ function toBatchParams(endpoint, params) {
|
|
|
39475
39261
|
});
|
|
39476
39262
|
return Object.keys(p).length ? p : void 0;
|
|
39477
39263
|
}
|
|
39478
|
-
if (endpoint === "
|
|
39264
|
+
if (endpoint === "listPublicWholeSeriesOfferings") {
|
|
39479
39265
|
const p = stripUndefined({ limit: params.limit || void 0 });
|
|
39480
39266
|
return Object.keys(p).length ? p : void 0;
|
|
39481
39267
|
}
|