@wix/headless-restaurants-olo 0.0.14 → 0.0.16

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 (85) hide show
  1. package/cjs/dist/mappers/operation-mapper.d.ts +3 -0
  2. package/cjs/dist/mappers/operation-mapper.js +95 -0
  3. package/cjs/dist/react/ItemDetails.d.ts +4 -162
  4. package/cjs/dist/react/ItemDetails.js +6 -78
  5. package/cjs/dist/react/ModifierGroup.d.ts +57 -0
  6. package/cjs/dist/react/ModifierGroup.js +61 -0
  7. package/cjs/dist/react/OLO.d.ts +3 -2
  8. package/cjs/dist/react/OLOMenus.d.ts +20 -0
  9. package/cjs/dist/react/OLOMenus.js +22 -0
  10. package/cjs/dist/react/Settings.d.ts +160 -0
  11. package/cjs/dist/react/Settings.js +94 -0
  12. package/cjs/dist/react/core/ItemDetails.d.ts +1 -11
  13. package/cjs/dist/react/core/ItemDetails.js +4 -21
  14. package/cjs/dist/react/core/ModifierGroup.d.ts +42 -0
  15. package/cjs/dist/react/core/ModifierGroup.js +67 -0
  16. package/cjs/dist/react/core/OLO.js +16 -2
  17. package/cjs/dist/react/core/OLOMenus.d.ts +7 -0
  18. package/cjs/dist/react/core/OLOMenus.js +12 -0
  19. package/cjs/dist/react/core/Settings.d.ts +157 -0
  20. package/cjs/dist/react/core/Settings.js +192 -0
  21. package/cjs/dist/react/core/index.d.ts +1 -0
  22. package/cjs/dist/react/core/index.js +1 -0
  23. package/cjs/dist/react/index.d.ts +3 -0
  24. package/cjs/dist/react/index.js +3 -0
  25. package/cjs/dist/services/common-types.d.ts +18 -0
  26. package/cjs/dist/services/common-types.js +10 -0
  27. package/cjs/dist/services/fulfillments-service.d.ts +13 -0
  28. package/cjs/dist/services/fulfillments-service.js +64 -0
  29. package/cjs/dist/services/index.d.ts +1 -0
  30. package/cjs/dist/services/index.js +1 -0
  31. package/cjs/dist/services/item-details-service.d.ts +2 -0
  32. package/cjs/dist/services/item-details-service.js +8 -1
  33. package/cjs/dist/services/olo-settings-service.d.ts +14 -8
  34. package/cjs/dist/services/olo-settings-service.js +24 -5
  35. package/cjs/dist/services/utils.d.ts +17 -0
  36. package/cjs/dist/services/utils.js +104 -0
  37. package/cjs/dist/types/fulfillments-types.d.ts +33 -0
  38. package/cjs/dist/types/fulfillments-types.js +7 -0
  39. package/cjs/dist/types/operation.d.ts +57 -0
  40. package/cjs/dist/types/operation.js +1 -0
  41. package/cjs/dist/utils/fulfillments-utils.d.ts +23 -0
  42. package/cjs/dist/utils/fulfillments-utils.js +144 -0
  43. package/dist/mappers/operation-mapper.d.ts +3 -0
  44. package/dist/mappers/operation-mapper.js +95 -0
  45. package/dist/react/ItemDetails.d.ts +4 -162
  46. package/dist/react/ItemDetails.js +6 -78
  47. package/dist/react/ModifierGroup.d.ts +57 -0
  48. package/dist/react/ModifierGroup.js +61 -0
  49. package/dist/react/OLO.d.ts +3 -2
  50. package/dist/react/OLOMenus.d.ts +20 -0
  51. package/dist/react/OLOMenus.js +22 -0
  52. package/dist/react/Settings.d.ts +160 -0
  53. package/dist/react/Settings.js +94 -0
  54. package/dist/react/core/ItemDetails.d.ts +1 -11
  55. package/dist/react/core/ItemDetails.js +4 -21
  56. package/dist/react/core/ModifierGroup.d.ts +42 -0
  57. package/dist/react/core/ModifierGroup.js +67 -0
  58. package/dist/react/core/OLO.js +16 -2
  59. package/dist/react/core/OLOMenus.d.ts +7 -0
  60. package/dist/react/core/OLOMenus.js +12 -0
  61. package/dist/react/core/Settings.d.ts +157 -0
  62. package/dist/react/core/Settings.js +192 -0
  63. package/dist/react/core/index.d.ts +1 -0
  64. package/dist/react/core/index.js +1 -0
  65. package/dist/react/index.d.ts +3 -0
  66. package/dist/react/index.js +3 -0
  67. package/dist/services/common-types.d.ts +18 -0
  68. package/dist/services/common-types.js +10 -0
  69. package/dist/services/fulfillments-service.d.ts +13 -0
  70. package/dist/services/fulfillments-service.js +64 -0
  71. package/dist/services/index.d.ts +1 -0
  72. package/dist/services/index.js +1 -0
  73. package/dist/services/item-details-service.d.ts +2 -0
  74. package/dist/services/item-details-service.js +8 -1
  75. package/dist/services/olo-settings-service.d.ts +14 -8
  76. package/dist/services/olo-settings-service.js +24 -5
  77. package/dist/services/utils.d.ts +17 -0
  78. package/dist/services/utils.js +104 -0
  79. package/dist/types/fulfillments-types.d.ts +33 -0
  80. package/dist/types/fulfillments-types.js +7 -0
  81. package/dist/types/operation.d.ts +57 -0
  82. package/dist/types/operation.js +1 -0
  83. package/dist/utils/fulfillments-utils.d.ts +23 -0
  84. package/dist/utils/fulfillments-utils.js +144 -0
  85. package/package.json +5 -6
@@ -0,0 +1,57 @@
1
+ import React from 'react';
2
+ import { type AsChildChildren } from '@wix/headless-utils/react';
3
+ import { EnhancedModifier, EnhancedModifierGroup } from '@wix/headless-restaurants-menus/services';
4
+ import { RuleTypeMap } from '../services/common-types.js';
5
+ export interface ItemDetailsModifierGroupProps {
6
+ children: React.ReactNode;
7
+ }
8
+ export interface ModifiersProps {
9
+ className?: string;
10
+ asChild?: boolean;
11
+ modifierNameClassName?: string;
12
+ modifierPriceClassName?: string;
13
+ children?: AsChildChildren<{
14
+ selectedModifierIds: string[];
15
+ onToggle: (modifierId: string) => void;
16
+ modifierGroup: EnhancedModifierGroup;
17
+ modifiers: EnhancedModifier[];
18
+ isSingleSelect: boolean;
19
+ }>;
20
+ }
21
+ export interface ModifierCheckboxProps {
22
+ selectedModifierIds: string[];
23
+ onToggle: (modifierId: string) => void;
24
+ className?: string;
25
+ modifierNameClassName?: string;
26
+ modifierPriceClassName?: string;
27
+ }
28
+ export interface ModifierRadioProps {
29
+ modifierNameClassName?: string;
30
+ modifierPriceClassName?: string;
31
+ }
32
+ export declare const Root: React.ForwardRefExoticComponent<ItemDetailsModifierGroupProps & React.RefAttributes<HTMLElement>>;
33
+ export declare const Modifiers: React.ForwardRefExoticComponent<ModifiersProps & React.RefAttributes<HTMLElement>>;
34
+ export interface DescriptionProps {
35
+ ruleTypeMap: RuleTypeMap;
36
+ className?: string;
37
+ asChild?: boolean;
38
+ children?: AsChildChildren<{
39
+ description: string;
40
+ }>;
41
+ }
42
+ export declare const Description: React.ForwardRefExoticComponent<DescriptionProps & React.RefAttributes<HTMLElement>>;
43
+ export interface ErrorProps {
44
+ ruleTypeMap: RuleTypeMap;
45
+ className?: string;
46
+ asChild?: boolean;
47
+ children?: AsChildChildren<{
48
+ error: string;
49
+ }>;
50
+ }
51
+ export declare const Error: React.ForwardRefExoticComponent<ErrorProps & React.RefAttributes<HTMLElement>>;
52
+ export declare const ModifierGroup: {
53
+ readonly Root: React.ForwardRefExoticComponent<ItemDetailsModifierGroupProps & React.RefAttributes<HTMLElement>>;
54
+ readonly Modifiers: React.ForwardRefExoticComponent<ModifiersProps & React.RefAttributes<HTMLElement>>;
55
+ readonly Description: React.ForwardRefExoticComponent<DescriptionProps & React.RefAttributes<HTMLElement>>;
56
+ readonly Error: React.ForwardRefExoticComponent<ErrorProps & React.RefAttributes<HTMLElement>>;
57
+ };
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { AsChildSlot } from '@wix/headless-utils/react';
4
+ import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
5
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
6
+ import { Modifier, ModifierGroup as ModifierGroupComponents, useModifierContext, } from '@wix/headless-restaurants-menus/react';
7
+ import { ModifierGroupComponent, ModifiersComponent, Description as DescriptionComponent, GroupError, } from './core/ModifierGroup.js';
8
+ var TestIds;
9
+ (function (TestIds) {
10
+ TestIds["modifiers"] = "modifiers";
11
+ TestIds["modifierGroupDescription"] = "modifier-group-description";
12
+ TestIds["modifierGroupError"] = "modifier-group-error";
13
+ })(TestIds || (TestIds = {}));
14
+ const CheckIcon = () => (_jsx("svg", { width: "15", height: "15", viewBox: "0 0 15 15", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z", fill: "currentColor" }) }));
15
+ export const Root = React.forwardRef(({ children }) => {
16
+ return _jsx(ModifierGroupComponent, { children: children });
17
+ });
18
+ Root.displayName = 'ItemDetailsModifierGroup.Root';
19
+ export const Modifiers = React.forwardRef(({ className, asChild, modifierNameClassName, modifierPriceClassName, children, }, ref) => {
20
+ return (_jsx(ModifiersComponent, { children: ({ selectedModifierIds, onToggle, modifierGroup, modifiers, isSingleSelect, singleSelectedModifierId, }) => (_jsx(AsChildSlot, { ref: ref, asChild: asChild, testId: TestIds.modifiers, className: className, customElement: children, customElementProps: {
21
+ selectedModifierIds,
22
+ onToggle,
23
+ modifierGroup,
24
+ modifiers,
25
+ isSingleSelect,
26
+ }, children: isSingleSelect ? (_jsx(RadioGroupPrimitive.Root, { value: singleSelectedModifierId, onValueChange: onToggle, children: _jsx(ModifierGroupComponents.ModifiersRepeater, { children: _jsx(ModifierRadio, { modifierNameClassName: modifierNameClassName, modifierPriceClassName: modifierPriceClassName }) }) })) : (_jsx(ModifierGroupComponents.ModifiersRepeater, { children: _jsx(ModifierCheckbox, { selectedModifierIds: selectedModifierIds, onToggle: onToggle, modifierNameClassName: modifierNameClassName, modifierPriceClassName: modifierPriceClassName }) })) })) }));
27
+ });
28
+ Modifiers.displayName = 'ItemDetailsModifierGroup.Modifiers';
29
+ const ModifierCheckbox = ({ selectedModifierIds, onToggle, className, modifierNameClassName, modifierPriceClassName, }) => {
30
+ const { modifier } = useModifierContext();
31
+ const isSelected = selectedModifierIds.includes(modifier._id || '');
32
+ return (_jsxs("div", { className: className, style: { display: 'flex', alignItems: 'center' }, children: [_jsx(CheckboxPrimitive.Root, { className: "CheckboxRoot", checked: isSelected, onCheckedChange: () => onToggle(modifier._id || ''), id: modifier._id || undefined, disabled: !modifier.inStock, children: _jsx(CheckboxPrimitive.Indicator, { className: "CheckboxIndicator", children: _jsx(CheckIcon, {}) }) }), _jsxs("label", { className: "Label", htmlFor: modifier._id || undefined, children: [_jsx(Modifier.Name, { className: modifierNameClassName }), _jsx(Modifier.Price, { className: modifierPriceClassName })] })] }));
33
+ };
34
+ const ModifierRadio = ({ modifierNameClassName, modifierPriceClassName, }) => {
35
+ const { modifier } = useModifierContext();
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
+ };
38
+ export const Description = React.forwardRef(({ ruleTypeMap, className, asChild, children }, ref) => {
39
+ return (_jsx(DescriptionComponent, { ruleTypeMap: ruleTypeMap, children: ({ description }) => {
40
+ if (!description) {
41
+ return null;
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 }) }));
44
+ } }));
45
+ });
46
+ Description.displayName = 'ItemDetailsModifierGroup.Description';
47
+ export const Error = React.forwardRef(({ ruleTypeMap, className, asChild, children }, ref) => {
48
+ return (_jsx(GroupError, { ruleTypeMap: ruleTypeMap, children: ({ error }) => {
49
+ if (!error) {
50
+ return null;
51
+ }
52
+ return (_jsx(AsChildSlot, { ref: ref, asChild: asChild, testId: TestIds.modifierGroupError, className: className, customElement: children, customElementProps: { error }, children: _jsx("p", { className: className, children: error }) }));
53
+ } }));
54
+ });
55
+ Error.displayName = 'ItemDetailsModifierGroup.Error';
56
+ export const ModifierGroup = {
57
+ Root,
58
+ Modifiers,
59
+ Description,
60
+ Error,
61
+ };
@@ -1,12 +1,13 @@
1
1
  import React from 'react';
2
2
  import { ItemServiceConfig } from '../services/item-details-service.js';
3
+ import { OLOSettingsServiceConfig } from '../services/olo-settings-service.js';
3
4
  interface OLORootProps {
4
5
  /** The ID of the item to load */
5
6
  itemId?: string;
6
7
  /** Pre-loaded item service config (optional) */
7
- itemServiceConfig?: any;
8
+ itemServiceConfig?: ItemServiceConfig;
8
9
  /** Pre-loaded OLO settings service config (optional) */
9
- oloSettingsServiceConfig?: any;
10
+ oloSettingsServiceConfig?: OLOSettingsServiceConfig;
10
11
  /** Children render prop that receives the service state */
11
12
  children: React.ReactNode;
12
13
  }
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { type MenusServiceConfig } from '@wix/headless-restaurants-menus/services';
3
+ declare enum TestIds {
4
+ menusRoot = "menus-root"
5
+ }
6
+ /**
7
+ * Menus.Root
8
+ * Container for the menus context and data loading.
9
+ * Does not render if there are no menus.
10
+ */
11
+ export interface MenusRootProps {
12
+ children: React.ReactNode;
13
+ config: MenusServiceConfig;
14
+ }
15
+ export declare const Root: React.ForwardRefExoticComponent<MenusRootProps & React.RefAttributes<HTMLElement>>;
16
+ export declare const OLOMenus: {
17
+ Root: React.ForwardRefExoticComponent<MenusRootProps & React.RefAttributes<HTMLElement>>;
18
+ TestIds: typeof TestIds;
19
+ };
20
+ export {};
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Menus } from '@wix/headless-restaurants-menus/react';
4
+ import * as CoreOLOMenus from './core/OLOMenus.js';
5
+ // =======================
6
+ // TestIds Enum
7
+ // =======================
8
+ var TestIds;
9
+ (function (TestIds) {
10
+ // Container Level
11
+ TestIds["menusRoot"] = "menus-root";
12
+ })(TestIds || (TestIds = {}));
13
+ export const Root = React.forwardRef((props) => {
14
+ const { children, config } = props;
15
+ return (_jsx(CoreOLOMenus.Root, { "data-testid": TestIds.menusRoot, config: config, children: (updatedConfig) => (_jsx(Menus.Root, { "data-testid": TestIds.menusRoot, config: updatedConfig, children: children })) }));
16
+ });
17
+ Root.displayName = 'Menus.Root';
18
+ // Compose Menus namespace
19
+ export const OLOMenus = {
20
+ Root,
21
+ TestIds,
22
+ };
@@ -0,0 +1,160 @@
1
+ import React from 'react';
2
+ import { AsChildChildren } from '@wix/headless-utils/react';
3
+ /**
4
+ * Root headless component for OLO Settings
5
+ * Provides access to current details, fulfillment options, location, and extra data
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * <Settings.Root>
10
+ * {({ currentDetails, currentFulfillment, currentLocation, extraData, isLoading, error }) => (
11
+ * isLoading ? (
12
+ * <div>Loading settings...</div>
13
+ * ) : error ? (
14
+ * <div>Error: {error}</div>
15
+ * ) : (
16
+ * <div>
17
+ * <h2>{currentDetails.name}</h2>
18
+ * <p>{currentDetails.address}</p>
19
+ * <p>Accepting Orders: {extraData.acceptingOrders ? 'Yes' : 'No'}</p>
20
+ * <p>Delivery Fee: ${extraData.deliveryFee}</p>
21
+ * <p>Min Order: ${extraData.minOrderAmount}</p>
22
+ * <p>Free Delivery: ${extraData.freeDeliveryThreshold}</p>
23
+ * </div>
24
+ * )
25
+ * )}
26
+ * </Settings.Root>
27
+ * ```
28
+ */
29
+ interface CurrentTimeSlotProps {
30
+ /** Children render prop that receives the current details */
31
+ children?: AsChildChildren<{
32
+ timeSlot: string;
33
+ }>;
34
+ /** CSS classes to apply to the default element */
35
+ className?: string;
36
+ /** Whether to render as a child component */
37
+ asChild?: boolean;
38
+ }
39
+ /**
40
+ * Headless component for current store details
41
+ * Provides access to store name, address, contact info, and hours
42
+ *
43
+ * @example
44
+ * ```tsx
45
+ * <Settings.CurrentTimeSlot>
46
+ * {({ details, hasDetails }) => (
47
+ * hasDetails ? (
48
+ * <div>
49
+ * <h3>{details.name}</h3>
50
+ * <p>{details.address}</p>
51
+ * <p>{details.phone}</p>
52
+ * <p>{details.email}</p>
53
+ * </div>
54
+ * ) : (
55
+ * <div>No store details available</div>
56
+ * )
57
+ * )}
58
+ * </Settings.CurrentTimeSlot>
59
+ * ```
60
+ */
61
+ export declare const CurrentTimeSlot: React.ForwardRefExoticComponent<CurrentTimeSlotProps & React.RefAttributes<HTMLElement>>;
62
+ /**
63
+ * Headless component for current fulfillment options
64
+ * Provides access to pickup, delivery, and dine-in options
65
+ *
66
+ * @example
67
+ * ```tsx
68
+ * <Settings.CurrentFulfillment>
69
+ * {({ fulfillment, availableOptions }) => (
70
+ * <div>
71
+ * <h3>Available Options:</h3>
72
+ * {availableOptions.map(option => (
73
+ * <div key={option}>
74
+ * {option}: {fulfillment[option]?.enabled ? 'Available' : 'Unavailable'}
75
+ * {fulfillment[option]?.estimatedTime && (
76
+ * <span> - {fulfillment[option].estimatedTime} mins</span>
77
+ * )}
78
+ * </div>
79
+ * ))}
80
+ * </div>
81
+ * )}
82
+ * </Settings.CurrentFulfillment>
83
+ * ```
84
+ */
85
+ interface CurrentLocationProps {
86
+ /** Whether to render as a child component */
87
+ asChild?: boolean;
88
+ /** CSS classes to apply to the default element */
89
+ className?: string;
90
+ /** Children render prop that receives the location data */
91
+ children?: AsChildChildren<{
92
+ currentLocation: {
93
+ name: string;
94
+ };
95
+ hasLocation: boolean;
96
+ }>;
97
+ }
98
+ /**
99
+ * Headless component for current location data
100
+ * Provides access to store location and coordinates
101
+ *
102
+ * @example
103
+ * ```tsx
104
+ * <Settings.CurrentLocation>
105
+ * {({ location, hasLocation }) => (
106
+ * <div>
107
+ * <p>{currentLocation.name}</p>
108
+ * {hasLocation && (
109
+ * <p>Coordinates: {location.latitude}, {location.longitude}</p>
110
+ * )}
111
+ * </div>
112
+ * )}
113
+ * </Settings.CurrentLocation>
114
+ * ```
115
+ */
116
+ export declare const CurrentLocation: React.FC<CurrentLocationProps>;
117
+ interface ExtraDataProps {
118
+ /** Children render prop that receives the extra settings data */
119
+ children: (props: {
120
+ extraData: {
121
+ acceptingOrders: boolean;
122
+ deliveryFee?: number;
123
+ minOrderAmount?: number;
124
+ freeDeliveryThreshold?: number;
125
+ taxRate?: number;
126
+ serviceCharge?: number;
127
+ isOnline?: boolean;
128
+ orderingDisabledReason?: string;
129
+ };
130
+ hasExtraData: boolean;
131
+ }) => React.ReactNode;
132
+ }
133
+ /**
134
+ * Headless component for extra settings data
135
+ * Provides access to ordering status, fees, and thresholds
136
+ *
137
+ * @example
138
+ * ```tsx
139
+ * <Settings.ExtraData>
140
+ * {({ extraData, hasExtraData }) => (
141
+ * hasExtraData ? (
142
+ * <div>
143
+ * <p>Status: {extraData.acceptingOrders ? 'Open' : 'Closed'}</p>
144
+ * {extraData.orderingDisabledReason && (
145
+ * <p>Reason: {extraData.orderingDisabledReason}</p>
146
+ * )}
147
+ * <p>Delivery Fee: ${extraData.deliveryFee}</p>
148
+ * <p>Min Order: ${extraData.minOrderAmount}</p>
149
+ * <p>Free Delivery: ${extraData.freeDeliveryThreshold}</p>
150
+ * <p>Tax Rate: {extraData.taxRate}%</p>
151
+ * </div>
152
+ * ) : (
153
+ * <div>No additional settings available</div>
154
+ * )
155
+ * )}
156
+ * </Settings.ExtraData>
157
+ * ```
158
+ */
159
+ export declare const ExtraData: React.FC<ExtraDataProps>;
160
+ export {};
@@ -0,0 +1,94 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { CoreSettings } from './core/index.js';
4
+ // import { OLOSettingsServiceConfig } from '../services/olo-settings-service.js';
5
+ import { AsChildSlot } from '@wix/headless-utils/react';
6
+ /**
7
+ * Headless component for current store details
8
+ * Provides access to store name, address, contact info, and hours
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * <Settings.CurrentTimeSlot>
13
+ * {({ details, hasDetails }) => (
14
+ * hasDetails ? (
15
+ * <div>
16
+ * <h3>{details.name}</h3>
17
+ * <p>{details.address}</p>
18
+ * <p>{details.phone}</p>
19
+ * <p>{details.email}</p>
20
+ * </div>
21
+ * ) : (
22
+ * <div>No store details available</div>
23
+ * )
24
+ * )}
25
+ * </Settings.CurrentTimeSlot>
26
+ * ```
27
+ */
28
+ // export const CurrentTimeSlot2: React.FC<CurrentTimeSlotProps> = ({ children }) => {
29
+ // return <CoreSettings.CurrentTimeSlot>{children}</CoreSettings.CurrentTimeSlot>;
30
+ // };
31
+ export const CurrentTimeSlot = React.forwardRef(({ asChild, children, className, ...rest }, ref) => {
32
+ return (_jsx(CoreSettings.CurrentTimeSlot, { children: ({ timeSlot, hasDetails }) => (_jsxs(AsChildSlot, { ref: ref, asChild: asChild,
33
+ // testId={TestIds.currentTimeSlot}
34
+ className: className, customElement: children, customElementProps: { timeSlot, hasDetails }, content: timeSlot, ...rest, children: [timeSlot?.dispatchType, timeSlot?.startTime.toLocaleString() +
35
+ ' - ' +
36
+ timeSlot?.endTime.toLocaleString()] })) }));
37
+ });
38
+ CurrentTimeSlot.displayName = 'Settings.CurrentTimeSlot';
39
+ /**
40
+ * Headless component for current location data
41
+ * Provides access to store location and coordinates
42
+ *
43
+ * @example
44
+ * ```tsx
45
+ * <Settings.CurrentLocation>
46
+ * {({ location, hasLocation }) => (
47
+ * <div>
48
+ * <p>{currentLocation.name}</p>
49
+ * {hasLocation && (
50
+ * <p>Coordinates: {location.latitude}, {location.longitude}</p>
51
+ * )}
52
+ * </div>
53
+ * )}
54
+ * </Settings.CurrentLocation>
55
+ * ```
56
+ */
57
+ export const CurrentLocation = ({ children, className, asChild, }) => {
58
+ return (_jsx(CoreSettings.CurrentLocation, { children: ({ location, hasLocation }) => (_jsx(AsChildSlot
59
+ // ref={ref}
60
+ , {
61
+ // ref={ref}
62
+ asChild: asChild,
63
+ // testId={TestIds.currentLocation}
64
+ className: className, customElement: children, customElementProps: { location, hasLocation }, content: location.name, children: location.name })) }));
65
+ };
66
+ /**
67
+ * Headless component for extra settings data
68
+ * Provides access to ordering status, fees, and thresholds
69
+ *
70
+ * @example
71
+ * ```tsx
72
+ * <Settings.ExtraData>
73
+ * {({ extraData, hasExtraData }) => (
74
+ * hasExtraData ? (
75
+ * <div>
76
+ * <p>Status: {extraData.acceptingOrders ? 'Open' : 'Closed'}</p>
77
+ * {extraData.orderingDisabledReason && (
78
+ * <p>Reason: {extraData.orderingDisabledReason}</p>
79
+ * )}
80
+ * <p>Delivery Fee: ${extraData.deliveryFee}</p>
81
+ * <p>Min Order: ${extraData.minOrderAmount}</p>
82
+ * <p>Free Delivery: ${extraData.freeDeliveryThreshold}</p>
83
+ * <p>Tax Rate: {extraData.taxRate}%</p>
84
+ * </div>
85
+ * ) : (
86
+ * <div>No additional settings available</div>
87
+ * )
88
+ * )}
89
+ * </Settings.ExtraData>
90
+ * ```
91
+ */
92
+ export const ExtraData = ({ children }) => {
93
+ return _jsx(CoreSettings.ExtraData, { children: children });
94
+ };
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { type LineItem } from '@wix/ecom/services';
3
3
  import { ItemServiceConfig } from '../../services/item-details-service.js';
4
- import { EnhancedModifier, EnhancedModifierGroup, EnhancedVariant } from '@wix/headless-restaurants-menus/services';
4
+ import { EnhancedVariant } from '@wix/headless-restaurants-menus/services';
5
5
  import { AvailabilityStatus, AvailabilityStatusMap } from '../../services/common-types.js';
6
6
  interface ItemDetailsRootProps {
7
7
  children: (props: {
@@ -45,16 +45,6 @@ interface ItemDetailsVariantsProps {
45
45
  }) => React.ReactNode;
46
46
  }
47
47
  export declare const VariantsComponent: React.FC<ItemDetailsVariantsProps>;
48
- interface ItemDetailsModifiersProps {
49
- children: (props: {
50
- selectedModifierIds: string[];
51
- onToggle: (modifierId: string) => void;
52
- modifierGroup: EnhancedModifierGroup;
53
- modifiers: EnhancedModifier[];
54
- }) => React.ReactNode;
55
- singleSelect?: boolean;
56
- }
57
- export declare const ModifiersComponent: React.FC<ItemDetailsModifiersProps>;
58
48
  interface ItemDetailsAvailabilityProps {
59
49
  availabilityStatusMap: AvailabilityStatusMap;
60
50
  children: (props: {
@@ -4,17 +4,18 @@ import { useService, WixServices } from '@wix/services-manager-react';
4
4
  import { createServicesMap } from '@wix/services-manager';
5
5
  import { ItemService, ItemServiceDefinition, loadItemServiceConfig, } from '../../services/item-details-service.js';
6
6
  import { OLOSettingsServiceDefinition } from '../../services/olo-settings-service.js';
7
- import { useItemContext, useModifierGroupContext, } from '@wix/headless-restaurants-menus/react';
7
+ import { useItemContext } from '@wix/headless-restaurants-menus/react';
8
8
  import { AvailabilityStatus, } from '../../services/common-types.js';
9
- import { convertModifierToFormModifier } from '../../services/utils.js';
10
9
  export const Root = ({ children, itemDetailsServiceConfig, }) => {
11
10
  const service = useService(OLOSettingsServiceDefinition);
12
11
  const selectedItem = service.selectedItem?.get();
12
+ console.log('selectedItem', selectedItem, itemDetailsServiceConfig);
13
13
  let config = itemDetailsServiceConfig;
14
14
  if (!config) {
15
15
  config = loadItemServiceConfig({
16
16
  item: selectedItem,
17
- operationId: service.operation?.get()?._id ?? '',
17
+ // @ts-expect-error - operation is not typed
18
+ operationId: service.operation?.get()?.id ?? '',
18
19
  });
19
20
  }
20
21
  if (config.item) {
@@ -86,24 +87,6 @@ export const VariantsComponent = ({ children, }) => {
86
87
  selectedVariant,
87
88
  });
88
89
  };
89
- export const ModifiersComponent = ({ children, singleSelect, }) => {
90
- const service = useService(ItemServiceDefinition);
91
- const { modifierGroup } = useModifierGroupContext();
92
- // Get selected modifier IDs for this group
93
- const groupId = modifierGroup._id;
94
- const groupSelectedModifierIds = service.getSelectedModifiers?.(groupId ?? '');
95
- const onToggle = (modifierId) => {
96
- if (groupId) {
97
- service.toggleModifier?.(groupId, modifierId, singleSelect);
98
- }
99
- };
100
- return children({
101
- selectedModifierIds: groupSelectedModifierIds,
102
- onToggle,
103
- modifierGroup,
104
- modifiers: modifierGroup.modifiers.map(convertModifierToFormModifier),
105
- });
106
- };
107
90
  export const AvailabilityComponent = ({ children, availabilityStatusMap, }) => {
108
91
  const oloSettingsService = useService(OLOSettingsServiceDefinition);
109
92
  const availabilityDispatchAction = oloSettingsService.availabilityDispatchAction?.get?.();
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import { EnhancedModifier, EnhancedModifierGroup } from '@wix/headless-restaurants-menus/services';
3
+ import { RuleType, RuleTypeMap } from '../../services/common-types.js';
4
+ interface ModifiersContextValue {
5
+ selectedModifierIds: string[];
6
+ onToggle: (modifierId: string) => void;
7
+ modifierGroup: EnhancedModifierGroup;
8
+ modifiers: EnhancedModifier[];
9
+ ruleType: RuleType;
10
+ isSingleSelect: boolean;
11
+ }
12
+ export declare function useModifiersContext(): ModifiersContextValue;
13
+ interface ModifierGroupComponentProps {
14
+ children: React.ReactNode;
15
+ }
16
+ export declare const ModifierGroupComponent: React.FC<ModifierGroupComponentProps>;
17
+ interface ModifiersComponentProps {
18
+ children: (props: {
19
+ selectedModifierIds: string[];
20
+ onToggle: (modifierId: string) => void;
21
+ modifierGroup: EnhancedModifierGroup;
22
+ modifiers: EnhancedModifier[];
23
+ isSingleSelect: boolean;
24
+ singleSelectedModifierId: string;
25
+ }) => React.ReactNode;
26
+ }
27
+ export declare const ModifiersComponent: React.FC<ModifiersComponentProps>;
28
+ interface DescriptionProps {
29
+ ruleTypeMap: RuleTypeMap;
30
+ children: (props: {
31
+ description: string | undefined;
32
+ }) => React.ReactNode;
33
+ }
34
+ export declare const Description: React.FC<DescriptionProps>;
35
+ interface GroupErrorProps {
36
+ ruleTypeMap: RuleTypeMap;
37
+ children: (props: {
38
+ error: string | undefined;
39
+ }) => React.ReactNode;
40
+ }
41
+ export declare const GroupError: React.FC<GroupErrorProps>;
42
+ export {};
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React, { createContext } from 'react';
3
+ import { useService } from '@wix/services-manager-react';
4
+ import { useModifierGroupContext } from '@wix/headless-restaurants-menus/react';
5
+ import { convertModifierToFormModifier, getModifierGroupRuleType, getRuleTypeMapValue, isSingleSelectRule, } from '../../services/utils.js';
6
+ import { ItemServiceDefinition } from '../../services/item-details-service.js';
7
+ const ModifiersContext = createContext(null);
8
+ export function useModifiersContext() {
9
+ const context = React.useContext(ModifiersContext);
10
+ if (!context) {
11
+ throw new Error('useModifiersContext must be used within a ModifierGroupComponent');
12
+ }
13
+ return context;
14
+ }
15
+ export const ModifierGroupComponent = ({ children, }) => {
16
+ const service = useService(ItemServiceDefinition);
17
+ const { modifierGroup } = useModifierGroupContext();
18
+ const rule = modifierGroup.rule;
19
+ const isSingleSelect = Boolean(rule ? isSingleSelectRule(rule) : false);
20
+ const groupId = modifierGroup._id;
21
+ const groupSelectedModifierIds = service.getSelectedModifiers?.(groupId ?? '');
22
+ const onToggle = (modifierId) => {
23
+ if (groupId) {
24
+ service.toggleModifier?.(groupId, modifierId, isSingleSelect);
25
+ }
26
+ };
27
+ const ruleType = getModifierGroupRuleType(modifierGroup.rule);
28
+ const contextValue = {
29
+ selectedModifierIds: groupSelectedModifierIds,
30
+ onToggle,
31
+ modifierGroup,
32
+ modifiers: modifierGroup.modifiers.map(convertModifierToFormModifier),
33
+ isSingleSelect,
34
+ ruleType,
35
+ };
36
+ return (_jsx(ModifiersContext.Provider, { value: contextValue, children: children }));
37
+ };
38
+ export const ModifiersComponent = ({ children, }) => {
39
+ const { selectedModifierIds, onToggle, modifierGroup, modifiers, isSingleSelect, } = useModifiersContext();
40
+ const singleSelectedModifierId = selectedModifierIds.length > 0 ? (selectedModifierIds[0] ?? '') : '';
41
+ return children({
42
+ selectedModifierIds,
43
+ onToggle,
44
+ modifierGroup,
45
+ modifiers,
46
+ isSingleSelect,
47
+ singleSelectedModifierId,
48
+ });
49
+ };
50
+ export const Description = ({ ruleTypeMap, children, }) => {
51
+ const { ruleType, modifierGroup } = useModifiersContext();
52
+ const modifierGroupName = modifierGroup.name || '';
53
+ const description = getRuleTypeMapValue(ruleTypeMap, ruleType, modifierGroupName, modifierGroup.rule);
54
+ return children({ description });
55
+ };
56
+ export const GroupError = ({ ruleTypeMap, children, }) => {
57
+ const service = useService(ItemServiceDefinition);
58
+ const { ruleType, modifierGroup } = useModifiersContext();
59
+ const groupId = modifierGroup._id || '';
60
+ const modifierGroupErrors = service.modifierGroupError?.get() || {};
61
+ const modifierGroupName = modifierGroup.name || '';
62
+ let error;
63
+ if (modifierGroupErrors[groupId]) {
64
+ error = getRuleTypeMapValue(ruleTypeMap, ruleType, modifierGroupName, modifierGroup.rule);
65
+ }
66
+ return children({ error });
67
+ };
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect } from 'react';
2
+ import { useEffect, useState } from 'react';
3
3
  import { createServicesMap } from '@wix/services-manager';
4
4
  import { WixServices } from '@wix/services-manager-react';
5
5
  // import { ItemService, ItemServiceDefinition, loadItemServiceConfig } from '@/components/restaurants-olo/services/itemDetailsService';
6
6
  import { OLOSettingsService, OLOSettingsServiceDefinition, } from '@wix/headless-restaurants-olo/services';
7
+ import { FulfillmentsService, FulfillmentsServiceDefinition, loadFulfillmentsServiceConfig, } from '../../services/fulfillments-service.js';
7
8
  /**
8
9
  * Core OLO Root component that sets up service management
9
10
  * Provides ItemService and CurrentCartService to child components
@@ -24,6 +25,9 @@ import { OLOSettingsService, OLOSettingsServiceDefinition, } from '@wix/headless
24
25
  * ```
25
26
  */
26
27
  export const Root = ({ itemId, itemServiceConfig, cartServiceConfig, oloSettingsServiceConfig, children, }) => {
28
+ const [fulfillmentsServiceConfig, setFulfillmentsServiceConfig] = useState({
29
+ operation: oloSettingsServiceConfig?.operation ?? undefined,
30
+ });
27
31
  // const [servicesManager, setServicesManager] = useState<ServicesManager | null>(null);
28
32
  // const [isLoading, setIsLoading] = useState(true);
29
33
  // const [error, setError] = useState<string | undefined>();
@@ -86,7 +90,17 @@ export const Root = ({ itemId, itemServiceConfig, cartServiceConfig, oloSettings
86
90
  // hasServices
87
91
  // });
88
92
  console.log('oloSettingsServiceConfig', oloSettingsServiceConfig);
89
- return (_jsx(WixServices, { servicesMap: createServicesMap().addService(OLOSettingsServiceDefinition, OLOSettingsService, oloSettingsServiceConfig), children: children }));
93
+ useEffect(() => {
94
+ if (oloSettingsServiceConfig?.operation?._id) {
95
+ loadFulfillmentsServiceConfig(oloSettingsServiceConfig.operation).then((config) => {
96
+ console.log('config', config);
97
+ setFulfillmentsServiceConfig(config);
98
+ });
99
+ }
100
+ }, [oloSettingsServiceConfig?.operation?._id]);
101
+ return (_jsx(WixServices, { servicesMap: createServicesMap()
102
+ .addService(OLOSettingsServiceDefinition, OLOSettingsService, oloSettingsServiceConfig)
103
+ .addService(FulfillmentsServiceDefinition, FulfillmentsService, fulfillmentsServiceConfig), children: children }));
90
104
  };
91
105
  /**
92
106
  * Convenience wrapper that combines Root with ServicesManagerProvider
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { MenusServiceConfig } from '@wix/headless-restaurants-menus/services';
3
+ export interface OLOMenusRootProps {
4
+ config: MenusServiceConfig;
5
+ children: (updatedConfig: MenusServiceConfig) => React.ReactNode;
6
+ }
7
+ export declare const Root: React.ForwardRefExoticComponent<OLOMenusRootProps & React.RefAttributes<HTMLElement>>;