@open-tender/store 0.1.327 → 0.1.329

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.
@@ -5,6 +5,7 @@ var utils_1 = require("@open-tender/utils");
5
5
  var react_1 = require("react");
6
6
  var hooks_1 = require("../app/hooks");
7
7
  var slices_1 = require("../slices");
8
+ var removeOptions_1 = require("../utils/removeOptions");
8
9
  var CategoryItem = function (_a) {
9
10
  var item = _a.item, favorite = _a.favorite, allergenAlerts = _a.allergenAlerts, placeholder = _a.placeholder, index = _a.index, navigate = _a.navigate, children = _a.children;
10
11
  var dispatch = (0, hooks_1.useAppDispatch)();
@@ -19,8 +20,9 @@ var CategoryItem = function (_a) {
19
20
  var _c = displaySettings || {}, _d = _c.calories, showCals = _d === void 0 ? false : _d, _e = _c.tags, showTags = _e === void 0 ? false : _e, _f = _c.allergens, showAllergens = _f === void 0 ? false : _f;
20
21
  var showDesc = 'SHOW';
21
22
  var orderItem = (0, react_1.useMemo)(function () {
22
- return favorite
23
+ var base = favorite
23
24
  ? tslib_1.__assign(tslib_1.__assign({}, (0, utils_1.rehydrateOrderItem)(item, favorite.item)), { index: -1 }) : (0, utils_1.makeOrderItem)(item, undefined, soldOut, undefined, hasPoints);
25
+ return (0, utils_1.calcPrices)((0, removeOptions_1.applyRemoveOptions)(base));
24
26
  }, [favorite, hasPoints, item, soldOut]);
25
27
  var _g = (0, utils_1.useMenuItem)(orderItem, null, {}, null, undefined), displayPrice = _g.displayPrice, displayCals = _g.displayCals;
26
28
  var cartItem = (0, utils_1.useOrderItem)(orderItem, favorite, allergenAlerts, cartCounts, showCals, showTags, showAllergens, showDesc);
@@ -14,9 +14,18 @@ var useOrderValidate = function () {
14
14
  var orderCheckout = tslib_1.__rest(preparedOrder || {}, []);
15
15
  var prevOrderCheckout = (0, usePrevious_1.default)(orderCheckout);
16
16
  (0, react_1.useEffect)(function () {
17
+ // Don't validate if the order is already submitted/completed
18
+ if (checkout.completedOrder)
19
+ return;
17
20
  if (preparedOrder && !(0, react_fast_compare_1.default)(prevOrderCheckout, orderCheckout)) {
18
21
  dispatch((0, slices_1.validatePosOrder)());
19
22
  }
20
- }, [dispatch, preparedOrder, prevOrderCheckout, orderCheckout]);
23
+ }, [
24
+ dispatch,
25
+ preparedOrder,
26
+ prevOrderCheckout,
27
+ orderCheckout,
28
+ checkout.completedOrder
29
+ ]);
21
30
  };
22
31
  exports.default = useOrderValidate;
@@ -0,0 +1,2 @@
1
+ import { CartItem } from '@open-tender/types';
2
+ export declare function applyRemoveOptions(item: CartItem): CartItem;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyRemoveOptions = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var REMOVE_SYNONYMS = ['remove', 'without'];
6
+ var nutritionKeys = [
7
+ 'calories',
8
+ 'cholesterol',
9
+ 'dietary_fiber',
10
+ 'protein',
11
+ 'saturated_fat',
12
+ 'sodium',
13
+ 'sugars',
14
+ 'total_carbs',
15
+ 'total_fat',
16
+ 'trans_fat'
17
+ ];
18
+ function hasRemovePrefix(name) {
19
+ var lower = name.trim().toLowerCase();
20
+ return REMOVE_SYNONYMS.some(function (syn) { return lower.startsWith(syn); });
21
+ }
22
+ function negateNutrition(info) {
23
+ if (!info)
24
+ return null;
25
+ var result = tslib_1.__assign({}, info);
26
+ nutritionKeys.forEach(function (key) {
27
+ var val = result[key];
28
+ if (typeof val === 'number')
29
+ result[key] = -val;
30
+ });
31
+ return result;
32
+ }
33
+ function negateRemoveOption(option) {
34
+ return tslib_1.__assign(tslib_1.__assign({}, option), { cals: typeof option.cals === 'number' ? -option.cals : option.cals, price: -option.price, points: typeof option.points === 'number' ? -option.points : option.points, nutritionalInfo: negateNutrition(option.nutritionalInfo) });
35
+ }
36
+ function addToBase(base, option) {
37
+ var optInfo = option.nutritionalInfo;
38
+ if (!optInfo)
39
+ return base;
40
+ var result = tslib_1.__assign({}, (base || {}));
41
+ nutritionKeys.forEach(function (key) {
42
+ var addVal = optInfo[key];
43
+ if (typeof addVal === 'number') {
44
+ var cur = result[key];
45
+ result[key] = (typeof cur === 'number' ? cur : 0) + addVal;
46
+ }
47
+ });
48
+ return result;
49
+ }
50
+ function applyRemoveOptions(item) {
51
+ var baseCals = item.cals;
52
+ var baseNutrition = item.nutritionalInfo;
53
+ var groups = item.groups.map(function (group) {
54
+ var options = group.options.map(function (option) {
55
+ if (!hasRemovePrefix(option.name))
56
+ return option;
57
+ if (typeof option.cals === 'number') {
58
+ baseCals = (baseCals !== null && baseCals !== void 0 ? baseCals : 0) + option.cals;
59
+ }
60
+ baseNutrition = addToBase(baseNutrition, option);
61
+ return negateRemoveOption(option);
62
+ });
63
+ return tslib_1.__assign(tslib_1.__assign({}, group), { options: options });
64
+ });
65
+ return tslib_1.__assign(tslib_1.__assign({}, item), { cals: baseCals, nutritionalInfo: baseNutrition, groups: groups });
66
+ }
67
+ exports.applyRemoveOptions = applyRemoveOptions;
@@ -1,8 +1,9 @@
1
1
  import { __assign } from "tslib";
2
- import { makeOrderItem, rehydrateOrderItem, useMenuItem, useOrderItem } from '@open-tender/utils';
2
+ import { calcPrices, makeOrderItem, rehydrateOrderItem, useMenuItem, useOrderItem } from '@open-tender/utils';
3
3
  import { memo, useMemo } from 'react';
4
4
  import { useAppDispatch, useAppSelector } from '../app/hooks';
5
5
  import { selectCartCounts, selectKioskApi, selectKioskConfig, selectMenu, selectPointsProgram, selectStoreSettings, setCurrentItem } from '../slices';
6
+ import { applyRemoveOptions } from '../utils/removeOptions';
6
7
  var CategoryItem = function (_a) {
7
8
  var item = _a.item, favorite = _a.favorite, allergenAlerts = _a.allergenAlerts, placeholder = _a.placeholder, index = _a.index, navigate = _a.navigate, children = _a.children;
8
9
  var dispatch = useAppDispatch();
@@ -17,8 +18,9 @@ var CategoryItem = function (_a) {
17
18
  var _c = displaySettings || {}, _d = _c.calories, showCals = _d === void 0 ? false : _d, _e = _c.tags, showTags = _e === void 0 ? false : _e, _f = _c.allergens, showAllergens = _f === void 0 ? false : _f;
18
19
  var showDesc = 'SHOW';
19
20
  var orderItem = useMemo(function () {
20
- return favorite
21
+ var base = favorite
21
22
  ? __assign(__assign({}, rehydrateOrderItem(item, favorite.item)), { index: -1 }) : makeOrderItem(item, undefined, soldOut, undefined, hasPoints);
23
+ return calcPrices(applyRemoveOptions(base));
22
24
  }, [favorite, hasPoints, item, soldOut]);
23
25
  var _g = useMenuItem(orderItem, null, {}, null, undefined), displayPrice = _g.displayPrice, displayCals = _g.displayCals;
24
26
  var cartItem = useOrderItem(orderItem, favorite, allergenAlerts, cartCounts, showCals, showTags, showAllergens, showDesc);
@@ -12,9 +12,18 @@ var useOrderValidate = function () {
12
12
  var orderCheckout = __rest(preparedOrder || {}, []);
13
13
  var prevOrderCheckout = usePrevious(orderCheckout);
14
14
  useEffect(function () {
15
+ // Don't validate if the order is already submitted/completed
16
+ if (checkout.completedOrder)
17
+ return;
15
18
  if (preparedOrder && !isEqual(prevOrderCheckout, orderCheckout)) {
16
19
  dispatch(validatePosOrder());
17
20
  }
18
- }, [dispatch, preparedOrder, prevOrderCheckout, orderCheckout]);
21
+ }, [
22
+ dispatch,
23
+ preparedOrder,
24
+ prevOrderCheckout,
25
+ orderCheckout,
26
+ checkout.completedOrder
27
+ ]);
19
28
  };
20
29
  export default useOrderValidate;
@@ -0,0 +1,2 @@
1
+ import { CartItem } from '@open-tender/types';
2
+ export declare function applyRemoveOptions(item: CartItem): CartItem;
@@ -0,0 +1,63 @@
1
+ import { __assign } from "tslib";
2
+ var REMOVE_SYNONYMS = ['remove', 'without'];
3
+ var nutritionKeys = [
4
+ 'calories',
5
+ 'cholesterol',
6
+ 'dietary_fiber',
7
+ 'protein',
8
+ 'saturated_fat',
9
+ 'sodium',
10
+ 'sugars',
11
+ 'total_carbs',
12
+ 'total_fat',
13
+ 'trans_fat'
14
+ ];
15
+ function hasRemovePrefix(name) {
16
+ var lower = name.trim().toLowerCase();
17
+ return REMOVE_SYNONYMS.some(function (syn) { return lower.startsWith(syn); });
18
+ }
19
+ function negateNutrition(info) {
20
+ if (!info)
21
+ return null;
22
+ var result = __assign({}, info);
23
+ nutritionKeys.forEach(function (key) {
24
+ var val = result[key];
25
+ if (typeof val === 'number')
26
+ result[key] = -val;
27
+ });
28
+ return result;
29
+ }
30
+ function negateRemoveOption(option) {
31
+ return __assign(__assign({}, option), { cals: typeof option.cals === 'number' ? -option.cals : option.cals, price: -option.price, points: typeof option.points === 'number' ? -option.points : option.points, nutritionalInfo: negateNutrition(option.nutritionalInfo) });
32
+ }
33
+ function addToBase(base, option) {
34
+ var optInfo = option.nutritionalInfo;
35
+ if (!optInfo)
36
+ return base;
37
+ var result = __assign({}, (base || {}));
38
+ nutritionKeys.forEach(function (key) {
39
+ var addVal = optInfo[key];
40
+ if (typeof addVal === 'number') {
41
+ var cur = result[key];
42
+ result[key] = (typeof cur === 'number' ? cur : 0) + addVal;
43
+ }
44
+ });
45
+ return result;
46
+ }
47
+ export function applyRemoveOptions(item) {
48
+ var baseCals = item.cals;
49
+ var baseNutrition = item.nutritionalInfo;
50
+ var groups = item.groups.map(function (group) {
51
+ var options = group.options.map(function (option) {
52
+ if (!hasRemovePrefix(option.name))
53
+ return option;
54
+ if (typeof option.cals === 'number') {
55
+ baseCals = (baseCals !== null && baseCals !== void 0 ? baseCals : 0) + option.cals;
56
+ }
57
+ baseNutrition = addToBase(baseNutrition, option);
58
+ return negateRemoveOption(option);
59
+ });
60
+ return __assign(__assign({}, group), { options: options });
61
+ });
62
+ return __assign(__assign({}, item), { cals: baseCals, nutritionalInfo: baseNutrition, groups: groups });
63
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-tender/store",
3
- "version": "0.1.327",
3
+ "version": "0.1.329",
4
4
  "description": "A library of hooks, reducers, utility functions, and types for use with Open Tender applications that utilize our in-store POS API",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",