@riverbankcms/sdk 0.88.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.
- package/dist/{PreviewEditorSidebar-EVRS3C7T.mjs → PreviewEditorSidebar-JDR64FEC.mjs} +3 -3
- package/dist/{PreviewEditorUI-54WD4IGE.mjs → PreviewEditorUI-67TMJMAF.mjs} +3 -3
- package/dist/SdkPreviewModeRuntime-ZBEMRV7N.mjs +8 -0
- package/dist/_dts/api/src/accessAdmin.d.ts +7 -0
- package/dist/_dts/api/src/endpoints.d.ts +8 -0
- package/dist/_dts/api/src/index.d.ts +2 -2
- package/dist/_dts/api/src/siteManagementEndpoints.d.ts +5 -1
- package/dist/_dts/api/src/siteMembers.d.ts +6 -1
- package/dist/_dts/api/src/types.d.ts +1 -1
- package/dist/_dts/blocks/src/system/icons/cta.d.ts +3 -3
- package/dist/_dts/blocks/src/system/icons/index.d.ts +1 -0
- package/dist/_dts/blocks/src/system/icons/registry.d.ts +2 -2
- package/dist/_dts/blocks/src/system/icons/semantic.d.ts +3 -3
- package/dist/_dts/blocks/src/system/icons/svg.d.ts +72 -0
- package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +1 -0
- package/dist/_dts/blocks/src/system/runtime/hooks/loadStateError.d.ts +1 -0
- package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableDates.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableDates.state.d.ts +55 -0
- package/dist/_dts/blocks/src/system/runtime/hooks/useAvailableSlots.state.d.ts +39 -0
- package/dist/_dts/blocks/src/system/runtime/hooks/useBookingFormConfig.d.ts +4 -27
- package/dist/_dts/blocks/src/system/runtime/hooks/useBookingFormConfig.state.d.ts +40 -0
- package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.state.d.ts +20 -0
- package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.state.d.ts +31 -0
- package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.d.ts +3 -3
- package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.state.d.ts +39 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventPaginatedListView.client.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.state.d.ts +24 -2
- package/dist/_dts/blocks/src/system/runtime/nodes/shared/MagicLinkForm.state.d.ts +24 -0
- package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.state.d.ts +35 -0
- package/dist/_dts/content-model/src/entry-slots/types.d.ts +54 -0
- package/dist/_dts/core/src/branded.d.ts +7 -0
- package/dist/_dts/core/src/index.d.ts +1 -0
- package/dist/_dts/core/src/site-route-target.d.ts +40 -0
- package/dist/_dts/db/src/generated/supabase/database.types.d.ts +159 -2
- package/dist/_dts/media-core/src/fileDomain.d.ts +4 -0
- package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +160 -0
- package/dist/_dts/sdk/src/client/types.d.ts +26 -1
- package/dist/_dts/sdk/src/index.d.ts +3 -1
- package/dist/_dts/sdk/src/version.d.ts +1 -1
- package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
- package/dist/{chunk-YDMBIIS5.mjs → chunk-7N46MZHI.mjs} +1 -1
- package/dist/{chunk-7KOO7RPP.mjs → chunk-7YUAXONX.mjs} +1007 -353
- package/dist/{chunk-O4LVYUVH.mjs → chunk-F645A5UV.mjs} +18 -0
- package/dist/{chunk-ER4UIW4X.mjs → chunk-HKJQERFR.mjs} +7 -7
- package/dist/{chunk-K3JWH6HE.mjs → chunk-TGBJWKMP.mjs} +1 -1
- package/dist/{chunk-HVOBXA3Y.mjs → chunk-ZQRBLCW5.mjs} +2 -2
- package/dist/cli/index.mjs +668 -18
- package/dist/client/{accordion-PT5CGW5N.mjs → accordion-MUCVNGQ7.mjs} +2 -2
- package/dist/client/{bookingForm-2HLRTEYS.mjs → bookingForm-PKD6EFIE.mjs} +192 -76
- package/dist/client/bookings.mjs +436 -191
- package/dist/client/{carousel-Z2LKYSWA.mjs → carousel-3TKQSNJC.mjs} +4 -3
- package/dist/client/{cart-ND5IK4A6.mjs → cart-6XHSZK23.mjs} +8 -7
- package/dist/client/{checkout-EYUSGAY7.mjs → checkout-FVSPM6FI.mjs} +8 -7
- package/dist/client/chunk-6N7YRNYU.mjs +183 -0
- package/dist/client/{chunk-O5JNI3E4.mjs → chunk-7DH35FGA.mjs} +2 -2
- package/dist/client/{chunk-BAWHZ5GM.mjs → chunk-CQKKFEQD.mjs} +195 -61
- package/dist/client/{chunk-X7GVFB7Y.mjs → chunk-EY42X22F.mjs} +3 -3
- package/dist/client/{chunk-6DVPO44G.mjs → chunk-FHU6PFPM.mjs} +1 -1
- package/dist/client/{chunk-H4MHEXYS.mjs → chunk-LQFDYWPJ.mjs} +1 -1
- package/dist/client/{chunk-MHBEWDT7.mjs → chunk-RSQWWUAD.mjs} +122 -50
- package/dist/client/{chunk-GOFO7HRH.mjs → chunk-STJ2NCQM.mjs} +1 -1
- package/dist/client/{chunk-DIRW2LNG.mjs → chunk-UQFY4AHX.mjs} +272 -198
- package/dist/client/{chunk-WCVK4MBJ.mjs → chunk-VGLXACVK.mjs} +1 -1
- package/dist/client/{chunk-BL66UWGD.mjs → chunk-ZJZZA5EP.mjs} +6 -6
- package/dist/client/{chunk-S4G65LGR.mjs → chunk-ZT5XE7FK.mjs} +1 -1
- package/dist/client/client.mjs +3823 -3507
- package/dist/client/{courseRegistration-H3AZBUEG.mjs → courseRegistration-ATZSYDHM.mjs} +6 -6
- package/dist/client/{eventCalendar-FPKJGLGS.mjs → eventCalendar-6T2UGKKP.mjs} +10 -9
- package/dist/client/{eventCombined-QCGIZBUY.mjs → eventCombined-Q4VANXVF.mjs} +10 -9
- package/dist/client/{eventDetails-HIT3BJWU.mjs → eventDetails-DW37E7VW.mjs} +10 -9
- package/dist/client/{eventListing-R4HNWJDN.mjs → eventListing-XURTSAUW.mjs} +10 -9
- package/dist/client/{eventRegistration-Q7BYY5HF.mjs → eventRegistration-MRKEVAXW.mjs} +10 -9
- package/dist/client/{form-NI6YOG6S.mjs → form-WZZFFGMU.mjs} +3 -3
- package/dist/client/{headerSection-SDYGII36.mjs → headerSection-EQYVQBLM.mjs} +3 -3
- package/dist/client/hooks.mjs +18 -0
- package/dist/client/{locationMap-BDETEUQD.mjs → locationMap-MFF5VAZR.mjs} +3 -3
- package/dist/client/{newsletterForm-EKYIU67X.mjs → newsletterForm-JQ77UYIE.mjs} +60 -24
- package/dist/client/{productDetail-5UTGNN76.mjs → productDetail-25LMT3IZ.mjs} +8 -7
- package/dist/client/{productList-7YA5KXZQ.mjs → productList-5ABEMKUG.mjs} +8 -7
- package/dist/client/rendering/client.mjs +3266 -3528
- package/dist/client/rendering/islands.mjs +19 -19
- package/dist/client/rendering.mjs +3143 -3452
- package/dist/client/{shop-AIMUMZYC.mjs → shop-OMMQZ6YO.mjs} +8 -7
- package/dist/preview-next/before-render.mjs +18 -0
- package/dist/preview-next/client/runtime.mjs +5 -5
- package/dist/preview-next/middleware.mjs +18 -0
- package/dist/{sdk-runtime-NW472WNT.mjs → sdk-runtime-WNLBZ3ZH.mjs} +6 -6
- package/dist/server/components.mjs +1068 -1540
- package/dist/server/config-validation.mjs +18 -0
- package/dist/server/config.mjs +18 -0
- package/dist/server/data.mjs +18 -0
- package/dist/server/index.mjs +847 -261
- package/dist/server/next.mjs +1708 -1555
- package/dist/server/prebuild.mjs +1 -1
- package/dist/server/rendering/server.mjs +1068 -1540
- package/dist/server/rendering.mjs +1074 -1546
- package/dist/server/routing.mjs +314 -9
- package/dist/server/server.mjs +668 -25
- package/dist/server/theme-bridge.mjs +26 -0
- package/dist/styles/index.css +26 -0
- package/package.json +2 -1
- package/dist/SdkPreviewModeRuntime-ZALZDJEK.mjs +0 -8
- /package/dist/client/{chunk-LI2C6M5O.mjs → chunk-25W2EQUN.mjs} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defineIslandPropsDecoder } from './chunk-
|
|
2
|
-
import './chunk-
|
|
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-
|
|
3
|
-
import { SpinnerNode } from './chunk-
|
|
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-
|
|
6
|
+
import { scrollToBlock, buildCheckoutReturnUrls, DiscountCodeDisclosure, formatPrice } from './chunk-EY42X22F.mjs';
|
|
7
7
|
import { FieldValidationMessage, getFieldValidationControlProps } from './chunk-3DCJ45Z2.mjs';
|
|
8
8
|
import './chunk-WBQG7VJA.mjs';
|
|
9
9
|
import { isSpamProtectionEnabled, getChallengeUrl, AltchaWidget } from './chunk-SDIYSQAY.mjs';
|
|
10
|
-
import { BlockApiProvider, useBlockApi, FeedbackMessage } from './chunk-
|
|
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-
|
|
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-
|
|
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 [
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
237
|
+
dispatch({ type: "refresh-started" });
|
|
170
238
|
} else {
|
|
171
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
data.dates
|
|
187
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
|
|
213
|
-
|
|
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 (!
|
|
240
|
-
const start =
|
|
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 [
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|
-
|
|
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
|
-
|
|
406
|
+
dispatch({ type: "refresh-started" });
|
|
289
407
|
} else {
|
|
290
|
-
|
|
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
|
-
|
|
305
|
-
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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 {
|
|
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
|