@wix/headless-bookings 0.0.26 → 0.0.28

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 (53) hide show
  1. package/cjs/dist/api/create-booking/index.d.ts +42 -0
  2. package/cjs/dist/api/create-booking/index.js +35 -0
  3. package/cjs/dist/api/create-checkout/index.d.ts +40 -0
  4. package/cjs/dist/api/create-checkout/index.js +37 -0
  5. package/cjs/dist/api/fetch-availability/index.d.ts +4 -4
  6. package/cjs/dist/api/fetch-availability/index.js +3 -47
  7. package/cjs/dist/api/index.d.ts +2 -0
  8. package/cjs/dist/api/index.js +2 -0
  9. package/cjs/dist/react/core/time-slot-list/TimeSlot.d.ts +9 -143
  10. package/cjs/dist/react/core/time-slot-list/TimeSlot.js +32 -167
  11. package/cjs/dist/react/core/time-slot-list/TimeSlotList.d.ts +3 -2
  12. package/cjs/dist/react/core/time-slot-list/TimeSlotList.js +1 -1
  13. package/cjs/dist/react/time-slot-list/TimeSlot.d.ts +15 -113
  14. package/cjs/dist/react/time-slot-list/TimeSlot.js +26 -125
  15. package/cjs/dist/react/time-slot-list/TimeSlotList.d.ts +5 -34
  16. package/cjs/dist/react/time-slot-list/TimeSlotList.js +12 -5
  17. package/cjs/dist/services/booking/book-action/bookAction.d.ts +2 -2
  18. package/cjs/dist/services/booking/book-action/bookAction.js +7 -7
  19. package/cjs/dist/services/booking/book-action/buildBookingRequest.d.ts +1 -1
  20. package/cjs/dist/services/booking/book-action/buildCheckoutRequest.d.ts +2 -2
  21. package/cjs/dist/services/booking/book-action/buildCheckoutRequest.js +1 -1
  22. package/cjs/dist/services/index.d.ts +1 -1
  23. package/cjs/dist/services/time-slot-list/index.d.ts +1 -1
  24. package/cjs/dist/services/time-slot-list/time-slot-list.d.ts +4 -4
  25. package/cjs/dist/services/time-slot-list/time-slot-list.def.d.ts +5 -40
  26. package/cjs/dist/services/time-slot-list/time-slot-list.js +38 -167
  27. package/dist/api/create-booking/index.d.ts +42 -0
  28. package/dist/api/create-booking/index.js +35 -0
  29. package/dist/api/create-checkout/index.d.ts +40 -0
  30. package/dist/api/create-checkout/index.js +37 -0
  31. package/dist/api/fetch-availability/index.d.ts +4 -4
  32. package/dist/api/fetch-availability/index.js +3 -47
  33. package/dist/api/index.d.ts +2 -0
  34. package/dist/api/index.js +2 -0
  35. package/dist/react/core/time-slot-list/TimeSlot.d.ts +9 -143
  36. package/dist/react/core/time-slot-list/TimeSlot.js +32 -167
  37. package/dist/react/core/time-slot-list/TimeSlotList.d.ts +3 -2
  38. package/dist/react/core/time-slot-list/TimeSlotList.js +1 -1
  39. package/dist/react/time-slot-list/TimeSlot.d.ts +15 -113
  40. package/dist/react/time-slot-list/TimeSlot.js +26 -125
  41. package/dist/react/time-slot-list/TimeSlotList.d.ts +5 -34
  42. package/dist/react/time-slot-list/TimeSlotList.js +12 -5
  43. package/dist/services/booking/book-action/bookAction.d.ts +2 -2
  44. package/dist/services/booking/book-action/bookAction.js +7 -7
  45. package/dist/services/booking/book-action/buildBookingRequest.d.ts +1 -1
  46. package/dist/services/booking/book-action/buildCheckoutRequest.d.ts +2 -2
  47. package/dist/services/booking/book-action/buildCheckoutRequest.js +1 -1
  48. package/dist/services/index.d.ts +1 -1
  49. package/dist/services/time-slot-list/index.d.ts +1 -1
  50. package/dist/services/time-slot-list/time-slot-list.d.ts +4 -4
  51. package/dist/services/time-slot-list/time-slot-list.def.d.ts +5 -40
  52. package/dist/services/time-slot-list/time-slot-list.js +38 -167
  53. package/package.json +2 -2
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Create Booking API
3
+ * Wrapper for the Wix Bookings createBooking SDK function
4
+ */
5
+ import { type Booking, type CreateBookingResponse, type ParticipantNotification } from '@wix/auto_sdk_bookings_bookings';
6
+ import type { FormValues } from '@wix/form-public';
7
+ /**
8
+ * Options for creating a booking
9
+ */
10
+ export interface CreateBookingOptions {
11
+ /** Notification settings for participants */
12
+ participantNotification?: ParticipantNotification;
13
+ /** Whether to send SMS reminder */
14
+ sendSmsReminder?: boolean;
15
+ /** Form submission data */
16
+ formSubmission?: FormValues;
17
+ }
18
+ /**
19
+ * Creates a booking with the specified booking data and options
20
+ *
21
+ * @param booking - The booking data
22
+ * @param options - Optional settings for notifications and form submission
23
+ * @returns Promise resolving to the created booking response
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const response = await createBooking(
28
+ * {
29
+ * selectedPaymentOption: 'ONLINE',
30
+ * totalParticipants: 1,
31
+ * bookedEntity: { slot: { ... } }
32
+ * },
33
+ * {
34
+ * participantNotification: { notifyParticipants: true },
35
+ * sendSmsReminder: true,
36
+ * formSubmission: formValues
37
+ * }
38
+ * );
39
+ * ```
40
+ */
41
+ export declare function createBooking(booking: Booking, options?: CreateBookingOptions): Promise<CreateBookingResponse>;
42
+ export type { Booking, CreateBookingRequest, CreateBookingResponse, ParticipantNotification, ContactDetails, } from '@wix/auto_sdk_bookings_bookings';
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Create Booking API
3
+ * Wrapper for the Wix Bookings createBooking SDK function
4
+ */
5
+ import { createBooking as createBookingSdk, } from '@wix/auto_sdk_bookings_bookings';
6
+ /**
7
+ * Creates a booking with the specified booking data and options
8
+ *
9
+ * @param booking - The booking data
10
+ * @param options - Optional settings for notifications and form submission
11
+ * @returns Promise resolving to the created booking response
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const response = await createBooking(
16
+ * {
17
+ * selectedPaymentOption: 'ONLINE',
18
+ * totalParticipants: 1,
19
+ * bookedEntity: { slot: { ... } }
20
+ * },
21
+ * {
22
+ * participantNotification: { notifyParticipants: true },
23
+ * sendSmsReminder: true,
24
+ * formSubmission: formValues
25
+ * }
26
+ * );
27
+ * ```
28
+ */
29
+ export async function createBooking(booking, options) {
30
+ return createBookingSdk(booking, {
31
+ participantNotification: options?.participantNotification,
32
+ sendSmsReminder: options?.sendSmsReminder,
33
+ formSubmission: options?.formSubmission,
34
+ });
35
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Create Checkout API
3
+ * Wrapper for the Wix eCommerce createCheckout SDK function
4
+ */
5
+ import { type CreateCheckoutRequest, type Checkout } from '@wix/auto_sdk_ecom_checkout';
6
+ /**
7
+ * Response from createCheckout API
8
+ */
9
+ export interface CreateCheckoutResponse {
10
+ /** The created checkout */
11
+ checkout?: Checkout;
12
+ }
13
+ /**
14
+ * Creates a checkout session with the specified request data
15
+ *
16
+ * @param request - The checkout request data including line items and checkout info
17
+ * @returns Promise resolving to the created checkout response
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const response = await createCheckout({
22
+ * channelType: ChannelType.WEB,
23
+ * lineItems: [
24
+ * {
25
+ * quantity: 1,
26
+ * catalogReference: {
27
+ * catalogItemId: bookingId,
28
+ * appId: BOOKINGS_APP_DEF_ID,
29
+ * },
30
+ * },
31
+ * ],
32
+ * checkoutInfo: {
33
+ * businessLocationId,
34
+ * billingInfo: { ... },
35
+ * },
36
+ * });
37
+ * ```
38
+ */
39
+ export declare function createCheckout(request: CreateCheckoutRequest): Promise<CreateCheckoutResponse>;
40
+ export { ChannelType, type CreateCheckoutRequest, } from '@wix/auto_sdk_ecom_checkout';
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Create Checkout API
3
+ * Wrapper for the Wix eCommerce createCheckout SDK function
4
+ */
5
+ import { createCheckout as createCheckoutSdk, } from '@wix/auto_sdk_ecom_checkout';
6
+ /**
7
+ * Creates a checkout session with the specified request data
8
+ *
9
+ * @param request - The checkout request data including line items and checkout info
10
+ * @returns Promise resolving to the created checkout response
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const response = await createCheckout({
15
+ * channelType: ChannelType.WEB,
16
+ * lineItems: [
17
+ * {
18
+ * quantity: 1,
19
+ * catalogReference: {
20
+ * catalogItemId: bookingId,
21
+ * appId: BOOKINGS_APP_DEF_ID,
22
+ * },
23
+ * },
24
+ * ],
25
+ * checkoutInfo: {
26
+ * businessLocationId,
27
+ * billingInfo: { ... },
28
+ * },
29
+ * });
30
+ * ```
31
+ */
32
+ export async function createCheckout(request) {
33
+ const checkout = await createCheckoutSdk(request);
34
+ return { checkout };
35
+ }
36
+ // Re-export types and constants that consumers may need
37
+ export { ChannelType, } from '@wix/auto_sdk_ecom_checkout';
@@ -2,9 +2,9 @@
2
2
  * Time Slot List API
3
3
  * Fetches available time slots for booking services from Wix Bookings
4
4
  */
5
- import { type CursorPaging, type CursorPagingMetadata } from '@wix/auto_sdk_bookings_availability-time-slots';
5
+ import { type TimeSlot, type CursorPaging, type CursorPagingMetadata } from '@wix/auto_sdk_bookings_availability-time-slots';
6
6
  import { type Service } from '@wix/auto_sdk_bookings_services';
7
- import { ViewMode, type TimeSlot, type Location } from '../../services/time-slot-list/time-slot-list.def.js';
7
+ import { ViewMode, type Location } from '../../services/time-slot-list/time-slot-list.def.js';
8
8
  export interface FetchAvailabilityOptions {
9
9
  services: Service[];
10
10
  fromLocalDate?: string | null;
@@ -28,14 +28,14 @@ export interface FetchAvailabilityOptions {
28
28
  * Response from fetchAvailability with grouped time slots
29
29
  */
30
30
  export interface FetchAvailabilityResponse {
31
- /** Grouped time slots (one per unique time) */
31
+ /** time slots */
32
32
  timeSlots: TimeSlot[];
33
33
  /** Cursor pagination metadata for loading more results */
34
34
  cursorPagingMetadata?: CursorPagingMetadata;
35
35
  }
36
36
  /**
37
37
  * Main entry point for fetching availability
38
- * Detects flow type, calls appropriate API, and groups slots by time
38
+ * Detects flow type and calls appropriate API
39
39
  *
40
40
  * @param options - Fetch options including services, date range, timezone, and view mode
41
41
  * @returns Promise with grouped time slots
@@ -29,50 +29,6 @@ function toLocalDateString(date) {
29
29
  return format(date, pattern);
30
30
  }
31
31
  // ============================================================================
32
- // Grouping Functions
33
- // ============================================================================
34
- /**
35
- * Groups API time slots by their start time
36
- * Multiple slots for the same time (different locations) are merged into one
37
- */
38
- function groupTimeSlotsByTime(apiSlots) {
39
- const groupedMap = new Map();
40
- for (const apiSlot of apiSlots) {
41
- const key = apiSlot.localStartDate;
42
- if (!groupedMap.has(key)) {
43
- // Create new grouped slot - omit location and availableResources
44
- const { location: _location, availableResources: _availableResources, ...rest } = apiSlot;
45
- groupedMap.set(key, {
46
- ...rest,
47
- staffByLocation: [],
48
- originalSlots: [],
49
- id: apiSlot.localStartDate,
50
- });
51
- }
52
- const groupedSlot = groupedMap.get(key);
53
- // Extract staff members with IDs and names from availableResources
54
- const staffMembers = (apiSlot.availableResources || [])
55
- .flatMap((resourceGroup) => resourceGroup.resources || [])
56
- .filter((resource) => resource._id && resource.name)
57
- .map((resource) => ({
58
- id: resource._id,
59
- name: resource.name,
60
- }));
61
- // Add this slot's location/staff info
62
- const staffByLocation = {
63
- location: {
64
- id: apiSlot.location?._id,
65
- name: apiSlot.location?.name,
66
- },
67
- staffMembers,
68
- };
69
- groupedSlot.staffByLocation.push(staffByLocation);
70
- // Store original slot for booking service
71
- groupedSlot.originalSlots.push(apiSlot);
72
- }
73
- return Array.from(groupedMap.values());
74
- }
75
- // ============================================================================
76
32
  // Internal Flow Detection
77
33
  // ============================================================================
78
34
  /**
@@ -98,7 +54,7 @@ function detectFlow(bookingServices, viewMode) {
98
54
  }
99
55
  /**
100
56
  * Main entry point for fetching availability
101
- * Detects flow type, calls appropriate API, and groups slots by time
57
+ * Detects flow type and calls appropriate API
102
58
  *
103
59
  * @param options - Fetch options including services, date range, timezone, and view mode
104
60
  * @returns Promise with grouped time slots
@@ -158,7 +114,7 @@ export async function fetchAvailability({ services: selectedServices, viewMode =
158
114
  timeSlotsPerDay,
159
115
  });
160
116
  return {
161
- timeSlots: groupTimeSlotsByTime(response.timeSlots || []),
117
+ timeSlots: response.timeSlots || [],
162
118
  cursorPagingMetadata: response.cursorPagingMetadata,
163
119
  };
164
120
  }
@@ -188,7 +144,7 @@ export async function fetchAvailability({ services: selectedServices, viewMode =
188
144
  maxSlotsPerDay: timeSlotsPerDay,
189
145
  });
190
146
  return {
191
- timeSlots: groupTimeSlotsByTime(response.timeSlots || []),
147
+ timeSlots: response.timeSlots || [],
192
148
  cursorPagingMetadata: response.pagingMetadata,
193
149
  };
194
150
  }
@@ -6,6 +6,8 @@
6
6
  */
7
7
  export { getServiceById, getServiceBySlug, queryServices, type PagingMetadata, type ServiceListFilters, type QueryServicesRequest, } from './query-services/index.js';
8
8
  export { fetchAvailability } from './fetch-availability/index.js';
9
+ export { createBooking, type CreateBookingOptions, type Booking, type CreateBookingRequest, type CreateBookingResponse, type ParticipantNotification, type ContactDetails, } from './create-booking/index.js';
10
+ export { createCheckout, ChannelType, type CreateCheckoutRequest, type CreateCheckoutResponse, } from './create-checkout/index.js';
9
11
  /**
10
12
  * PagingMetadata includes:
11
13
  * - limit: Number of items per page
@@ -6,6 +6,8 @@
6
6
  */
7
7
  export { getServiceById, getServiceBySlug, queryServices, } from './query-services/index.js';
8
8
  export { fetchAvailability } from './fetch-availability/index.js';
9
+ export { createBooking, } from './create-booking/index.js';
10
+ export { createCheckout, ChannelType, } from './create-checkout/index.js';
9
11
  /**
10
12
  * PagingMetadata includes:
11
13
  * - limit: Number of items per page
@@ -6,7 +6,7 @@
6
6
  * which provides the TimeSlotProvider context.
7
7
  */
8
8
  import React from 'react';
9
- import { type TimeSlot as TimeSlotType } from '../../../services/time-slot-list/time-slot-list.def.js';
9
+ import type { TimeSlot as TimeSlotType } from '@wix/auto_sdk_bookings_availability-time-slots';
10
10
  /**
11
11
  * Context value for TimeSlot components
12
12
  */
@@ -35,30 +35,6 @@ export interface TimeSlotProviderProps {
35
35
  * Not used directly by consumers - only by TimeSlotList.TimeSlotRepeater.
36
36
  */
37
37
  export declare function TimeSlotProvider(props: TimeSlotProviderProps): React.ReactNode;
38
- /**
39
- * Context value for Location components
40
- */
41
- export interface LocationContextValue {
42
- location: LocationData;
43
- selectLocation: () => void;
44
- }
45
- /**
46
- * Hook to access Location context
47
- * @throws Error if used outside of LocationProvider
48
- */
49
- export declare function useLocationContext(): LocationContextValue;
50
- /**
51
- * Props for LocationProvider
52
- */
53
- export interface LocationProviderProps {
54
- children: React.ReactNode;
55
- location: LocationData;
56
- }
57
- /**
58
- * Provider component used by LocationRepeater to provide context.
59
- * Not used directly by consumers - only by TimeSlot.LocationRepeater.
60
- */
61
- export declare function LocationProvider(props: LocationProviderProps): React.ReactNode;
62
38
  /**
63
39
  * Context value for StaffMember components
64
40
  */
@@ -94,6 +70,8 @@ export interface InfoProps {
94
70
  endDate: Date;
95
71
  /** Calculated duration in minutes */
96
72
  durationInMinutes: number;
73
+ /** Location name */
74
+ locationName: string;
97
75
  /** Whether the timeSlot is bookable */
98
76
  bookable: boolean;
99
77
  /** Whether this timeSlot is currently selected */
@@ -127,8 +105,8 @@ export interface ActionsProps {
127
105
  children: (data: {
128
106
  /** Action to select this timeSlot */
129
107
  selectTimeSlot: () => void;
130
- /** Action to clear preferences */
131
- clearPreferences?: () => void;
108
+ /** Action to clear staff selection */
109
+ clearStaffSelection?: () => void;
132
110
  /** The raw timeSlot object */
133
111
  timeSlot: TimeSlotType;
134
112
  /** Whether the timeSlot is bookable */
@@ -158,112 +136,6 @@ export interface ActionsProps {
158
136
  * ```
159
137
  */
160
138
  export declare function Actions(props: ActionsProps): React.ReactNode;
161
- /**
162
- * Location data with selection state
163
- */
164
- export interface LocationData {
165
- /** Location ID */
166
- id: string;
167
- /** Location name */
168
- name: string;
169
- /** Whether this location is currently selected */
170
- isSelected: boolean;
171
- /** Whether this location is selectable (compatible with selected staff, or no staff selected) */
172
- isSelectable: boolean;
173
- }
174
- /**
175
- * Props for Locations render prop component
176
- */
177
- export interface LocationsProps {
178
- children: (data: {
179
- /** Array of locations with selection state */
180
- locations: LocationData[];
181
- /** Action to select a location */
182
- selectLocation: (locationId: string) => void;
183
- }) => React.ReactNode;
184
- }
185
- /**
186
- * Core component that provides access to time slot locations via render props.
187
- * Extracts locations from slot.staffByLocation and enriches with name from originalSlots.
188
- * Each location includes isSelected and isSelectable based on current selection state.
189
- *
190
- * Returns null if there's only 1 location (nothing to choose from).
191
- *
192
- * @component
193
- * @example
194
- * ```tsx
195
- * <CoreTimeSlot.Locations>
196
- * {({ locations, locationsCount, selectLocation }) => (
197
- * <GenericList.Root items={locations}>
198
- * {children}
199
- * </GenericList.Root>
200
- * )}
201
- * </CoreTimeSlot.Locations>
202
- * ```
203
- */
204
- export declare function Locations(props: LocationsProps): React.ReactNode;
205
- /**
206
- * Props for LocationInfo render prop component
207
- */
208
- export interface LocationInfoProps {
209
- children: (data: {
210
- /** Location name */
211
- name: string;
212
- /** Whether this location is currently selected */
213
- isSelected: boolean;
214
- /** Whether this location is selectable */
215
- isSelectable: boolean;
216
- /** The raw location object */
217
- location: LocationData;
218
- }) => React.ReactNode;
219
- }
220
- /**
221
- * Core component that provides access to location info via render props.
222
- * Must be used within LocationProvider.
223
- *
224
- * @component
225
- * @example
226
- * ```tsx
227
- * <LocationInfo>
228
- * {({ name, isSelected, isSelectable }) => (
229
- * <span>{name}</span>
230
- * )}
231
- * </LocationInfo>
232
- * ```
233
- */
234
- export declare function LocationInfo(props: LocationInfoProps): React.ReactNode;
235
- /**
236
- * Props for LocationActions render prop component
237
- */
238
- export interface LocationActionsProps {
239
- children: (data: {
240
- /** Action to select this location */
241
- selectLocation: () => void;
242
- /** Whether this location is currently selected */
243
- isSelected: boolean;
244
- /** Whether this location is selectable */
245
- isSelectable: boolean;
246
- /** The raw location object */
247
- location: LocationData;
248
- }) => React.ReactNode;
249
- }
250
- /**
251
- * Core component that provides location actions via render props.
252
- * Must be used within LocationProvider.
253
- *
254
- * @component
255
- * @example
256
- * ```tsx
257
- * <LocationActions>
258
- * {({ selectLocation, isSelected, isSelectable }) => (
259
- * <button onClick={selectLocation} disabled={!isSelectable}>
260
- * {isSelected ? 'Selected' : 'Select'}
261
- * </button>
262
- * )}
263
- * </LocationActions>
264
- * ```
265
- */
266
- export declare function LocationActions(props: LocationActionsProps): React.ReactNode;
267
139
  /**
268
140
  * Staff member data with selection state
269
141
  */
@@ -274,8 +146,6 @@ export interface StaffMemberData {
274
146
  name: string;
275
147
  /** Whether this staff member is currently selected */
276
148
  isSelected: boolean;
277
- /** Whether this staff member is selectable (works at selected location, or no location selected) */
278
- isSelectable: boolean;
279
149
  }
280
150
  /**
281
151
  * Props for StaffMembers render prop component
@@ -291,7 +161,7 @@ export interface StaffMembersProps {
291
161
  /**
292
162
  * Core component that provides access to time slot staff members via render props.
293
163
  * Extracts unique staff members from slot.staffByLocation (names already included).
294
- * Each staff member includes isSelected and isSelectable based on current selection state.
164
+ * Each staff member includes isSelected based on current selection state.
295
165
  *
296
166
  * Returns null if there's only 1 staff member (nothing to choose from).
297
167
  *
@@ -317,8 +187,6 @@ export interface StaffMemberInfoProps {
317
187
  name: string;
318
188
  /** Whether this staff member is currently selected */
319
189
  isSelected: boolean;
320
- /** Whether this staff member is selectable */
321
- isSelectable: boolean;
322
190
  /** The raw staff member object */
323
191
  staffMember: StaffMemberData;
324
192
  }) => React.ReactNode;
@@ -331,7 +199,7 @@ export interface StaffMemberInfoProps {
331
199
  * @example
332
200
  * ```tsx
333
201
  * <StaffMemberInfo>
334
- * {({ name, isSelected, isSelectable }) => (
202
+ * {({ name, isSelected }) => (
335
203
  * <span>{name}</span>
336
204
  * )}
337
205
  * </StaffMemberInfo>
@@ -347,8 +215,6 @@ export interface StaffMemberActionsProps {
347
215
  selectStaffMember: () => void;
348
216
  /** Whether this staff member is currently selected */
349
217
  isSelected: boolean;
350
- /** Whether this staff member is selectable */
351
- isSelectable: boolean;
352
218
  /** The raw staff member object */
353
219
  staffMember: StaffMemberData;
354
220
  }) => React.ReactNode;
@@ -361,8 +227,8 @@ export interface StaffMemberActionsProps {
361
227
  * @example
362
228
  * ```tsx
363
229
  * <StaffMemberActions>
364
- * {({ selectStaffMember, isSelected, isSelectable }) => (
365
- * <button onClick={selectStaffMember} disabled={!isSelectable}>
230
+ * {({ selectStaffMember, isSelected }) => (
231
+ * <button onClick={selectStaffMember}>
366
232
  * {isSelected ? 'Selected' : 'Select'}
367
233
  * </button>
368
234
  * )}