@riverbankcms/sdk 0.85.0 → 0.89.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/{PreviewEditorSidebar-4PH35ZIE.mjs → PreviewEditorSidebar-JDR64FEC.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-WHMCRJGM.mjs → PreviewEditorUI-67TMJMAF.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-ZBEMRV7N.mjs +8 -0
  4. package/dist/_dts/api/src/accessAdmin.d.ts +7 -0
  5. package/dist/_dts/api/src/endpoints.d.ts +66 -14
  6. package/dist/_dts/api/src/index.d.ts +5 -2
  7. package/dist/_dts/api/src/launchReadiness.d.ts +3 -3
  8. package/dist/_dts/api/src/mailchimpIntegration.d.ts +215 -0
  9. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +35 -15
  10. package/dist/_dts/api/src/siteInfrastructure.d.ts +0 -14
  11. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +5 -1
  12. package/dist/_dts/api/src/siteMembers.d.ts +6 -1
  13. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +1 -13
  14. package/dist/_dts/api/src/types.d.ts +7 -4
  15. package/dist/_dts/blocks/src/PageRenderer.d.ts +1 -0
  16. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
  17. package/dist/_dts/blocks/src/index.d.ts +2 -1
  18. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  19. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  20. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  21. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  22. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  23. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  24. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  25. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +288 -288
  26. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  27. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  28. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +42 -42
  29. package/dist/_dts/blocks/src/system/blocks/newsletter-signup-destination.d.ts +300 -0
  30. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +63 -3
  31. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  32. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  33. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  34. package/dist/_dts/blocks/src/system/fragments/library/newsletterForm.d.ts +53 -1
  35. package/dist/_dts/blocks/src/system/icons/cta.d.ts +3 -3
  36. package/dist/_dts/blocks/src/system/icons/index.d.ts +1 -0
  37. package/dist/_dts/blocks/src/system/icons/registry.d.ts +2 -2
  38. package/dist/_dts/blocks/src/system/icons/semantic.d.ts +3 -3
  39. package/dist/_dts/blocks/src/system/icons/svg.d.ts +72 -0
  40. package/dist/_dts/blocks/src/system/manifest/richTextSchema.d.ts +27 -0
  41. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -23
  42. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +11 -2
  43. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -0
  44. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +12 -0
  45. package/dist/_dts/blocks/src/system/runtime/hooks/loadStateError.d.ts +1 -0
  46. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableDates.d.ts +1 -1
  47. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableDates.state.d.ts +55 -0
  48. package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableSlots.state.d.ts +39 -0
  49. package/dist/_dts/blocks/src/system/runtime/hooks/useBookingFormConfig.d.ts +4 -27
  50. package/dist/_dts/blocks/src/system/runtime/hooks/useBookingFormConfig.state.d.ts +40 -0
  51. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.state.d.ts +20 -0
  52. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.state.d.ts +31 -0
  53. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.d.ts +3 -3
  54. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.state.d.ts +39 -0
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +1 -0
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +4 -0
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  58. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventPaginatedListView.client.d.ts +1 -1
  59. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +11 -1
  60. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.state.d.ts +24 -2
  61. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +15 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.server.d.ts +1 -1
  63. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +32 -0
  64. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +5 -1
  65. package/dist/_dts/blocks/src/system/runtime/nodes/shared/MagicLinkForm.state.d.ts +24 -0
  66. package/dist/_dts/blocks/src/system/runtime/shared/components/ModalShell.d.ts +5 -1
  67. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.state.d.ts +35 -0
  68. package/dist/_dts/blocks/src/system/runtime/shared/utils/formatting.d.ts +1 -1
  69. package/dist/_dts/content-model/src/entry-slots/types.d.ts +54 -0
  70. package/dist/_dts/content-model/src/referenceFields.d.ts +1 -1
  71. package/dist/_dts/core/src/branded.d.ts +7 -0
  72. package/dist/_dts/core/src/currency-format.d.ts +37 -2
  73. package/dist/_dts/core/src/event-pricing.d.ts +24 -0
  74. package/dist/_dts/core/src/index.d.ts +1 -0
  75. package/dist/_dts/core/src/site-route-target.d.ts +40 -0
  76. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +705 -17
  77. package/dist/_dts/editor-blocks/src/widgets/reference/loaders.d.ts +3 -1
  78. package/dist/_dts/media-core/src/fileDomain.d.ts +4 -0
  79. package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +160 -0
  80. package/dist/_dts/sdk/src/client/types.d.ts +35 -1
  81. package/dist/_dts/sdk/src/config/validation.d.ts +3 -0
  82. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +3 -0
  83. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +3 -9
  84. package/dist/_dts/sdk/src/index.d.ts +3 -1
  85. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +1 -1
  86. package/dist/_dts/sdk/src/manifest/three-pass-converter.d.ts +7 -18
  87. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  88. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +3 -1
  89. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +7 -3
  90. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +4 -24
  91. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +45 -0
  92. package/dist/_dts/sdk/src/version.d.ts +1 -1
  93. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  94. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +9 -9
  95. package/dist/_dts/theme-core/src/schema.d.ts +11 -11
  96. package/dist/{chunk-PYDHOMEO.mjs → chunk-7N46MZHI.mjs} +1 -1
  97. package/dist/{chunk-ZR2GQK2A.mjs → chunk-7YUAXONX.mjs} +1880 -588
  98. package/dist/{chunk-4QNLOTES.mjs → chunk-F645A5UV.mjs} +76 -14
  99. package/dist/{chunk-OCGTXHSO.mjs → chunk-HKJQERFR.mjs} +7 -7
  100. package/dist/{chunk-NFWGLRZZ.mjs → chunk-TGBJWKMP.mjs} +37 -3
  101. package/dist/{chunk-WFPYN7KA.mjs → chunk-ZQRBLCW5.mjs} +2 -2
  102. package/dist/cli/index.mjs +1075 -126
  103. package/dist/client/{accordion-2UZPBMYM.mjs → accordion-MUCVNGQ7.mjs} +2 -2
  104. package/dist/client/{bookingForm-36CWQUMV.mjs → bookingForm-PKD6EFIE.mjs} +193 -77
  105. package/dist/client/bookings.mjs +487 -197
  106. package/dist/client/{carousel-QH77HR6X.mjs → carousel-3TKQSNJC.mjs} +4 -3
  107. package/dist/client/cart-6XHSZK23.mjs +19 -0
  108. package/dist/client/checkout-FVSPM6FI.mjs +19 -0
  109. package/dist/client/{chunk-ZE5G642V.mjs → chunk-25W2EQUN.mjs} +75 -1
  110. package/dist/client/chunk-6N7YRNYU.mjs +183 -0
  111. package/dist/client/{chunk-4OXKTA3D.mjs → chunk-7DH35FGA.mjs} +2 -2
  112. package/dist/client/{chunk-3C2VTPWI.mjs → chunk-CQKKFEQD.mjs} +363 -66
  113. package/dist/client/{chunk-7UCLJ5SP.mjs → chunk-EY42X22F.mjs} +4 -7
  114. package/dist/client/{chunk-SYIJ5JO2.mjs → chunk-FHU6PFPM.mjs} +1 -1
  115. package/dist/client/{chunk-ZKUO52W3.mjs → chunk-LQFDYWPJ.mjs} +1 -1
  116. package/dist/client/chunk-RSQWWUAD.mjs +390 -0
  117. package/dist/client/{chunk-UDNSI5PY.mjs → chunk-STJ2NCQM.mjs} +2 -3
  118. package/dist/client/{chunk-VGDBVNOO.mjs → chunk-UQFY4AHX.mjs} +511 -406
  119. package/dist/client/{chunk-F5VRX5Y6.mjs → chunk-VGLXACVK.mjs} +1 -1
  120. package/dist/client/{chunk-DVNUDUVT.mjs → chunk-WBQG7VJA.mjs} +4 -1
  121. package/dist/client/{chunk-52CGCQ7B.mjs → chunk-ZJZZA5EP.mjs} +10 -80
  122. package/dist/client/{chunk-XSV6KW4D.mjs → chunk-ZT5XE7FK.mjs} +1 -1
  123. package/dist/client/client.mjs +5820 -4782
  124. package/dist/client/{courseRegistration-TMKU6ABO.mjs → courseRegistration-ATZSYDHM.mjs} +7 -7
  125. package/dist/client/{eventCalendar-G6TI32X6.mjs → eventCalendar-6T2UGKKP.mjs} +11 -11
  126. package/dist/client/{eventCombined-SCKEMNAR.mjs → eventCombined-Q4VANXVF.mjs} +11 -11
  127. package/dist/client/{eventDetails-XPIFXXPK.mjs → eventDetails-DW37E7VW.mjs} +11 -11
  128. package/dist/client/{eventListing-7QFMEMGT.mjs → eventListing-XURTSAUW.mjs} +11 -11
  129. package/dist/client/{eventRegistration-TOODSZUI.mjs → eventRegistration-MRKEVAXW.mjs} +11 -11
  130. package/dist/client/{form-MTCMVCZT.mjs → form-WZZFFGMU.mjs} +3 -3
  131. package/dist/client/{headerSection-Y5TMR3TW.mjs → headerSection-EQYVQBLM.mjs} +4 -4
  132. package/dist/client/hooks.mjs +1700 -1412
  133. package/dist/client/{locationMap-RH2LG7FZ.mjs → locationMap-MFF5VAZR.mjs} +3 -4
  134. package/dist/client/{newsletterForm-PCAIPFMA.mjs → newsletterForm-JQ77UYIE.mjs} +127 -43
  135. package/dist/client/{productDetail-OIGDR4YE.mjs → productDetail-25LMT3IZ.mjs} +9 -9
  136. package/dist/client/{productList-4MA5S2CX.mjs → productList-5ABEMKUG.mjs} +9 -9
  137. package/dist/client/rendering/client.mjs +3884 -3722
  138. package/dist/client/rendering/islands.mjs +19 -19
  139. package/dist/client/rendering.mjs +6774 -6331
  140. package/dist/client/shop-OMMQZ6YO.mjs +21 -0
  141. package/dist/preview-next/before-render.mjs +76 -14
  142. package/dist/preview-next/client/runtime.mjs +5 -5
  143. package/dist/preview-next/editor-chrome.css +56 -9
  144. package/dist/preview-next/middleware.mjs +76 -14
  145. package/dist/{sdk-runtime-QLOCYKVU.mjs → sdk-runtime-WNLBZ3ZH.mjs} +6 -6
  146. package/dist/server/components.mjs +2579 -2548
  147. package/dist/server/config-validation.mjs +1737 -1461
  148. package/dist/server/config.mjs +1737 -1461
  149. package/dist/server/data.mjs +1701 -1413
  150. package/dist/server/index.mjs +1048 -400
  151. package/dist/server/next.mjs +3602 -2858
  152. package/dist/server/page-converter.mjs +2193 -1169
  153. package/dist/server/prebuild.mjs +1 -1
  154. package/dist/server/rendering/server.mjs +2770 -2742
  155. package/dist/server/rendering.mjs +2961 -2886
  156. package/dist/server/routing.mjs +2186 -1508
  157. package/dist/server/server.mjs +2237 -1287
  158. package/dist/server/theme-bridge.mjs +260 -0
  159. package/dist/styles/index.css +258 -0
  160. package/package.json +2 -1
  161. package/dist/SdkPreviewModeRuntime-4FGSVUYI.mjs +0 -8
  162. package/dist/client/cart-X4YK4FTW.mjs +0 -19
  163. package/dist/client/checkout-OM2BEPWD.mjs +0 -19
  164. package/dist/client/chunk-3DTWLTXM.mjs +0 -204
  165. package/dist/client/chunk-I2MMZO53.mjs +0 -6
  166. package/dist/client/shop-WXSYV5QO.mjs +0 -21
@@ -1,5 +1,5 @@
1
- import { defineIslandPropsDecoder } from './chunk-VGDBVNOO.mjs';
2
- import './chunk-ZE5G642V.mjs';
1
+ import { defineIslandPropsDecoder } from './chunk-UQFY4AHX.mjs';
2
+ import './chunk-25W2EQUN.mjs';
3
3
 
4
4
  // src/rendering/islands/enhancers/accordion.ts
5
5
  var decode = defineIslandPropsDecoder("accordion");
@@ -1,16 +1,16 @@
1
1
  "use client";
2
- import { usePolling } from './chunk-ZKUO52W3.mjs';
3
- import { SpinnerNode } from './chunk-SYIJ5JO2.mjs';
2
+ import { usePolling } from './chunk-LQFDYWPJ.mjs';
3
+ import { SpinnerNode } from './chunk-FHU6PFPM.mjs';
4
4
  import { useDiscountCodeUi } from './chunk-ZFHRN6W2.mjs';
5
5
  import { buildRouteIslandApiConfig } from './chunk-L4J5Y62O.mjs';
6
- import { scrollToBlock, buildCheckoutReturnUrls, DiscountCodeDisclosure, formatPrice } from './chunk-7UCLJ5SP.mjs';
6
+ import { scrollToBlock, buildCheckoutReturnUrls, DiscountCodeDisclosure, formatPrice } from './chunk-EY42X22F.mjs';
7
7
  import { FieldValidationMessage, getFieldValidationControlProps } from './chunk-3DCJ45Z2.mjs';
8
- import './chunk-DVNUDUVT.mjs';
8
+ import './chunk-WBQG7VJA.mjs';
9
9
  import { isSpamProtectionEnabled, getChallengeUrl, AltchaWidget } from './chunk-SDIYSQAY.mjs';
10
- import { BlockApiProvider, useBlockApi, FeedbackMessage } from './chunk-UDNSI5PY.mjs';
10
+ import { BlockApiProvider, useBlockApi, FeedbackMessage } from './chunk-STJ2NCQM.mjs';
11
11
  import { mountReactIsland } from './chunk-N7PBWBWQ.mjs';
12
- import { defineIslandPropsDecoder, resolveBookingSiteId, resolveDefaultBookingServiceId, getBookingRedirectStateFromLocation, deriveBookingFormViewState, logger, getBookingSuccessMessage, resolveAppointmentCheckoutVerificationState, themeButtonClassName, toSelectedCollectionOptionKind, assertNever11, prepareBookingSubmission, formatBookingSubmissionPreparationError, resolveBookingPaymentStep, BOOKING_FORM_DATA_RESERVED_KEYS, clearWorkflowFeedback, reportWorkflowError, reportWorkflowSuccess, okWith2, err2 } from './chunk-VGDBVNOO.mjs';
13
- import { resolveBookingTimeZoneId, DEFAULT_BOOKING_TIME_ZONE, unsafeAsFormId, unsafeAsAppointmentResourceId, unsafeAsCustomerPassId, unsafeAsAppointmentServiceId, formatLocalScheduleDate, addLocalScheduleDays, parseBookingLocalDate, resolveFlexibleBalanceInitialPaymentCents, resolveFlexibleBalanceDueAt, getBookingInstalmentDepositRefundability, unsafeAsPassId, splitAmountWithRemainderInFirst, addIntervalPreservingMonthAnchor, clampConfiguredAmount, getBookingInstalmentPlanIntervalCount, omitZeroAmountFutureRows, formatBookingInstant } from './chunk-ZE5G642V.mjs';
12
+ import { defineIslandPropsDecoder, resolveBookingSiteId, resolveDefaultBookingServiceId, getBookingRedirectStateFromLocation, deriveBookingFormViewState, logger, getBookingSuccessMessage, resolveAppointmentCheckoutVerificationState, themeButtonClassName, toSelectedCollectionOptionKind, assertNever11, prepareBookingSubmission, formatBookingSubmissionPreparationError, resolveBookingPaymentStep, BOOKING_FORM_DATA_RESERVED_KEYS, clearWorkflowFeedback, reportWorkflowError, reportWorkflowSuccess, okWith2, err2 } from './chunk-UQFY4AHX.mjs';
13
+ import { resolveBookingTimeZoneId, DEFAULT_BOOKING_TIME_ZONE, unsafeAsFormId, unsafeAsAppointmentResourceId, unsafeAsCustomerPassId, unsafeAsAppointmentServiceId, formatLocalScheduleDate, addLocalScheduleDays, parseBookingLocalDate, resolveFlexibleBalanceInitialPaymentCents, resolveFlexibleBalanceDueAt, getBookingInstalmentDepositRefundability, unsafeAsPassId, splitAmountWithRemainderInFirst, addIntervalPreservingMonthAnchor, clampConfiguredAmount, getBookingInstalmentPlanIntervalCount, omitZeroAmountFutureRows, formatBookingInstant } from './chunk-25W2EQUN.mjs';
14
14
  import React2, { useRef, useState, useMemo, useReducer, useEffect, useCallback, useLayoutEffect } from 'react';
15
15
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
16
16
 
@@ -141,6 +141,74 @@ function useVisibleTabPolling({
141
141
  }, [enabled, intervalMs, jitterMs, minVisibleRefreshIntervalMs]);
142
142
  }
143
143
 
144
+ // ../blocks/src/system/runtime/hooks/useAvailableDates.state.ts
145
+ function createEmptyAvailableDatesData() {
146
+ return {
147
+ availableDates: /* @__PURE__ */ new Set(),
148
+ hasMore: false,
149
+ loadedRange: null,
150
+ nextStartDate: null
151
+ };
152
+ }
153
+ function createInitialAvailableDatesState() {
154
+ return {
155
+ tag: "idle",
156
+ data: createEmptyAvailableDatesData()
157
+ };
158
+ }
159
+ function getAvailableDates(state) {
160
+ return state.data.availableDates;
161
+ }
162
+ function getAvailableDatesLoadedRange(state) {
163
+ return state.data.loadedRange;
164
+ }
165
+ function getAvailableDatesNextStartDate(state) {
166
+ return state.data.nextStartDate;
167
+ }
168
+ function hasMoreAvailableDates(state) {
169
+ return state.data.hasMore;
170
+ }
171
+ function isLoadingAvailableDates(state) {
172
+ return state.tag === "loading";
173
+ }
174
+ function isRefreshingAvailableDates(state) {
175
+ return state.tag === "refreshing";
176
+ }
177
+ function getAvailableDatesError(state) {
178
+ return state.tag === "error" ? state.message : null;
179
+ }
180
+ function mergeAvailableDates(previous, action) {
181
+ const availableDates = action.append ? new Set(previous.availableDates) : /* @__PURE__ */ new Set();
182
+ for (const date of action.dates) {
183
+ availableDates.add(date);
184
+ }
185
+ return {
186
+ availableDates,
187
+ hasMore: action.hasMore,
188
+ loadedRange: {
189
+ start: action.append && previous.loadedRange ? previous.loadedRange.start : action.startDate,
190
+ end: action.endDate
191
+ },
192
+ nextStartDate: action.nextStartDate
193
+ };
194
+ }
195
+ function availableDatesReducer(state, action) {
196
+ switch (action.type) {
197
+ case "query-cleared":
198
+ return { tag: "idle", data: createEmptyAvailableDatesData() };
199
+ case "load-started":
200
+ return { tag: "loading", data: state.data };
201
+ case "refresh-started":
202
+ return { tag: "refreshing", data: state.data };
203
+ case "load-succeeded":
204
+ return { tag: "loaded", data: mergeAvailableDates(state.data, action) };
205
+ case "load-failed":
206
+ return { tag: "error", data: state.data, message: action.message };
207
+ default:
208
+ return assertNever11(action);
209
+ }
210
+ }
211
+
144
212
  // ../blocks/src/system/runtime/hooks/useAvailableDates.ts
145
213
  var AVAILABILITY_REFRESH_INTERVAL_MS = 3e4;
146
214
  var AVAILABILITY_REFRESH_JITTER_MS = 5e3;
@@ -153,25 +221,23 @@ function useAvailableDates({
153
221
  initialDays = 30
154
222
  }) {
155
223
  const api = useBlockApi();
156
- const [availableDates, setAvailableDates] = useState(/* @__PURE__ */ new Set());
157
- const [isLoading, setIsLoading] = useState(false);
158
- const [isRefreshing, setIsRefreshing] = useState(false);
159
- const [error, setError] = useState(null);
160
- const [hasMore, setHasMore] = useState(false);
161
- const [loadedRange, setLoadedRange] = useState(null);
162
- const nextStartDateRef = useRef(null);
224
+ const [state, dispatch] = useReducer(
225
+ availableDatesReducer,
226
+ createInitialAvailableDatesState()
227
+ );
163
228
  const requestIdRef = useRef(0);
229
+ const loadedRange = getAvailableDatesLoadedRange(state);
230
+ const isLoading = isLoadingAvailableDates(state);
231
+ const nextStartDate = getAvailableDatesNextStartDate(state);
164
232
  const fetchDates = useCallback(
165
233
  async (startDate, endDate, append = false, mode = "load") => {
166
234
  if (!serviceId) return;
167
235
  const requestId = ++requestIdRef.current;
168
236
  if (mode === "refresh") {
169
- setIsRefreshing(true);
237
+ dispatch({ type: "refresh-started" });
170
238
  } else {
171
- setIsLoading(true);
172
- setIsRefreshing(false);
239
+ dispatch({ type: "load-started" });
173
240
  }
174
- setError(null);
175
241
  try {
176
242
  const data = await api.getAvailableDates({
177
243
  serviceId,
@@ -181,38 +247,29 @@ function useAvailableDates({
181
247
  resourceId
182
248
  });
183
249
  if (requestId !== requestIdRef.current) return;
184
- setAvailableDates((prev) => {
185
- const newSet = append ? new Set(prev) : /* @__PURE__ */ new Set();
186
- data.dates.forEach((d) => newSet.add(d));
187
- return newSet;
250
+ dispatch({
251
+ type: "load-succeeded",
252
+ dates: data.dates,
253
+ hasMore: data.hasMore,
254
+ nextStartDate: data.nextStartDate || null,
255
+ startDate: data.startDate,
256
+ endDate: data.endDate,
257
+ append
188
258
  });
189
- setHasMore(data.hasMore);
190
- nextStartDateRef.current = data.nextStartDate || null;
191
- setLoadedRange((prev) => ({
192
- start: append && prev ? prev.start : data.startDate,
193
- end: data.endDate
194
- }));
195
259
  } catch (err) {
196
260
  if (requestId !== requestIdRef.current) return;
197
- setError(
198
- err instanceof Error ? err.message : "Failed to load available dates"
199
- );
200
- } finally {
201
- if (mode === "refresh" && requestId === requestIdRef.current) {
202
- setIsRefreshing(false);
203
- } else if (requestId === requestIdRef.current) {
204
- setIsLoading(false);
205
- }
261
+ dispatch({
262
+ type: "load-failed",
263
+ message: err instanceof Error ? err.message : "Failed to load available dates"
264
+ });
206
265
  }
207
266
  },
208
267
  [api, serviceId, resourceId, timezone]
209
268
  );
210
269
  useEffect(() => {
211
270
  if (!serviceId) {
212
- setAvailableDates(/* @__PURE__ */ new Set());
213
- setLoadedRange(null);
214
- setHasMore(false);
215
- setIsRefreshing(false);
271
+ requestIdRef.current += 1;
272
+ dispatch({ type: "query-cleared" });
216
273
  return;
217
274
  }
218
275
  const now = /* @__PURE__ */ new Date();
@@ -236,8 +293,8 @@ function useAvailableDates({
236
293
  }
237
294
  });
238
295
  const loadMore = useCallback(() => {
239
- if (!nextStartDateRef.current || isLoading) return;
240
- const start = nextStartDateRef.current;
296
+ if (!nextStartDate || isLoading) return;
297
+ const start = nextStartDate;
241
298
  const end = formatLocalScheduleDate(
242
299
  addLocalScheduleDays(
243
300
  parseBookingLocalDate(start),
@@ -245,17 +302,83 @@ function useAvailableDates({
245
302
  )
246
303
  );
247
304
  void fetchDates(start, end, true);
248
- }, [fetchDates, isLoading]);
305
+ }, [fetchDates, isLoading, nextStartDate]);
249
306
  return {
250
- availableDates,
307
+ availableDates: getAvailableDates(state),
251
308
  isLoading,
252
- isRefreshing,
253
- error,
254
- hasMore,
309
+ isRefreshing: isRefreshingAvailableDates(state),
310
+ error: getAvailableDatesError(state),
311
+ hasMore: hasMoreAvailableDates(state),
255
312
  loadMore,
256
313
  loadedRange
257
314
  };
258
315
  }
316
+
317
+ // ../blocks/src/system/runtime/hooks/useAvailableSlots.state.ts
318
+ var initialAvailableSlotsState = { tag: "idle" };
319
+ function getAvailableSlots(state) {
320
+ switch (state.tag) {
321
+ case "idle":
322
+ case "loading":
323
+ return [];
324
+ case "loaded":
325
+ case "refreshing":
326
+ case "error":
327
+ return state.slots;
328
+ default:
329
+ return assertNever11(state);
330
+ }
331
+ }
332
+ function hasLoadedAvailableSlots(state) {
333
+ switch (state.tag) {
334
+ case "idle":
335
+ return false;
336
+ case "loading":
337
+ case "refreshing":
338
+ case "error":
339
+ return state.hasLoaded;
340
+ case "loaded":
341
+ return true;
342
+ default:
343
+ return assertNever11(state);
344
+ }
345
+ }
346
+ function isLoadingAvailableSlots(state) {
347
+ return state.tag === "loading";
348
+ }
349
+ function isRefreshingAvailableSlots(state) {
350
+ return state.tag === "refreshing";
351
+ }
352
+ function getAvailableSlotsError(state) {
353
+ return state.tag === "error" ? state.message : null;
354
+ }
355
+ function availableSlotsReducer(state, action) {
356
+ switch (action.type) {
357
+ case "query-cleared":
358
+ return { tag: "idle" };
359
+ case "load-started":
360
+ return { tag: "loading", hasLoaded: hasLoadedAvailableSlots(state) };
361
+ case "refresh-started":
362
+ return {
363
+ tag: "refreshing",
364
+ slots: getAvailableSlots(state),
365
+ hasLoaded: hasLoadedAvailableSlots(state)
366
+ };
367
+ case "load-succeeded":
368
+ return { tag: "loaded", slots: action.slots };
369
+ case "load-failed":
370
+ return {
371
+ tag: "error",
372
+ slots: getAvailableSlots(state),
373
+ hasLoaded: hasLoadedAvailableSlots(state),
374
+ message: action.message
375
+ };
376
+ default:
377
+ return assertNever11(action);
378
+ }
379
+ }
380
+
381
+ // ../blocks/src/system/runtime/hooks/useAvailableSlots.ts
259
382
  var AVAILABILITY_REFRESH_INTERVAL_MS2 = 3e4;
260
383
  var AVAILABILITY_REFRESH_JITTER_MS2 = 5e3;
261
384
  function useAvailableSlots({
@@ -267,31 +390,23 @@ function useAvailableSlots({
267
390
  timezone
268
391
  }) {
269
392
  const api = useBlockApi();
270
- const [slots, setSlots] = useState([]);
271
- const [isLoading, setIsLoading] = useState(false);
272
- const [isRefreshing, setIsRefreshing] = useState(false);
273
- const [hasLoaded, setHasLoaded] = useState(false);
274
- const [error, setError] = useState(null);
393
+ const [state, dispatch] = useReducer(
394
+ availableSlotsReducer,
395
+ initialAvailableSlotsState
396
+ );
275
397
  const requestIdRef = useRef(0);
276
398
  const fetchSlots = useCallback(
277
399
  async (mode) => {
278
400
  const requestId = ++requestIdRef.current;
279
401
  if (!selectedDate || !serviceId) {
280
- setSlots([]);
281
- setIsLoading(false);
282
- setIsRefreshing(false);
283
- setHasLoaded(false);
284
- setError(null);
402
+ dispatch({ type: "query-cleared" });
285
403
  return;
286
404
  }
287
405
  if (mode === "refresh") {
288
- setIsRefreshing(true);
406
+ dispatch({ type: "refresh-started" });
289
407
  } else {
290
- setIsLoading(true);
291
- setIsRefreshing(false);
292
- setSlots([]);
408
+ dispatch({ type: "load-started" });
293
409
  }
294
- setError(null);
295
410
  try {
296
411
  const result = await api.getAvailableSlots({
297
412
  serviceId,
@@ -301,24 +416,19 @@ function useAvailableSlots({
301
416
  resourceId
302
417
  });
303
418
  if (requestId !== requestIdRef.current) return;
304
- setSlots(
305
- result.slots.map((slot) => ({
419
+ dispatch({
420
+ type: "load-succeeded",
421
+ slots: result.slots.map((slot) => ({
306
422
  ...slot,
307
423
  resourceId: unsafeAsAppointmentResourceId(slot.resourceId)
308
424
  }))
309
- );
310
- setHasLoaded(true);
425
+ });
311
426
  } catch (err) {
312
427
  if (requestId !== requestIdRef.current) return;
313
- setError(
314
- err instanceof Error ? err.message : "Failed to load available times"
315
- );
316
- } finally {
317
- if (mode === "refresh" && requestId === requestIdRef.current) {
318
- setIsRefreshing(false);
319
- } else if (requestId === requestIdRef.current) {
320
- setIsLoading(false);
321
- }
428
+ dispatch({
429
+ type: "load-failed",
430
+ message: err instanceof Error ? err.message : "Failed to load available times"
431
+ });
322
432
  }
323
433
  },
324
434
  [selectedDate, serviceId, resourceId, timezone, api]
@@ -335,7 +445,13 @@ function useAvailableSlots({
335
445
  jitterMs: AVAILABILITY_REFRESH_JITTER_MS2,
336
446
  onPoll: () => fetchSlots("refresh")
337
447
  });
338
- return { slots, isLoading, isRefreshing, hasLoaded, error };
448
+ return {
449
+ slots: getAvailableSlots(state),
450
+ isLoading: isLoadingAvailableSlots(state),
451
+ isRefreshing: isRefreshingAvailableSlots(state),
452
+ hasLoaded: hasLoadedAvailableSlots(state),
453
+ error: getAvailableSlotsError(state)
454
+ };
339
455
  }
340
456
 
341
457
  // ../blocks/src/system/runtime/hooks/useBookingSubmission.state.ts