@riverbankcms/sdk 0.146.0 → 0.147.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/CHANGELOG.md +12 -0
- package/dist/{PreviewEditorSidebar-kg2r2Fyi.mjs → PreviewEditorSidebar-DtpB3_sS.mjs} +51 -33
- package/dist/{PreviewEditorUI-sWMLp5dT.mjs → PreviewEditorUI-DxTLgaHo.mjs} +3 -3
- package/dist/{PreviewQueryProvider-Cg51xq1w.mjs → PreviewQueryProvider-Dd4dxOiU.mjs} +1 -1
- package/dist/{SdkPreviewModeRuntime-h2ti3Hch.mjs → SdkPreviewModeRuntime-DMMNCngt.mjs} +39 -12
- package/dist/{SiteChromeCustomizeContext-DEACFH9m.mjs → SiteChromeCustomizeContext-DQXZXiqS.mjs} +2499 -1682
- package/dist/_dts/ai/src/contracts/proposals.d.ts +198 -0
- package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +18 -0
- package/dist/_dts/api/src/accountApi.d.ts +5 -5
- package/dist/_dts/api/src/bookingConfig.d.ts +16 -0
- package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +4 -13
- package/dist/_dts/api/src/bookingOperations.d.ts +2 -44
- package/dist/_dts/api/src/bookingPeople.d.ts +92 -0
- package/dist/_dts/api/src/bookingPeopleEndpointDefinitions.d.ts +38 -0
- package/dist/_dts/api/src/bookingRecords.d.ts +11 -49
- package/dist/_dts/api/src/bookingSettingsSections.d.ts +1 -1
- package/dist/_dts/api/src/bookings.d.ts +1 -0
- package/dist/_dts/api/src/endpoints.d.ts +587 -561
- package/dist/_dts/api/src/eventManagementContracts.d.ts +23 -8
- package/dist/_dts/api/src/eventManagementEndpointDefinitions.d.ts +1 -1
- package/dist/_dts/api/src/index.d.ts +3 -2
- package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
- package/dist/_dts/api/src/launchReadiness.d.ts +1 -6
- package/dist/_dts/api/src/mailingListIntegration.d.ts +6 -0
- package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +1 -1
- package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +15 -0
- package/dist/_dts/api/src/occurrenceScheduling.d.ts +19 -0
- package/dist/_dts/api/src/publicAppointmentBookingContracts.d.ts +48 -0
- package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +7 -0
- package/dist/_dts/api/src/sdk-event-upsert.d.ts +15 -0
- package/dist/_dts/api/src/sdkCourseBooking.d.ts +4 -4
- package/dist/_dts/api/src/siteLifecycleEndpoints.d.ts +61 -0
- package/dist/_dts/api/src/siteManagementEndpoints.d.ts +5 -18
- package/dist/_dts/api/src/siteOnboarding.d.ts +2 -14
- package/dist/_dts/blocks/src/PageRenderer.d.ts +3 -4
- package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +8 -0
- package/dist/_dts/blocks/src/index.d.ts +1 -1
- package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +22 -4
- package/dist/_dts/blocks/src/pageRendererContracts.d.ts +2 -0
- package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +4 -1
- package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +4 -0
- package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +12 -0
- package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +12 -0
- package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +6 -0
- package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -0
- package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +2 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.completion.d.ts +9 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +9 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +19 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.mailing-list-choice.d.ts +5 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.mailing-list-note.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.mailing-list-state.d.ts +9 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.reserved-fields.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.server.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +2 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.submit-handler.d.ts +8 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.submit-success.d.ts +9 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/AttendeeDetailsStep.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/SuccessStep.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/sessionStorage.d.ts +2 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +6 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +3 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +8 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +9 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.block-submission.d.ts +2 -4
- package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +2 -0
- package/dist/_dts/blocks/src/system/runtime/shared/components/BookingMailingListNote.d.ts +6 -0
- package/dist/_dts/blocks/src/system/runtime/shared/mailingListSignupCopy.d.ts +6 -0
- package/dist/_dts/blocks/src/system/runtime/shared/types.d.ts +1 -0
- package/dist/_dts/blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.d.ts +3 -2
- package/dist/_dts/blocks/src/system/transforms/registry/core.d.ts +2 -0
- package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +1 -3
- package/dist/_dts/core/src/index.d.ts +1 -1
- package/dist/_dts/core/src/mailing-list-runtime.d.ts +15 -0
- package/dist/_dts/core/src/mailing-list-setup.d.ts +2 -0
- package/dist/_dts/core/src/mailing-list-submission.d.ts +6 -0
- package/dist/_dts/core/src/navigation-portal-labels.d.ts +9 -0
- package/dist/_dts/core/src/participants.d.ts +0 -38
- package/dist/_dts/db/src/generated/supabase/database.types.d.ts +102 -22
- package/dist/_dts/editor-blocks/src/block-editor/actionPresentation.d.ts +1 -0
- package/dist/_dts/preview-next/src/client/blocks/EditablePageRenderer.d.ts +7 -1
- package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +4 -3
- package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
- package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +1 -0
- package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +1 -1
- package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +2 -2
- package/dist/_dts/sdk/src/version.d.ts +1 -1
- package/dist/_dts/theme-core/src/buttons/effects/types.d.ts +1 -1
- package/dist/_dts/theme-core/src/footer/effectiveNavLinkStyle.d.ts +13 -0
- package/dist/_dts/theme-core/src/footer/index.d.ts +1 -0
- package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
- package/dist/_dts/theme-core/src/header/effectiveNavLinkStyle.d.ts +17 -0
- package/dist/_dts/theme-core/src/header/generateHeaderLogoStyles.d.ts +15 -0
- package/dist/_dts/theme-core/src/header/generateHeaderNavLinkStyles.d.ts +4 -0
- package/dist/_dts/theme-core/src/header/index.d.ts +3 -0
- package/dist/_dts/theme-core/src/header/legacyNavLinkStyle.d.ts +1 -1
- package/dist/_dts/theme-core/src/header/openingForegroundProjection.d.ts +7 -0
- package/dist/_dts/theme-core/src/header/rootPaint.d.ts +4 -0
- package/dist/_dts/theme-core/src/navigation/effectPolicy.d.ts +38 -0
- package/dist/_dts/theme-core/src/navigation/generateNavLinkCSS.d.ts +4 -0
- package/dist/_dts/theme-core/src/navigation/types.d.ts +4 -0
- package/dist/_dts/theme-core/src/site-styles/accessibleSurfaces.d.ts +1 -1
- package/dist/_dts/theme-core/src/surfaces/foregroundContract.d.ts +7 -0
- package/dist/_dts/theme-core/src/surfaces/foregroundInteraction.d.ts +29 -22
- package/dist/_dts/theme-core/src/surfaces/foregroundRoles.d.ts +10 -2
- package/dist/_dts/theme-core/src/surfaces/resolveSurfaceForeground.d.ts +9 -0
- package/dist/_dts/theme-core/src/utils/cssDeclarations.d.ts +2 -0
- package/dist/_dts/ui/src/badge.d.ts +2 -1
- package/dist/_dts/ui/src/button.d.ts +1 -1
- package/dist/_dts/ui/src/combobox-keys.d.ts +23 -0
- package/dist/_dts/ui/src/combobox-rows.d.ts +34 -0
- package/dist/_dts/ui/src/combobox.d.ts +26 -1
- package/dist/_dts/ui/src/date-picker.d.ts +5 -8
- package/dist/_dts/ui/src/editor-item-card.d.ts +1 -0
- package/dist/_dts/ui/src/field-trigger.d.ts +39 -0
- package/dist/_dts/ui/src/fieldControl.d.ts +27 -0
- package/dist/_dts/ui/src/index.d.ts +4 -1
- package/dist/_dts/ui/src/native-select.d.ts +8 -0
- package/dist/_dts/ui/src/popover.d.ts +7 -1
- package/dist/_dts/ui/src/segmented-control.d.ts +4 -0
- package/dist/_dts/ui/src/surface.d.ts +1 -1
- package/dist/client/{BookingConsentAgreement-BQKL045f.mjs → BookingMailingListNote-1n4Ch_u_.mjs} +15 -4
- package/dist/client/{CheckboxChoice--W2n6yKs.mjs → CheckboxChoice-B33MqoUo.mjs} +1 -1
- package/dist/client/{DiscountCodeDisclosure-CsOtjFY7.mjs → DiscountCodeDisclosure-CKJtz0mY.mjs} +1 -1
- package/dist/client/{EventCombined.client-BdRjVbhH.mjs → EventCombined.client-C0pgma9y.mjs} +7 -7
- package/dist/client/{EventListing.client-DBxC6xOU.mjs → EventListing.client-4fhLOvHP.mjs} +2 -2
- package/dist/client/{LeafletStaticMap-mHEJKrTs.mjs → LeafletStaticMap-DScC4F3w.mjs} +1 -1
- package/dist/client/{scrollToBlock-BNgaEUpo.mjs → TerminalPanel-B5ZUsYhe.mjs} +77 -77
- package/dist/client/{ThemedButton-CE5KYT6z.mjs → ThemedButton-DoVIV1Ao.mjs} +2 -2
- package/dist/client/{accordion-BEQNSptH.mjs → accordion-CoT5g7zo.mjs} +1 -1
- package/dist/client/{bookingForm-AMr-s5vw.mjs → bookingForm-BWxB46xD.mjs} +226 -106
- package/dist/client/bookings.mjs +367 -188
- package/dist/client/{carousel-Bbt_QgJy.mjs → carousel-DtNYWFd3.mjs} +2 -2
- package/dist/client/{carousel.client-jahpU9Vz.mjs → carousel.client-A2lG-9od.mjs} +1 -1
- package/dist/client/{cart-CnWi30zJ.mjs → cart-z4qZih1Y.mjs} +3 -3
- package/dist/client/{checkout-f3nkWgd4.mjs → checkout-DpL7euFH.mjs} +3 -3
- package/dist/client/{checkoutUrls-CW3-78uu.mjs → checkoutUrls-BEfR7kVu.mjs} +1 -1
- package/dist/client/client.mjs +2125 -1420
- package/dist/client/{colorStyles-CuJBiS-1.mjs → colorStyles-j5U9v5JA.mjs} +5 -1
- package/dist/client/{context-Bc8T6pCe.mjs → context-C8TinPJc.mjs} +1 -1
- package/dist/client/{dates-DUsCEzLb.mjs → dates-vwwxTeB0.mjs} +2 -2
- package/dist/client/{eventCalendar-CKwgXui5.mjs → eventCalendar-DIbHfJXO.mjs} +10 -10
- package/dist/client/{eventCombined-CBAOSTGR.mjs → eventCombined-DoGMJ6cg.mjs} +4 -4
- package/dist/client/{eventDetails-Dh-_WiBD.mjs → eventDetails-BjN9v6a1.mjs} +4 -4
- package/dist/client/{eventListing-CA3frIH5.mjs → eventListing-DajjWgOv.mjs} +4 -4
- package/dist/client/{eventRegistration-BHtsgdcg.mjs → eventRegistration-DMq9gMA-.mjs} +109 -41
- package/dist/client/{form-C2h3YAcg.mjs → form-Qf6qTbos.mjs} +5 -5
- package/dist/client/{headerSection-lwMuMTH9.mjs → headerSection-D7qJrqFX.mjs} +3 -3
- package/dist/client/hooks.mjs +661 -116
- package/dist/client/{locationMap-DJ2bLODV.mjs → locationMap-CCF9-t_0.mjs} +4 -4
- package/dist/client/{FieldValidationMessage-AYanWFb-.mjs → mailingListSignupCopy-DZSHZrm6.mjs} +14 -1
- package/dist/client/{media-BtJ37tzS.mjs → media-CwBGetqC.mjs} +1 -1
- package/dist/client/{newsletterForm-8Pu5K32g.mjs → newsletterForm-DzCLSP4S.mjs} +6 -6
- package/dist/client/{pricing-HHx3IgBz.mjs → pricing-Cgxv2KLC.mjs} +1 -1
- package/dist/client/{productDetail-C_1odnAf.mjs → productDetail-ru9w5GHx.mjs} +3 -3
- package/dist/client/{productList-CtCv-Nmx.mjs → productList-zaapKSl-.mjs} +3 -3
- package/dist/client/{propsDecoder-Dcgsncxb.mjs → propsDecoder-CwvvNOHx.mjs} +52 -6
- package/dist/client/rendering/client.mjs +951 -369
- package/dist/client/rendering/islands.mjs +19 -19
- package/dist/client/rendering.mjs +2153 -1393
- package/dist/client/{routeIslandApiConfig-CWLP7wu3.mjs → routeIslandApiConfig-BwVFo0Y4.mjs} +1 -1
- package/dist/client/{shop-commerce-B88zmWWo.mjs → shop-commerce-De7gEnkA.mjs} +8 -8
- package/dist/client/{shop-commerce-store-DtSfkKuX.mjs → shop-commerce-store-B3MCxIBW.mjs} +1 -1
- package/dist/client/{shop-DQXrQ8kJ.mjs → shop-mktkXvbV.mjs} +7 -7
- package/dist/client/{shopShared-cuaONpkJ.mjs → shopShared-TqExh235.mjs} +5 -5
- package/dist/client/{useEventFilters-Bukew6Gb.mjs → useEventFilters-n_OjkIjX.mjs} +8 -8
- package/dist/preview-next/before-render.mjs +122 -50
- package/dist/preview-next/client/runtime.mjs +4 -4
- package/dist/preview-next/editor-base.css +53 -2
- package/dist/preview-next/editor-chrome.css +7 -4
- package/dist/preview-next/keepAlive.mjs +122 -50
- package/dist/preview-next/middleware.mjs +122 -50
- package/dist/{previewAuthStore-h5IgbSp4.mjs → previewAuthStore-C_EHQ5XA.mjs} +122 -50
- package/dist/{sdk-runtime-DTc1uIXn.mjs → sdk-runtime-BIkJg5y1.mjs} +2 -2
- package/dist/{separator-BpHS1KZK.mjs → separator-C9qDP95Z.mjs} +1 -1
- package/dist/server/components.mjs +25345 -24942
- package/dist/server/config-validation.mjs +711 -163
- package/dist/server/config.mjs +711 -163
- package/dist/server/data.mjs +709 -162
- package/dist/server/index.mjs +123 -51
- package/dist/server/navigation.mjs +13 -2
- package/dist/server/next.mjs +4538 -4169
- package/dist/server/page-converter.mjs +107 -64
- package/dist/server/prebuild.mjs +1 -1
- package/dist/server/rendering/server.mjs +2509 -2104
- package/dist/server/rendering.mjs +25526 -25104
- package/dist/server/routing.mjs +750 -289
- package/dist/server/server.mjs +671 -148
- package/dist/server/theme-bridge.mjs +66 -17
- package/dist/server/theme.mjs +5 -1
- package/dist/styles/index.css +32 -4
- package/package.json +1 -1
- package/dist/_dts/core/src/participant-identity.d.ts +0 -135
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { C as unsafeAsPassId, b as unsafeAsCustomerPassId, v as unsafeAsAppointmentResourceId, x as unsafeAsFormId, y as unsafeAsAppointmentServiceId } from "./colorStyles-
|
|
3
|
-
import {
|
|
4
|
-
import { At as resolveAppointmentCheckoutVerificationState, Ct as formatBookingSubmissionPreparationError, Dt as isBookingServiceSlidingAmountInRange, Et as getBookingSuccessMessage, Ft as projectSelectedAppointmentConsentIntoForm, Gt as okWith, Ht as clearWorkflowFeedback, It as resolveSelectedAppointmentConsent, Kt as reportWorkflowError, Lt as BOOKING_FORM_DATA_RESERVED_KEYS, Mt as resolveBookingSiteId, Nt as resolveDefaultBookingServiceId, Ot as parseBookingCurrencyInputToCents, Pt as toSelectedCollectionOptionKind, Rt as isBookingRequirementConsentFieldId, St as formatBookingCentsAsCurrencyInput, Tt as getBookingServiceSlidingScale, Ut as err, Vt as assertNever, Zt as
|
|
5
|
-
import { n as useBlockApi, t as BlockApiProvider } from "./context-
|
|
2
|
+
import { C as unsafeAsPassId, b as unsafeAsCustomerPassId, v as unsafeAsAppointmentResourceId, x as unsafeAsFormId, y as unsafeAsAppointmentServiceId } from "./colorStyles-j5U9v5JA.mjs";
|
|
3
|
+
import { a as buildBookingPaymentSelectionViewModel, i as usePolling, n as BookingConsentAgreement, r as StepIndicator, t as BookingMailingListNote } from "./BookingMailingListNote-1n4Ch_u_.mjs";
|
|
4
|
+
import { At as resolveAppointmentCheckoutVerificationState, Ct as formatBookingSubmissionPreparationError, Dt as isBookingServiceSlidingAmountInRange, Et as getBookingSuccessMessage, Ft as projectSelectedAppointmentConsentIntoForm, Gt as okWith, Ht as clearWorkflowFeedback, It as resolveSelectedAppointmentConsent, Kt as reportWorkflowError, Lt as BOOKING_FORM_DATA_RESERVED_KEYS, Mt as resolveBookingSiteId, Nt as resolveDefaultBookingServiceId, Ot as parseBookingCurrencyInputToCents, Pt as toSelectedCollectionOptionKind, Qt as addLocalScheduleDays, Rt as isBookingRequirementConsentFieldId, St as formatBookingCentsAsCurrencyInput, Tt as getBookingServiceSlidingScale, Ut as err, Vt as assertNever, Zt as resolveBookingSignupOffer, bn as formatCurrencyAmount, bt as logger, cn as resolveBookingTimeZoneId, in as formatLocalScheduleDate, jt as resolveBookingPaymentStep, kt as prepareBookingSubmission, nn as formatBookingInstant, qt as reportWorkflowSuccess, sn as parseBookingLocalDate, t as defineIslandPropsDecoder, wt as getBookingRedirectStateFromLocation, xt as deriveBookingFormViewState } from "./propsDecoder-CwvvNOHx.mjs";
|
|
5
|
+
import { n as useBlockApi, t as BlockApiProvider } from "./context-C8TinPJc.mjs";
|
|
6
6
|
import { n as isSpamProtectionEnabled, r as AltchaWidget, t as getChallengeUrl } from "./src-B833rYRr.mjs";
|
|
7
|
-
import {
|
|
8
|
-
import { t as
|
|
9
|
-
import { i as SpinnerNode, t as ThemedButton } from "./ThemedButton-
|
|
7
|
+
import { t as DiscountCodeDisclosure } from "./DiscountCodeDisclosure-CKJtz0mY.mjs";
|
|
8
|
+
import { a as useDiscountCodeUi, i as CheckIcon, n as StateIcon, r as scrollToBlock, t as TerminalPanel } from "./TerminalPanel-B5ZUsYhe.mjs";
|
|
9
|
+
import { i as SpinnerNode, t as ThemedButton } from "./ThemedButton-DoVIV1Ao.mjs";
|
|
10
10
|
import { t as FeedbackMessage } from "./FeedbackMessage-CtLvvS_d.mjs";
|
|
11
|
-
import {
|
|
12
|
-
import { t as buildCheckoutReturnUrls } from "./checkoutUrls-
|
|
13
|
-
import { t as CheckboxChoice } from "./CheckboxChoice
|
|
11
|
+
import { i as getFieldValidationControlProps, r as FieldValidationMessage } from "./mailingListSignupCopy-DZSHZrm6.mjs";
|
|
12
|
+
import { t as buildCheckoutReturnUrls } from "./checkoutUrls-BEfR7kVu.mjs";
|
|
13
|
+
import { t as CheckboxChoice } from "./CheckboxChoice-B33MqoUo.mjs";
|
|
14
14
|
import { t as mountReactIsland } from "./reactMount-SY8AVRof.mjs";
|
|
15
|
-
import { t as buildRouteIslandApiConfig } from "./routeIslandApiConfig-
|
|
15
|
+
import { t as buildRouteIslandApiConfig } from "./routeIslandApiConfig-BwVFo0Y4.mjs";
|
|
16
16
|
import React, { useCallback, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from "react";
|
|
17
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
18
18
|
//#region ../core/src/appointment-service-categories.ts
|
|
19
19
|
/**
|
|
20
20
|
* Groups services under their categories.
|
|
@@ -55,30 +55,6 @@ function layoutServicesByCategory(categories, services, options) {
|
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
57
|
//#endregion
|
|
58
|
-
//#region ../blocks/src/system/runtime/components/booking/SuccessMessage.tsx
|
|
59
|
-
const SuccessMessage = ({ message, resourceName, className }) => {
|
|
60
|
-
return /* @__PURE__ */ jsx(TerminalPanel, {
|
|
61
|
-
tone: "success",
|
|
62
|
-
title: "Booking confirmed",
|
|
63
|
-
icon: /* @__PURE__ */ jsx(StateIcon, {
|
|
64
|
-
variant: "success",
|
|
65
|
-
children: /* @__PURE__ */ jsx(CheckIcon, { strokeWidth: 3 })
|
|
66
|
-
}),
|
|
67
|
-
body: /* @__PURE__ */ jsx("p", {
|
|
68
|
-
className: "ab-text",
|
|
69
|
-
children: message
|
|
70
|
-
}),
|
|
71
|
-
secondaryBody: resourceName ? /* @__PURE__ */ jsxs("p", {
|
|
72
|
-
className: "ab-text rb-on-surface--muted",
|
|
73
|
-
children: ["Practitioner: ", resourceName]
|
|
74
|
-
}) : null,
|
|
75
|
-
className: ["ab-center", className ?? ""].join(" ").trim(),
|
|
76
|
-
titleClassName: "ab-terminal-title",
|
|
77
|
-
role: "alert",
|
|
78
|
-
live: "polite"
|
|
79
|
-
});
|
|
80
|
-
};
|
|
81
|
-
//#endregion
|
|
82
58
|
//#region ../blocks/src/system/runtime/hooks/useSelectedAppointmentConsentForm.ts
|
|
83
59
|
function useSelectedAppointmentConsentForm(form, selectedService) {
|
|
84
60
|
return useMemo(() => projectSelectedAppointmentConsentIntoForm(form, resolveSelectedAppointmentConsent(selectedService)), [form, selectedService]);
|
|
@@ -643,6 +619,7 @@ function useBookingSubmission(_siteId) {
|
|
|
643
619
|
startAt: data.startAt,
|
|
644
620
|
endAt: data.endAt,
|
|
645
621
|
customFields: data.customFields,
|
|
622
|
+
mailingListOptIn: data.mailingListOptIn,
|
|
646
623
|
timezone: data.timezone,
|
|
647
624
|
customerPassId: data.customerPassId
|
|
648
625
|
}) : await api.submitBooking({
|
|
@@ -652,6 +629,7 @@ function useBookingSubmission(_siteId) {
|
|
|
652
629
|
startAt: data.startAt,
|
|
653
630
|
endAt: data.endAt,
|
|
654
631
|
customFields: data.customFields,
|
|
632
|
+
mailingListOptIn: data.mailingListOptIn,
|
|
655
633
|
timezone: data.timezone,
|
|
656
634
|
discountCode: data.discountCode,
|
|
657
635
|
selectedSlidingAmount: data.selectedSlidingAmount,
|
|
@@ -687,6 +665,40 @@ function useBookingSubmission(_siteId) {
|
|
|
687
665
|
};
|
|
688
666
|
}
|
|
689
667
|
//#endregion
|
|
668
|
+
//#region ../blocks/src/system/runtime/nodes/booking-form.submit-success.ts
|
|
669
|
+
function completeBookingSubmission(input) {
|
|
670
|
+
const { data } = input;
|
|
671
|
+
if (data.type === "checkout_redirect") {
|
|
672
|
+
if (input.redirect === "auto" && typeof window !== "undefined") input.navigateToCheckout(data.checkoutUrl);
|
|
673
|
+
return {
|
|
674
|
+
ok: true,
|
|
675
|
+
outcome: {
|
|
676
|
+
kind: "checkout_redirect",
|
|
677
|
+
checkoutUrl: data.checkoutUrl,
|
|
678
|
+
sessionId: data.sessionId,
|
|
679
|
+
...data.mailingListSignupNote ? { mailingListSignupNote: data.mailingListSignupNote } : {}
|
|
680
|
+
}
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
input.dispatch({
|
|
684
|
+
type: "feedback-set",
|
|
685
|
+
feedback: {
|
|
686
|
+
kind: "success",
|
|
687
|
+
message: getBookingSuccessMessage(input.successMessage),
|
|
688
|
+
resourceName: data.appointment.resourceName
|
|
689
|
+
}
|
|
690
|
+
});
|
|
691
|
+
return {
|
|
692
|
+
ok: true,
|
|
693
|
+
outcome: {
|
|
694
|
+
kind: "booked",
|
|
695
|
+
appointmentId: data.appointment.id,
|
|
696
|
+
resourceName: data.appointment.resourceName,
|
|
697
|
+
...data.mailingListSignupNote ? { mailingListSignupNote: data.mailingListSignupNote } : {}
|
|
698
|
+
}
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
//#endregion
|
|
690
702
|
//#region ../blocks/src/system/runtime/nodes/booking-form.validationErrors.ts
|
|
691
703
|
function omitRecordKey(record, key) {
|
|
692
704
|
if (!(key in record)) return record;
|
|
@@ -728,6 +740,40 @@ function clearBookingFieldError(errors, fieldId) {
|
|
|
728
740
|
};
|
|
729
741
|
}
|
|
730
742
|
//#endregion
|
|
743
|
+
//#region ../blocks/src/system/runtime/nodes/booking-form.mailing-list-state.ts
|
|
744
|
+
function bookingFormDataWithEligibleOptIn(data, eligible) {
|
|
745
|
+
return {
|
|
746
|
+
...data,
|
|
747
|
+
mailingListOptIn: eligible && data.mailingListOptIn === true
|
|
748
|
+
};
|
|
749
|
+
}
|
|
750
|
+
function isBookingContactEvent(event) {
|
|
751
|
+
return event.type === "field-updated" || event.type === "field-touched" || event.type === "mailing-list-opt-in-set";
|
|
752
|
+
}
|
|
753
|
+
function applyBookingContactEvent(state, event) {
|
|
754
|
+
switch (event.type) {
|
|
755
|
+
case "field-updated": return {
|
|
756
|
+
...state,
|
|
757
|
+
fieldValues: {
|
|
758
|
+
...state.fieldValues,
|
|
759
|
+
[event.fieldId]: event.value
|
|
760
|
+
},
|
|
761
|
+
validationErrors: clearBookingFieldError(clearBookingFormError(state.validationErrors), event.fieldId)
|
|
762
|
+
};
|
|
763
|
+
case "field-touched": return {
|
|
764
|
+
...state,
|
|
765
|
+
touchedFields: {
|
|
766
|
+
...state.touchedFields,
|
|
767
|
+
[event.fieldId]: true
|
|
768
|
+
}
|
|
769
|
+
};
|
|
770
|
+
case "mailing-list-opt-in-set": return {
|
|
771
|
+
...state,
|
|
772
|
+
mailingListOptIn: event.checked
|
|
773
|
+
};
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
//#endregion
|
|
731
777
|
//#region ../blocks/src/system/runtime/nodes/booking-form.field-values.ts
|
|
732
778
|
function collectInitialBookingFieldValues(initialData) {
|
|
733
779
|
const values = {};
|
|
@@ -753,6 +799,7 @@ function createInitialBookingFlowReducerState(input) {
|
|
|
753
799
|
selectedDate: toOptionalString(initialData.selectedDate),
|
|
754
800
|
selectedSlot: null,
|
|
755
801
|
fieldValues: collectInitialBookingFieldValues(initialData),
|
|
802
|
+
mailingListOptIn: initialData.mailingListOptIn === true,
|
|
756
803
|
touchedFields: {},
|
|
757
804
|
attemptedStepIds: {},
|
|
758
805
|
discountCode: toOptionalString(initialData.discountCode) ?? "",
|
|
@@ -802,6 +849,7 @@ function applyAvailabilitySelectionInvalidation(state, invalidation) {
|
|
|
802
849
|
};
|
|
803
850
|
}
|
|
804
851
|
function bookingFlowReducer(state, event) {
|
|
852
|
+
if (isBookingContactEvent(event)) return applyBookingContactEvent(state, event);
|
|
805
853
|
switch (event.type) {
|
|
806
854
|
case "service-selected": return applyBookingServiceSelection(state, event.serviceId);
|
|
807
855
|
case "resource-selected": return {
|
|
@@ -824,21 +872,6 @@ function bookingFlowReducer(state, event) {
|
|
|
824
872
|
feedback: clearAvailabilityFeedback(state.feedback),
|
|
825
873
|
validationErrors: clearBookingFormError(state.validationErrors)
|
|
826
874
|
};
|
|
827
|
-
case "field-updated": return {
|
|
828
|
-
...state,
|
|
829
|
-
fieldValues: {
|
|
830
|
-
...state.fieldValues,
|
|
831
|
-
[event.fieldId]: event.value
|
|
832
|
-
},
|
|
833
|
-
validationErrors: clearBookingFieldError(clearBookingFormError(state.validationErrors), event.fieldId)
|
|
834
|
-
};
|
|
835
|
-
case "field-touched": return {
|
|
836
|
-
...state,
|
|
837
|
-
touchedFields: {
|
|
838
|
-
...state.touchedFields,
|
|
839
|
-
[event.fieldId]: true
|
|
840
|
-
}
|
|
841
|
-
};
|
|
842
875
|
case "step-advance-attempted": return state.attemptedStepIds[event.stepId] ? state : {
|
|
843
876
|
...state,
|
|
844
877
|
attemptedStepIds: {
|
|
@@ -976,6 +1009,7 @@ function deriveBookingSlotDisplayOptions(input) {
|
|
|
976
1009
|
function toBookingFormData(state) {
|
|
977
1010
|
return {
|
|
978
1011
|
...state.fieldValues,
|
|
1012
|
+
mailingListOptIn: state.mailingListOptIn,
|
|
979
1013
|
serviceId: state.selectedServiceId,
|
|
980
1014
|
resourceId: state.selectedResourceId ?? state.selectedSlot?.resourceId,
|
|
981
1015
|
selectedDate: state.selectedDate,
|
|
@@ -1238,10 +1272,7 @@ function buildBookingSubmitPlan(input) {
|
|
|
1238
1272
|
};
|
|
1239
1273
|
const prepared = prepareBookingSubmission({
|
|
1240
1274
|
formId: input.formId,
|
|
1241
|
-
data: toBookingFormData(
|
|
1242
|
-
...input.state,
|
|
1243
|
-
altchaSolution: input.altchaSolution ?? input.state.altchaSolution
|
|
1244
|
-
}),
|
|
1275
|
+
data: bookingFormDataWithEligibleOptIn(toBookingFormData(input.state), Boolean(input.mailingListEligible)),
|
|
1245
1276
|
services: input.services,
|
|
1246
1277
|
defaultServiceId: input.defaultServiceId,
|
|
1247
1278
|
defaultResourceId: input.defaultResourceId,
|
|
@@ -1427,6 +1458,8 @@ function useHeadlessBookingFlow(options) {
|
|
|
1427
1458
|
const canLoadAppointmentPackages = Boolean(options.enableAppointmentPackages && hasPortalBearerAuth && selectedService && !selectedServiceSlidingScale && (selectedService.priceAmount ?? 0) > 0);
|
|
1428
1459
|
const appointmentPackagesUnavailableReason = !options.enableAppointmentPackages ? "disabled" : !selectedService || selectedServiceSlidingScale || (selectedService.priceAmount ?? 0) <= 0 ? "missing-priced-service" : !hasPortalBearerAuth ? "missing-portal-auth" : null;
|
|
1429
1460
|
const data = useMemo(() => toBookingFormData(state), [state]);
|
|
1461
|
+
const mailingList = resolveBookingSignupOffer(options.mailingList, options.siteName);
|
|
1462
|
+
const mailingListEligible = mailingList !== null;
|
|
1430
1463
|
const availabilityDatesQuery = useMemo(() => buildBookingAvailabilityQuery({
|
|
1431
1464
|
serviceId: selectedServiceId,
|
|
1432
1465
|
resourceId: selectedResourceId,
|
|
@@ -1687,7 +1720,8 @@ function useHeadlessBookingFlow(options) {
|
|
|
1687
1720
|
viewerTimeZone: latest.viewerTimeZone,
|
|
1688
1721
|
redirect: submitOptions?.redirect ?? "manual",
|
|
1689
1722
|
successUrl: submitOptions?.successUrl,
|
|
1690
|
-
cancelUrl: submitOptions?.cancelUrl
|
|
1723
|
+
cancelUrl: submitOptions?.cancelUrl,
|
|
1724
|
+
mailingListEligible
|
|
1691
1725
|
});
|
|
1692
1726
|
if (!plan.ok) {
|
|
1693
1727
|
dispatch({
|
|
@@ -1720,37 +1754,18 @@ function useHeadlessBookingFlow(options) {
|
|
|
1720
1754
|
message: result.error
|
|
1721
1755
|
};
|
|
1722
1756
|
}
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
checkoutUrl: result.data.checkoutUrl
|
|
1730
|
-
}
|
|
1731
|
-
};
|
|
1732
|
-
}
|
|
1733
|
-
dispatch({
|
|
1734
|
-
type: "feedback-set",
|
|
1735
|
-
feedback: {
|
|
1736
|
-
kind: "success",
|
|
1737
|
-
message: getBookingSuccessMessage(latest.successMessage),
|
|
1738
|
-
resourceName: result.data.appointment.resourceName
|
|
1739
|
-
}
|
|
1757
|
+
return completeBookingSubmission({
|
|
1758
|
+
data: result.data,
|
|
1759
|
+
redirect: plan.redirect,
|
|
1760
|
+
successMessage: latest.successMessage,
|
|
1761
|
+
navigateToCheckout: latest.navigateToCheckout,
|
|
1762
|
+
dispatch
|
|
1740
1763
|
});
|
|
1741
|
-
return {
|
|
1742
|
-
ok: true,
|
|
1743
|
-
outcome: {
|
|
1744
|
-
kind: "booked",
|
|
1745
|
-
appointmentId: result.data.appointment.id,
|
|
1746
|
-
resourceName: result.data.appointment.resourceName
|
|
1747
|
-
}
|
|
1748
|
-
};
|
|
1749
1764
|
} finally {
|
|
1750
1765
|
submittingRef.current = false;
|
|
1751
1766
|
dispatch({ type: "submission-finished" });
|
|
1752
1767
|
}
|
|
1753
|
-
}, [latestRef]);
|
|
1768
|
+
}, [latestRef, mailingListEligible]);
|
|
1754
1769
|
const actions = useMemo(() => ({
|
|
1755
1770
|
selectService: (serviceId) => dispatch({
|
|
1756
1771
|
type: "service-selected",
|
|
@@ -1773,6 +1788,10 @@ function useHeadlessBookingFlow(options) {
|
|
|
1773
1788
|
fieldId: unsafeAsBookingFieldId(fieldId),
|
|
1774
1789
|
value
|
|
1775
1790
|
}),
|
|
1791
|
+
setMailingListOptIn: (checked) => dispatch({
|
|
1792
|
+
type: "mailing-list-opt-in-set",
|
|
1793
|
+
checked
|
|
1794
|
+
}),
|
|
1776
1795
|
markFieldTouched: (fieldId) => dispatch({
|
|
1777
1796
|
type: "field-touched",
|
|
1778
1797
|
fieldId: unsafeAsBookingFieldId(fieldId)
|
|
@@ -1931,6 +1950,8 @@ function useHeadlessBookingFlow(options) {
|
|
|
1931
1950
|
appointmentPackages: appointmentPackagesModel
|
|
1932
1951
|
};
|
|
1933
1952
|
return {
|
|
1953
|
+
mailingList,
|
|
1954
|
+
mailingListOptIn: state.mailingListOptIn,
|
|
1934
1955
|
status,
|
|
1935
1956
|
view,
|
|
1936
1957
|
steps: stepState.steps,
|
|
@@ -2228,6 +2249,25 @@ const TimeSlotSelector = ({ value, onChange, slots, isLoading, timezone, require
|
|
|
2228
2249
|
});
|
|
2229
2250
|
};
|
|
2230
2251
|
//#endregion
|
|
2252
|
+
//#region ../blocks/src/system/runtime/nodes/booking-form.mailing-list-choice.tsx
|
|
2253
|
+
function BookingMailingListChoice({ booking }) {
|
|
2254
|
+
const id = React.useId();
|
|
2255
|
+
if (!booking.mailingList) return null;
|
|
2256
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
2257
|
+
className: "rb-space-y-2",
|
|
2258
|
+
children: [/* @__PURE__ */ jsx(CheckboxChoice, {
|
|
2259
|
+
id,
|
|
2260
|
+
name: "mailingListOptIn",
|
|
2261
|
+
checked: booking.mailingListOptIn,
|
|
2262
|
+
onChange: (event) => booking.actions.setMailingListOptIn(event.target.checked),
|
|
2263
|
+
label: `Email me news and updates from ${booking.mailingList.siteName}.`
|
|
2264
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
2265
|
+
className: "rb-caption status-muted",
|
|
2266
|
+
children: "Optional. You can unsubscribe at any time."
|
|
2267
|
+
})]
|
|
2268
|
+
});
|
|
2269
|
+
}
|
|
2270
|
+
//#endregion
|
|
2231
2271
|
//#region ../blocks/src/system/runtime/nodes/booking-form.service-choices.tsx
|
|
2232
2272
|
function optionCardClassName(isSelected) {
|
|
2233
2273
|
return `rb-option-card${isSelected ? " rb-option-card--selected" : ""}`;
|
|
@@ -2707,12 +2747,17 @@ function PaymentOptionContent({ description, helperText, id, summaryRows, title
|
|
|
2707
2747
|
});
|
|
2708
2748
|
}
|
|
2709
2749
|
function DefaultDynamicFields({ booking, fields }) {
|
|
2750
|
+
const lastContactIndex = fields.reduce((last, field, index) => [
|
|
2751
|
+
"name",
|
|
2752
|
+
"email",
|
|
2753
|
+
"phone"
|
|
2754
|
+
].includes(field.id) ? index : last, -1);
|
|
2710
2755
|
return /* @__PURE__ */ jsx("div", {
|
|
2711
2756
|
className: "rb-space-y-6",
|
|
2712
|
-
children: fields.map((field) => /* @__PURE__ */ jsx(DefaultDynamicField, {
|
|
2757
|
+
children: fields.map((field, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [/* @__PURE__ */ jsx(DefaultDynamicField, {
|
|
2713
2758
|
booking,
|
|
2714
2759
|
field
|
|
2715
|
-
}, field.id))
|
|
2760
|
+
}), index === lastContactIndex && booking.mailingList ? /* @__PURE__ */ jsx(BookingMailingListChoice, { booking }) : null] }, field.id))
|
|
2716
2761
|
});
|
|
2717
2762
|
}
|
|
2718
2763
|
function DefaultDynamicField({ booking, field }) {
|
|
@@ -2983,9 +3028,88 @@ function DefaultBookingErrorSummary({ errors, id }) {
|
|
|
2983
3028
|
});
|
|
2984
3029
|
}
|
|
2985
3030
|
//#endregion
|
|
3031
|
+
//#region ../blocks/src/system/runtime/components/booking/SuccessMessage.tsx
|
|
3032
|
+
const SuccessMessage = ({ message, resourceName, className }) => {
|
|
3033
|
+
return /* @__PURE__ */ jsx(TerminalPanel, {
|
|
3034
|
+
tone: "success",
|
|
3035
|
+
title: "Booking confirmed",
|
|
3036
|
+
icon: /* @__PURE__ */ jsx(StateIcon, {
|
|
3037
|
+
variant: "success",
|
|
3038
|
+
children: /* @__PURE__ */ jsx(CheckIcon, { strokeWidth: 3 })
|
|
3039
|
+
}),
|
|
3040
|
+
body: /* @__PURE__ */ jsx("p", {
|
|
3041
|
+
className: "ab-text",
|
|
3042
|
+
children: message
|
|
3043
|
+
}),
|
|
3044
|
+
secondaryBody: resourceName ? /* @__PURE__ */ jsxs("p", {
|
|
3045
|
+
className: "ab-text rb-on-surface--muted",
|
|
3046
|
+
children: ["Practitioner: ", resourceName]
|
|
3047
|
+
}) : null,
|
|
3048
|
+
className: ["ab-center", className ?? ""].join(" ").trim(),
|
|
3049
|
+
titleClassName: "ab-terminal-title",
|
|
3050
|
+
role: "alert",
|
|
3051
|
+
live: "polite"
|
|
3052
|
+
});
|
|
3053
|
+
};
|
|
3054
|
+
//#endregion
|
|
3055
|
+
//#region ../blocks/src/system/runtime/nodes/booking-form.mailing-list-note.ts
|
|
3056
|
+
function storageKey(sessionId) {
|
|
3057
|
+
return `riverbank:booking:mailing-list:${sessionId}`;
|
|
3058
|
+
}
|
|
3059
|
+
function saveAppointmentMailingListNote(sessionId, note) {
|
|
3060
|
+
if (!note) return;
|
|
3061
|
+
try {
|
|
3062
|
+
window.sessionStorage.setItem(storageKey(sessionId), note);
|
|
3063
|
+
} catch {}
|
|
3064
|
+
}
|
|
3065
|
+
function readAppointmentMailingListNote(sessionId) {
|
|
3066
|
+
try {
|
|
3067
|
+
const stored = window.sessionStorage.getItem(storageKey(sessionId));
|
|
3068
|
+
return stored === "confirmation_required" || stored === "not_confirmed" ? stored : null;
|
|
3069
|
+
} catch {
|
|
3070
|
+
return null;
|
|
3071
|
+
}
|
|
3072
|
+
}
|
|
3073
|
+
//#endregion
|
|
3074
|
+
//#region ../blocks/src/system/runtime/nodes/booking-form.completion.tsx
|
|
3075
|
+
function BookingFormCompletion({ resourceName, successMessage, redirectState, localNote }) {
|
|
3076
|
+
const note = redirectState.kind === "success" ? readAppointmentMailingListNote(redirectState.sessionId) : localNote;
|
|
3077
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(SuccessMessage, {
|
|
3078
|
+
message: getBookingSuccessMessage(successMessage),
|
|
3079
|
+
resourceName
|
|
3080
|
+
}), note ? /* @__PURE__ */ jsx(BookingMailingListNote, {
|
|
3081
|
+
note,
|
|
3082
|
+
context: "booking",
|
|
3083
|
+
className: "rb-mt-4"
|
|
3084
|
+
}) : null] });
|
|
3085
|
+
}
|
|
3086
|
+
//#endregion
|
|
3087
|
+
//#region ../blocks/src/system/runtime/nodes/booking-form.submit-handler.ts
|
|
3088
|
+
function appendRebookFlag(url, enabled) {
|
|
3089
|
+
if (!enabled) return url;
|
|
3090
|
+
const nextUrl = new URL(url);
|
|
3091
|
+
nextUrl.searchParams.set("rebook", "1");
|
|
3092
|
+
return nextUrl.toString();
|
|
3093
|
+
}
|
|
3094
|
+
function createBookingFormSubmitHandler(input) {
|
|
3095
|
+
return async () => {
|
|
3096
|
+
const { successUrl, cancelUrl } = buildCheckoutReturnUrls("booking", input.bookingAnchorId);
|
|
3097
|
+
const result = await input.booking.actions.submit({
|
|
3098
|
+
redirect: "manual",
|
|
3099
|
+
successUrl: appendRebookFlag(successUrl, input.isPortalRebook),
|
|
3100
|
+
cancelUrl: appendRebookFlag(cancelUrl, input.isPortalRebook)
|
|
3101
|
+
});
|
|
3102
|
+
if (!result.ok) return;
|
|
3103
|
+
if (result.outcome.kind === "checkout_redirect") {
|
|
3104
|
+
saveAppointmentMailingListNote(result.outcome.sessionId, result.outcome.mailingListSignupNote);
|
|
3105
|
+
window.location.href = result.outcome.checkoutUrl;
|
|
3106
|
+
return;
|
|
3107
|
+
}
|
|
3108
|
+
input.setLocalMailingListNote(result.outcome.mailingListSignupNote ?? null);
|
|
3109
|
+
};
|
|
3110
|
+
}
|
|
3111
|
+
//#endregion
|
|
2986
3112
|
//#region ../blocks/src/system/runtime/nodes/booking-form.client.tsx
|
|
2987
|
-
const PORTAL_REBOOK_QUERY_PARAM = "rebook";
|
|
2988
|
-
const PORTAL_REBOOK_QUERY_VALUE = "1";
|
|
2989
3113
|
const REBOOK_COMPLETION_MODE_VERIFIED_CHECKOUT = "verified_checkout";
|
|
2990
3114
|
const REBOOK_COMPLETION_MODE_BYPASSED = "bypassed";
|
|
2991
3115
|
function getBookingRedirectLocationSnapshot() {
|
|
@@ -2998,12 +3122,6 @@ function getBookingRedirectLocationSnapshot() {
|
|
|
2998
3122
|
hash: window.location.hash
|
|
2999
3123
|
};
|
|
3000
3124
|
}
|
|
3001
|
-
function appendRebookFlag(url, enabled) {
|
|
3002
|
-
if (!enabled) return url;
|
|
3003
|
-
const nextUrl = new URL(url);
|
|
3004
|
-
nextUrl.searchParams.set(PORTAL_REBOOK_QUERY_PARAM, PORTAL_REBOOK_QUERY_VALUE);
|
|
3005
|
-
return nextUrl.toString();
|
|
3006
|
-
}
|
|
3007
3125
|
/**
|
|
3008
3126
|
* Themed surface container for every booking view state (wizard, success,
|
|
3009
3127
|
* verifying). Styled by the shared registration-surface layer.
|
|
@@ -3026,12 +3144,16 @@ const BookingFormClient = ({ siteId: siteIdProp, render }) => {
|
|
|
3026
3144
|
const isPortalRebook = render.hydration.rebookContext?.kind === "portal_rebook";
|
|
3027
3145
|
const hasLoggedRebookCompletionRef = useRef(false);
|
|
3028
3146
|
const [redirectState] = useState(() => getBookingRedirectStateFromLocation(getBookingRedirectLocationSnapshot()));
|
|
3147
|
+
const [localMailingListNote, setLocalMailingListNote] = useState(null);
|
|
3029
3148
|
const showSpamProtection = render.hydration.spamProtectionEnabled ?? isSpamProtectionEnabled();
|
|
3030
3149
|
const api = useBlockApi();
|
|
3031
3150
|
const hasPortalAuth = api.config.auth.type === "bearer" || api.config.authOverrides?.portal?.type === "bearer";
|
|
3151
|
+
const formId = render.hydration.formId ?? form?.id ?? "booking-form";
|
|
3032
3152
|
const booking = useHeadlessBookingFlow({
|
|
3153
|
+
mailingList: render.hydration.mailingList,
|
|
3154
|
+
siteName: render.hydration.siteName,
|
|
3033
3155
|
siteId,
|
|
3034
|
-
formId
|
|
3156
|
+
formId,
|
|
3035
3157
|
form,
|
|
3036
3158
|
services,
|
|
3037
3159
|
serviceCategories: render.hydration.serviceCategories,
|
|
@@ -3101,22 +3223,20 @@ const BookingFormClient = ({ siteId: siteIdProp, render }) => {
|
|
|
3101
3223
|
children: render.display.message ?? "Booking form not found. Please check your configuration."
|
|
3102
3224
|
})
|
|
3103
3225
|
});
|
|
3104
|
-
const handleComplete =
|
|
3105
|
-
|
|
3106
|
-
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
});
|
|
3111
|
-
if (!result.ok) return;
|
|
3112
|
-
if (result.outcome.kind === "checkout_redirect") window.location.href = result.outcome.checkoutUrl;
|
|
3113
|
-
};
|
|
3226
|
+
const handleComplete = createBookingFormSubmitHandler({
|
|
3227
|
+
booking,
|
|
3228
|
+
bookingAnchorId,
|
|
3229
|
+
isPortalRebook,
|
|
3230
|
+
setLocalMailingListNote
|
|
3231
|
+
});
|
|
3114
3232
|
if (viewState.kind === "success") return /* @__PURE__ */ jsx(BookingSurface, {
|
|
3115
3233
|
id: bookingAnchorId,
|
|
3116
3234
|
className: render.display.className,
|
|
3117
|
-
children: /* @__PURE__ */ jsx(
|
|
3118
|
-
|
|
3119
|
-
resourceName: viewState.resourceName
|
|
3235
|
+
children: /* @__PURE__ */ jsx(BookingFormCompletion, {
|
|
3236
|
+
successMessage: render.display.successMessage,
|
|
3237
|
+
resourceName: viewState.resourceName,
|
|
3238
|
+
redirectState,
|
|
3239
|
+
localNote: localMailingListNote
|
|
3120
3240
|
})
|
|
3121
3241
|
});
|
|
3122
3242
|
if (viewState.kind === "verifying") return /* @__PURE__ */ jsx(BookingSurface, {
|