@wix/headless-restaurants-olo 0.0.20 → 0.0.22

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.
@@ -35,12 +35,12 @@ const ModifierRadio = ({ modifierNameClassName, modifierPriceClassName, }) => {
35
35
  const { modifier } = useModifierContext();
36
36
  return (_jsx(RadioGroupPrimitive.Item, { className: "RadioGroupItem", value: modifier._id || '', id: modifier._id || undefined, disabled: !modifier.inStock, children: _jsxs("div", { style: { display: 'flex', alignItems: 'center' }, children: [_jsx(RadioGroupPrimitive.Indicator, { className: "RadioGroupIndicator" }), _jsxs("label", { className: "Label", htmlFor: modifier._id || undefined, children: [_jsx(Modifier.Name, { className: modifierNameClassName }), _jsx(Modifier.Price, { className: modifierPriceClassName })] })] }) }));
37
37
  };
38
- export const Description = React.forwardRef(({ ruleTypeMap, className, asChild, children }, ref) => {
38
+ export const Description = React.forwardRef(({ ruleTypeMap, className, asChild, children, ...otherProps }, ref) => {
39
39
  return (_jsx(DescriptionComponent, { ruleTypeMap: ruleTypeMap, children: ({ description }) => {
40
40
  if (!description) {
41
41
  return null;
42
42
  }
43
- return (_jsx(AsChildSlot, { ref: ref, asChild: asChild, testId: TestIds.modifierGroupDescription, className: className, customElement: children, customElementProps: { description }, children: _jsx("p", { className: className, children: description }) }));
43
+ return (_jsx(AsChildSlot, { ref: ref, asChild: asChild, "data-testid": TestIds.modifierGroupDescription, className: className, customElement: children, customElementProps: { description }, content: description, ...otherProps, children: _jsx("p", { className: className, children: description }) }));
44
44
  } }));
45
45
  });
46
46
  Description.displayName = 'ItemDetailsModifierGroup.Description';
@@ -6,6 +6,7 @@ import { ItemService, ItemServiceDefinition, loadItemServiceConfig, } from '../.
6
6
  import { OLOSettingsServiceDefinition } from '../../services/olo-settings-service.js';
7
7
  import { useItemContext } from '@wix/headless-restaurants-menus/react';
8
8
  import { AvailabilityStatus, AddToCartButtonState, } from '../../services/common-types.js';
9
+ import { getAvailabilityText } from '../../services/utils.js';
9
10
  export const Root = ({ children, itemDetailsServiceConfig, }) => {
10
11
  const service = useService(OLOSettingsServiceDefinition);
11
12
  const selectedItem = service.selectedItem?.get();
@@ -105,6 +106,7 @@ export const AvailabilityComponent = ({ children, availabilityStatusMap, }) => {
105
106
  const oloSettingsService = useService(OLOSettingsServiceDefinition);
106
107
  const availabilityDispatchAction = oloSettingsService.availabilityDispatchAction?.get?.();
107
108
  const itemService = useService(ItemServiceDefinition);
109
+ const futureAvailability = itemService.futureAvailability;
108
110
  const availabilityStatus = itemService.availabilityStatus?.get?.() ?? AvailabilityStatus.AVAILABLE;
109
111
  const availabilityStatusWithAction = availabilityStatus === AvailabilityStatus.NEXT_AVAILABILITY_PICKUP ||
110
112
  availabilityStatus === AvailabilityStatus.NEXT_AVAILABILITY_DELIVERY;
@@ -113,12 +115,13 @@ export const AvailabilityComponent = ({ children, availabilityStatusMap, }) => {
113
115
  ? availabilityStatusObject
114
116
  ?.buttonText
115
117
  : undefined;
118
+ const availabilityStatusText = getAvailabilityText(availabilityStatus, availabilityStatusObject, futureAvailability);
116
119
  return children({
117
120
  availabilityStatus,
118
121
  availabilityAction: availabilityStatusWithAction
119
122
  ? availabilityDispatchAction
120
123
  : undefined,
121
- availabilityStatusText: availabilityStatusObject?.text,
124
+ availabilityStatusText,
122
125
  availabilityStatusButtonText,
123
126
  });
124
127
  };
@@ -28,13 +28,23 @@ export declare enum AvailabilityStatus {
28
28
  }
29
29
  export type NextAvailability = AvailabilityStatus.NEXT_AVAILABILITY_PICKUP | AvailabilityStatus.NEXT_AVAILABILITY_DELIVERY;
30
30
  export type AvailabilityStatusWithActionObject = {
31
- text?: string;
31
+ startDateText?: (startDate: Date) => string;
32
+ defaultText?: string;
32
33
  buttonText?: string;
33
34
  };
35
+ export type NoAvailabilityTextObject = {
36
+ defaultText?: string;
37
+ futureOptions?: {
38
+ startDateText?: (startDate: Date) => string;
39
+ dateRangeText?: (startDate: Date, endDate: Date) => string;
40
+ weeklyScheduleText?: (weeklyAvailabilitySummary: WeeklyAvailability) => string;
41
+ noFutureDatesText?: string;
42
+ };
43
+ };
34
44
  export type AvailabilityStatusObject = {
35
45
  text?: string;
36
46
  };
37
- export type AvailabilityStatusMap = Partial<Record<Exclude<AvailabilityStatus, NextAvailability>, AvailabilityStatusObject>> & Record<NextAvailability, AvailabilityStatusWithActionObject>;
47
+ export type AvailabilityStatusMap = Partial<Record<Exclude<AvailabilityStatus, NextAvailability | AvailabilityStatus.NOT_AVAILABLE>, AvailabilityStatusObject>> & Record<AvailabilityStatus.NOT_AVAILABLE, NoAvailabilityTextObject> & Record<NextAvailability, AvailabilityStatusWithActionObject>;
38
48
  export declare enum AddToCartButtonState {
39
49
  ITEM_UNAVAILABLE = 0,
40
50
  OUT_OF_STOCK = 1,
@@ -43,3 +53,38 @@ export declare enum AddToCartButtonState {
43
53
  VALID_TO_CONTINUE = 4
44
54
  }
45
55
  export type AddToCartButtonLabelMap = Record<AddToCartButtonState, string>;
56
+ type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;
57
+ type IntRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
58
+ type HoursRange = IntRange<0, 24>;
59
+ type MinutesRange = IntRange<0, 60>;
60
+ interface TimeOfDay {
61
+ hours: HoursRange;
62
+ minutes: MinutesRange;
63
+ }
64
+ type AvailabilitySlot = {
65
+ start: TimeOfDay;
66
+ end: TimeOfDay;
67
+ };
68
+ type DailyAvailability = {
69
+ dayOfWeek: DayOfWeek;
70
+ availabilities: AvailabilitySlot[];
71
+ };
72
+ declare enum DayOfWeek {
73
+ SUNDAY = "SUNDAY",
74
+ MONDAY = "MONDAY",
75
+ TUESDAY = "TUESDAY",
76
+ WEDNESDAY = "WEDNESDAY",
77
+ THURSDAY = "THURSDAY",
78
+ FRIDAY = "FRIDAY",
79
+ SATURDAY = "SATURDAY"
80
+ }
81
+ export type WeeklyAvailability = {
82
+ [K in DayOfWeek]: DailyAvailability;
83
+ };
84
+ export type FutureAvailability = {
85
+ startDate?: Date;
86
+ endDate?: Date;
87
+ weeklyAvailabilitySummary?: WeeklyAvailability;
88
+ noFutureDates?: boolean;
89
+ };
90
+ export {};
@@ -1,4 +1,4 @@
1
1
  export { ItemService, ItemServiceDefinition, loadItemServiceConfig, ItemServiceConfig, } from './item-details-service.js';
2
2
  export { OLOSettingsService, OLOSettingsServiceDefinition, loadOLOSettingsServiceConfig, type OLOSettingsServiceConfig, type OLOSettingsServiceAPI, } from './olo-settings-service.js';
3
- export { AvailabilityStatus, AvailabilityStatusMap, AddToCartButtonState, AddToCartButtonLabelMap, } from './common-types.js';
3
+ export { AvailabilityStatus, AvailabilityStatusMap, RuleType, RuleTypeMap, AddToCartButtonState, AddToCartButtonLabelMap, } from './common-types.js';
4
4
  export { FulfillmentsService, FulfillmentsServiceDefinition, loadFulfillmentsServiceConfig, } from './fulfillments-service.js';
@@ -1,4 +1,4 @@
1
1
  export { ItemService, ItemServiceDefinition, loadItemServiceConfig, } from './item-details-service.js';
2
2
  export { OLOSettingsService, OLOSettingsServiceDefinition, loadOLOSettingsServiceConfig, } from './olo-settings-service.js';
3
- export { AvailabilityStatus, AddToCartButtonState, } from './common-types.js';
3
+ export { AvailabilityStatus, RuleType, AddToCartButtonState, } from './common-types.js';
4
4
  export { FulfillmentsService, FulfillmentsServiceDefinition, loadFulfillmentsServiceConfig, } from './fulfillments-service.js';
@@ -2,7 +2,7 @@ import { type Signal, type ReadOnlySignal } from '@wix/services-definitions/core
2
2
  import { type LineItem } from '@wix/ecom/services';
3
3
  import { itemVariants } from '@wix/restaurants';
4
4
  import type { EnhancedItem } from '@wix/headless-restaurants-menus/services';
5
- import { AddToCartButtonState, AvailabilityStatus } from './common-types.js';
5
+ import { AddToCartButtonState, AvailabilityStatus, FutureAvailability, WeeklyAvailability } from './common-types.js';
6
6
  type Variant = itemVariants.Variant;
7
7
  /**
8
8
  * API interface for the Item Detailsservice, providing reactive item data management.
@@ -38,6 +38,11 @@ export interface ItemServiceAPI {
38
38
  toggleModifier: (modifierGroupId: string, modifierId: string, singleSelect?: boolean) => void;
39
39
  /** Function to get the selected modifiers for a specific group */
40
40
  getSelectedModifiers: (modifierGroupId: string) => Array<string>;
41
+ futureAvailability: {
42
+ startDate?: Date;
43
+ endDate?: Date;
44
+ weeklyAvailabilitySummary?: WeeklyAvailability;
45
+ };
41
46
  }
42
47
  /**
43
48
  * Service definition for the Item service.
@@ -59,12 +64,12 @@ export declare const ItemServiceDefinition: string & {
59
64
  export interface ItemServiceConfig {
60
65
  /** The initial item data to configure the service with */
61
66
  item?: EnhancedItem;
62
- itemId?: string;
63
67
  operationId?: string;
64
68
  availabilityStatus?: AvailabilityStatus;
65
69
  editItemMode?: boolean;
66
70
  menuId?: string;
67
71
  sectionId?: string;
72
+ futureAvailability?: FutureAvailability;
68
73
  }
69
74
  export declare const ItemService: import("@wix/services-definitions").ServiceFactory<string & {
70
75
  __api: ItemServiceAPI;
@@ -1,6 +1,6 @@
1
1
  import { defineService, implementService } from '@wix/services-definitions';
2
2
  import { SignalsServiceDefinition, } from '@wix/services-definitions/core-services/signals';
3
- import { AddToCartButtonState, AvailabilityStatus } from './common-types.js';
3
+ import { AddToCartButtonState, AvailabilityStatus, } from './common-types.js';
4
4
  import { getAreNotEnoughModifiersOfMandatoryModifierGroupInStock, getModifiersInitState, getLineItemModifiers, getPriceVariantOptions, getSelectedModifierPrices, getSelectedVariantPrice, calculateItemPrice, } from './utils.js';
5
5
  import { OLOSettingsServiceDefinition } from './olo-settings-service.js';
6
6
  /**
@@ -45,6 +45,11 @@ export const ItemServiceDefinition = defineService('item');
45
45
  */
46
46
  const APP_ID = '9a5d83fd-8570-482e-81ab-cfa88942ee60';
47
47
  export const ItemService = implementService.withConfig()(ItemServiceDefinition, ({ getService, config }) => {
48
+ const futureAvailability = config.futureAvailability ?? {
49
+ startDate: undefined,
50
+ endDate: undefined,
51
+ weeklyAvailabilitySummary: undefined,
52
+ };
48
53
  const signalsService = getService(SignalsServiceDefinition);
49
54
  const oloSettingsService = getService(OLOSettingsServiceDefinition);
50
55
  const availabilityStatus = signalsService.signal(config.availabilityStatus ?? AvailabilityStatus.AVAILABLE);
@@ -174,6 +179,7 @@ export const ItemService = implementService.withConfig()(ItemServiceDefinition,
174
179
  buttonState,
175
180
  addToCartButtonDisabled,
176
181
  price,
182
+ futureAvailability,
177
183
  };
178
184
  });
179
185
  /**
@@ -1,5 +1,5 @@
1
1
  import type { EnhancedModifier, EnhancedModifierGroup } from '@wix/headless-restaurants-menus/services';
2
- import { RuleType, RuleTypeMap } from './common-types.js';
2
+ import { AvailabilityStatus, AvailabilityStatusMap, FutureAvailability, RuleType, RuleTypeMap } from './common-types.js';
3
3
  interface ruleUtilsArgs {
4
4
  required: boolean;
5
5
  minSelections: number;
@@ -62,4 +62,5 @@ export declare const getSelectedVariantPrice: (selectedVariant: {
62
62
  };
63
63
  }>) => number;
64
64
  export declare const calculateItemPrice: (basePrice: number, variantPrice: number, modifierPrices: number, quantity: number) => number;
65
+ export declare const getAvailabilityText: (availabilityStatus: AvailabilityStatus, availabilityStatusObject: AvailabilityStatusMap[AvailabilityStatus], futureAvailability: FutureAvailability) => string | undefined;
65
66
  export {};
@@ -1,4 +1,4 @@
1
- import { RuleType } from './common-types.js';
1
+ import { AvailabilityStatus, RuleType, } from './common-types.js';
2
2
  export const getModifiersInitState = (modifierGroups) => {
3
3
  const initialSelectedModifiers = {};
4
4
  modifierGroups.forEach((group) => {
@@ -212,3 +212,36 @@ export const getSelectedVariantPrice = (selectedVariant, priceVariants) => {
212
212
  export const calculateItemPrice = (basePrice, variantPrice, modifierPrices, quantity) => {
213
213
  return (basePrice + variantPrice + modifierPrices) * quantity;
214
214
  };
215
+ export const getAvailabilityText = (availabilityStatus, availabilityStatusObject, futureAvailability) => {
216
+ if (availabilityStatus === AvailabilityStatus.NOT_AVAILABLE) {
217
+ const notAvailableObject = availabilityStatusObject;
218
+ if (futureAvailability?.weeklyAvailabilitySummary &&
219
+ notAvailableObject.futureOptions?.weeklyScheduleText) {
220
+ return notAvailableObject.futureOptions?.weeklyScheduleText?.(futureAvailability.weeklyAvailabilitySummary);
221
+ }
222
+ if (futureAvailability?.startDate) {
223
+ if (futureAvailability?.endDate &&
224
+ notAvailableObject.futureOptions?.dateRangeText) {
225
+ return notAvailableObject.futureOptions?.dateRangeText?.(futureAvailability.startDate, futureAvailability.endDate);
226
+ }
227
+ if (notAvailableObject.futureOptions?.startDateText) {
228
+ return notAvailableObject.futureOptions?.startDateText?.(futureAvailability.startDate);
229
+ }
230
+ }
231
+ if (futureAvailability?.noFutureDates &&
232
+ notAvailableObject.futureOptions?.noFutureDatesText) {
233
+ return notAvailableObject.futureOptions?.noFutureDatesText;
234
+ }
235
+ return notAvailableObject.defaultText;
236
+ }
237
+ if (availabilityStatus === AvailabilityStatus.NEXT_AVAILABILITY_PICKUP ||
238
+ availabilityStatus === AvailabilityStatus.NEXT_AVAILABILITY_DELIVERY) {
239
+ const nextAvailabilityObject = availabilityStatusObject;
240
+ if (futureAvailability?.startDate && nextAvailabilityObject.startDateText) {
241
+ return nextAvailabilityObject.startDateText?.(futureAvailability.startDate);
242
+ }
243
+ return nextAvailabilityObject.defaultText;
244
+ }
245
+ const statusObject = availabilityStatusObject;
246
+ return statusObject.text;
247
+ };
@@ -35,12 +35,12 @@ const ModifierRadio = ({ modifierNameClassName, modifierPriceClassName, }) => {
35
35
  const { modifier } = useModifierContext();
36
36
  return (_jsx(RadioGroupPrimitive.Item, { className: "RadioGroupItem", value: modifier._id || '', id: modifier._id || undefined, disabled: !modifier.inStock, children: _jsxs("div", { style: { display: 'flex', alignItems: 'center' }, children: [_jsx(RadioGroupPrimitive.Indicator, { className: "RadioGroupIndicator" }), _jsxs("label", { className: "Label", htmlFor: modifier._id || undefined, children: [_jsx(Modifier.Name, { className: modifierNameClassName }), _jsx(Modifier.Price, { className: modifierPriceClassName })] })] }) }));
37
37
  };
38
- export const Description = React.forwardRef(({ ruleTypeMap, className, asChild, children }, ref) => {
38
+ export const Description = React.forwardRef(({ ruleTypeMap, className, asChild, children, ...otherProps }, ref) => {
39
39
  return (_jsx(DescriptionComponent, { ruleTypeMap: ruleTypeMap, children: ({ description }) => {
40
40
  if (!description) {
41
41
  return null;
42
42
  }
43
- return (_jsx(AsChildSlot, { ref: ref, asChild: asChild, testId: TestIds.modifierGroupDescription, className: className, customElement: children, customElementProps: { description }, children: _jsx("p", { className: className, children: description }) }));
43
+ return (_jsx(AsChildSlot, { ref: ref, asChild: asChild, "data-testid": TestIds.modifierGroupDescription, className: className, customElement: children, customElementProps: { description }, content: description, ...otherProps, children: _jsx("p", { className: className, children: description }) }));
44
44
  } }));
45
45
  });
46
46
  Description.displayName = 'ItemDetailsModifierGroup.Description';
@@ -6,6 +6,7 @@ import { ItemService, ItemServiceDefinition, loadItemServiceConfig, } from '../.
6
6
  import { OLOSettingsServiceDefinition } from '../../services/olo-settings-service.js';
7
7
  import { useItemContext } from '@wix/headless-restaurants-menus/react';
8
8
  import { AvailabilityStatus, AddToCartButtonState, } from '../../services/common-types.js';
9
+ import { getAvailabilityText } from '../../services/utils.js';
9
10
  export const Root = ({ children, itemDetailsServiceConfig, }) => {
10
11
  const service = useService(OLOSettingsServiceDefinition);
11
12
  const selectedItem = service.selectedItem?.get();
@@ -105,6 +106,7 @@ export const AvailabilityComponent = ({ children, availabilityStatusMap, }) => {
105
106
  const oloSettingsService = useService(OLOSettingsServiceDefinition);
106
107
  const availabilityDispatchAction = oloSettingsService.availabilityDispatchAction?.get?.();
107
108
  const itemService = useService(ItemServiceDefinition);
109
+ const futureAvailability = itemService.futureAvailability;
108
110
  const availabilityStatus = itemService.availabilityStatus?.get?.() ?? AvailabilityStatus.AVAILABLE;
109
111
  const availabilityStatusWithAction = availabilityStatus === AvailabilityStatus.NEXT_AVAILABILITY_PICKUP ||
110
112
  availabilityStatus === AvailabilityStatus.NEXT_AVAILABILITY_DELIVERY;
@@ -113,12 +115,13 @@ export const AvailabilityComponent = ({ children, availabilityStatusMap, }) => {
113
115
  ? availabilityStatusObject
114
116
  ?.buttonText
115
117
  : undefined;
118
+ const availabilityStatusText = getAvailabilityText(availabilityStatus, availabilityStatusObject, futureAvailability);
116
119
  return children({
117
120
  availabilityStatus,
118
121
  availabilityAction: availabilityStatusWithAction
119
122
  ? availabilityDispatchAction
120
123
  : undefined,
121
- availabilityStatusText: availabilityStatusObject?.text,
124
+ availabilityStatusText,
122
125
  availabilityStatusButtonText,
123
126
  });
124
127
  };
@@ -28,13 +28,23 @@ export declare enum AvailabilityStatus {
28
28
  }
29
29
  export type NextAvailability = AvailabilityStatus.NEXT_AVAILABILITY_PICKUP | AvailabilityStatus.NEXT_AVAILABILITY_DELIVERY;
30
30
  export type AvailabilityStatusWithActionObject = {
31
- text?: string;
31
+ startDateText?: (startDate: Date) => string;
32
+ defaultText?: string;
32
33
  buttonText?: string;
33
34
  };
35
+ export type NoAvailabilityTextObject = {
36
+ defaultText?: string;
37
+ futureOptions?: {
38
+ startDateText?: (startDate: Date) => string;
39
+ dateRangeText?: (startDate: Date, endDate: Date) => string;
40
+ weeklyScheduleText?: (weeklyAvailabilitySummary: WeeklyAvailability) => string;
41
+ noFutureDatesText?: string;
42
+ };
43
+ };
34
44
  export type AvailabilityStatusObject = {
35
45
  text?: string;
36
46
  };
37
- export type AvailabilityStatusMap = Partial<Record<Exclude<AvailabilityStatus, NextAvailability>, AvailabilityStatusObject>> & Record<NextAvailability, AvailabilityStatusWithActionObject>;
47
+ export type AvailabilityStatusMap = Partial<Record<Exclude<AvailabilityStatus, NextAvailability | AvailabilityStatus.NOT_AVAILABLE>, AvailabilityStatusObject>> & Record<AvailabilityStatus.NOT_AVAILABLE, NoAvailabilityTextObject> & Record<NextAvailability, AvailabilityStatusWithActionObject>;
38
48
  export declare enum AddToCartButtonState {
39
49
  ITEM_UNAVAILABLE = 0,
40
50
  OUT_OF_STOCK = 1,
@@ -43,3 +53,38 @@ export declare enum AddToCartButtonState {
43
53
  VALID_TO_CONTINUE = 4
44
54
  }
45
55
  export type AddToCartButtonLabelMap = Record<AddToCartButtonState, string>;
56
+ type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;
57
+ type IntRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>;
58
+ type HoursRange = IntRange<0, 24>;
59
+ type MinutesRange = IntRange<0, 60>;
60
+ interface TimeOfDay {
61
+ hours: HoursRange;
62
+ minutes: MinutesRange;
63
+ }
64
+ type AvailabilitySlot = {
65
+ start: TimeOfDay;
66
+ end: TimeOfDay;
67
+ };
68
+ type DailyAvailability = {
69
+ dayOfWeek: DayOfWeek;
70
+ availabilities: AvailabilitySlot[];
71
+ };
72
+ declare enum DayOfWeek {
73
+ SUNDAY = "SUNDAY",
74
+ MONDAY = "MONDAY",
75
+ TUESDAY = "TUESDAY",
76
+ WEDNESDAY = "WEDNESDAY",
77
+ THURSDAY = "THURSDAY",
78
+ FRIDAY = "FRIDAY",
79
+ SATURDAY = "SATURDAY"
80
+ }
81
+ export type WeeklyAvailability = {
82
+ [K in DayOfWeek]: DailyAvailability;
83
+ };
84
+ export type FutureAvailability = {
85
+ startDate?: Date;
86
+ endDate?: Date;
87
+ weeklyAvailabilitySummary?: WeeklyAvailability;
88
+ noFutureDates?: boolean;
89
+ };
90
+ export {};
@@ -1,4 +1,4 @@
1
1
  export { ItemService, ItemServiceDefinition, loadItemServiceConfig, ItemServiceConfig, } from './item-details-service.js';
2
2
  export { OLOSettingsService, OLOSettingsServiceDefinition, loadOLOSettingsServiceConfig, type OLOSettingsServiceConfig, type OLOSettingsServiceAPI, } from './olo-settings-service.js';
3
- export { AvailabilityStatus, AvailabilityStatusMap, AddToCartButtonState, AddToCartButtonLabelMap, } from './common-types.js';
3
+ export { AvailabilityStatus, AvailabilityStatusMap, RuleType, RuleTypeMap, AddToCartButtonState, AddToCartButtonLabelMap, } from './common-types.js';
4
4
  export { FulfillmentsService, FulfillmentsServiceDefinition, loadFulfillmentsServiceConfig, } from './fulfillments-service.js';
@@ -1,4 +1,4 @@
1
1
  export { ItemService, ItemServiceDefinition, loadItemServiceConfig, } from './item-details-service.js';
2
2
  export { OLOSettingsService, OLOSettingsServiceDefinition, loadOLOSettingsServiceConfig, } from './olo-settings-service.js';
3
- export { AvailabilityStatus, AddToCartButtonState, } from './common-types.js';
3
+ export { AvailabilityStatus, RuleType, AddToCartButtonState, } from './common-types.js';
4
4
  export { FulfillmentsService, FulfillmentsServiceDefinition, loadFulfillmentsServiceConfig, } from './fulfillments-service.js';
@@ -2,7 +2,7 @@ import { type Signal, type ReadOnlySignal } from '@wix/services-definitions/core
2
2
  import { type LineItem } from '@wix/ecom/services';
3
3
  import { itemVariants } from '@wix/restaurants';
4
4
  import type { EnhancedItem } from '@wix/headless-restaurants-menus/services';
5
- import { AddToCartButtonState, AvailabilityStatus } from './common-types.js';
5
+ import { AddToCartButtonState, AvailabilityStatus, FutureAvailability, WeeklyAvailability } from './common-types.js';
6
6
  type Variant = itemVariants.Variant;
7
7
  /**
8
8
  * API interface for the Item Detailsservice, providing reactive item data management.
@@ -38,6 +38,11 @@ export interface ItemServiceAPI {
38
38
  toggleModifier: (modifierGroupId: string, modifierId: string, singleSelect?: boolean) => void;
39
39
  /** Function to get the selected modifiers for a specific group */
40
40
  getSelectedModifiers: (modifierGroupId: string) => Array<string>;
41
+ futureAvailability: {
42
+ startDate?: Date;
43
+ endDate?: Date;
44
+ weeklyAvailabilitySummary?: WeeklyAvailability;
45
+ };
41
46
  }
42
47
  /**
43
48
  * Service definition for the Item service.
@@ -59,12 +64,12 @@ export declare const ItemServiceDefinition: string & {
59
64
  export interface ItemServiceConfig {
60
65
  /** The initial item data to configure the service with */
61
66
  item?: EnhancedItem;
62
- itemId?: string;
63
67
  operationId?: string;
64
68
  availabilityStatus?: AvailabilityStatus;
65
69
  editItemMode?: boolean;
66
70
  menuId?: string;
67
71
  sectionId?: string;
72
+ futureAvailability?: FutureAvailability;
68
73
  }
69
74
  export declare const ItemService: import("@wix/services-definitions").ServiceFactory<string & {
70
75
  __api: ItemServiceAPI;
@@ -1,6 +1,6 @@
1
1
  import { defineService, implementService } from '@wix/services-definitions';
2
2
  import { SignalsServiceDefinition, } from '@wix/services-definitions/core-services/signals';
3
- import { AddToCartButtonState, AvailabilityStatus } from './common-types.js';
3
+ import { AddToCartButtonState, AvailabilityStatus, } from './common-types.js';
4
4
  import { getAreNotEnoughModifiersOfMandatoryModifierGroupInStock, getModifiersInitState, getLineItemModifiers, getPriceVariantOptions, getSelectedModifierPrices, getSelectedVariantPrice, calculateItemPrice, } from './utils.js';
5
5
  import { OLOSettingsServiceDefinition } from './olo-settings-service.js';
6
6
  /**
@@ -45,6 +45,11 @@ export const ItemServiceDefinition = defineService('item');
45
45
  */
46
46
  const APP_ID = '9a5d83fd-8570-482e-81ab-cfa88942ee60';
47
47
  export const ItemService = implementService.withConfig()(ItemServiceDefinition, ({ getService, config }) => {
48
+ const futureAvailability = config.futureAvailability ?? {
49
+ startDate: undefined,
50
+ endDate: undefined,
51
+ weeklyAvailabilitySummary: undefined,
52
+ };
48
53
  const signalsService = getService(SignalsServiceDefinition);
49
54
  const oloSettingsService = getService(OLOSettingsServiceDefinition);
50
55
  const availabilityStatus = signalsService.signal(config.availabilityStatus ?? AvailabilityStatus.AVAILABLE);
@@ -174,6 +179,7 @@ export const ItemService = implementService.withConfig()(ItemServiceDefinition,
174
179
  buttonState,
175
180
  addToCartButtonDisabled,
176
181
  price,
182
+ futureAvailability,
177
183
  };
178
184
  });
179
185
  /**
@@ -1,5 +1,5 @@
1
1
  import type { EnhancedModifier, EnhancedModifierGroup } from '@wix/headless-restaurants-menus/services';
2
- import { RuleType, RuleTypeMap } from './common-types.js';
2
+ import { AvailabilityStatus, AvailabilityStatusMap, FutureAvailability, RuleType, RuleTypeMap } from './common-types.js';
3
3
  interface ruleUtilsArgs {
4
4
  required: boolean;
5
5
  minSelections: number;
@@ -62,4 +62,5 @@ export declare const getSelectedVariantPrice: (selectedVariant: {
62
62
  };
63
63
  }>) => number;
64
64
  export declare const calculateItemPrice: (basePrice: number, variantPrice: number, modifierPrices: number, quantity: number) => number;
65
+ export declare const getAvailabilityText: (availabilityStatus: AvailabilityStatus, availabilityStatusObject: AvailabilityStatusMap[AvailabilityStatus], futureAvailability: FutureAvailability) => string | undefined;
65
66
  export {};
@@ -1,4 +1,4 @@
1
- import { RuleType } from './common-types.js';
1
+ import { AvailabilityStatus, RuleType, } from './common-types.js';
2
2
  export const getModifiersInitState = (modifierGroups) => {
3
3
  const initialSelectedModifiers = {};
4
4
  modifierGroups.forEach((group) => {
@@ -212,3 +212,36 @@ export const getSelectedVariantPrice = (selectedVariant, priceVariants) => {
212
212
  export const calculateItemPrice = (basePrice, variantPrice, modifierPrices, quantity) => {
213
213
  return (basePrice + variantPrice + modifierPrices) * quantity;
214
214
  };
215
+ export const getAvailabilityText = (availabilityStatus, availabilityStatusObject, futureAvailability) => {
216
+ if (availabilityStatus === AvailabilityStatus.NOT_AVAILABLE) {
217
+ const notAvailableObject = availabilityStatusObject;
218
+ if (futureAvailability?.weeklyAvailabilitySummary &&
219
+ notAvailableObject.futureOptions?.weeklyScheduleText) {
220
+ return notAvailableObject.futureOptions?.weeklyScheduleText?.(futureAvailability.weeklyAvailabilitySummary);
221
+ }
222
+ if (futureAvailability?.startDate) {
223
+ if (futureAvailability?.endDate &&
224
+ notAvailableObject.futureOptions?.dateRangeText) {
225
+ return notAvailableObject.futureOptions?.dateRangeText?.(futureAvailability.startDate, futureAvailability.endDate);
226
+ }
227
+ if (notAvailableObject.futureOptions?.startDateText) {
228
+ return notAvailableObject.futureOptions?.startDateText?.(futureAvailability.startDate);
229
+ }
230
+ }
231
+ if (futureAvailability?.noFutureDates &&
232
+ notAvailableObject.futureOptions?.noFutureDatesText) {
233
+ return notAvailableObject.futureOptions?.noFutureDatesText;
234
+ }
235
+ return notAvailableObject.defaultText;
236
+ }
237
+ if (availabilityStatus === AvailabilityStatus.NEXT_AVAILABILITY_PICKUP ||
238
+ availabilityStatus === AvailabilityStatus.NEXT_AVAILABILITY_DELIVERY) {
239
+ const nextAvailabilityObject = availabilityStatusObject;
240
+ if (futureAvailability?.startDate && nextAvailabilityObject.startDateText) {
241
+ return nextAvailabilityObject.startDateText?.(futureAvailability.startDate);
242
+ }
243
+ return nextAvailabilityObject.defaultText;
244
+ }
245
+ const statusObject = availabilityStatusObject;
246
+ return statusObject.text;
247
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/headless-restaurants-olo",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -76,5 +76,5 @@
76
76
  "groupId": "com.wixpress.headless-components"
77
77
  }
78
78
  },
79
- "falconPackageHash": "62b03d48ee9763fd64c2c4dd77886b6399b70c84d6cf03279404176c"
79
+ "falconPackageHash": "22c7edc50a34f26aaa424a9e2d3195386db4cb0a84e96dc40950fca2"
80
80
  }