@open-tender/store 1.1.2 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/hooks/index.d.ts +5 -1
- package/dist/cjs/hooks/index.js +9 -1
- package/dist/cjs/hooks/useChipDNATender/index.d.ts +2 -0
- package/dist/cjs/hooks/useChipDNATender/index.js +5 -0
- package/dist/cjs/hooks/useChipDNATender/useChipDNATender.d.ts +8 -0
- package/dist/cjs/hooks/useChipDNATender/useChipDNATender.js +108 -0
- package/dist/cjs/hooks/useChipDNATender/useChipDNATender.utils.d.ts +4 -0
- package/dist/cjs/hooks/useChipDNATender/useChipDNATender.utils.js +37 -0
- package/dist/cjs/hooks/useCustomerRewards.d.ts +14 -0
- package/dist/cjs/hooks/useCustomerRewards.js +45 -0
- package/dist/cjs/hooks/useOrder.d.ts +24 -0
- package/dist/cjs/hooks/useOrder.js +52 -0
- package/dist/cjs/hooks/useOrderValidate.d.ts +2 -0
- package/dist/cjs/hooks/useOrderValidate.js +22 -0
- package/dist/esm/hooks/index.d.ts +5 -1
- package/dist/esm/hooks/index.js +5 -1
- package/dist/esm/hooks/useChipDNATender/index.d.ts +2 -0
- package/dist/esm/hooks/useChipDNATender/index.js +2 -0
- package/dist/esm/hooks/useChipDNATender/useChipDNATender.d.ts +8 -0
- package/dist/esm/hooks/useChipDNATender/useChipDNATender.js +106 -0
- package/dist/esm/hooks/useChipDNATender/useChipDNATender.utils.d.ts +4 -0
- package/dist/esm/hooks/useChipDNATender/useChipDNATender.utils.js +33 -0
- package/dist/esm/hooks/useCustomerRewards.d.ts +14 -0
- package/dist/esm/hooks/useCustomerRewards.js +43 -0
- package/dist/esm/hooks/useOrder.d.ts +24 -0
- package/dist/esm/hooks/useOrder.js +50 -0
- package/dist/esm/hooks/useOrderValidate.d.ts +2 -0
- package/dist/esm/hooks/useOrderValidate.js +20 -0
- package/package.json +5 -3
- package/dist/.DS_Store +0 -0
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import useBarcode from './useBarcode';
|
|
2
2
|
import useCardSwipe from './useCardSwipe';
|
|
3
|
+
import useChipDNATender from './useChipDNATender';
|
|
4
|
+
import useCustomerRewards from './useCustomerRewards';
|
|
3
5
|
import useEmployee from './useEmployee';
|
|
4
6
|
import useGiftCardBalance from './useGiftCardBalance';
|
|
5
7
|
import { useKioskImageUrl } from './useKioskImageUrl';
|
|
8
|
+
import useOrder from './useOrder';
|
|
9
|
+
import useOrderValidate from './useOrderValidate';
|
|
6
10
|
import usePrevious from './usePrevious';
|
|
7
11
|
import usePunch from './usePunch';
|
|
8
12
|
import useRefund from './useRefund';
|
|
9
|
-
export { useBarcode, useCardSwipe, useEmployee, useGiftCardBalance, useKioskImageUrl, usePrevious, usePunch, useRefund };
|
|
13
|
+
export { useBarcode, useCardSwipe, useChipDNATender, useCustomerRewards, useEmployee, useGiftCardBalance, useKioskImageUrl, useOrder, useOrderValidate, usePrevious, usePunch, useRefund };
|
package/dist/cjs/hooks/index.js
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useRefund = exports.usePunch = exports.usePrevious = exports.useKioskImageUrl = exports.useGiftCardBalance = exports.useEmployee = exports.useCardSwipe = exports.useBarcode = void 0;
|
|
3
|
+
exports.useRefund = exports.usePunch = exports.usePrevious = exports.useOrderValidate = exports.useOrder = exports.useKioskImageUrl = exports.useGiftCardBalance = exports.useEmployee = exports.useCustomerRewards = exports.useChipDNATender = exports.useCardSwipe = exports.useBarcode = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var useBarcode_1 = tslib_1.__importDefault(require("./useBarcode"));
|
|
6
6
|
exports.useBarcode = useBarcode_1.default;
|
|
7
7
|
var useCardSwipe_1 = tslib_1.__importDefault(require("./useCardSwipe"));
|
|
8
8
|
exports.useCardSwipe = useCardSwipe_1.default;
|
|
9
|
+
var useChipDNATender_1 = tslib_1.__importDefault(require("./useChipDNATender"));
|
|
10
|
+
exports.useChipDNATender = useChipDNATender_1.default;
|
|
11
|
+
var useCustomerRewards_1 = tslib_1.__importDefault(require("./useCustomerRewards"));
|
|
12
|
+
exports.useCustomerRewards = useCustomerRewards_1.default;
|
|
9
13
|
var useEmployee_1 = tslib_1.__importDefault(require("./useEmployee"));
|
|
10
14
|
exports.useEmployee = useEmployee_1.default;
|
|
11
15
|
var useGiftCardBalance_1 = tslib_1.__importDefault(require("./useGiftCardBalance"));
|
|
12
16
|
exports.useGiftCardBalance = useGiftCardBalance_1.default;
|
|
13
17
|
var useKioskImageUrl_1 = require("./useKioskImageUrl");
|
|
14
18
|
Object.defineProperty(exports, "useKioskImageUrl", { enumerable: true, get: function () { return useKioskImageUrl_1.useKioskImageUrl; } });
|
|
19
|
+
var useOrder_1 = tslib_1.__importDefault(require("./useOrder"));
|
|
20
|
+
exports.useOrder = useOrder_1.default;
|
|
21
|
+
var useOrderValidate_1 = tslib_1.__importDefault(require("./useOrderValidate"));
|
|
22
|
+
exports.useOrderValidate = useOrderValidate_1.default;
|
|
15
23
|
var usePrevious_1 = tslib_1.__importDefault(require("./usePrevious"));
|
|
16
24
|
exports.usePrevious = usePrevious_1.default;
|
|
17
25
|
var usePunch_1 = tslib_1.__importDefault(require("./usePunch"));
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
var utils_1 = require("@open-tender/utils");
|
|
6
|
+
var hooks_1 = require("../../app/hooks");
|
|
7
|
+
var slices_1 = require("../../slices");
|
|
8
|
+
var useChipDNATender_utils_1 = require("./useChipDNATender.utils");
|
|
9
|
+
// JC Amex card token: 440abfc9cc7518f1ad76e2be56f19fe4
|
|
10
|
+
var useChipDNATender = function (amount) {
|
|
11
|
+
var dispatch = (0, hooks_1.useAppDispatch)();
|
|
12
|
+
var orderId = (0, hooks_1.useAppSelector)(slices_1.selectOrder).orderId;
|
|
13
|
+
var api = (0, hooks_1.useAppSelector)(slices_1.selectApi);
|
|
14
|
+
var _a = (0, react_1.useState)(false), reading = _a[0], setReading = _a[1];
|
|
15
|
+
var _b = (0, react_1.useState)('Pending...'), message = _b[0], setMessage = _b[1];
|
|
16
|
+
var _c = (0, react_1.useState)(null), success = _c[0], setSuccess = _c[1];
|
|
17
|
+
var _d = (0, react_1.useState)(null), canceled = _d[0], setCanceled = _d[1];
|
|
18
|
+
var _e = (0, react_1.useState)(null), error = _e[0], setError = _e[1];
|
|
19
|
+
(0, react_1.useEffect)(function () {
|
|
20
|
+
var readChipDNA = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
21
|
+
var data, response, reader_1, card_token_1, card_msg_1, err_1, error_1, detail;
|
|
22
|
+
return tslib_1.__generator(this, function (_a) {
|
|
23
|
+
switch (_a.label) {
|
|
24
|
+
case 0:
|
|
25
|
+
setReading(true);
|
|
26
|
+
_a.label = 1;
|
|
27
|
+
case 1:
|
|
28
|
+
_a.trys.push([1, 3, , 4]);
|
|
29
|
+
if (!amount)
|
|
30
|
+
return [2 /*return*/];
|
|
31
|
+
data = { tender_type: 'CREDIT', amount: amount };
|
|
32
|
+
if (!orderId)
|
|
33
|
+
return [2 /*return*/];
|
|
34
|
+
return [4 /*yield*/, api.postChipDNATender(orderId, data)];
|
|
35
|
+
case 2:
|
|
36
|
+
response = _a.sent();
|
|
37
|
+
reader_1 = response.getReader();
|
|
38
|
+
card_token_1 = null;
|
|
39
|
+
card_msg_1 = null;
|
|
40
|
+
reader_1.read().then(function processText(_a) {
|
|
41
|
+
var done = _a.done, value = _a.value;
|
|
42
|
+
// done - true if the stream has already given you all its data.
|
|
43
|
+
// value - some data. Always undefined when done is true.
|
|
44
|
+
if (done) {
|
|
45
|
+
if (card_token_1 || card_msg_1 === 'Tender Created') {
|
|
46
|
+
setSuccess('Card authorized!');
|
|
47
|
+
}
|
|
48
|
+
else if (card_msg_1 === 'Transaction Declined') {
|
|
49
|
+
setError('Transaction DECLINED. Please try again.');
|
|
50
|
+
}
|
|
51
|
+
else if (card_msg_1 !== 'Transaction Canceled') {
|
|
52
|
+
setError('Card read error. Please try again.');
|
|
53
|
+
}
|
|
54
|
+
dispatch((0, slices_1.completeChipDNA)(card_token_1));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
var _b = (0, useChipDNATender_utils_1.processMessage)(value), msg = _b.msg, token = _b.token;
|
|
58
|
+
if (msg)
|
|
59
|
+
setMessage(msg);
|
|
60
|
+
card_token_1 = token;
|
|
61
|
+
card_msg_1 = msg;
|
|
62
|
+
// console.log('card_msg', card_msg)
|
|
63
|
+
// console.log('card_token', card_token)
|
|
64
|
+
return reader_1.read().then(processText);
|
|
65
|
+
});
|
|
66
|
+
return [3 /*break*/, 4];
|
|
67
|
+
case 3:
|
|
68
|
+
err_1 = _a.sent();
|
|
69
|
+
error_1 = (0, utils_1.handleRespError)(err_1);
|
|
70
|
+
detail = error_1.detail;
|
|
71
|
+
setError(detail || 'Unknown payment error. Please contact support.');
|
|
72
|
+
return [3 /*break*/, 4];
|
|
73
|
+
case 4: return [2 /*return*/];
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}); };
|
|
77
|
+
if (!reading && amount && amount !== '0.00')
|
|
78
|
+
readChipDNA();
|
|
79
|
+
}, [api, dispatch, reading, orderId, amount]);
|
|
80
|
+
var cancel = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
81
|
+
var err_2, detail;
|
|
82
|
+
return tslib_1.__generator(this, function (_a) {
|
|
83
|
+
switch (_a.label) {
|
|
84
|
+
case 0:
|
|
85
|
+
_a.trys.push([0, 2, , 3]);
|
|
86
|
+
return [4 /*yield*/, api.postChipDNACancel()];
|
|
87
|
+
case 1:
|
|
88
|
+
_a.sent();
|
|
89
|
+
setCanceled('EMV transaction canceled');
|
|
90
|
+
return [3 /*break*/, 3];
|
|
91
|
+
case 2:
|
|
92
|
+
err_2 = _a.sent();
|
|
93
|
+
detail = (0, utils_1.handleRespError)(err_2).detail;
|
|
94
|
+
setError(detail || 'Unknown cancellation error. Please contact support.');
|
|
95
|
+
return [3 /*break*/, 3];
|
|
96
|
+
case 3: return [2 /*return*/];
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}); };
|
|
100
|
+
return {
|
|
101
|
+
message: message,
|
|
102
|
+
success: success,
|
|
103
|
+
canceled: canceled,
|
|
104
|
+
error: error,
|
|
105
|
+
cancel: cancel
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
exports.default = useChipDNATender;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processMessage = void 0;
|
|
4
|
+
var utils_1 = require("@open-tender/utils");
|
|
5
|
+
var makeMessage = function (event) {
|
|
6
|
+
if (!event)
|
|
7
|
+
return null;
|
|
8
|
+
return event
|
|
9
|
+
.replace('event: ', '')
|
|
10
|
+
.split('_')
|
|
11
|
+
.map(function (s) { return (0, utils_1.capitalize)(s); })
|
|
12
|
+
.join(' ');
|
|
13
|
+
};
|
|
14
|
+
var parseToken = function (data) {
|
|
15
|
+
if (!data)
|
|
16
|
+
return null;
|
|
17
|
+
try {
|
|
18
|
+
var tender = JSON.parse(data.replace('data: ', ''));
|
|
19
|
+
var token = (tender.credit_card || {}).token;
|
|
20
|
+
return token || null;
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var processMessage = function (value) {
|
|
27
|
+
var decoded = new TextDecoder('utf-8').decode(value);
|
|
28
|
+
var lines = decoded.split('\n');
|
|
29
|
+
var events = lines.filter(function (i) { return i.startsWith('event:'); });
|
|
30
|
+
var event = events[events.length - 1];
|
|
31
|
+
var msg = makeMessage(event);
|
|
32
|
+
var datas = lines.filter(function (i) { return i.startsWith('data:'); });
|
|
33
|
+
var data = datas[datas.length - 1];
|
|
34
|
+
var token = parseToken(data);
|
|
35
|
+
return { msg: msg, token: token };
|
|
36
|
+
};
|
|
37
|
+
exports.processMessage = processMessage;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CustomerIdentify, Discounts, OrderCart } from '@open-tender/types';
|
|
2
|
+
declare const useCustomerRewards: () => {
|
|
3
|
+
customer: CustomerIdentify | null;
|
|
4
|
+
hasDeals: boolean;
|
|
5
|
+
hasRewards: boolean;
|
|
6
|
+
hasPoints: boolean;
|
|
7
|
+
deals: Discounts;
|
|
8
|
+
rewards: Discounts;
|
|
9
|
+
items: OrderCart;
|
|
10
|
+
points: number;
|
|
11
|
+
pointsApplied: number;
|
|
12
|
+
pointsRemaining: number;
|
|
13
|
+
};
|
|
14
|
+
export default useCustomerRewards;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var hooks_1 = require("../app/hooks");
|
|
5
|
+
var slices_1 = require("../slices");
|
|
6
|
+
var useCustomerRewards = function () {
|
|
7
|
+
var customer = (0, hooks_1.useAppSelector)(slices_1.selectCustomerIdentified);
|
|
8
|
+
var _a = (0, hooks_1.useAppSelector)(slices_1.selectCustomer), rewards = _a.rewards, deals = _a.deals;
|
|
9
|
+
var _b = (0, hooks_1.useAppSelector)(slices_1.selectPosCheckout) || {}, check = _b.check, _c = _b.points, checkPoints = _c === void 0 ? [] : _c;
|
|
10
|
+
var _d = (check || {}).cart, cart = _d === void 0 ? [] : _d;
|
|
11
|
+
if (!customer) {
|
|
12
|
+
return {
|
|
13
|
+
customer: null,
|
|
14
|
+
hasDeals: false,
|
|
15
|
+
hasRewards: false,
|
|
16
|
+
hasPoints: false,
|
|
17
|
+
deals: [],
|
|
18
|
+
rewards: [],
|
|
19
|
+
items: [],
|
|
20
|
+
points: 0,
|
|
21
|
+
pointsApplied: 0,
|
|
22
|
+
pointsRemaining: 0
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// const rewards = customer.rewards
|
|
26
|
+
var points = parseInt(customer.points);
|
|
27
|
+
var items = cart
|
|
28
|
+
.map(function (i, index) { return (tslib_1.__assign(tslib_1.__assign({}, i), { points: i.points ? tslib_1.__assign(tslib_1.__assign({}, i.points), { index: index }) : null })); })
|
|
29
|
+
.filter(function (i) { return i.points && i.points.per < points; });
|
|
30
|
+
var pointsApplied = checkPoints.reduce(function (t, i) { return (t += i.points); }, 0);
|
|
31
|
+
var pointsRemaining = points - pointsApplied;
|
|
32
|
+
return {
|
|
33
|
+
customer: customer,
|
|
34
|
+
hasDeals: deals.length > 0,
|
|
35
|
+
hasRewards: rewards.length > 0,
|
|
36
|
+
hasPoints: items.length > 0,
|
|
37
|
+
deals: deals,
|
|
38
|
+
rewards: rewards,
|
|
39
|
+
items: items,
|
|
40
|
+
points: points,
|
|
41
|
+
pointsApplied: pointsApplied,
|
|
42
|
+
pointsRemaining: pointsRemaining
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
exports.default = useCustomerRewards;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Order } from '@open-tender/types';
|
|
2
|
+
declare const useOrder: (order: Order, callback?: () => void) => {
|
|
3
|
+
isInPrepQueue: boolean;
|
|
4
|
+
isUpcoming: boolean;
|
|
5
|
+
itemImages: {
|
|
6
|
+
title: string;
|
|
7
|
+
imageUrl: string;
|
|
8
|
+
}[];
|
|
9
|
+
itemNames: string;
|
|
10
|
+
status: import("@open-tender/types").OrderStatus;
|
|
11
|
+
orderId: number | null;
|
|
12
|
+
orderPrep: import("@open-tender/types").OrderPrep | null;
|
|
13
|
+
orderType: import("@open-tender/types").OrderType;
|
|
14
|
+
orderTypeName: string | undefined;
|
|
15
|
+
reorder: () => void;
|
|
16
|
+
requestedAt: string;
|
|
17
|
+
revenueCenter: import("@open-tender/types").OrderRevenueCenter;
|
|
18
|
+
serviceType: import("@open-tender/types").ServiceType;
|
|
19
|
+
subtitle: string;
|
|
20
|
+
orderNo: string;
|
|
21
|
+
title: string;
|
|
22
|
+
total: `${number}.${number}`;
|
|
23
|
+
};
|
|
24
|
+
export default useOrder;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var utils_1 = require("@open-tender/utils");
|
|
4
|
+
var hooks_1 = require("../app/hooks");
|
|
5
|
+
var slices_1 = require("../slices");
|
|
6
|
+
var useOrder = function (order, callback) {
|
|
7
|
+
var dispatch = (0, hooks_1.useAppDispatch)();
|
|
8
|
+
var orderId = order.order_id, status = order.status, serviceType = order.service_type, orderType = order.order_type, revenueCenter = order.revenue_center, requested_at = order.requested_at, timezone = order.timezone, cart = order.cart, totals = order.totals, orderPrep = order.order_prep;
|
|
9
|
+
var _a = (orderPrep || {}).is_in_prep_queue, isInPrepQueue = _a === void 0 ? false : _a;
|
|
10
|
+
var orderTypeName = (0, utils_1.makeOrderTypeName)(orderType, serviceType);
|
|
11
|
+
var tz = utils_1.timezoneMap[timezone];
|
|
12
|
+
var requestedAt = (0, utils_1.isoToDateStr)(requested_at, tz, 'MMMM d, yyyy @ h:mma');
|
|
13
|
+
var isUpcoming = (0, utils_1.isoToDate)(requested_at) > new Date();
|
|
14
|
+
var itemImages = cart
|
|
15
|
+
.map(function (i) {
|
|
16
|
+
return i.images
|
|
17
|
+
.filter(function (m) { return m.type === 'SMALL_IMAGE' && m.url; })
|
|
18
|
+
.map(function (image) { return ({ title: i.name, imageUrl: image.url }); });
|
|
19
|
+
})
|
|
20
|
+
.flat();
|
|
21
|
+
var itemNames = cart.map(function (i) { return i.name; }).join(', ');
|
|
22
|
+
var total = totals.total;
|
|
23
|
+
var orderNo = "Order #".concat(orderId);
|
|
24
|
+
var title = "".concat(orderTypeName, " from ").concat(revenueCenter.name);
|
|
25
|
+
var subtitle = "".concat(requestedAt, " | ").concat((0, utils_1.formatDollars)(total));
|
|
26
|
+
var reorder = function () {
|
|
27
|
+
// const { revenue_center_id: revenueCenterId } = revenueCenter
|
|
28
|
+
dispatch((0, slices_1.setOrderServiceType)({ orderType: 'OLO', serviceType: 'WALKIN' }));
|
|
29
|
+
if (callback)
|
|
30
|
+
callback();
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
isInPrepQueue: isInPrepQueue,
|
|
34
|
+
isUpcoming: isUpcoming,
|
|
35
|
+
itemImages: itemImages,
|
|
36
|
+
itemNames: itemNames,
|
|
37
|
+
status: status,
|
|
38
|
+
orderId: orderId,
|
|
39
|
+
orderPrep: orderPrep,
|
|
40
|
+
orderType: orderType,
|
|
41
|
+
orderTypeName: orderTypeName,
|
|
42
|
+
reorder: reorder,
|
|
43
|
+
requestedAt: requestedAt,
|
|
44
|
+
revenueCenter: revenueCenter,
|
|
45
|
+
serviceType: serviceType,
|
|
46
|
+
subtitle: subtitle,
|
|
47
|
+
orderNo: orderNo,
|
|
48
|
+
title: title,
|
|
49
|
+
total: total
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
exports.default = useOrder;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
var react_fast_compare_1 = tslib_1.__importDefault(require("react-fast-compare"));
|
|
6
|
+
var slices_1 = require("../slices");
|
|
7
|
+
var hooks_1 = require("../app/hooks");
|
|
8
|
+
var usePrevious_1 = tslib_1.__importDefault(require("./usePrevious"));
|
|
9
|
+
var useOrderValidate = function () {
|
|
10
|
+
var dispatch = (0, hooks_1.useAppDispatch)();
|
|
11
|
+
var checkout = (0, hooks_1.useAppSelector)(slices_1.selectPosCheckout);
|
|
12
|
+
var order = (0, hooks_1.useAppSelector)(slices_1.selectOrder);
|
|
13
|
+
var preparedOrder = (0, slices_1.prepareOrder)(order, checkout);
|
|
14
|
+
var ordeCheckout = tslib_1.__rest(preparedOrder || {}, []);
|
|
15
|
+
var prevOrderCheckout = (0, usePrevious_1.default)(ordeCheckout);
|
|
16
|
+
(0, react_1.useEffect)(function () {
|
|
17
|
+
if (preparedOrder && !(0, react_fast_compare_1.default)(prevOrderCheckout, ordeCheckout)) {
|
|
18
|
+
dispatch((0, slices_1.validatePosOrder)());
|
|
19
|
+
}
|
|
20
|
+
}, [dispatch, preparedOrder, prevOrderCheckout, ordeCheckout]);
|
|
21
|
+
};
|
|
22
|
+
exports.default = useOrderValidate;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import useBarcode from './useBarcode';
|
|
2
2
|
import useCardSwipe from './useCardSwipe';
|
|
3
|
+
import useChipDNATender from './useChipDNATender';
|
|
4
|
+
import useCustomerRewards from './useCustomerRewards';
|
|
3
5
|
import useEmployee from './useEmployee';
|
|
4
6
|
import useGiftCardBalance from './useGiftCardBalance';
|
|
5
7
|
import { useKioskImageUrl } from './useKioskImageUrl';
|
|
8
|
+
import useOrder from './useOrder';
|
|
9
|
+
import useOrderValidate from './useOrderValidate';
|
|
6
10
|
import usePrevious from './usePrevious';
|
|
7
11
|
import usePunch from './usePunch';
|
|
8
12
|
import useRefund from './useRefund';
|
|
9
|
-
export { useBarcode, useCardSwipe, useEmployee, useGiftCardBalance, useKioskImageUrl, usePrevious, usePunch, useRefund };
|
|
13
|
+
export { useBarcode, useCardSwipe, useChipDNATender, useCustomerRewards, useEmployee, useGiftCardBalance, useKioskImageUrl, useOrder, useOrderValidate, usePrevious, usePunch, useRefund };
|
package/dist/esm/hooks/index.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import useBarcode from './useBarcode';
|
|
2
2
|
import useCardSwipe from './useCardSwipe';
|
|
3
|
+
import useChipDNATender from './useChipDNATender';
|
|
4
|
+
import useCustomerRewards from './useCustomerRewards';
|
|
3
5
|
import useEmployee from './useEmployee';
|
|
4
6
|
import useGiftCardBalance from './useGiftCardBalance';
|
|
5
7
|
import { useKioskImageUrl } from './useKioskImageUrl';
|
|
8
|
+
import useOrder from './useOrder';
|
|
9
|
+
import useOrderValidate from './useOrderValidate';
|
|
6
10
|
import usePrevious from './usePrevious';
|
|
7
11
|
import usePunch from './usePunch';
|
|
8
12
|
import useRefund from './useRefund';
|
|
9
|
-
export { useBarcode, useCardSwipe, useEmployee, useGiftCardBalance, useKioskImageUrl, usePrevious, usePunch, useRefund };
|
|
13
|
+
export { useBarcode, useCardSwipe, useChipDNATender, useCustomerRewards, useEmployee, useGiftCardBalance, useKioskImageUrl, useOrder, useOrderValidate, usePrevious, usePunch, useRefund };
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { __awaiter, __generator } from "tslib";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { handleRespError } from '@open-tender/utils';
|
|
4
|
+
import { useAppDispatch, useAppSelector } from '../../app/hooks';
|
|
5
|
+
import { completeChipDNA, selectApi, selectOrder } from '../../slices';
|
|
6
|
+
import { processMessage } from './useChipDNATender.utils';
|
|
7
|
+
// JC Amex card token: 440abfc9cc7518f1ad76e2be56f19fe4
|
|
8
|
+
var useChipDNATender = function (amount) {
|
|
9
|
+
var dispatch = useAppDispatch();
|
|
10
|
+
var orderId = useAppSelector(selectOrder).orderId;
|
|
11
|
+
var api = useAppSelector(selectApi);
|
|
12
|
+
var _a = useState(false), reading = _a[0], setReading = _a[1];
|
|
13
|
+
var _b = useState('Pending...'), message = _b[0], setMessage = _b[1];
|
|
14
|
+
var _c = useState(null), success = _c[0], setSuccess = _c[1];
|
|
15
|
+
var _d = useState(null), canceled = _d[0], setCanceled = _d[1];
|
|
16
|
+
var _e = useState(null), error = _e[0], setError = _e[1];
|
|
17
|
+
useEffect(function () {
|
|
18
|
+
var readChipDNA = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
19
|
+
var data, response, reader_1, card_token_1, card_msg_1, err_1, error_1, detail;
|
|
20
|
+
return __generator(this, function (_a) {
|
|
21
|
+
switch (_a.label) {
|
|
22
|
+
case 0:
|
|
23
|
+
setReading(true);
|
|
24
|
+
_a.label = 1;
|
|
25
|
+
case 1:
|
|
26
|
+
_a.trys.push([1, 3, , 4]);
|
|
27
|
+
if (!amount)
|
|
28
|
+
return [2 /*return*/];
|
|
29
|
+
data = { tender_type: 'CREDIT', amount: amount };
|
|
30
|
+
if (!orderId)
|
|
31
|
+
return [2 /*return*/];
|
|
32
|
+
return [4 /*yield*/, api.postChipDNATender(orderId, data)];
|
|
33
|
+
case 2:
|
|
34
|
+
response = _a.sent();
|
|
35
|
+
reader_1 = response.getReader();
|
|
36
|
+
card_token_1 = null;
|
|
37
|
+
card_msg_1 = null;
|
|
38
|
+
reader_1.read().then(function processText(_a) {
|
|
39
|
+
var done = _a.done, value = _a.value;
|
|
40
|
+
// done - true if the stream has already given you all its data.
|
|
41
|
+
// value - some data. Always undefined when done is true.
|
|
42
|
+
if (done) {
|
|
43
|
+
if (card_token_1 || card_msg_1 === 'Tender Created') {
|
|
44
|
+
setSuccess('Card authorized!');
|
|
45
|
+
}
|
|
46
|
+
else if (card_msg_1 === 'Transaction Declined') {
|
|
47
|
+
setError('Transaction DECLINED. Please try again.');
|
|
48
|
+
}
|
|
49
|
+
else if (card_msg_1 !== 'Transaction Canceled') {
|
|
50
|
+
setError('Card read error. Please try again.');
|
|
51
|
+
}
|
|
52
|
+
dispatch(completeChipDNA(card_token_1));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
var _b = processMessage(value), msg = _b.msg, token = _b.token;
|
|
56
|
+
if (msg)
|
|
57
|
+
setMessage(msg);
|
|
58
|
+
card_token_1 = token;
|
|
59
|
+
card_msg_1 = msg;
|
|
60
|
+
// console.log('card_msg', card_msg)
|
|
61
|
+
// console.log('card_token', card_token)
|
|
62
|
+
return reader_1.read().then(processText);
|
|
63
|
+
});
|
|
64
|
+
return [3 /*break*/, 4];
|
|
65
|
+
case 3:
|
|
66
|
+
err_1 = _a.sent();
|
|
67
|
+
error_1 = handleRespError(err_1);
|
|
68
|
+
detail = error_1.detail;
|
|
69
|
+
setError(detail || 'Unknown payment error. Please contact support.');
|
|
70
|
+
return [3 /*break*/, 4];
|
|
71
|
+
case 4: return [2 /*return*/];
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}); };
|
|
75
|
+
if (!reading && amount && amount !== '0.00')
|
|
76
|
+
readChipDNA();
|
|
77
|
+
}, [api, dispatch, reading, orderId, amount]);
|
|
78
|
+
var cancel = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
79
|
+
var err_2, detail;
|
|
80
|
+
return __generator(this, function (_a) {
|
|
81
|
+
switch (_a.label) {
|
|
82
|
+
case 0:
|
|
83
|
+
_a.trys.push([0, 2, , 3]);
|
|
84
|
+
return [4 /*yield*/, api.postChipDNACancel()];
|
|
85
|
+
case 1:
|
|
86
|
+
_a.sent();
|
|
87
|
+
setCanceled('EMV transaction canceled');
|
|
88
|
+
return [3 /*break*/, 3];
|
|
89
|
+
case 2:
|
|
90
|
+
err_2 = _a.sent();
|
|
91
|
+
detail = handleRespError(err_2).detail;
|
|
92
|
+
setError(detail || 'Unknown cancellation error. Please contact support.');
|
|
93
|
+
return [3 /*break*/, 3];
|
|
94
|
+
case 3: return [2 /*return*/];
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}); };
|
|
98
|
+
return {
|
|
99
|
+
message: message,
|
|
100
|
+
success: success,
|
|
101
|
+
canceled: canceled,
|
|
102
|
+
error: error,
|
|
103
|
+
cancel: cancel
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
export default useChipDNATender;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { capitalize } from '@open-tender/utils';
|
|
2
|
+
var makeMessage = function (event) {
|
|
3
|
+
if (!event)
|
|
4
|
+
return null;
|
|
5
|
+
return event
|
|
6
|
+
.replace('event: ', '')
|
|
7
|
+
.split('_')
|
|
8
|
+
.map(function (s) { return capitalize(s); })
|
|
9
|
+
.join(' ');
|
|
10
|
+
};
|
|
11
|
+
var parseToken = function (data) {
|
|
12
|
+
if (!data)
|
|
13
|
+
return null;
|
|
14
|
+
try {
|
|
15
|
+
var tender = JSON.parse(data.replace('data: ', ''));
|
|
16
|
+
var token = (tender.credit_card || {}).token;
|
|
17
|
+
return token || null;
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
export var processMessage = function (value) {
|
|
24
|
+
var decoded = new TextDecoder('utf-8').decode(value);
|
|
25
|
+
var lines = decoded.split('\n');
|
|
26
|
+
var events = lines.filter(function (i) { return i.startsWith('event:'); });
|
|
27
|
+
var event = events[events.length - 1];
|
|
28
|
+
var msg = makeMessage(event);
|
|
29
|
+
var datas = lines.filter(function (i) { return i.startsWith('data:'); });
|
|
30
|
+
var data = datas[datas.length - 1];
|
|
31
|
+
var token = parseToken(data);
|
|
32
|
+
return { msg: msg, token: token };
|
|
33
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CustomerIdentify, Discounts, OrderCart } from '@open-tender/types';
|
|
2
|
+
declare const useCustomerRewards: () => {
|
|
3
|
+
customer: CustomerIdentify | null;
|
|
4
|
+
hasDeals: boolean;
|
|
5
|
+
hasRewards: boolean;
|
|
6
|
+
hasPoints: boolean;
|
|
7
|
+
deals: Discounts;
|
|
8
|
+
rewards: Discounts;
|
|
9
|
+
items: OrderCart;
|
|
10
|
+
points: number;
|
|
11
|
+
pointsApplied: number;
|
|
12
|
+
pointsRemaining: number;
|
|
13
|
+
};
|
|
14
|
+
export default useCustomerRewards;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { __assign } from "tslib";
|
|
2
|
+
import { useAppSelector } from '../app/hooks';
|
|
3
|
+
import { selectCustomer, selectCustomerIdentified, selectPosCheckout } from '../slices';
|
|
4
|
+
var useCustomerRewards = function () {
|
|
5
|
+
var customer = useAppSelector(selectCustomerIdentified);
|
|
6
|
+
var _a = useAppSelector(selectCustomer), rewards = _a.rewards, deals = _a.deals;
|
|
7
|
+
var _b = useAppSelector(selectPosCheckout) || {}, check = _b.check, _c = _b.points, checkPoints = _c === void 0 ? [] : _c;
|
|
8
|
+
var _d = (check || {}).cart, cart = _d === void 0 ? [] : _d;
|
|
9
|
+
if (!customer) {
|
|
10
|
+
return {
|
|
11
|
+
customer: null,
|
|
12
|
+
hasDeals: false,
|
|
13
|
+
hasRewards: false,
|
|
14
|
+
hasPoints: false,
|
|
15
|
+
deals: [],
|
|
16
|
+
rewards: [],
|
|
17
|
+
items: [],
|
|
18
|
+
points: 0,
|
|
19
|
+
pointsApplied: 0,
|
|
20
|
+
pointsRemaining: 0
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// const rewards = customer.rewards
|
|
24
|
+
var points = parseInt(customer.points);
|
|
25
|
+
var items = cart
|
|
26
|
+
.map(function (i, index) { return (__assign(__assign({}, i), { points: i.points ? __assign(__assign({}, i.points), { index: index }) : null })); })
|
|
27
|
+
.filter(function (i) { return i.points && i.points.per < points; });
|
|
28
|
+
var pointsApplied = checkPoints.reduce(function (t, i) { return (t += i.points); }, 0);
|
|
29
|
+
var pointsRemaining = points - pointsApplied;
|
|
30
|
+
return {
|
|
31
|
+
customer: customer,
|
|
32
|
+
hasDeals: deals.length > 0,
|
|
33
|
+
hasRewards: rewards.length > 0,
|
|
34
|
+
hasPoints: items.length > 0,
|
|
35
|
+
deals: deals,
|
|
36
|
+
rewards: rewards,
|
|
37
|
+
items: items,
|
|
38
|
+
points: points,
|
|
39
|
+
pointsApplied: pointsApplied,
|
|
40
|
+
pointsRemaining: pointsRemaining
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export default useCustomerRewards;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Order } from '@open-tender/types';
|
|
2
|
+
declare const useOrder: (order: Order, callback?: () => void) => {
|
|
3
|
+
isInPrepQueue: boolean;
|
|
4
|
+
isUpcoming: boolean;
|
|
5
|
+
itemImages: {
|
|
6
|
+
title: string;
|
|
7
|
+
imageUrl: string;
|
|
8
|
+
}[];
|
|
9
|
+
itemNames: string;
|
|
10
|
+
status: import("@open-tender/types").OrderStatus;
|
|
11
|
+
orderId: number | null;
|
|
12
|
+
orderPrep: import("@open-tender/types").OrderPrep | null;
|
|
13
|
+
orderType: import("@open-tender/types").OrderType;
|
|
14
|
+
orderTypeName: string | undefined;
|
|
15
|
+
reorder: () => void;
|
|
16
|
+
requestedAt: string;
|
|
17
|
+
revenueCenter: import("@open-tender/types").OrderRevenueCenter;
|
|
18
|
+
serviceType: import("@open-tender/types").ServiceType;
|
|
19
|
+
subtitle: string;
|
|
20
|
+
orderNo: string;
|
|
21
|
+
title: string;
|
|
22
|
+
total: `${number}.${number}`;
|
|
23
|
+
};
|
|
24
|
+
export default useOrder;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { formatDollars, isoToDate, isoToDateStr, makeOrderTypeName, timezoneMap } from '@open-tender/utils';
|
|
2
|
+
import { useAppDispatch } from '../app/hooks';
|
|
3
|
+
import { setOrderServiceType } from '../slices';
|
|
4
|
+
var useOrder = function (order, callback) {
|
|
5
|
+
var dispatch = useAppDispatch();
|
|
6
|
+
var orderId = order.order_id, status = order.status, serviceType = order.service_type, orderType = order.order_type, revenueCenter = order.revenue_center, requested_at = order.requested_at, timezone = order.timezone, cart = order.cart, totals = order.totals, orderPrep = order.order_prep;
|
|
7
|
+
var _a = (orderPrep || {}).is_in_prep_queue, isInPrepQueue = _a === void 0 ? false : _a;
|
|
8
|
+
var orderTypeName = makeOrderTypeName(orderType, serviceType);
|
|
9
|
+
var tz = timezoneMap[timezone];
|
|
10
|
+
var requestedAt = isoToDateStr(requested_at, tz, 'MMMM d, yyyy @ h:mma');
|
|
11
|
+
var isUpcoming = isoToDate(requested_at) > new Date();
|
|
12
|
+
var itemImages = cart
|
|
13
|
+
.map(function (i) {
|
|
14
|
+
return i.images
|
|
15
|
+
.filter(function (m) { return m.type === 'SMALL_IMAGE' && m.url; })
|
|
16
|
+
.map(function (image) { return ({ title: i.name, imageUrl: image.url }); });
|
|
17
|
+
})
|
|
18
|
+
.flat();
|
|
19
|
+
var itemNames = cart.map(function (i) { return i.name; }).join(', ');
|
|
20
|
+
var total = totals.total;
|
|
21
|
+
var orderNo = "Order #".concat(orderId);
|
|
22
|
+
var title = "".concat(orderTypeName, " from ").concat(revenueCenter.name);
|
|
23
|
+
var subtitle = "".concat(requestedAt, " | ").concat(formatDollars(total));
|
|
24
|
+
var reorder = function () {
|
|
25
|
+
// const { revenue_center_id: revenueCenterId } = revenueCenter
|
|
26
|
+
dispatch(setOrderServiceType({ orderType: 'OLO', serviceType: 'WALKIN' }));
|
|
27
|
+
if (callback)
|
|
28
|
+
callback();
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
isInPrepQueue: isInPrepQueue,
|
|
32
|
+
isUpcoming: isUpcoming,
|
|
33
|
+
itemImages: itemImages,
|
|
34
|
+
itemNames: itemNames,
|
|
35
|
+
status: status,
|
|
36
|
+
orderId: orderId,
|
|
37
|
+
orderPrep: orderPrep,
|
|
38
|
+
orderType: orderType,
|
|
39
|
+
orderTypeName: orderTypeName,
|
|
40
|
+
reorder: reorder,
|
|
41
|
+
requestedAt: requestedAt,
|
|
42
|
+
revenueCenter: revenueCenter,
|
|
43
|
+
serviceType: serviceType,
|
|
44
|
+
subtitle: subtitle,
|
|
45
|
+
orderNo: orderNo,
|
|
46
|
+
title: title,
|
|
47
|
+
total: total
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
export default useOrder;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { __rest } from "tslib";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import isEqual from 'react-fast-compare';
|
|
4
|
+
import { prepareOrder, selectOrder, selectPosCheckout, validatePosOrder } from '../slices';
|
|
5
|
+
import { useAppDispatch, useAppSelector } from '../app/hooks';
|
|
6
|
+
import usePrevious from './usePrevious';
|
|
7
|
+
var useOrderValidate = function () {
|
|
8
|
+
var dispatch = useAppDispatch();
|
|
9
|
+
var checkout = useAppSelector(selectPosCheckout);
|
|
10
|
+
var order = useAppSelector(selectOrder);
|
|
11
|
+
var preparedOrder = prepareOrder(order, checkout);
|
|
12
|
+
var ordeCheckout = __rest(preparedOrder || {}, []);
|
|
13
|
+
var prevOrderCheckout = usePrevious(ordeCheckout);
|
|
14
|
+
useEffect(function () {
|
|
15
|
+
if (preparedOrder && !isEqual(prevOrderCheckout, ordeCheckout)) {
|
|
16
|
+
dispatch(validatePosOrder());
|
|
17
|
+
}
|
|
18
|
+
}, [dispatch, preparedOrder, prevOrderCheckout, ordeCheckout]);
|
|
19
|
+
};
|
|
20
|
+
export default useOrderValidate;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-tender/store",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
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",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"@emotion/react": "^11.11.1",
|
|
61
|
-
"@open-tender/types": "^0.4.
|
|
61
|
+
"@open-tender/types": "^0.4.42",
|
|
62
62
|
"@open-tender/ui": "^0.2.1",
|
|
63
63
|
"@open-tender/utils": "^0.4.20",
|
|
64
64
|
"@reduxjs/toolkit": "^2.0.1",
|
|
@@ -69,5 +69,7 @@
|
|
|
69
69
|
"react-dom": "^18.2.0",
|
|
70
70
|
"uuid": "^9.0.1"
|
|
71
71
|
},
|
|
72
|
-
"dependencies": {
|
|
72
|
+
"dependencies": {
|
|
73
|
+
"react-fast-compare": "^3.2.2"
|
|
74
|
+
}
|
|
73
75
|
}
|
package/dist/.DS_Store
DELETED
|
Binary file
|