@wix/headless-bookings 0.0.71 → 0.0.73
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/cjs/dist/__mocks__/booking.js +6 -1
- package/cjs/dist/__mocks__/payment.d.ts +16 -0
- package/cjs/dist/__mocks__/payment.js +198 -0
- package/cjs/dist/__mocks__/services.d.ts +8 -0
- package/cjs/dist/__mocks__/services.js +44 -0
- package/cjs/dist/services/location-list/location-list.js +6 -3
- package/cjs/dist/services/service-list/service-list.js +1 -1
- package/cjs/dist/services/time-slot-list/time-slot-list.def.d.ts +1 -1
- package/cjs/dist/services/time-slot-list/time-slot-list.js +35 -28
- package/dist/__mocks__/booking.js +6 -1
- package/dist/__mocks__/payment.d.ts +16 -0
- package/dist/__mocks__/payment.js +198 -0
- package/dist/__mocks__/services.d.ts +8 -0
- package/dist/__mocks__/services.js +44 -0
- package/dist/services/location-list/location-list.js +6 -3
- package/dist/services/service-list/service-list.js +1 -1
- package/dist/services/time-slot-list/time-slot-list.def.d.ts +1 -1
- package/dist/services/time-slot-list/time-slot-list.js +35 -28
- package/package.json +2 -2
|
@@ -13,7 +13,12 @@ export function mockSignal(initialValue) {
|
|
|
13
13
|
export function createMockSignalsService() {
|
|
14
14
|
return {
|
|
15
15
|
signal: mockSignal,
|
|
16
|
-
computed
|
|
16
|
+
// Re-evaluate the computed function on every get/peek (like real computed signals)
|
|
17
|
+
computed: (fn) => ({
|
|
18
|
+
get: () => fn(),
|
|
19
|
+
peek: () => fn(),
|
|
20
|
+
set: () => { }, // no-op for computed
|
|
21
|
+
}),
|
|
17
22
|
effect: vi.fn((fn) => {
|
|
18
23
|
fn();
|
|
19
24
|
}),
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared mock data for payment service tests
|
|
3
|
+
*/
|
|
4
|
+
import type { CalculateTotalsResponse } from '@wix/auto_sdk_ecom_totals-calculator';
|
|
5
|
+
/**
|
|
6
|
+
* Mock CalculateTotals response with single line item
|
|
7
|
+
*/
|
|
8
|
+
export declare const mockCalculateTotalsResponse: CalculateTotalsResponse;
|
|
9
|
+
/**
|
|
10
|
+
* Mock CalculateTotals response with deposit
|
|
11
|
+
*/
|
|
12
|
+
export declare const mockCalculateTotalsResponseWithDeposit: CalculateTotalsResponse;
|
|
13
|
+
/**
|
|
14
|
+
* Mock CalculateTotals response with multiple line items
|
|
15
|
+
*/
|
|
16
|
+
export declare const mockCalculateTotalsResponseMultipleItems: CalculateTotalsResponse;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared mock data for payment service tests
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Mock CalculateTotals response with single line item
|
|
6
|
+
*/
|
|
7
|
+
export const mockCalculateTotalsResponse = {
|
|
8
|
+
calculatedLineItems: [
|
|
9
|
+
{
|
|
10
|
+
lineItemId: 'line-item-1',
|
|
11
|
+
pricesBreakdown: {
|
|
12
|
+
totalPriceAfterTax: { amount: '50.00' },
|
|
13
|
+
fullPrice: { amount: '45.00' },
|
|
14
|
+
taxDetails: {
|
|
15
|
+
totalTax: { amount: '5.00' },
|
|
16
|
+
},
|
|
17
|
+
totalDiscount: { amount: '0.00' },
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
priceSummary: {
|
|
22
|
+
subtotal: {
|
|
23
|
+
amount: '50.00',
|
|
24
|
+
convertedAmount: '50.00',
|
|
25
|
+
formattedAmount: '$50.00',
|
|
26
|
+
formattedConvertedAmount: '$50.00',
|
|
27
|
+
},
|
|
28
|
+
total: {
|
|
29
|
+
amount: '50.00',
|
|
30
|
+
convertedAmount: '50.00',
|
|
31
|
+
formattedAmount: '$50.00',
|
|
32
|
+
formattedConvertedAmount: '$50.00',
|
|
33
|
+
},
|
|
34
|
+
tax: {
|
|
35
|
+
amount: '5.00',
|
|
36
|
+
convertedAmount: '5.00',
|
|
37
|
+
formattedAmount: '$5.00',
|
|
38
|
+
formattedConvertedAmount: '$5.00',
|
|
39
|
+
},
|
|
40
|
+
discount: {
|
|
41
|
+
amount: '0.00',
|
|
42
|
+
convertedAmount: '0.00',
|
|
43
|
+
formattedAmount: '$0.00',
|
|
44
|
+
formattedConvertedAmount: '$0.00',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
payNow: {
|
|
48
|
+
total: {
|
|
49
|
+
amount: '50.00',
|
|
50
|
+
convertedAmount: '50.00',
|
|
51
|
+
formattedAmount: '$50.00',
|
|
52
|
+
formattedConvertedAmount: '$50.00',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
payLater: {
|
|
56
|
+
total: {
|
|
57
|
+
amount: '0.00',
|
|
58
|
+
convertedAmount: '0.00',
|
|
59
|
+
formattedAmount: '$0.00',
|
|
60
|
+
formattedConvertedAmount: '$0.00',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
currency: 'USD',
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Mock CalculateTotals response with deposit
|
|
67
|
+
*/
|
|
68
|
+
export const mockCalculateTotalsResponseWithDeposit = {
|
|
69
|
+
calculatedLineItems: [
|
|
70
|
+
{
|
|
71
|
+
lineItemId: 'line-item-1',
|
|
72
|
+
pricesBreakdown: {
|
|
73
|
+
totalPriceAfterTax: { amount: '100.00' },
|
|
74
|
+
fullPrice: { amount: '90.00' },
|
|
75
|
+
taxDetails: {
|
|
76
|
+
totalTax: { amount: '10.00' },
|
|
77
|
+
},
|
|
78
|
+
totalDiscount: { amount: '0.00' },
|
|
79
|
+
depositAmount: { amount: '30.00' },
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
priceSummary: {
|
|
84
|
+
subtotal: {
|
|
85
|
+
amount: '100.00',
|
|
86
|
+
convertedAmount: '100.00',
|
|
87
|
+
formattedAmount: '$100.00',
|
|
88
|
+
formattedConvertedAmount: '$100.00',
|
|
89
|
+
},
|
|
90
|
+
total: {
|
|
91
|
+
amount: '100.00',
|
|
92
|
+
convertedAmount: '100.00',
|
|
93
|
+
formattedAmount: '$100.00',
|
|
94
|
+
formattedConvertedAmount: '$100.00',
|
|
95
|
+
},
|
|
96
|
+
tax: {
|
|
97
|
+
amount: '10.00',
|
|
98
|
+
convertedAmount: '10.00',
|
|
99
|
+
formattedAmount: '$10.00',
|
|
100
|
+
formattedConvertedAmount: '$10.00',
|
|
101
|
+
},
|
|
102
|
+
discount: {
|
|
103
|
+
amount: '0.00',
|
|
104
|
+
convertedAmount: '0.00',
|
|
105
|
+
formattedAmount: '$0.00',
|
|
106
|
+
formattedConvertedAmount: '$0.00',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
payNow: {
|
|
110
|
+
total: {
|
|
111
|
+
amount: '30.00',
|
|
112
|
+
convertedAmount: '30.00',
|
|
113
|
+
formattedAmount: '$30.00',
|
|
114
|
+
formattedConvertedAmount: '$30.00',
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
payLater: {
|
|
118
|
+
total: {
|
|
119
|
+
amount: '70.00',
|
|
120
|
+
convertedAmount: '70.00',
|
|
121
|
+
formattedAmount: '$70.00',
|
|
122
|
+
formattedConvertedAmount: '$70.00',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
currency: 'USD',
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Mock CalculateTotals response with multiple line items
|
|
129
|
+
*/
|
|
130
|
+
export const mockCalculateTotalsResponseMultipleItems = {
|
|
131
|
+
calculatedLineItems: [
|
|
132
|
+
{
|
|
133
|
+
lineItemId: 'line-item-1',
|
|
134
|
+
pricesBreakdown: {
|
|
135
|
+
totalPriceAfterTax: { amount: '50.00' },
|
|
136
|
+
fullPrice: { amount: '45.00' },
|
|
137
|
+
taxDetails: {
|
|
138
|
+
totalTax: { amount: '5.00' },
|
|
139
|
+
},
|
|
140
|
+
totalDiscount: { amount: '0.00' },
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
lineItemId: 'line-item-2',
|
|
145
|
+
pricesBreakdown: {
|
|
146
|
+
totalPriceAfterTax: { amount: '75.00' },
|
|
147
|
+
fullPrice: { amount: '67.50' },
|
|
148
|
+
taxDetails: {
|
|
149
|
+
totalTax: { amount: '7.50' },
|
|
150
|
+
},
|
|
151
|
+
totalDiscount: { amount: '0.00' },
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
priceSummary: {
|
|
156
|
+
subtotal: {
|
|
157
|
+
amount: '125.00',
|
|
158
|
+
convertedAmount: '125.00',
|
|
159
|
+
formattedAmount: '$125.00',
|
|
160
|
+
formattedConvertedAmount: '$125.00',
|
|
161
|
+
},
|
|
162
|
+
total: {
|
|
163
|
+
amount: '125.00',
|
|
164
|
+
convertedAmount: '125.00',
|
|
165
|
+
formattedAmount: '$125.00',
|
|
166
|
+
formattedConvertedAmount: '$125.00',
|
|
167
|
+
},
|
|
168
|
+
tax: {
|
|
169
|
+
amount: '12.50',
|
|
170
|
+
convertedAmount: '12.50',
|
|
171
|
+
formattedAmount: '$12.50',
|
|
172
|
+
formattedConvertedAmount: '$12.50',
|
|
173
|
+
},
|
|
174
|
+
discount: {
|
|
175
|
+
amount: '0.00',
|
|
176
|
+
convertedAmount: '0.00',
|
|
177
|
+
formattedAmount: '$0.00',
|
|
178
|
+
formattedConvertedAmount: '$0.00',
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
payNow: {
|
|
182
|
+
total: {
|
|
183
|
+
amount: '125.00',
|
|
184
|
+
convertedAmount: '125.00',
|
|
185
|
+
formattedAmount: '$125.00',
|
|
186
|
+
formattedConvertedAmount: '$125.00',
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
payLater: {
|
|
190
|
+
total: {
|
|
191
|
+
amount: '0.00',
|
|
192
|
+
convertedAmount: '0.00',
|
|
193
|
+
formattedAmount: '$0.00',
|
|
194
|
+
formattedConvertedAmount: '$0.00',
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
currency: 'USD',
|
|
198
|
+
};
|
|
@@ -131,3 +131,11 @@ export declare const mockSingleStaffMemberListConfig: StaffMemberListServiceConf
|
|
|
131
131
|
* Helper to create a large list of staff members for tests
|
|
132
132
|
*/
|
|
133
133
|
export declare function createLargeStaffMemberList(count: number): StaffMember[];
|
|
134
|
+
/**
|
|
135
|
+
* Mock service with deposit configured
|
|
136
|
+
*/
|
|
137
|
+
export declare const mockServiceWithDeposit: Service;
|
|
138
|
+
/**
|
|
139
|
+
* Mock service with in-person payment option
|
|
140
|
+
*/
|
|
141
|
+
export declare const mockServiceInPerson: Service;
|
|
@@ -442,3 +442,47 @@ export function createLargeStaffMemberList(count) {
|
|
|
442
442
|
},
|
|
443
443
|
}));
|
|
444
444
|
}
|
|
445
|
+
// ============================================================================
|
|
446
|
+
// Payment Service Mocks
|
|
447
|
+
// ============================================================================
|
|
448
|
+
/**
|
|
449
|
+
* Mock service with deposit configured
|
|
450
|
+
*/
|
|
451
|
+
export const mockServiceWithDeposit = {
|
|
452
|
+
...mockService,
|
|
453
|
+
_id: 'test-service-deposit',
|
|
454
|
+
name: 'Service with Deposit',
|
|
455
|
+
payment: {
|
|
456
|
+
rateType: RateType.FIXED,
|
|
457
|
+
fixed: {
|
|
458
|
+
price: {
|
|
459
|
+
value: '100.00',
|
|
460
|
+
currency: 'USD',
|
|
461
|
+
},
|
|
462
|
+
deposit: {
|
|
463
|
+
value: '30.00',
|
|
464
|
+
currency: 'USD',
|
|
465
|
+
},
|
|
466
|
+
},
|
|
467
|
+
},
|
|
468
|
+
};
|
|
469
|
+
/**
|
|
470
|
+
* Mock service with in-person payment option
|
|
471
|
+
*/
|
|
472
|
+
export const mockServiceInPerson = {
|
|
473
|
+
...mockService,
|
|
474
|
+
_id: 'test-service-in-person',
|
|
475
|
+
name: 'In Person Payment Service',
|
|
476
|
+
payment: {
|
|
477
|
+
rateType: RateType.FIXED,
|
|
478
|
+
fixed: {
|
|
479
|
+
price: {
|
|
480
|
+
value: '50.00',
|
|
481
|
+
currency: 'USD',
|
|
482
|
+
},
|
|
483
|
+
},
|
|
484
|
+
options: {
|
|
485
|
+
inPerson: true,
|
|
486
|
+
},
|
|
487
|
+
},
|
|
488
|
+
};
|
|
@@ -52,7 +52,7 @@ function buildDisplayLocations(locations, hasCustomLocations, hasCustomerLocatio
|
|
|
52
52
|
else if (hasCustomLocations) {
|
|
53
53
|
// Synthetic custom location (only from explicit flag, not array)
|
|
54
54
|
displayLocations.push({
|
|
55
|
-
location:
|
|
55
|
+
location: { _id: SYNTHETIC_CUSTOM_ID, type: LocationType.CUSTOM },
|
|
56
56
|
type: LocationType.CUSTOM,
|
|
57
57
|
isSynthetic: true,
|
|
58
58
|
id: SYNTHETIC_CUSTOM_ID,
|
|
@@ -60,10 +60,13 @@ function buildDisplayLocations(locations, hasCustomLocations, hasCustomerLocatio
|
|
|
60
60
|
}
|
|
61
61
|
// 3. Add CUSTOMER location (always synthetic display, real or flag-based)
|
|
62
62
|
if (customerFromArray || hasCustomerLocations) {
|
|
63
|
+
const isSynthetic = !customerFromArray;
|
|
63
64
|
displayLocations.push({
|
|
64
|
-
location:
|
|
65
|
+
location: isSynthetic
|
|
66
|
+
? { _id: SYNTHETIC_CUSTOMER_ID, type: LocationType.CUSTOMER }
|
|
67
|
+
: customerFromArray,
|
|
65
68
|
type: LocationType.CUSTOMER,
|
|
66
|
-
isSynthetic
|
|
69
|
+
isSynthetic,
|
|
67
70
|
id: SYNTHETIC_CUSTOMER_ID,
|
|
68
71
|
});
|
|
69
72
|
}
|
|
@@ -149,7 +149,7 @@ export const ServiceListService = implementService.withConfig()(ServiceListServi
|
|
|
149
149
|
// Helper to get effective filters including location from BookingService
|
|
150
150
|
const getEffectiveFilters = (baseFilters) => {
|
|
151
151
|
const selectedLocation = bookingService.location.get();
|
|
152
|
-
const locationId = selectedLocation?.
|
|
152
|
+
const locationId = selectedLocation?._id;
|
|
153
153
|
if (!baseFilters && !locationId) {
|
|
154
154
|
return undefined;
|
|
155
155
|
}
|
|
@@ -10,7 +10,7 @@ import type { Service } from '@wix/auto_sdk_bookings_services';
|
|
|
10
10
|
* Require a stable `id` + `locationType` pair (no optional fields).
|
|
11
11
|
*/
|
|
12
12
|
export interface Location {
|
|
13
|
-
id
|
|
13
|
+
id?: string;
|
|
14
14
|
locationType: LocationTypeWithLiterals;
|
|
15
15
|
}
|
|
16
16
|
export declare enum ViewMode {
|
|
@@ -3,18 +3,26 @@
|
|
|
3
3
|
* Manages time slot fetching, selection, and state
|
|
4
4
|
*/
|
|
5
5
|
import { implementService } from '@wix/services-definitions';
|
|
6
|
-
import { SignalsServiceDefinition } from '@wix/services-definitions/core-services/signals';
|
|
6
|
+
import { SignalsServiceDefinition, } from '@wix/services-definitions/core-services/signals';
|
|
7
7
|
import { TimeSlotListServiceDefinition, ViewMode, } from './time-slot-list.def.js';
|
|
8
|
+
import { LocationType, } from '@wix/auto_sdk_bookings_event-time-slots';
|
|
8
9
|
import { fetchAvailability } from '../../api/fetch-availability/index.js';
|
|
9
10
|
import { BookingServiceDefinition, ANY_STAFF_MEMBER_ID, } from '../booking/booking.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Helpers
|
|
12
13
|
// ============================================================================
|
|
13
|
-
|
|
14
|
+
const getClientTimezone = () => {
|
|
14
15
|
return typeof Intl !== 'undefined'
|
|
15
16
|
? Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
16
17
|
: undefined;
|
|
17
|
-
}
|
|
18
|
+
};
|
|
19
|
+
const getStaffName = (staffMemberId, slots) => {
|
|
20
|
+
if (staffMemberId === ANY_STAFF_MEMBER_ID)
|
|
21
|
+
return 'Any staff member';
|
|
22
|
+
return (slots
|
|
23
|
+
.flatMap((slot) => slot.availableResources[0].resources)
|
|
24
|
+
.find((r) => r._id === staffMemberId)?.name ?? undefined);
|
|
25
|
+
};
|
|
18
26
|
// ============================================================================
|
|
19
27
|
// Service Implementation
|
|
20
28
|
// ============================================================================
|
|
@@ -31,6 +39,12 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
31
39
|
end: config.endDate,
|
|
32
40
|
});
|
|
33
41
|
const cursorSignal = signalsService.signal(undefined);
|
|
42
|
+
const preSelectedStaffMemberIdSignal = signalsService.computed(() => {
|
|
43
|
+
const serviceSelections = bookingService.serviceSelections.get();
|
|
44
|
+
return serviceSelections.length
|
|
45
|
+
? (serviceSelections[0]?.resources?.[0]?._id ?? undefined)
|
|
46
|
+
: undefined;
|
|
47
|
+
});
|
|
34
48
|
const getServices = () => {
|
|
35
49
|
const serviceSelections = bookingService.serviceSelections.peek();
|
|
36
50
|
return serviceSelections.length
|
|
@@ -40,12 +54,16 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
40
54
|
const getFilters = () => {
|
|
41
55
|
const baseFilters = config.filters ?? {};
|
|
42
56
|
const selectedLocation = bookingService.location.peek();
|
|
57
|
+
const isCustomOrCustomerLocation = selectedLocation?.type === LocationType.CUSTOM ||
|
|
58
|
+
selectedLocation?.type === LocationType.CUSTOMER;
|
|
43
59
|
const location = selectedLocation
|
|
44
|
-
? {
|
|
60
|
+
? {
|
|
61
|
+
id: isCustomOrCustomerLocation ? undefined : selectedLocation._id,
|
|
62
|
+
locationType: selectedLocation.type,
|
|
63
|
+
}
|
|
45
64
|
: baseFilters.location;
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
? selectedResources.map((r) => r._id)
|
|
65
|
+
const staffMemberIds = preSelectedStaffMemberIdSignal.peek()
|
|
66
|
+
? [preSelectedStaffMemberIdSignal.peek()]
|
|
49
67
|
: baseFilters.staffMemberIds;
|
|
50
68
|
return { ...baseFilters, location, staffMemberIds };
|
|
51
69
|
};
|
|
@@ -85,11 +103,14 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
85
103
|
* - Auto-selects staff only when there is exactly one staff option in this slot
|
|
86
104
|
*/
|
|
87
105
|
const selectSlot = (slot) => {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
106
|
+
const resources = preSelectedStaffMemberIdSignal.peek()
|
|
107
|
+
? [
|
|
108
|
+
{
|
|
109
|
+
_id: preSelectedStaffMemberIdSignal.peek(),
|
|
110
|
+
name: getStaffName(preSelectedStaffMemberIdSignal.peek(), timeSlotsSignal.peek()),
|
|
111
|
+
},
|
|
112
|
+
]
|
|
113
|
+
: [];
|
|
93
114
|
const timeSlot = {
|
|
94
115
|
startDate: slot.localStartDate,
|
|
95
116
|
endDate: slot.localEndDate,
|
|
@@ -112,18 +133,10 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
112
133
|
const selectedTimeSlot = bookingService.serviceSelections.peek()[0]?.timeSlot;
|
|
113
134
|
if (!selectedTimeSlot)
|
|
114
135
|
return;
|
|
115
|
-
const getStaffName = (id) => {
|
|
116
|
-
if (id === ANY_STAFF_MEMBER_ID)
|
|
117
|
-
return 'Any staff member';
|
|
118
|
-
const slots = timeSlotsSignal.peek();
|
|
119
|
-
return (slots
|
|
120
|
-
.flatMap((slot) => slot.availableResources[0].resources)
|
|
121
|
-
.find((r) => r._id === id)?.name ?? undefined);
|
|
122
|
-
};
|
|
123
136
|
const resources = [
|
|
124
137
|
{
|
|
125
138
|
_id: staffMemberId,
|
|
126
|
-
name: getStaffName(staffMemberId),
|
|
139
|
+
name: getStaffName(staffMemberId, timeSlotsSignal.peek()),
|
|
127
140
|
},
|
|
128
141
|
];
|
|
129
142
|
bookingService.actions.updateItem({
|
|
@@ -191,18 +204,12 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
191
204
|
}
|
|
192
205
|
dateRangeSignal.set({ start: newStartDate, end: newEndDate });
|
|
193
206
|
};
|
|
194
|
-
const preSelectedStaffMemberId = signalsService.computed(() => {
|
|
195
|
-
const serviceSelections = bookingService.serviceSelections.get();
|
|
196
|
-
return serviceSelections.length
|
|
197
|
-
? (serviceSelections[0]?.resources?.[0]?._id ?? undefined)
|
|
198
|
-
: undefined;
|
|
199
|
-
});
|
|
200
207
|
let isFirstRun = true;
|
|
201
208
|
const dispose = signalsService.effect(() => {
|
|
202
209
|
dateRangeSignal.get();
|
|
203
210
|
bookingService.timezone.get();
|
|
204
211
|
bookingService.location.get();
|
|
205
|
-
|
|
212
|
+
preSelectedStaffMemberIdSignal.get();
|
|
206
213
|
if (isFirstRun) {
|
|
207
214
|
isFirstRun = false;
|
|
208
215
|
if (config.timeSlots) {
|
|
@@ -13,7 +13,12 @@ export function mockSignal(initialValue) {
|
|
|
13
13
|
export function createMockSignalsService() {
|
|
14
14
|
return {
|
|
15
15
|
signal: mockSignal,
|
|
16
|
-
computed
|
|
16
|
+
// Re-evaluate the computed function on every get/peek (like real computed signals)
|
|
17
|
+
computed: (fn) => ({
|
|
18
|
+
get: () => fn(),
|
|
19
|
+
peek: () => fn(),
|
|
20
|
+
set: () => { }, // no-op for computed
|
|
21
|
+
}),
|
|
17
22
|
effect: vi.fn((fn) => {
|
|
18
23
|
fn();
|
|
19
24
|
}),
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared mock data for payment service tests
|
|
3
|
+
*/
|
|
4
|
+
import type { CalculateTotalsResponse } from '@wix/auto_sdk_ecom_totals-calculator';
|
|
5
|
+
/**
|
|
6
|
+
* Mock CalculateTotals response with single line item
|
|
7
|
+
*/
|
|
8
|
+
export declare const mockCalculateTotalsResponse: CalculateTotalsResponse;
|
|
9
|
+
/**
|
|
10
|
+
* Mock CalculateTotals response with deposit
|
|
11
|
+
*/
|
|
12
|
+
export declare const mockCalculateTotalsResponseWithDeposit: CalculateTotalsResponse;
|
|
13
|
+
/**
|
|
14
|
+
* Mock CalculateTotals response with multiple line items
|
|
15
|
+
*/
|
|
16
|
+
export declare const mockCalculateTotalsResponseMultipleItems: CalculateTotalsResponse;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared mock data for payment service tests
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Mock CalculateTotals response with single line item
|
|
6
|
+
*/
|
|
7
|
+
export const mockCalculateTotalsResponse = {
|
|
8
|
+
calculatedLineItems: [
|
|
9
|
+
{
|
|
10
|
+
lineItemId: 'line-item-1',
|
|
11
|
+
pricesBreakdown: {
|
|
12
|
+
totalPriceAfterTax: { amount: '50.00' },
|
|
13
|
+
fullPrice: { amount: '45.00' },
|
|
14
|
+
taxDetails: {
|
|
15
|
+
totalTax: { amount: '5.00' },
|
|
16
|
+
},
|
|
17
|
+
totalDiscount: { amount: '0.00' },
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
priceSummary: {
|
|
22
|
+
subtotal: {
|
|
23
|
+
amount: '50.00',
|
|
24
|
+
convertedAmount: '50.00',
|
|
25
|
+
formattedAmount: '$50.00',
|
|
26
|
+
formattedConvertedAmount: '$50.00',
|
|
27
|
+
},
|
|
28
|
+
total: {
|
|
29
|
+
amount: '50.00',
|
|
30
|
+
convertedAmount: '50.00',
|
|
31
|
+
formattedAmount: '$50.00',
|
|
32
|
+
formattedConvertedAmount: '$50.00',
|
|
33
|
+
},
|
|
34
|
+
tax: {
|
|
35
|
+
amount: '5.00',
|
|
36
|
+
convertedAmount: '5.00',
|
|
37
|
+
formattedAmount: '$5.00',
|
|
38
|
+
formattedConvertedAmount: '$5.00',
|
|
39
|
+
},
|
|
40
|
+
discount: {
|
|
41
|
+
amount: '0.00',
|
|
42
|
+
convertedAmount: '0.00',
|
|
43
|
+
formattedAmount: '$0.00',
|
|
44
|
+
formattedConvertedAmount: '$0.00',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
payNow: {
|
|
48
|
+
total: {
|
|
49
|
+
amount: '50.00',
|
|
50
|
+
convertedAmount: '50.00',
|
|
51
|
+
formattedAmount: '$50.00',
|
|
52
|
+
formattedConvertedAmount: '$50.00',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
payLater: {
|
|
56
|
+
total: {
|
|
57
|
+
amount: '0.00',
|
|
58
|
+
convertedAmount: '0.00',
|
|
59
|
+
formattedAmount: '$0.00',
|
|
60
|
+
formattedConvertedAmount: '$0.00',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
currency: 'USD',
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Mock CalculateTotals response with deposit
|
|
67
|
+
*/
|
|
68
|
+
export const mockCalculateTotalsResponseWithDeposit = {
|
|
69
|
+
calculatedLineItems: [
|
|
70
|
+
{
|
|
71
|
+
lineItemId: 'line-item-1',
|
|
72
|
+
pricesBreakdown: {
|
|
73
|
+
totalPriceAfterTax: { amount: '100.00' },
|
|
74
|
+
fullPrice: { amount: '90.00' },
|
|
75
|
+
taxDetails: {
|
|
76
|
+
totalTax: { amount: '10.00' },
|
|
77
|
+
},
|
|
78
|
+
totalDiscount: { amount: '0.00' },
|
|
79
|
+
depositAmount: { amount: '30.00' },
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
priceSummary: {
|
|
84
|
+
subtotal: {
|
|
85
|
+
amount: '100.00',
|
|
86
|
+
convertedAmount: '100.00',
|
|
87
|
+
formattedAmount: '$100.00',
|
|
88
|
+
formattedConvertedAmount: '$100.00',
|
|
89
|
+
},
|
|
90
|
+
total: {
|
|
91
|
+
amount: '100.00',
|
|
92
|
+
convertedAmount: '100.00',
|
|
93
|
+
formattedAmount: '$100.00',
|
|
94
|
+
formattedConvertedAmount: '$100.00',
|
|
95
|
+
},
|
|
96
|
+
tax: {
|
|
97
|
+
amount: '10.00',
|
|
98
|
+
convertedAmount: '10.00',
|
|
99
|
+
formattedAmount: '$10.00',
|
|
100
|
+
formattedConvertedAmount: '$10.00',
|
|
101
|
+
},
|
|
102
|
+
discount: {
|
|
103
|
+
amount: '0.00',
|
|
104
|
+
convertedAmount: '0.00',
|
|
105
|
+
formattedAmount: '$0.00',
|
|
106
|
+
formattedConvertedAmount: '$0.00',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
payNow: {
|
|
110
|
+
total: {
|
|
111
|
+
amount: '30.00',
|
|
112
|
+
convertedAmount: '30.00',
|
|
113
|
+
formattedAmount: '$30.00',
|
|
114
|
+
formattedConvertedAmount: '$30.00',
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
payLater: {
|
|
118
|
+
total: {
|
|
119
|
+
amount: '70.00',
|
|
120
|
+
convertedAmount: '70.00',
|
|
121
|
+
formattedAmount: '$70.00',
|
|
122
|
+
formattedConvertedAmount: '$70.00',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
currency: 'USD',
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Mock CalculateTotals response with multiple line items
|
|
129
|
+
*/
|
|
130
|
+
export const mockCalculateTotalsResponseMultipleItems = {
|
|
131
|
+
calculatedLineItems: [
|
|
132
|
+
{
|
|
133
|
+
lineItemId: 'line-item-1',
|
|
134
|
+
pricesBreakdown: {
|
|
135
|
+
totalPriceAfterTax: { amount: '50.00' },
|
|
136
|
+
fullPrice: { amount: '45.00' },
|
|
137
|
+
taxDetails: {
|
|
138
|
+
totalTax: { amount: '5.00' },
|
|
139
|
+
},
|
|
140
|
+
totalDiscount: { amount: '0.00' },
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
lineItemId: 'line-item-2',
|
|
145
|
+
pricesBreakdown: {
|
|
146
|
+
totalPriceAfterTax: { amount: '75.00' },
|
|
147
|
+
fullPrice: { amount: '67.50' },
|
|
148
|
+
taxDetails: {
|
|
149
|
+
totalTax: { amount: '7.50' },
|
|
150
|
+
},
|
|
151
|
+
totalDiscount: { amount: '0.00' },
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
priceSummary: {
|
|
156
|
+
subtotal: {
|
|
157
|
+
amount: '125.00',
|
|
158
|
+
convertedAmount: '125.00',
|
|
159
|
+
formattedAmount: '$125.00',
|
|
160
|
+
formattedConvertedAmount: '$125.00',
|
|
161
|
+
},
|
|
162
|
+
total: {
|
|
163
|
+
amount: '125.00',
|
|
164
|
+
convertedAmount: '125.00',
|
|
165
|
+
formattedAmount: '$125.00',
|
|
166
|
+
formattedConvertedAmount: '$125.00',
|
|
167
|
+
},
|
|
168
|
+
tax: {
|
|
169
|
+
amount: '12.50',
|
|
170
|
+
convertedAmount: '12.50',
|
|
171
|
+
formattedAmount: '$12.50',
|
|
172
|
+
formattedConvertedAmount: '$12.50',
|
|
173
|
+
},
|
|
174
|
+
discount: {
|
|
175
|
+
amount: '0.00',
|
|
176
|
+
convertedAmount: '0.00',
|
|
177
|
+
formattedAmount: '$0.00',
|
|
178
|
+
formattedConvertedAmount: '$0.00',
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
payNow: {
|
|
182
|
+
total: {
|
|
183
|
+
amount: '125.00',
|
|
184
|
+
convertedAmount: '125.00',
|
|
185
|
+
formattedAmount: '$125.00',
|
|
186
|
+
formattedConvertedAmount: '$125.00',
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
payLater: {
|
|
190
|
+
total: {
|
|
191
|
+
amount: '0.00',
|
|
192
|
+
convertedAmount: '0.00',
|
|
193
|
+
formattedAmount: '$0.00',
|
|
194
|
+
formattedConvertedAmount: '$0.00',
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
currency: 'USD',
|
|
198
|
+
};
|
|
@@ -131,3 +131,11 @@ export declare const mockSingleStaffMemberListConfig: StaffMemberListServiceConf
|
|
|
131
131
|
* Helper to create a large list of staff members for tests
|
|
132
132
|
*/
|
|
133
133
|
export declare function createLargeStaffMemberList(count: number): StaffMember[];
|
|
134
|
+
/**
|
|
135
|
+
* Mock service with deposit configured
|
|
136
|
+
*/
|
|
137
|
+
export declare const mockServiceWithDeposit: Service;
|
|
138
|
+
/**
|
|
139
|
+
* Mock service with in-person payment option
|
|
140
|
+
*/
|
|
141
|
+
export declare const mockServiceInPerson: Service;
|
|
@@ -442,3 +442,47 @@ export function createLargeStaffMemberList(count) {
|
|
|
442
442
|
},
|
|
443
443
|
}));
|
|
444
444
|
}
|
|
445
|
+
// ============================================================================
|
|
446
|
+
// Payment Service Mocks
|
|
447
|
+
// ============================================================================
|
|
448
|
+
/**
|
|
449
|
+
* Mock service with deposit configured
|
|
450
|
+
*/
|
|
451
|
+
export const mockServiceWithDeposit = {
|
|
452
|
+
...mockService,
|
|
453
|
+
_id: 'test-service-deposit',
|
|
454
|
+
name: 'Service with Deposit',
|
|
455
|
+
payment: {
|
|
456
|
+
rateType: RateType.FIXED,
|
|
457
|
+
fixed: {
|
|
458
|
+
price: {
|
|
459
|
+
value: '100.00',
|
|
460
|
+
currency: 'USD',
|
|
461
|
+
},
|
|
462
|
+
deposit: {
|
|
463
|
+
value: '30.00',
|
|
464
|
+
currency: 'USD',
|
|
465
|
+
},
|
|
466
|
+
},
|
|
467
|
+
},
|
|
468
|
+
};
|
|
469
|
+
/**
|
|
470
|
+
* Mock service with in-person payment option
|
|
471
|
+
*/
|
|
472
|
+
export const mockServiceInPerson = {
|
|
473
|
+
...mockService,
|
|
474
|
+
_id: 'test-service-in-person',
|
|
475
|
+
name: 'In Person Payment Service',
|
|
476
|
+
payment: {
|
|
477
|
+
rateType: RateType.FIXED,
|
|
478
|
+
fixed: {
|
|
479
|
+
price: {
|
|
480
|
+
value: '50.00',
|
|
481
|
+
currency: 'USD',
|
|
482
|
+
},
|
|
483
|
+
},
|
|
484
|
+
options: {
|
|
485
|
+
inPerson: true,
|
|
486
|
+
},
|
|
487
|
+
},
|
|
488
|
+
};
|
|
@@ -52,7 +52,7 @@ function buildDisplayLocations(locations, hasCustomLocations, hasCustomerLocatio
|
|
|
52
52
|
else if (hasCustomLocations) {
|
|
53
53
|
// Synthetic custom location (only from explicit flag, not array)
|
|
54
54
|
displayLocations.push({
|
|
55
|
-
location:
|
|
55
|
+
location: { _id: SYNTHETIC_CUSTOM_ID, type: LocationType.CUSTOM },
|
|
56
56
|
type: LocationType.CUSTOM,
|
|
57
57
|
isSynthetic: true,
|
|
58
58
|
id: SYNTHETIC_CUSTOM_ID,
|
|
@@ -60,10 +60,13 @@ function buildDisplayLocations(locations, hasCustomLocations, hasCustomerLocatio
|
|
|
60
60
|
}
|
|
61
61
|
// 3. Add CUSTOMER location (always synthetic display, real or flag-based)
|
|
62
62
|
if (customerFromArray || hasCustomerLocations) {
|
|
63
|
+
const isSynthetic = !customerFromArray;
|
|
63
64
|
displayLocations.push({
|
|
64
|
-
location:
|
|
65
|
+
location: isSynthetic
|
|
66
|
+
? { _id: SYNTHETIC_CUSTOMER_ID, type: LocationType.CUSTOMER }
|
|
67
|
+
: customerFromArray,
|
|
65
68
|
type: LocationType.CUSTOMER,
|
|
66
|
-
isSynthetic
|
|
69
|
+
isSynthetic,
|
|
67
70
|
id: SYNTHETIC_CUSTOMER_ID,
|
|
68
71
|
});
|
|
69
72
|
}
|
|
@@ -149,7 +149,7 @@ export const ServiceListService = implementService.withConfig()(ServiceListServi
|
|
|
149
149
|
// Helper to get effective filters including location from BookingService
|
|
150
150
|
const getEffectiveFilters = (baseFilters) => {
|
|
151
151
|
const selectedLocation = bookingService.location.get();
|
|
152
|
-
const locationId = selectedLocation?.
|
|
152
|
+
const locationId = selectedLocation?._id;
|
|
153
153
|
if (!baseFilters && !locationId) {
|
|
154
154
|
return undefined;
|
|
155
155
|
}
|
|
@@ -10,7 +10,7 @@ import type { Service } from '@wix/auto_sdk_bookings_services';
|
|
|
10
10
|
* Require a stable `id` + `locationType` pair (no optional fields).
|
|
11
11
|
*/
|
|
12
12
|
export interface Location {
|
|
13
|
-
id
|
|
13
|
+
id?: string;
|
|
14
14
|
locationType: LocationTypeWithLiterals;
|
|
15
15
|
}
|
|
16
16
|
export declare enum ViewMode {
|
|
@@ -3,18 +3,26 @@
|
|
|
3
3
|
* Manages time slot fetching, selection, and state
|
|
4
4
|
*/
|
|
5
5
|
import { implementService } from '@wix/services-definitions';
|
|
6
|
-
import { SignalsServiceDefinition } from '@wix/services-definitions/core-services/signals';
|
|
6
|
+
import { SignalsServiceDefinition, } from '@wix/services-definitions/core-services/signals';
|
|
7
7
|
import { TimeSlotListServiceDefinition, ViewMode, } from './time-slot-list.def.js';
|
|
8
|
+
import { LocationType, } from '@wix/auto_sdk_bookings_event-time-slots';
|
|
8
9
|
import { fetchAvailability } from '../../api/fetch-availability/index.js';
|
|
9
10
|
import { BookingServiceDefinition, ANY_STAFF_MEMBER_ID, } from '../booking/booking.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Helpers
|
|
12
13
|
// ============================================================================
|
|
13
|
-
|
|
14
|
+
const getClientTimezone = () => {
|
|
14
15
|
return typeof Intl !== 'undefined'
|
|
15
16
|
? Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
16
17
|
: undefined;
|
|
17
|
-
}
|
|
18
|
+
};
|
|
19
|
+
const getStaffName = (staffMemberId, slots) => {
|
|
20
|
+
if (staffMemberId === ANY_STAFF_MEMBER_ID)
|
|
21
|
+
return 'Any staff member';
|
|
22
|
+
return (slots
|
|
23
|
+
.flatMap((slot) => slot.availableResources[0].resources)
|
|
24
|
+
.find((r) => r._id === staffMemberId)?.name ?? undefined);
|
|
25
|
+
};
|
|
18
26
|
// ============================================================================
|
|
19
27
|
// Service Implementation
|
|
20
28
|
// ============================================================================
|
|
@@ -31,6 +39,12 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
31
39
|
end: config.endDate,
|
|
32
40
|
});
|
|
33
41
|
const cursorSignal = signalsService.signal(undefined);
|
|
42
|
+
const preSelectedStaffMemberIdSignal = signalsService.computed(() => {
|
|
43
|
+
const serviceSelections = bookingService.serviceSelections.get();
|
|
44
|
+
return serviceSelections.length
|
|
45
|
+
? (serviceSelections[0]?.resources?.[0]?._id ?? undefined)
|
|
46
|
+
: undefined;
|
|
47
|
+
});
|
|
34
48
|
const getServices = () => {
|
|
35
49
|
const serviceSelections = bookingService.serviceSelections.peek();
|
|
36
50
|
return serviceSelections.length
|
|
@@ -40,12 +54,16 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
40
54
|
const getFilters = () => {
|
|
41
55
|
const baseFilters = config.filters ?? {};
|
|
42
56
|
const selectedLocation = bookingService.location.peek();
|
|
57
|
+
const isCustomOrCustomerLocation = selectedLocation?.type === LocationType.CUSTOM ||
|
|
58
|
+
selectedLocation?.type === LocationType.CUSTOMER;
|
|
43
59
|
const location = selectedLocation
|
|
44
|
-
? {
|
|
60
|
+
? {
|
|
61
|
+
id: isCustomOrCustomerLocation ? undefined : selectedLocation._id,
|
|
62
|
+
locationType: selectedLocation.type,
|
|
63
|
+
}
|
|
45
64
|
: baseFilters.location;
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
? selectedResources.map((r) => r._id)
|
|
65
|
+
const staffMemberIds = preSelectedStaffMemberIdSignal.peek()
|
|
66
|
+
? [preSelectedStaffMemberIdSignal.peek()]
|
|
49
67
|
: baseFilters.staffMemberIds;
|
|
50
68
|
return { ...baseFilters, location, staffMemberIds };
|
|
51
69
|
};
|
|
@@ -85,11 +103,14 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
85
103
|
* - Auto-selects staff only when there is exactly one staff option in this slot
|
|
86
104
|
*/
|
|
87
105
|
const selectSlot = (slot) => {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
106
|
+
const resources = preSelectedStaffMemberIdSignal.peek()
|
|
107
|
+
? [
|
|
108
|
+
{
|
|
109
|
+
_id: preSelectedStaffMemberIdSignal.peek(),
|
|
110
|
+
name: getStaffName(preSelectedStaffMemberIdSignal.peek(), timeSlotsSignal.peek()),
|
|
111
|
+
},
|
|
112
|
+
]
|
|
113
|
+
: [];
|
|
93
114
|
const timeSlot = {
|
|
94
115
|
startDate: slot.localStartDate,
|
|
95
116
|
endDate: slot.localEndDate,
|
|
@@ -112,18 +133,10 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
112
133
|
const selectedTimeSlot = bookingService.serviceSelections.peek()[0]?.timeSlot;
|
|
113
134
|
if (!selectedTimeSlot)
|
|
114
135
|
return;
|
|
115
|
-
const getStaffName = (id) => {
|
|
116
|
-
if (id === ANY_STAFF_MEMBER_ID)
|
|
117
|
-
return 'Any staff member';
|
|
118
|
-
const slots = timeSlotsSignal.peek();
|
|
119
|
-
return (slots
|
|
120
|
-
.flatMap((slot) => slot.availableResources[0].resources)
|
|
121
|
-
.find((r) => r._id === id)?.name ?? undefined);
|
|
122
|
-
};
|
|
123
136
|
const resources = [
|
|
124
137
|
{
|
|
125
138
|
_id: staffMemberId,
|
|
126
|
-
name: getStaffName(staffMemberId),
|
|
139
|
+
name: getStaffName(staffMemberId, timeSlotsSignal.peek()),
|
|
127
140
|
},
|
|
128
141
|
];
|
|
129
142
|
bookingService.actions.updateItem({
|
|
@@ -191,18 +204,12 @@ export const TimeSlotListService = implementService.withConfig()(TimeSlotListSer
|
|
|
191
204
|
}
|
|
192
205
|
dateRangeSignal.set({ start: newStartDate, end: newEndDate });
|
|
193
206
|
};
|
|
194
|
-
const preSelectedStaffMemberId = signalsService.computed(() => {
|
|
195
|
-
const serviceSelections = bookingService.serviceSelections.get();
|
|
196
|
-
return serviceSelections.length
|
|
197
|
-
? (serviceSelections[0]?.resources?.[0]?._id ?? undefined)
|
|
198
|
-
: undefined;
|
|
199
|
-
});
|
|
200
207
|
let isFirstRun = true;
|
|
201
208
|
const dispose = signalsService.effect(() => {
|
|
202
209
|
dateRangeSignal.get();
|
|
203
210
|
bookingService.timezone.get();
|
|
204
211
|
bookingService.location.get();
|
|
205
|
-
|
|
212
|
+
preSelectedStaffMemberIdSignal.get();
|
|
206
213
|
if (isFirstRun) {
|
|
207
214
|
isFirstRun = false;
|
|
208
215
|
if (config.timeSlots) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/headless-bookings",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.73",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"scripts": {
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"groupId": "com.wixpress.headless-components"
|
|
73
73
|
}
|
|
74
74
|
},
|
|
75
|
-
"falconPackageHash": "
|
|
75
|
+
"falconPackageHash": "34417118571f5f9e720d6fd388d06f0244497d6ec0184bca137822c9"
|
|
76
76
|
}
|