@open-tender/cloud 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +3 -0
  3. package/dist/cjs/app/hooks.d.ts +50 -0
  4. package/dist/cjs/app/hooks.js +8 -0
  5. package/dist/cjs/app/index.d.ts +1 -0
  6. package/dist/cjs/app/index.js +4 -0
  7. package/dist/cjs/app/store.d.ts +146 -0
  8. package/dist/cjs/app/store.js +51 -0
  9. package/dist/cjs/index.d.ts +3 -0
  10. package/dist/cjs/index.js +7 -0
  11. package/dist/cjs/services/api.d.ts +162 -0
  12. package/dist/cjs/services/api.js +691 -0
  13. package/dist/cjs/services/errors.d.ts +50 -0
  14. package/dist/cjs/services/errors.js +53 -0
  15. package/dist/cjs/services/index.d.ts +2 -0
  16. package/dist/cjs/services/index.js +6 -0
  17. package/dist/cjs/slices/alerts.d.ts +5 -0
  18. package/dist/cjs/slices/alerts.js +28 -0
  19. package/dist/cjs/slices/allergens.d.ts +19 -0
  20. package/dist/cjs/slices/allergens.js +66 -0
  21. package/dist/cjs/slices/announcements.d.ts +28 -0
  22. package/dist/cjs/slices/announcements.js +77 -0
  23. package/dist/cjs/slices/checkout.d.ts +38 -0
  24. package/dist/cjs/slices/checkout.js +276 -0
  25. package/dist/cjs/slices/completedOrders.d.ts +25 -0
  26. package/dist/cjs/slices/completedOrders.js +61 -0
  27. package/dist/cjs/slices/config.d.ts +87 -0
  28. package/dist/cjs/slices/config.js +121 -0
  29. package/dist/cjs/slices/confirmation.d.ts +8 -0
  30. package/dist/cjs/slices/confirmation.js +22 -0
  31. package/dist/cjs/slices/customer/account.d.ts +59 -0
  32. package/dist/cjs/slices/customer/account.js +288 -0
  33. package/dist/cjs/slices/customer/addresses.d.ts +37 -0
  34. package/dist/cjs/slices/customer/addresses.js +134 -0
  35. package/dist/cjs/slices/customer/allergens.d.ts +25 -0
  36. package/dist/cjs/slices/customer/allergens.js +94 -0
  37. package/dist/cjs/slices/customer/communicationPreferences.d.ts +44 -0
  38. package/dist/cjs/slices/customer/communicationPreferences.js +165 -0
  39. package/dist/cjs/slices/customer/creditCards.d.ts +46 -0
  40. package/dist/cjs/slices/customer/creditCards.js +172 -0
  41. package/dist/cjs/slices/customer/favorites.d.ts +45 -0
  42. package/dist/cjs/slices/customer/favorites.js +176 -0
  43. package/dist/cjs/slices/customer/fcmToken.d.ts +31 -0
  44. package/dist/cjs/slices/customer/fcmToken.js +110 -0
  45. package/dist/cjs/slices/customer/giftCards.d.ts +62 -0
  46. package/dist/cjs/slices/customer/giftCards.js +196 -0
  47. package/dist/cjs/slices/customer/groupOrders.d.ts +33 -0
  48. package/dist/cjs/slices/customer/groupOrders.js +148 -0
  49. package/dist/cjs/slices/customer/houseAccounts.d.ts +20 -0
  50. package/dist/cjs/slices/customer/houseAccounts.js +67 -0
  51. package/dist/cjs/slices/customer/index.d.ts +29 -0
  52. package/dist/cjs/slices/customer/index.js +52 -0
  53. package/dist/cjs/slices/customer/levelup.d.ts +36 -0
  54. package/dist/cjs/slices/customer/levelup.js +128 -0
  55. package/dist/cjs/slices/customer/loyalty.d.ts +27 -0
  56. package/dist/cjs/slices/customer/loyalty.js +87 -0
  57. package/dist/cjs/slices/customer/order.d.ts +25 -0
  58. package/dist/cjs/slices/customer/order.js +84 -0
  59. package/dist/cjs/slices/customer/orders.d.ts +20 -0
  60. package/dist/cjs/slices/customer/orders.js +67 -0
  61. package/dist/cjs/slices/customer/qrCode.d.ts +17 -0
  62. package/dist/cjs/slices/customer/qrCode.js +57 -0
  63. package/dist/cjs/slices/customer/rewards.d.ts +20 -0
  64. package/dist/cjs/slices/customer/rewards.js +67 -0
  65. package/dist/cjs/slices/customer/thanx.d.ts +17 -0
  66. package/dist/cjs/slices/customer/thanx.js +57 -0
  67. package/dist/cjs/slices/deals.d.ts +19 -0
  68. package/dist/cjs/slices/deals.js +97 -0
  69. package/dist/cjs/slices/donations.d.ts +26 -0
  70. package/dist/cjs/slices/donations.js +62 -0
  71. package/dist/cjs/slices/giftCards.d.ts +26 -0
  72. package/dist/cjs/slices/giftCards.js +63 -0
  73. package/dist/cjs/slices/groupOrder.d.ts +80 -0
  74. package/dist/cjs/slices/groupOrder.js +226 -0
  75. package/dist/cjs/slices/guest.d.ts +38 -0
  76. package/dist/cjs/slices/guest.js +101 -0
  77. package/dist/cjs/slices/index.d.ts +27 -0
  78. package/dist/cjs/slices/index.js +30 -0
  79. package/dist/cjs/slices/levelup.d.ts +18 -0
  80. package/dist/cjs/slices/levelup.js +51 -0
  81. package/dist/cjs/slices/menu.d.ts +22 -0
  82. package/dist/cjs/slices/menu.js +86 -0
  83. package/dist/cjs/slices/menuDisplay.d.ts +26 -0
  84. package/dist/cjs/slices/menuDisplay.js +59 -0
  85. package/dist/cjs/slices/menuItems.d.ts +20 -0
  86. package/dist/cjs/slices/menuItems.js +57 -0
  87. package/dist/cjs/slices/notifications.d.ts +5 -0
  88. package/dist/cjs/slices/notifications.js +27 -0
  89. package/dist/cjs/slices/order.d.ts +77 -0
  90. package/dist/cjs/slices/order.js +426 -0
  91. package/dist/cjs/slices/orderFulfillment.d.ts +29 -0
  92. package/dist/cjs/slices/orderFulfillment.js +83 -0
  93. package/dist/cjs/slices/orderRating.d.ts +34 -0
  94. package/dist/cjs/slices/orderRating.js +108 -0
  95. package/dist/cjs/slices/orders.d.ts +86 -0
  96. package/dist/cjs/slices/orders.js +311 -0
  97. package/dist/cjs/slices/resetPassword.d.ts +29 -0
  98. package/dist/cjs/slices/resetPassword.js +83 -0
  99. package/dist/cjs/slices/revenueCenters.d.ts +35 -0
  100. package/dist/cjs/slices/revenueCenters.js +95 -0
  101. package/dist/cjs/slices/signUp.d.ts +19 -0
  102. package/dist/cjs/slices/signUp.js +52 -0
  103. package/dist/cjs/slices/types.d.ts +43 -0
  104. package/dist/cjs/slices/types.js +47 -0
  105. package/dist/cjs/slices/validTimes.d.ts +17 -0
  106. package/dist/cjs/slices/validTimes.js +57 -0
  107. package/dist/cjs/slices/verifyAccount.d.ts +17 -0
  108. package/dist/cjs/slices/verifyAccount.js +54 -0
  109. package/dist/esm/app/hooks.d.ts +50 -0
  110. package/dist/esm/app/hooks.js +4 -0
  111. package/dist/esm/app/index.d.ts +1 -0
  112. package/dist/esm/app/index.js +1 -0
  113. package/dist/esm/app/store.d.ts +146 -0
  114. package/dist/esm/app/store.js +48 -0
  115. package/dist/esm/index.d.ts +3 -0
  116. package/dist/esm/index.js +3 -0
  117. package/dist/esm/services/api.d.ts +162 -0
  118. package/dist/esm/services/api.js +689 -0
  119. package/dist/esm/services/errors.d.ts +50 -0
  120. package/dist/esm/services/errors.js +50 -0
  121. package/dist/esm/services/index.d.ts +2 -0
  122. package/dist/esm/services/index.js +2 -0
  123. package/dist/esm/slices/alerts.d.ts +5 -0
  124. package/dist/esm/slices/alerts.js +23 -0
  125. package/dist/esm/slices/allergens.d.ts +19 -0
  126. package/dist/esm/slices/allergens.js +60 -0
  127. package/dist/esm/slices/announcements.d.ts +28 -0
  128. package/dist/esm/slices/announcements.js +71 -0
  129. package/dist/esm/slices/checkout.d.ts +38 -0
  130. package/dist/esm/slices/checkout.js +268 -0
  131. package/dist/esm/slices/completedOrders.d.ts +25 -0
  132. package/dist/esm/slices/completedOrders.js +57 -0
  133. package/dist/esm/slices/config.d.ts +87 -0
  134. package/dist/esm/slices/config.js +102 -0
  135. package/dist/esm/slices/confirmation.d.ts +8 -0
  136. package/dist/esm/slices/confirmation.js +18 -0
  137. package/dist/esm/slices/customer/account.d.ts +59 -0
  138. package/dist/esm/slices/customer/account.js +282 -0
  139. package/dist/esm/slices/customer/addresses.d.ts +37 -0
  140. package/dist/esm/slices/customer/addresses.js +129 -0
  141. package/dist/esm/slices/customer/allergens.d.ts +25 -0
  142. package/dist/esm/slices/customer/allergens.js +89 -0
  143. package/dist/esm/slices/customer/communicationPreferences.d.ts +44 -0
  144. package/dist/esm/slices/customer/communicationPreferences.js +161 -0
  145. package/dist/esm/slices/customer/creditCards.d.ts +46 -0
  146. package/dist/esm/slices/customer/creditCards.js +166 -0
  147. package/dist/esm/slices/customer/favorites.d.ts +45 -0
  148. package/dist/esm/slices/customer/favorites.js +171 -0
  149. package/dist/esm/slices/customer/fcmToken.d.ts +31 -0
  150. package/dist/esm/slices/customer/fcmToken.js +106 -0
  151. package/dist/esm/slices/customer/giftCards.d.ts +62 -0
  152. package/dist/esm/slices/customer/giftCards.js +191 -0
  153. package/dist/esm/slices/customer/groupOrders.d.ts +33 -0
  154. package/dist/esm/slices/customer/groupOrders.js +143 -0
  155. package/dist/esm/slices/customer/houseAccounts.d.ts +20 -0
  156. package/dist/esm/slices/customer/houseAccounts.js +62 -0
  157. package/dist/esm/slices/customer/index.d.ts +29 -0
  158. package/dist/esm/slices/customer/index.js +48 -0
  159. package/dist/esm/slices/customer/levelup.d.ts +36 -0
  160. package/dist/esm/slices/customer/levelup.js +123 -0
  161. package/dist/esm/slices/customer/loyalty.d.ts +27 -0
  162. package/dist/esm/slices/customer/loyalty.js +79 -0
  163. package/dist/esm/slices/customer/order.d.ts +25 -0
  164. package/dist/esm/slices/customer/order.js +79 -0
  165. package/dist/esm/slices/customer/orders.d.ts +20 -0
  166. package/dist/esm/slices/customer/orders.js +62 -0
  167. package/dist/esm/slices/customer/qrCode.d.ts +17 -0
  168. package/dist/esm/slices/customer/qrCode.js +53 -0
  169. package/dist/esm/slices/customer/rewards.d.ts +20 -0
  170. package/dist/esm/slices/customer/rewards.js +62 -0
  171. package/dist/esm/slices/customer/thanx.d.ts +17 -0
  172. package/dist/esm/slices/customer/thanx.js +53 -0
  173. package/dist/esm/slices/deals.d.ts +19 -0
  174. package/dist/esm/slices/deals.js +91 -0
  175. package/dist/esm/slices/donations.d.ts +26 -0
  176. package/dist/esm/slices/donations.js +58 -0
  177. package/dist/esm/slices/giftCards.d.ts +26 -0
  178. package/dist/esm/slices/giftCards.js +59 -0
  179. package/dist/esm/slices/groupOrder.d.ts +80 -0
  180. package/dist/esm/slices/groupOrder.js +216 -0
  181. package/dist/esm/slices/guest.d.ts +38 -0
  182. package/dist/esm/slices/guest.js +97 -0
  183. package/dist/esm/slices/index.d.ts +27 -0
  184. package/dist/esm/slices/index.js +27 -0
  185. package/dist/esm/slices/levelup.d.ts +18 -0
  186. package/dist/esm/slices/levelup.js +48 -0
  187. package/dist/esm/slices/menu.d.ts +22 -0
  188. package/dist/esm/slices/menu.js +81 -0
  189. package/dist/esm/slices/menuDisplay.d.ts +26 -0
  190. package/dist/esm/slices/menuDisplay.js +55 -0
  191. package/dist/esm/slices/menuItems.d.ts +20 -0
  192. package/dist/esm/slices/menuItems.js +52 -0
  193. package/dist/esm/slices/notifications.d.ts +5 -0
  194. package/dist/esm/slices/notifications.js +22 -0
  195. package/dist/esm/slices/order.d.ts +77 -0
  196. package/dist/esm/slices/order.js +423 -0
  197. package/dist/esm/slices/orderFulfillment.d.ts +29 -0
  198. package/dist/esm/slices/orderFulfillment.js +79 -0
  199. package/dist/esm/slices/orderRating.d.ts +34 -0
  200. package/dist/esm/slices/orderRating.js +104 -0
  201. package/dist/esm/slices/orders.d.ts +86 -0
  202. package/dist/esm/slices/orders.js +302 -0
  203. package/dist/esm/slices/resetPassword.d.ts +29 -0
  204. package/dist/esm/slices/resetPassword.js +79 -0
  205. package/dist/esm/slices/revenueCenters.d.ts +35 -0
  206. package/dist/esm/slices/revenueCenters.js +89 -0
  207. package/dist/esm/slices/signUp.d.ts +19 -0
  208. package/dist/esm/slices/signUp.js +48 -0
  209. package/dist/esm/slices/types.d.ts +43 -0
  210. package/dist/esm/slices/types.js +44 -0
  211. package/dist/esm/slices/validTimes.d.ts +17 -0
  212. package/dist/esm/slices/validTimes.js +52 -0
  213. package/dist/esm/slices/verifyAccount.d.ts +17 -0
  214. package/dist/esm/slices/verifyAccount.js +50 -0
  215. package/package.json +61 -0
@@ -0,0 +1,80 @@
1
+ import { AppState } from '../app';
2
+ import { CartOwner, GroupOrder, ISOString, OrderItem, RequestError, RequestStatus, ServiceType } from '@open-tender/types';
3
+ export interface GroupOrderState {
4
+ cart: Array<OrderItem>;
5
+ cartGuest: any;
6
+ cartGuests: any;
7
+ cartId: number | null;
8
+ cartOwner: CartOwner | null;
9
+ closed: boolean;
10
+ cutoffAt: string | null;
11
+ error: RequestError;
12
+ guestCount: number | null;
13
+ guestLimit: number | null;
14
+ isCartOwner: boolean;
15
+ loading: RequestStatus;
16
+ requestedAt: ISOString | null;
17
+ revenueCenterId: number | null;
18
+ serviceType: ServiceType | null;
19
+ spendingLimit: string | null;
20
+ token: string | null;
21
+ }
22
+ export declare enum GroupOrderActionType {
23
+ JoinGroupOrder = "groupOrder/joinGroupOrder",
24
+ FetchGroupOrder = "groupOrder/fetchGroupOrder",
25
+ UpdateGroupOrder = "groupOrder/updateGroupOrder",
26
+ ReloadGuestOrder = "groupOrder/reloadGuestOrder"
27
+ }
28
+ export declare const makeCartPayload: (response: GroupOrder, cartGuestId?: number) => {
29
+ cartId: number;
30
+ token: string;
31
+ revenueCenterId: number;
32
+ serviceType: ServiceType;
33
+ requestedAt: `${number}${number}${number}${number}-${number}${number}-${number}${number}T${number}${number}:${number}${number}:${number}${number}Z`;
34
+ cutoffAt: string;
35
+ guestLimit: number;
36
+ guestCount: number;
37
+ spendingLimit: string;
38
+ closed: boolean;
39
+ cartOwner: CartOwner | null;
40
+ cart: OrderItem[];
41
+ cartGuests: any;
42
+ };
43
+ export declare const joinGroupOrder: import("@reduxjs/toolkit").AsyncThunk<any, {
44
+ cart_id: number;
45
+ first_name: string;
46
+ last_name: string;
47
+ }, {
48
+ state: AppState;
49
+ rejectValue: any;
50
+ }>;
51
+ export declare const fetchGroupOrder: import("@reduxjs/toolkit").AsyncThunk<void | Partial<GroupOrderState>, number, {
52
+ state: AppState;
53
+ rejectValue: any;
54
+ }>;
55
+ export declare const updateGroupOrder: import("@reduxjs/toolkit").AsyncThunk<void | Partial<GroupOrderState>, void, {
56
+ state: AppState;
57
+ rejectValue: any;
58
+ }>;
59
+ export declare const reloadGuestOrder: import("@reduxjs/toolkit").AsyncThunk<void, void, {
60
+ state: AppState;
61
+ rejectValue: any;
62
+ }>;
63
+ export declare const resetGroupOrder: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
64
+ export declare const selectGroupOrder: (state: AppState) => GroupOrderState;
65
+ export declare const selectGroupOrderToken: (state: AppState) => string | null;
66
+ export declare const selectSpendingLimit: (state: AppState) => number | null;
67
+ export declare const selectGroupOrderClosed: (state: AppState) => any;
68
+ export declare const selectGroupOrderTests: (state: AppState) => {
69
+ closed: boolean;
70
+ pastCutoff: boolean;
71
+ atCapacity: boolean;
72
+ };
73
+ export declare const selectGroupOrderPrepTimes: (state: AppState) => {
74
+ prepTime?: undefined;
75
+ leadTime?: undefined;
76
+ } | {
77
+ prepTime: number;
78
+ leadTime: number | undefined;
79
+ };
80
+ export declare const groupOrderReducer: import("redux").Reducer<GroupOrderState, import("redux").AnyAction>;
@@ -0,0 +1,216 @@
1
+ import { __awaiter } from "tslib";
2
+ import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
3
+ import { ReducerType } from './types';
4
+ import { resetOrder, selectTimezone, setCart, setMenuVars } from './order';
5
+ import { isoToDate, makeSimpleCart, rehydrateCart } from '@open-tender/utils';
6
+ const initialState = {
7
+ cartId: null,
8
+ token: null,
9
+ revenueCenterId: null,
10
+ serviceType: null,
11
+ requestedAt: null,
12
+ cutoffAt: null,
13
+ guestLimit: null,
14
+ guestCount: null,
15
+ spendingLimit: null,
16
+ closed: false,
17
+ isCartOwner: false,
18
+ cartOwner: null,
19
+ cartGuest: null,
20
+ cartGuests: [],
21
+ cart: [],
22
+ error: null,
23
+ loading: 'idle'
24
+ };
25
+ export var GroupOrderActionType;
26
+ (function (GroupOrderActionType) {
27
+ GroupOrderActionType["JoinGroupOrder"] = "groupOrder/joinGroupOrder";
28
+ GroupOrderActionType["FetchGroupOrder"] = "groupOrder/fetchGroupOrder";
29
+ GroupOrderActionType["UpdateGroupOrder"] = "groupOrder/updateGroupOrder";
30
+ GroupOrderActionType["ReloadGuestOrder"] = "groupOrder/reloadGuestOrder";
31
+ })(GroupOrderActionType || (GroupOrderActionType = {}));
32
+ export const makeCartPayload = (response, cartGuestId) => {
33
+ const { customer = null, closed, cart_id: cartId, token, cart, revenue_center_id: revenueCenterId, service_type: serviceType, requested_at: requestedAt, cutoff_at: cutoffAt, spending_limit: spendingLimit, guest_limit: guestLimit, guest_count: guestCount, cart_guests: cartGuests } = response;
34
+ const filteredCart = cartGuestId
35
+ ? cart.filter(i => i.cart_guest_id === cartGuestId)
36
+ : cart;
37
+ return {
38
+ cartId,
39
+ token,
40
+ revenueCenterId,
41
+ serviceType,
42
+ requestedAt,
43
+ cutoffAt,
44
+ guestLimit,
45
+ guestCount,
46
+ spendingLimit,
47
+ closed,
48
+ cartOwner: customer,
49
+ cart: filteredCart,
50
+ cartGuests: cartGuests || []
51
+ };
52
+ };
53
+ export const joinGroupOrder = createAsyncThunk(GroupOrderActionType.JoinGroupOrder, (requestData, { dispatch, getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
54
+ const { api } = getState().config;
55
+ if (!api)
56
+ return null;
57
+ try {
58
+ const data = {
59
+ cart_id: requestData.cart_id,
60
+ first_name: requestData.first_name,
61
+ last_name: requestData.last_name
62
+ };
63
+ const response = yield api.postCartGuest(data);
64
+ const { cart_guest_id: cartGuestId, first_name: firstName, last_name: lastName } = response;
65
+ const { revenueCenter } = getState().order;
66
+ dispatch(resetOrder());
67
+ const { serviceType, requestedAt } = getState().groupOrder;
68
+ dispatch(setMenuVars({ revenueCenter, serviceType, requestedAt }));
69
+ dispatch(setCart([]));
70
+ const payload = { cartGuestId, firstName, lastName };
71
+ return payload;
72
+ }
73
+ catch (err) {
74
+ return rejectWithValue(err);
75
+ }
76
+ }));
77
+ export const fetchGroupOrder = createAsyncThunk(GroupOrderActionType.FetchGroupOrder, (id, { getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
78
+ const { api } = getState().config;
79
+ if (!api)
80
+ return;
81
+ try {
82
+ const response = yield api.getCart(id);
83
+ const { cartGuest } = getState().groupOrder;
84
+ const cartGuestId = cartGuest ? cartGuest.cartGuestId : null;
85
+ const payload = makeCartPayload(response, cartGuestId);
86
+ return payload;
87
+ }
88
+ catch (err) {
89
+ return rejectWithValue(err);
90
+ }
91
+ }));
92
+ export const updateGroupOrder = createAsyncThunk(GroupOrderActionType.UpdateGroupOrder, (_, { dispatch, getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
93
+ var _a;
94
+ const { api } = getState().config;
95
+ if (!api)
96
+ return;
97
+ const { cartId, cartGuest } = getState().groupOrder;
98
+ try {
99
+ const data = {
100
+ cart: makeSimpleCart((_a = getState().order.cart) !== null && _a !== void 0 ? _a : []),
101
+ cart_guest_id: cartGuest.cartGuestId
102
+ };
103
+ const response = yield api.putCart(cartId, data);
104
+ const payload = makeCartPayload(response, cartGuest.cartGuestId);
105
+ return payload;
106
+ }
107
+ catch (err) {
108
+ yield dispatch(fetchGroupOrder(cartId));
109
+ return rejectWithValue(err);
110
+ }
111
+ }));
112
+ export const reloadGuestOrder = createAsyncThunk(GroupOrderActionType.ReloadGuestOrder, (_, { dispatch, getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
113
+ const { api } = getState().config;
114
+ if (!api)
115
+ return;
116
+ try {
117
+ const { revenueCenterId, serviceType } = getState().groupOrder;
118
+ const { cart: items } = getState().groupOrder;
119
+ const menuItems = yield api.getMenuItems(revenueCenterId, serviceType);
120
+ const { cart } = rehydrateCart(menuItems, items);
121
+ dispatch(setCart(cart));
122
+ return;
123
+ }
124
+ catch (err) {
125
+ return rejectWithValue(err);
126
+ }
127
+ }));
128
+ const groupOrderSlice = createSlice({
129
+ name: ReducerType.GroupOrder,
130
+ initialState,
131
+ reducers: {
132
+ resetGroupOrder: () => initialState,
133
+ deleteGroupOrder: () => initialState
134
+ },
135
+ extraReducers: builder => {
136
+ builder
137
+ .addCase(joinGroupOrder.fulfilled, (state, action) => {
138
+ state.loading = 'idle';
139
+ state.error = null;
140
+ state.cartGuest = action.payload;
141
+ })
142
+ .addCase(joinGroupOrder.pending, state => {
143
+ state.loading = 'pending';
144
+ })
145
+ .addCase(joinGroupOrder.rejected, (state, action) => {
146
+ state.loading = 'idle';
147
+ state.error = action.payload;
148
+ })
149
+ .addCase(fetchGroupOrder.fulfilled, (state, action) => {
150
+ state = Object.assign(Object.assign(Object.assign({}, state), { loading: 'idle', error: null }), action.payload);
151
+ })
152
+ .addCase(fetchGroupOrder.pending, state => {
153
+ state.loading = 'pending';
154
+ })
155
+ .addCase(fetchGroupOrder.rejected, (state, action) => {
156
+ state.loading = 'idle';
157
+ state.error = action.payload;
158
+ })
159
+ .addCase(updateGroupOrder.fulfilled, (state, action) => {
160
+ state = Object.assign(Object.assign(Object.assign({}, state), { loading: 'idle', error: null }), action.payload);
161
+ })
162
+ .addCase(updateGroupOrder.pending, state => {
163
+ state.loading = 'pending';
164
+ })
165
+ .addCase(updateGroupOrder.rejected, (state, action) => {
166
+ state.loading = 'idle';
167
+ state.error = action.payload;
168
+ })
169
+ .addCase(reloadGuestOrder.fulfilled, state => {
170
+ state.loading = 'idle';
171
+ })
172
+ .addCase(reloadGuestOrder.pending, state => {
173
+ state.loading = 'pending';
174
+ })
175
+ .addCase(reloadGuestOrder.rejected, (state, action) => {
176
+ state.loading = 'idle';
177
+ state.error = action.payload;
178
+ });
179
+ }
180
+ });
181
+ export const { resetGroupOrder } = groupOrderSlice.actions;
182
+ export const selectGroupOrder = (state) => state.groupOrder;
183
+ export const selectGroupOrderToken = (state) => state.groupOrder.token;
184
+ export const selectSpendingLimit = (state) => {
185
+ const { cartGuest, spendingLimit } = state.groupOrder;
186
+ return cartGuest && spendingLimit ? parseFloat(spendingLimit) : null;
187
+ };
188
+ export const selectGroupOrderClosed = (state) => {
189
+ const { cartGuest, cutoffAt, closed } = state.groupOrder;
190
+ const tz = selectTimezone(state);
191
+ const cutoffDate = cutoffAt ? isoToDate(cutoffAt, tz) : null;
192
+ const pastCutoff = cutoffDate ? new Date() > cutoffDate : false;
193
+ return cartGuest && (closed || pastCutoff);
194
+ };
195
+ export const selectGroupOrderTests = (state) => {
196
+ const { closed, cutoffAt, guestLimit, guestCount } = state.groupOrder;
197
+ const tz = selectTimezone(state);
198
+ const cutoffDate = cutoffAt ? isoToDate(cutoffAt, tz) : null;
199
+ const pastCutoff = cutoffDate ? new Date() > cutoffDate : false;
200
+ const spotsRemaining = guestLimit ? guestLimit - (guestCount !== null && guestCount !== void 0 ? guestCount : 0) : null;
201
+ const atCapacity = spotsRemaining !== null && spotsRemaining <= 0;
202
+ return { closed, pastCutoff, atCapacity };
203
+ };
204
+ export const selectGroupOrderPrepTimes = (state) => {
205
+ const { revenueCenter, serviceType } = state.order;
206
+ if (!revenueCenter || !serviceType)
207
+ return {};
208
+ const { settings } = revenueCenter;
209
+ const { wait_times, group_ordering } = settings || revenueCenter;
210
+ const { prep_time, lead_time: leadTime } = group_ordering || {};
211
+ const st = serviceType === 'WALKIN' ? 'PICKUP' : serviceType;
212
+ const waitTime = wait_times && wait_times[st] ? wait_times[st] : 0;
213
+ const prepTime = (waitTime !== null && waitTime !== void 0 ? waitTime : 0) + (prep_time !== null && prep_time !== void 0 ? prep_time : 0);
214
+ return { prepTime, leadTime };
215
+ };
216
+ export const groupOrderReducer = groupOrderSlice.reducer;
@@ -0,0 +1,38 @@
1
+ import { AppState } from '../app';
2
+ import { Brands, RequestStatus } from '@open-tender/types';
3
+ export interface GuestState {
4
+ brands: Brands | null;
5
+ errors: any;
6
+ loading: RequestStatus;
7
+ email?: string | null;
8
+ showMagicLink: boolean;
9
+ }
10
+ export declare enum GuestActionType {
11
+ FetchGuest = "guest/fetchGuest",
12
+ FetchGuestThanx = "guest/fetchGuestThanx"
13
+ }
14
+ export declare const fetchGuest: import("@reduxjs/toolkit").AsyncThunk<Partial<GuestState>, {
15
+ email: string;
16
+ callback?: (() => void) | undefined;
17
+ }, {
18
+ state: AppState;
19
+ rejectValue: {
20
+ errors: any;
21
+ email: string;
22
+ };
23
+ }>;
24
+ export declare const fetchGuestThanx: import("@reduxjs/toolkit").AsyncThunk<void | {
25
+ email: string;
26
+ }, {
27
+ email: string;
28
+ callback?: (() => void) | undefined;
29
+ }, {
30
+ state: AppState;
31
+ rejectValue: {
32
+ errors: any;
33
+ email: string;
34
+ };
35
+ }>;
36
+ export declare const resetGuest: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
37
+ export declare const selectGuest: (state: AppState) => GuestState;
38
+ export declare const guestReducer: import("redux").Reducer<GuestState, import("redux").AnyAction>;
@@ -0,0 +1,97 @@
1
+ import { __awaiter } from "tslib";
2
+ import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
3
+ import { ReducerType } from './types';
4
+ import { makeFormErrors } from '@open-tender/utils';
5
+ const initialState = {
6
+ brands: null,
7
+ showMagicLink: false,
8
+ errors: null,
9
+ loading: 'idle',
10
+ email: null
11
+ };
12
+ export var GuestActionType;
13
+ (function (GuestActionType) {
14
+ GuestActionType["FetchGuest"] = "guest/fetchGuest";
15
+ GuestActionType["FetchGuestThanx"] = "guest/fetchGuestThanx";
16
+ })(GuestActionType || (GuestActionType = {}));
17
+ export const fetchGuest = createAsyncThunk(GuestActionType.FetchGuest, (requestData, { getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
18
+ const { api } = getState().config;
19
+ if (!api)
20
+ return;
21
+ try {
22
+ const response = yield api.getGuest(requestData.email);
23
+ if (requestData.callback)
24
+ requestData.callback();
25
+ return response;
26
+ }
27
+ catch (err) {
28
+ let errors = makeFormErrors(err);
29
+ if (errors.form && errors.form.includes('Unknown 500 error')) {
30
+ errors = { form: 'Invalid email address. Please try again.' };
31
+ }
32
+ return rejectWithValue({ errors, email: requestData.email });
33
+ }
34
+ }));
35
+ export const fetchGuestThanx = createAsyncThunk(GuestActionType.FetchGuestThanx, (requestData, { getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
36
+ const { api } = getState().config;
37
+ if (!api)
38
+ return;
39
+ try {
40
+ yield api.postThanxLogin(requestData.email);
41
+ if (requestData.callback)
42
+ requestData.callback();
43
+ return { email: requestData.email };
44
+ }
45
+ catch (err) {
46
+ const errors = makeFormErrors(err);
47
+ return rejectWithValue({ errors, email: requestData.email });
48
+ }
49
+ }));
50
+ const guestSlice = createSlice({
51
+ name: ReducerType.Guest,
52
+ initialState,
53
+ reducers: {
54
+ resetGuest: () => initialState,
55
+ resetGuestErrors: state => {
56
+ state.errors = null;
57
+ state.loading = 'idle';
58
+ state.showMagicLink = false;
59
+ },
60
+ setGuestEmail: (state, action) => {
61
+ state.email = action.payload;
62
+ }
63
+ },
64
+ extraReducers: builder => {
65
+ builder
66
+ .addCase(fetchGuest.fulfilled, (state, action) => {
67
+ state = Object.assign(Object.assign(Object.assign({}, state), { loading: 'idle', errors: null }), action.payload);
68
+ })
69
+ .addCase(fetchGuest.pending, state => {
70
+ state.loading = 'pending';
71
+ })
72
+ .addCase(fetchGuest.rejected, (state, action) => {
73
+ var _a, _b;
74
+ state.errors = (_a = action.payload) === null || _a === void 0 ? void 0 : _a.errors;
75
+ state.email = (_b = action.payload) === null || _b === void 0 ? void 0 : _b.email;
76
+ state.loading = 'idle';
77
+ state.brands = null;
78
+ })
79
+ .addCase(fetchGuestThanx.fulfilled, (state, action) => {
80
+ state = Object.assign(Object.assign(Object.assign({}, state), { loading: 'idle', errors: null, showMagicLink: true }), action.payload);
81
+ })
82
+ .addCase(fetchGuestThanx.pending, state => {
83
+ state.loading = 'pending';
84
+ })
85
+ .addCase(fetchGuestThanx.rejected, (state, action) => {
86
+ var _a, _b;
87
+ state.errors = (_a = action.payload) === null || _a === void 0 ? void 0 : _a.errors;
88
+ state.email = (_b = action.payload) === null || _b === void 0 ? void 0 : _b.email;
89
+ state.loading = 'idle';
90
+ state.showMagicLink = false;
91
+ state.brands = null;
92
+ });
93
+ }
94
+ });
95
+ export const { resetGuest } = guestSlice.actions;
96
+ export const selectGuest = (state) => state.guest;
97
+ export const guestReducer = guestSlice.reducer;
@@ -0,0 +1,27 @@
1
+ export * from './alerts';
2
+ export * from './notifications';
3
+ export * from './allergens';
4
+ export * from './announcements';
5
+ export * from './customer';
6
+ export * from './signUp';
7
+ export * from './revenueCenters';
8
+ export * from './checkout';
9
+ export * from './completedOrders';
10
+ export * from './order';
11
+ export * from './orderFulfillment';
12
+ export * from './orderRating';
13
+ export * from './orders';
14
+ export * from './deals';
15
+ export * from './confirmation';
16
+ export * from './donations';
17
+ export * from './guest';
18
+ export * from './verifyAccount';
19
+ export * from './menu';
20
+ export * from './resetPassword';
21
+ export * from './validTimes';
22
+ export * from './menuItems';
23
+ export * from './menuDisplay';
24
+ export * from './giftCards';
25
+ export * from './groupOrder';
26
+ export * from './levelup';
27
+ export * from './config';
@@ -0,0 +1,27 @@
1
+ export * from './alerts';
2
+ export * from './notifications';
3
+ export * from './allergens';
4
+ export * from './announcements';
5
+ export * from './customer';
6
+ export * from './signUp';
7
+ export * from './revenueCenters';
8
+ export * from './checkout';
9
+ export * from './completedOrders';
10
+ export * from './order';
11
+ export * from './orderFulfillment';
12
+ export * from './orderRating';
13
+ export * from './orders';
14
+ export * from './deals';
15
+ export * from './confirmation';
16
+ export * from './donations';
17
+ export * from './guest';
18
+ export * from './verifyAccount';
19
+ export * from './menu';
20
+ export * from './resetPassword';
21
+ export * from './validTimes';
22
+ export * from './menuItems';
23
+ export * from './menuDisplay';
24
+ export * from './giftCards';
25
+ export * from './groupOrder';
26
+ export * from './levelup';
27
+ export * from './config';
@@ -0,0 +1,18 @@
1
+ import { AppState } from '../app';
2
+ import { RequestError, RequestStatus } from '@open-tender/types';
3
+ export interface LevelupState {
4
+ loading: RequestStatus;
5
+ error: RequestError;
6
+ }
7
+ export declare enum LevelupActionType {
8
+ FetchLevelUpCustomer = "levelup/fetchLevelUpCustomer"
9
+ }
10
+ export declare const fetchLevelUpCustomer: import("@reduxjs/toolkit").AsyncThunk<void, {
11
+ token: string;
12
+ callback?: (() => void) | undefined;
13
+ }, {
14
+ state: AppState;
15
+ rejectValue: RequestError;
16
+ }>;
17
+ export declare const resetLevelup: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>;
18
+ export declare const levelupReducer: import("redux").Reducer<LevelupState, import("redux").AnyAction>;
@@ -0,0 +1,48 @@
1
+ import { __awaiter } from "tslib";
2
+ import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
3
+ import { ReducerType } from './types';
4
+ import { fetchCustomer, fulfillLoginCustomer } from './customer';
5
+ const initialState = {
6
+ loading: 'idle',
7
+ error: null
8
+ };
9
+ export var LevelupActionType;
10
+ (function (LevelupActionType) {
11
+ LevelupActionType["FetchLevelUpCustomer"] = "levelup/fetchLevelUpCustomer";
12
+ })(LevelupActionType || (LevelupActionType = {}));
13
+ export const fetchLevelUpCustomer = createAsyncThunk(LevelupActionType.FetchLevelUpCustomer, (data, { dispatch, getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
14
+ const { api } = getState().config;
15
+ if (!api)
16
+ return;
17
+ try {
18
+ const auth = yield api.postLevelUp({ token: data.token });
19
+ dispatch(fulfillLoginCustomer(auth));
20
+ dispatch(fetchCustomer());
21
+ if (data.callback)
22
+ data.callback();
23
+ return;
24
+ }
25
+ catch (err) {
26
+ return rejectWithValue(err);
27
+ }
28
+ }));
29
+ const levelupSlice = createSlice({
30
+ name: ReducerType.Levelup,
31
+ initialState,
32
+ reducers: {
33
+ resetLevelup: () => initialState
34
+ },
35
+ extraReducers: builder => {
36
+ builder
37
+ .addCase(fetchLevelUpCustomer.fulfilled, () => initialState)
38
+ .addCase(fetchLevelUpCustomer.pending, state => {
39
+ state.loading = 'pending';
40
+ })
41
+ .addCase(fetchLevelUpCustomer.rejected, (state, action) => {
42
+ state.loading = 'idle';
43
+ state.error = action.payload;
44
+ });
45
+ }
46
+ });
47
+ export const { resetLevelup } = levelupSlice.actions;
48
+ export const levelupReducer = levelupSlice.reducer;
@@ -0,0 +1,22 @@
1
+ import { AppState } from '../app';
2
+ import { MenuCategories, MenuVars, OrderRevenueCenter, RequestError, RequestStatus, SoldOut } from '@open-tender/types';
3
+ export interface MenuState {
4
+ loading: RequestStatus;
5
+ error: RequestError;
6
+ cartErrors: any;
7
+ categories: MenuCategories;
8
+ menuVars: Partial<MenuVars> | null;
9
+ previousMenuVars: Partial<MenuVars> | null;
10
+ revenueCenters: OrderRevenueCenter[] | null;
11
+ soldOut: SoldOut;
12
+ }
13
+ export declare enum MenuActionType {
14
+ FetchMenu = "menu/fetchMenu"
15
+ }
16
+ export declare const fetchMenu: import("@reduxjs/toolkit").AsyncThunk<void | Partial<MenuState>, Partial<MenuVars>, {
17
+ state: AppState;
18
+ rejectValue: any;
19
+ }>;
20
+ export declare const resetMenu: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>, resetCartErrors: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>, resetMenuVars: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<string>, setCartErrors: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, string>;
21
+ export declare const selectMenu: (state: AppState) => MenuState;
22
+ export declare const menuReducer: import("redux").Reducer<MenuState, import("redux").AnyAction>;
@@ -0,0 +1,81 @@
1
+ import { __awaiter } from "tslib";
2
+ import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
3
+ import { ReducerType } from './types';
4
+ import { refreshRevenueCenter, setAlert, setCart } from './order';
5
+ import { validateCart } from '@open-tender/utils';
6
+ const initialState = {
7
+ menuVars: null,
8
+ previousMenuVars: null,
9
+ revenueCenters: null,
10
+ categories: [],
11
+ soldOut: [],
12
+ cartErrors: null,
13
+ error: null,
14
+ loading: 'idle'
15
+ };
16
+ export var MenuActionType;
17
+ (function (MenuActionType) {
18
+ MenuActionType["FetchMenu"] = "menu/fetchMenu";
19
+ })(MenuActionType || (MenuActionType = {}));
20
+ export const fetchMenu = createAsyncThunk(MenuActionType.FetchMenu, (menuVars, { dispatch, getState, rejectWithValue }) => __awaiter(void 0, void 0, void 0, function* () {
21
+ const { api } = getState().config;
22
+ if (!api)
23
+ return;
24
+ const { revenueCenterId, serviceType, requestedAt } = menuVars;
25
+ try {
26
+ if (requestedAt === null) {
27
+ const err = getState().menu.error;
28
+ throw err;
29
+ }
30
+ const menu = yield api.getMenu(revenueCenterId, serviceType, requestedAt);
31
+ const { cart } = getState().order;
32
+ const { menu: categories, sold_out_items: soldOut, revenue_centers: revenueCenters } = menu;
33
+ const { newCart, errors } = validateCart(cart !== null && cart !== void 0 ? cart : [], categories, soldOut);
34
+ if (errors) {
35
+ dispatch(setCartErrors({ newCart, errors }));
36
+ dispatch(setAlert({ type: 'cartErrors' }));
37
+ }
38
+ else {
39
+ dispatch(setCart(newCart));
40
+ dispatch(resetCartErrors());
41
+ }
42
+ return { categories, soldOut, revenueCenters, menuVars };
43
+ }
44
+ catch (err) {
45
+ dispatch(refreshRevenueCenter(Object.assign(Object.assign({}, menuVars), { reset: true })));
46
+ return rejectWithValue(err);
47
+ }
48
+ }));
49
+ const menuSlice = createSlice({
50
+ name: ReducerType.Menu,
51
+ initialState,
52
+ reducers: {
53
+ resetMenu: () => initialState,
54
+ resetMenuVars: state => {
55
+ state.menuVars = null;
56
+ state.previousMenuVars = null;
57
+ },
58
+ resetCartErrors: state => {
59
+ state.cartErrors = null;
60
+ },
61
+ setCartErrors: (state, action) => {
62
+ state.cartErrors = action.payload;
63
+ }
64
+ },
65
+ extraReducers: builder => {
66
+ builder
67
+ .addCase(fetchMenu.fulfilled, (state, action) => {
68
+ state = Object.assign(Object.assign(Object.assign({}, state), { previousMenuVars: state.menuVars || null, loading: 'idle', error: null }), action.payload);
69
+ })
70
+ .addCase(fetchMenu.pending, state => {
71
+ state.loading = 'pending';
72
+ })
73
+ .addCase(fetchMenu.rejected, (state, action) => {
74
+ state.loading = 'idle';
75
+ state.error = action.payload;
76
+ });
77
+ }
78
+ });
79
+ export const { resetMenu, resetCartErrors, resetMenuVars, setCartErrors } = menuSlice.actions;
80
+ export const selectMenu = (state) => state.menu;
81
+ export const menuReducer = menuSlice.reducer;