@open-tender/store 1.1.26 → 1.1.29

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 (33) hide show
  1. package/dist/cjs/components/SignInOptions.d.ts +4 -1
  2. package/dist/cjs/components/SignInOptions.js +4 -2
  3. package/dist/cjs/components/SignInPhone.js +1 -1
  4. package/dist/cjs/components/SignInQr.d.ts +7 -3
  5. package/dist/cjs/components/SignInQr.js +20 -15
  6. package/dist/cjs/config/checkoutConfirmation.js +35 -5
  7. package/dist/cjs/hooks/index.d.ts +5 -1
  8. package/dist/cjs/hooks/index.js +9 -1
  9. package/dist/cjs/hooks/types.d.ts +22 -0
  10. package/dist/cjs/hooks/types.js +20 -0
  11. package/dist/cjs/hooks/useBarcodeCameraScanner.d.ts +3 -0
  12. package/dist/cjs/hooks/useBarcodeCameraScanner.js +56 -0
  13. package/dist/cjs/hooks/useBarcodeScanner.d.ts +3 -0
  14. package/dist/cjs/hooks/useBarcodeScanner.js +23 -0
  15. package/dist/cjs/hooks/useBarcodeUSB.d.ts +3 -0
  16. package/dist/cjs/hooks/useBarcodeUSB.js +52 -0
  17. package/dist/esm/components/SignInOptions.d.ts +4 -1
  18. package/dist/esm/components/SignInOptions.js +5 -3
  19. package/dist/esm/components/SignInPhone.js +1 -1
  20. package/dist/esm/components/SignInQr.d.ts +7 -3
  21. package/dist/esm/components/SignInQr.js +20 -16
  22. package/dist/esm/config/checkoutConfirmation.js +35 -5
  23. package/dist/esm/hooks/index.d.ts +5 -1
  24. package/dist/esm/hooks/index.js +5 -1
  25. package/dist/esm/hooks/types.d.ts +22 -0
  26. package/dist/esm/hooks/types.js +17 -0
  27. package/dist/esm/hooks/useBarcodeCameraScanner.d.ts +3 -0
  28. package/dist/esm/hooks/useBarcodeCameraScanner.js +54 -0
  29. package/dist/esm/hooks/useBarcodeScanner.d.ts +3 -0
  30. package/dist/esm/hooks/useBarcodeScanner.js +18 -0
  31. package/dist/esm/hooks/useBarcodeUSB.d.ts +3 -0
  32. package/dist/esm/hooks/useBarcodeUSB.js +50 -0
  33. package/package.json +1 -1
@@ -1,6 +1,9 @@
1
1
  import { SignInOptionsProps, SignInQrProps, SignInPhoneProps, ErrorMessageProps, KeypadProps } from '@open-tender/ui';
2
2
  import React, { ReactNode } from 'react';
3
- declare const SignInOptions: ({ close, children, SignInQrView, SignInPhoneView, KeypadView, ErrorMessageView }: {
3
+ import { ScanListener } from '../hooks/types';
4
+ declare const SignInOptions: ({ listener, cameraScanner, close, children, SignInQrView, SignInPhoneView, KeypadView, ErrorMessageView }: {
5
+ listener: ScanListener;
6
+ cameraScanner: ScanListener;
4
7
  close: () => void;
5
8
  children: (props: SignInOptionsProps) => ReactNode;
6
9
  SignInQrView: (props: SignInQrProps) => ReactNode;
@@ -7,11 +7,13 @@ var slices_1 = require("../slices");
7
7
  var SignInPhone_1 = tslib_1.__importDefault(require("./SignInPhone"));
8
8
  var SignInQr_1 = tslib_1.__importDefault(require("./SignInQr"));
9
9
  var SignInOptions = function (_a) {
10
- var close = _a.close, children = _a.children, SignInQrView = _a.SignInQrView, SignInPhoneView = _a.SignInPhoneView, KeypadView = _a.KeypadView, ErrorMessageView = _a.ErrorMessageView;
10
+ var listener = _a.listener, cameraScanner = _a.cameraScanner, close = _a.close, children = _a.children, SignInQrView = _a.SignInQrView, SignInPhoneView = _a.SignInPhoneView, KeypadView = _a.KeypadView, ErrorMessageView = _a.ErrorMessageView;
11
11
  var _b = (0, hooks_1.useAppSelector)(slices_1.selectKioskConfig), config = _b.signInOptions, modalContentConfig = _b.modalContent;
12
12
  var _c = (0, react_1.useState)(null), signInType = _c[0], setSignInType = _c[1];
13
+ var terminal = (0, hooks_1.useAppSelector)(slices_1.selectKioskTerminal);
14
+ var scannerType = terminal === null || terminal === void 0 ? void 0 : terminal.pos_scanner.identifier;
13
15
  var handlers = { close: close, setSignInType: setSignInType };
14
- var renderSignInQr = (0, react_1.useCallback)(function (close) { return (react_1.default.createElement(SignInQr_1.default, { close: close, children: SignInQrView })); }, [SignInQrView]);
16
+ var renderSignInQr = (0, react_1.useCallback)(function (close) { return (react_1.default.createElement(SignInQr_1.default, { listener: listener, cameraScanner: cameraScanner, close: close, children: SignInQrView, type: scannerType })); }, [SignInQrView, scannerType, cameraScanner, listener]);
15
17
  var renderSignInPhone = (0, react_1.useCallback)(function (close) { return (react_1.default.createElement(SignInPhone_1.default, { ErrorMessageView: ErrorMessageView, KeypadView: KeypadView, close: close, children: SignInPhoneView })); }, [SignInPhoneView, KeypadView, ErrorMessageView]);
16
18
  if (!config)
17
19
  return null;
@@ -44,7 +44,7 @@ var SignInPhone = function (_a) {
44
44
  var keypadHandlers = (0, react_1.useMemo)(function () { return ({
45
45
  change: function (value) { return setPhone((0, utils_2.makePhone)(value)); }
46
46
  }); }, []);
47
- var renderKeypad = (0, react_1.useCallback)(function () { return (react_1.default.createElement(Keypad_1.default, { handlers: keypadHandlers, value: phone, children: KeypadView })); }, [KeypadView, phone, keypadHandlers]);
47
+ var renderKeypad = (0, react_1.useCallback)(function () { return (react_1.default.createElement(Keypad_1.default, { type: "numeric", handlers: keypadHandlers, value: phone, children: KeypadView })); }, [KeypadView, phone, keypadHandlers]);
48
48
  var renderErrorMessage = (0, react_1.useCallback)(function (errMsg) { return (react_1.default.createElement(ErrorMessage_1.default, { content: errMsg, children: ErrorMessageView })); }, [ErrorMessageView]);
49
49
  return children({
50
50
  config: config,
@@ -1,7 +1,11 @@
1
1
  import { SignInQrProps } from '@open-tender/ui';
2
- import { ReactNode } from 'react';
3
- declare const SignInQr: ({ close, children }: {
2
+ import React, { ReactNode } from 'react';
3
+ import { ScanListener } from '../hooks/types';
4
+ declare const SignInQr: ({ close, children, listener, cameraScanner, type }: {
4
5
  close: () => void;
5
6
  children: (props: SignInQrProps) => ReactNode;
6
- }) => ReactNode;
7
+ listener: ScanListener;
8
+ cameraScanner: ScanListener;
9
+ type?: string;
10
+ }) => React.JSX.Element;
7
11
  export default SignInQr;
@@ -1,41 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
3
4
  var utils_1 = require("@open-tender/utils");
4
- var react_1 = require("react");
5
+ var react_1 = tslib_1.__importStar(require("react"));
5
6
  var hooks_1 = require("../app/hooks");
6
7
  var hooks_2 = require("../hooks");
7
8
  var slices_1 = require("../slices");
8
9
  var SignInQr = function (_a) {
9
- var close = _a.close, children = _a.children;
10
+ var close = _a.close, children = _a.children, listener = _a.listener, cameraScanner = _a.cameraScanner, type = _a.type;
10
11
  var dispatch = (0, hooks_1.useAppDispatch)();
11
12
  var _b = (0, react_1.useState)(false), submitted = _b[0], setSubmitted = _b[1];
12
13
  var _c = (0, react_1.useState)(false), hasRead = _c[0], setHasRead = _c[1];
13
14
  var _d = (0, react_1.useState)(null), errMsg = _d[0], setErrMsg = _d[1];
14
15
  var _e = (0, hooks_1.useAppSelector)(slices_1.selectKioskConfig), config = _e.signInQr, errorMessageConfig = _e.errorMessage, modalContentConfig = _e.modalContent;
15
16
  var api = (0, hooks_1.useAppSelector)(slices_1.selectApi);
16
- var scan = (0, hooks_2.useBarcode)(api);
17
+ var scan = (0, hooks_2.useBarcodeScanner)(listener, cameraScanner, type, api);
17
18
  var _f = (0, hooks_1.useAppSelector)(slices_1.selectCustomerIdentify), customer = _f.data, loading = _f.loading, error = _f.error;
18
19
  var isLoading = loading === 'pending';
19
20
  var cancel = function () {
20
- if (!scan.code)
21
- scan.cancel();
21
+ if (!(scan === null || scan === void 0 ? void 0 : scan.code))
22
+ scan === null || scan === void 0 ? void 0 : scan.cancel();
22
23
  close();
23
24
  };
24
25
  var retry = function () {
26
+ (scan === null || scan === void 0 ? void 0 : scan.reset) && scan.reset();
25
27
  setHasRead(false);
26
28
  setErrMsg(null);
27
29
  };
28
30
  (0, react_1.useEffect)(function () {
29
- if (scan.error) {
31
+ if (scan === null || scan === void 0 ? void 0 : scan.error) {
30
32
  setErrMsg(scan.error);
31
33
  }
32
- else if (scan.code && !customer) {
34
+ else if ((scan === null || scan === void 0 ? void 0 : scan.code) && !customer) {
33
35
  dispatch((0, slices_1.fetchCustomerIdentify)({ qr_code: scan.code }));
34
36
  setSubmitted(true);
35
37
  }
36
38
  else if (!hasRead) {
37
39
  setHasRead(true);
38
- scan.read();
40
+ scan === null || scan === void 0 ? void 0 : scan.read();
39
41
  }
40
42
  }, [dispatch, scan, close, customer, hasRead]);
41
43
  var handlers = { close: cancel, retry: retry };
@@ -50,12 +52,15 @@ var SignInQr = function (_a) {
50
52
  }
51
53
  }
52
54
  }, [submitted, isLoading, error, close]);
53
- return children({
54
- config: config,
55
- handlers: handlers,
56
- errMsg: errMsg,
57
- errorMessageConfig: errorMessageConfig,
58
- modalContentConfig: modalContentConfig
59
- });
55
+ var CameraComponent = (0, react_1.useMemo)(function () { return scan === null || scan === void 0 ? void 0 : scan.camera; }, [scan]);
56
+ return (react_1.default.createElement(react_1.default.Fragment, null,
57
+ children({
58
+ config: config,
59
+ handlers: handlers,
60
+ errMsg: errMsg,
61
+ errorMessageConfig: errorMessageConfig,
62
+ modalContentConfig: modalContentConfig
63
+ }),
64
+ (scan === null || scan === void 0 ? void 0 : scan.showScanner) && scan.camera && CameraComponent && (react_1.default.createElement(CameraComponent, null))));
60
65
  };
61
66
  exports.default = SignInQr;
@@ -41,6 +41,41 @@ var checkoutConfirmation = {
41
41
  },
42
42
  style: tslib_1.__assign(tslib_1.__assign({}, styles_1.default.textHeadline), { fontSize: utils_1.theme.fontSizes.xxxlarge })
43
43
  },
44
+ checkoutConfirmation__printHeader: {
45
+ classes: '',
46
+ props: {},
47
+ style: {
48
+ alignItems: 'center',
49
+ flexBasis: 50,
50
+ flexGrow: 0,
51
+ flexShrink: 1,
52
+ justifyContent: 'center',
53
+ textAlign: 'center'
54
+ }
55
+ },
56
+ checkoutConfirmation__printTitle: {
57
+ classes: '',
58
+ props: {
59
+ as: 'h2',
60
+ text: 'Need a Receipt?'
61
+ },
62
+ style: tslib_1.__assign(tslib_1.__assign({}, styles_1.default.textHeading), { fontSize: utils_1.theme.fontSizes.xlarge, marginBottom: utils_1.theme.spacing.margin.small })
63
+ },
64
+ checkoutConfirmation__printContent: {
65
+ classes: '',
66
+ props: {},
67
+ style: {
68
+ alignItems: 'center',
69
+ justifyContent: 'center',
70
+ flexDirection: 'row',
71
+ gap: utils_1.theme.spacing.margin.small
72
+ }
73
+ },
74
+ checkoutConfirmation__printButton: {
75
+ classes: '',
76
+ props: {},
77
+ style: tslib_1.__assign(tslib_1.__assign({}, styles_1.default.buttonSecondary), { flexGrow: 0, flexShrink: 0, borderRadius: 64, fontSize: utils_1.theme.fontSizes.large, paddingBottom: 20, paddingLeft: 30, paddingRight: 30, paddingTop: 20 })
78
+ },
44
79
  checkoutConfirmation__content: {
45
80
  classes: '',
46
81
  props: {},
@@ -96,11 +131,6 @@ var checkoutConfirmation = {
96
131
  justifyContent: 'center'
97
132
  }
98
133
  },
99
- checkoutConfirmation__print: {
100
- classes: '',
101
- props: { text: 'Customize' },
102
- style: tslib_1.__assign(tslib_1.__assign({}, styles_1.default.buttonSecondary), { flexBasis: '400px', flexGrow: 0, flexShrink: 0, borderRadius: 64, fontSize: utils_1.theme.fontSizes.large, paddingBottom: 20, paddingLeft: 30, paddingRight: 30, paddingTop: 20 })
103
- },
104
134
  checkoutConfirmation__proceed: {
105
135
  classes: '',
106
136
  props: { text: 'Add To Order' },
@@ -1,4 +1,8 @@
1
+ import { BarcodeScannerType, BarcodeScannerMethod } from './types';
1
2
  import useBarcode from './useBarcode';
3
+ import useBarcodeCameraScanner from './useBarcodeCameraScanner';
4
+ import { useBarcodeScanner } from './useBarcodeScanner';
5
+ import useBarcodeUSB from './useBarcodeUSB';
2
6
  import useCardSwipe from './useCardSwipe';
3
7
  import useChipDNATender from './useChipDNATender';
4
8
  import useCustomerRewards from './useCustomerRewards';
@@ -10,4 +14,4 @@ import useOrderValidate from './useOrderValidate';
10
14
  import usePrevious from './usePrevious';
11
15
  import usePunch from './usePunch';
12
16
  import useRefund from './useRefund';
13
- export { useBarcode, useCardSwipe, useChipDNATender, useCustomerRewards, useEmployee, useGiftCardBalance, useKioskImageUrl, useOrder, useOrderValidate, usePrevious, usePunch, useRefund };
17
+ export { useBarcode, useCardSwipe, useChipDNATender, useCustomerRewards, useEmployee, useGiftCardBalance, useKioskImageUrl, useOrder, useOrderValidate, usePrevious, usePunch, useRefund, useBarcodeCameraScanner, useBarcodeUSB, useBarcodeScanner, BarcodeScannerType, BarcodeScannerMethod };
@@ -1,9 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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;
3
+ exports.BarcodeScannerType = exports.useBarcodeScanner = exports.useBarcodeUSB = exports.useBarcodeCameraScanner = 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
+ var types_1 = require("./types");
6
+ Object.defineProperty(exports, "BarcodeScannerType", { enumerable: true, get: function () { return types_1.BarcodeScannerType; } });
5
7
  var useBarcode_1 = tslib_1.__importDefault(require("./useBarcode"));
6
8
  exports.useBarcode = useBarcode_1.default;
9
+ var useBarcodeCameraScanner_1 = tslib_1.__importDefault(require("./useBarcodeCameraScanner"));
10
+ exports.useBarcodeCameraScanner = useBarcodeCameraScanner_1.default;
11
+ var useBarcodeScanner_1 = require("./useBarcodeScanner");
12
+ Object.defineProperty(exports, "useBarcodeScanner", { enumerable: true, get: function () { return useBarcodeScanner_1.useBarcodeScanner; } });
13
+ var useBarcodeUSB_1 = tslib_1.__importDefault(require("./useBarcodeUSB"));
14
+ exports.useBarcodeUSB = useBarcodeUSB_1.default;
7
15
  var useCardSwipe_1 = tslib_1.__importDefault(require("./useCardSwipe"));
8
16
  exports.useCardSwipe = useCardSwipe_1.default;
9
17
  var useChipDNATender_1 = tslib_1.__importDefault(require("./useChipDNATender"));
@@ -0,0 +1,22 @@
1
+ /// <reference types="react" />
2
+ export declare enum BarcodeScannerType {
3
+ NONE = "NONE",
4
+ MORPHSTICK = "MORPHSTICK",
5
+ USB = "USB",
6
+ CAMERA = "CAMERA"
7
+ }
8
+ export interface BarcodeScannerMethod {
9
+ code: string | null;
10
+ error: string | null;
11
+ read: () => Promise<void>;
12
+ cancel: () => Promise<void>;
13
+ reset?: () => Promise<void>;
14
+ camera?: () => React.ReactNode;
15
+ showScanner?: boolean;
16
+ }
17
+ export declare abstract class ScanListener {
18
+ constructor();
19
+ abstract read(callback?: any): Promise<void>;
20
+ abstract cancel(callback?: any): Promise<void>;
21
+ scannerComponent(callback?: any): any;
22
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScanListener = exports.BarcodeScannerType = void 0;
4
+ var BarcodeScannerType;
5
+ (function (BarcodeScannerType) {
6
+ BarcodeScannerType["NONE"] = "NONE";
7
+ BarcodeScannerType["MORPHSTICK"] = "MORPHSTICK";
8
+ BarcodeScannerType["USB"] = "USB";
9
+ BarcodeScannerType["CAMERA"] = "CAMERA";
10
+ })(BarcodeScannerType || (exports.BarcodeScannerType = BarcodeScannerType = {}));
11
+ var ScanListener = /** @class */ (function () {
12
+ function ScanListener() {
13
+ }
14
+ ScanListener.prototype.scannerComponent = function (callback) {
15
+ callback && callback();
16
+ return null;
17
+ };
18
+ return ScanListener;
19
+ }());
20
+ exports.ScanListener = ScanListener;
@@ -0,0 +1,3 @@
1
+ import { ScanListener, BarcodeScannerMethod } from './types';
2
+ declare function useBarcodeCameraScanner(listener: ScanListener): BarcodeScannerMethod;
3
+ export default useBarcodeCameraScanner;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ var react_1 = require("react");
5
+ function useBarcodeCameraScanner(listener) {
6
+ var _this = this;
7
+ var scannedCode = (0, react_1.useRef)('');
8
+ var _a = (0, react_1.useState)(null), error = _a[0], setError = _a[1];
9
+ var _b = (0, react_1.useState)(false), showScanner = _b[0], setShowScanner = _b[1];
10
+ var onCodeScanned = function (event) {
11
+ scannedCode.current = event.nativeEvent.codeStringValue;
12
+ setShowScanner(false);
13
+ };
14
+ var requestPermissionHandler = function (result) {
15
+ setShowScanner(result === 'granted');
16
+ setError(result !== 'granted'
17
+ ? 'Authorization Error: Cannot Access Device Camera'
18
+ : null);
19
+ };
20
+ var read = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
21
+ return tslib_1.__generator(this, function (_a) {
22
+ listener.read(requestPermissionHandler);
23
+ return [2 /*return*/];
24
+ });
25
+ }); };
26
+ var cancel = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
27
+ return tslib_1.__generator(this, function (_a) {
28
+ listener.cancel(function () { return setShowScanner(false); });
29
+ return [2 /*return*/];
30
+ });
31
+ }); };
32
+ var camera = (0, react_1.useCallback)(function () {
33
+ if (!showScanner) {
34
+ return null;
35
+ }
36
+ return listener.scannerComponent(onCodeScanned);
37
+ }, [listener, showScanner]);
38
+ var reset = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
39
+ return tslib_1.__generator(this, function (_a) {
40
+ scannedCode.current = '';
41
+ setShowScanner(false);
42
+ setError(null);
43
+ return [2 /*return*/];
44
+ });
45
+ }); };
46
+ return {
47
+ read: read,
48
+ camera: camera,
49
+ error: error,
50
+ cancel: cancel,
51
+ reset: reset,
52
+ showScanner: showScanner,
53
+ code: scannedCode.current
54
+ };
55
+ }
56
+ exports.default = useBarcodeCameraScanner;
@@ -0,0 +1,3 @@
1
+ import { PosAPI } from '../services';
2
+ import { BarcodeScannerMethod, ScanListener } from './types';
3
+ export declare const useBarcodeScanner: (listener: ScanListener, cameraScanner: ScanListener, type?: string, api?: PosAPI) => BarcodeScannerMethod | undefined;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useBarcodeScanner = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var types_1 = require("./types");
6
+ var useBarcode_1 = tslib_1.__importDefault(require("./useBarcode"));
7
+ var useBarcodeCameraScanner_1 = tslib_1.__importDefault(require("./useBarcodeCameraScanner"));
8
+ var useBarcodeUSB_1 = tslib_1.__importDefault(require("./useBarcodeUSB"));
9
+ var useBarcodeScanner = function (listener, cameraScanner, type, api) {
10
+ var usbScan = (0, useBarcodeUSB_1.default)(listener);
11
+ var cameraScan = (0, useBarcodeCameraScanner_1.default)(cameraScanner);
12
+ var defaultScan = (0, useBarcode_1.default)(api);
13
+ switch (type) {
14
+ case types_1.BarcodeScannerType.CAMERA:
15
+ return cameraScan;
16
+ case types_1.BarcodeScannerType.USB:
17
+ return usbScan;
18
+ case types_1.BarcodeScannerType.MORPHSTICK:
19
+ return defaultScan;
20
+ }
21
+ return undefined;
22
+ };
23
+ exports.useBarcodeScanner = useBarcodeScanner;
@@ -0,0 +1,3 @@
1
+ import { ScanListener, BarcodeScannerMethod } from './types';
2
+ declare const useBarcodeUSB: (listener: ScanListener) => BarcodeScannerMethod;
3
+ export default useBarcodeUSB;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ var react_1 = require("react");
5
+ var SCAN_MAX_TIME_DIFF = 100;
6
+ var useBarcodeUSB = function (listener) {
7
+ var barcodeArray = (0, react_1.useRef)([]);
8
+ var _a = (0, react_1.useState)(false), setCodeScanned = _a[1];
9
+ var _b = (0, react_1.useState)(null), error = _b[0], setError = _b[1];
10
+ var timer = (0, react_1.useRef)(undefined);
11
+ var updateBarcode = function (data) {
12
+ barcodeArray.current.push(data.pressedKey);
13
+ clearTimeout(timer === null || timer === void 0 ? void 0 : timer.current);
14
+ timer.current = setTimeout(function () { return setCodeScanned(function (prev) { return !prev; }); }, SCAN_MAX_TIME_DIFF);
15
+ };
16
+ var cancel = (0, react_1.useCallback)(function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
17
+ return tslib_1.__generator(this, function (_a) {
18
+ listener.cancel(function () { return clearTimeout(timer === null || timer === void 0 ? void 0 : timer.current); });
19
+ return [2 /*return*/];
20
+ });
21
+ }); }, [listener]);
22
+ var reset = (0, react_1.useCallback)(function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
23
+ return tslib_1.__generator(this, function (_a) {
24
+ cancel();
25
+ barcodeArray.current = [];
26
+ setCodeScanned(false);
27
+ setError(null);
28
+ return [2 /*return*/];
29
+ });
30
+ }); }, [cancel]);
31
+ (0, react_1.useEffect)(function () {
32
+ return function () {
33
+ reset();
34
+ };
35
+ }, [reset]);
36
+ var read = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
37
+ return tslib_1.__generator(this, function (_a) {
38
+ listener.read(updateBarcode);
39
+ return [2 /*return*/];
40
+ });
41
+ }); };
42
+ return {
43
+ code: barcodeArray.current.length > 0
44
+ ? barcodeArray.current.join('').trim()
45
+ : null,
46
+ read: read,
47
+ cancel: cancel,
48
+ reset: reset,
49
+ error: error
50
+ };
51
+ };
52
+ exports.default = useBarcodeUSB;
@@ -1,6 +1,9 @@
1
1
  import { SignInOptionsProps, SignInQrProps, SignInPhoneProps, ErrorMessageProps, KeypadProps } from '@open-tender/ui';
2
2
  import React, { ReactNode } from 'react';
3
- declare const SignInOptions: ({ close, children, SignInQrView, SignInPhoneView, KeypadView, ErrorMessageView }: {
3
+ import { ScanListener } from '../hooks/types';
4
+ declare const SignInOptions: ({ listener, cameraScanner, close, children, SignInQrView, SignInPhoneView, KeypadView, ErrorMessageView }: {
5
+ listener: ScanListener;
6
+ cameraScanner: ScanListener;
4
7
  close: () => void;
5
8
  children: (props: SignInOptionsProps) => ReactNode;
6
9
  SignInQrView: (props: SignInQrProps) => ReactNode;
@@ -1,14 +1,16 @@
1
1
  import React, { useCallback, useState } from 'react';
2
2
  import { useAppSelector } from '../app/hooks';
3
- import { selectKioskConfig } from '../slices';
3
+ import { selectKioskConfig, selectKioskTerminal } from '../slices';
4
4
  import { default as SignInPhoneContainer } from './SignInPhone';
5
5
  import { default as SignInQrContainer } from './SignInQr';
6
6
  var SignInOptions = function (_a) {
7
- var close = _a.close, children = _a.children, SignInQrView = _a.SignInQrView, SignInPhoneView = _a.SignInPhoneView, KeypadView = _a.KeypadView, ErrorMessageView = _a.ErrorMessageView;
7
+ var listener = _a.listener, cameraScanner = _a.cameraScanner, close = _a.close, children = _a.children, SignInQrView = _a.SignInQrView, SignInPhoneView = _a.SignInPhoneView, KeypadView = _a.KeypadView, ErrorMessageView = _a.ErrorMessageView;
8
8
  var _b = useAppSelector(selectKioskConfig), config = _b.signInOptions, modalContentConfig = _b.modalContent;
9
9
  var _c = useState(null), signInType = _c[0], setSignInType = _c[1];
10
+ var terminal = useAppSelector(selectKioskTerminal);
11
+ var scannerType = terminal === null || terminal === void 0 ? void 0 : terminal.pos_scanner.identifier;
10
12
  var handlers = { close: close, setSignInType: setSignInType };
11
- var renderSignInQr = useCallback(function (close) { return (React.createElement(SignInQrContainer, { close: close, children: SignInQrView })); }, [SignInQrView]);
13
+ var renderSignInQr = useCallback(function (close) { return (React.createElement(SignInQrContainer, { listener: listener, cameraScanner: cameraScanner, close: close, children: SignInQrView, type: scannerType })); }, [SignInQrView, scannerType, cameraScanner, listener]);
12
14
  var renderSignInPhone = useCallback(function (close) { return (React.createElement(SignInPhoneContainer, { ErrorMessageView: ErrorMessageView, KeypadView: KeypadView, close: close, children: SignInPhoneView })); }, [SignInPhoneView, KeypadView, ErrorMessageView]);
13
15
  if (!config)
14
16
  return null;
@@ -41,7 +41,7 @@ var SignInPhone = function (_a) {
41
41
  var keypadHandlers = useMemo(function () { return ({
42
42
  change: function (value) { return setPhone(makePhone(value)); }
43
43
  }); }, []);
44
- var renderKeypad = useCallback(function () { return (React.createElement(KeypadContainer, { handlers: keypadHandlers, value: phone, children: KeypadView })); }, [KeypadView, phone, keypadHandlers]);
44
+ var renderKeypad = useCallback(function () { return (React.createElement(KeypadContainer, { type: "numeric", handlers: keypadHandlers, value: phone, children: KeypadView })); }, [KeypadView, phone, keypadHandlers]);
45
45
  var renderErrorMessage = useCallback(function (errMsg) { return (React.createElement(ErrorMessageContainer, { content: errMsg, children: ErrorMessageView })); }, [ErrorMessageView]);
46
46
  return children({
47
47
  config: config,
@@ -1,7 +1,11 @@
1
1
  import { SignInQrProps } from '@open-tender/ui';
2
- import { ReactNode } from 'react';
3
- declare const SignInQr: ({ close, children }: {
2
+ import React, { ReactNode } from 'react';
3
+ import { ScanListener } from '../hooks/types';
4
+ declare const SignInQr: ({ close, children, listener, cameraScanner, type }: {
4
5
  close: () => void;
5
6
  children: (props: SignInQrProps) => ReactNode;
6
- }) => ReactNode;
7
+ listener: ScanListener;
8
+ cameraScanner: ScanListener;
9
+ type?: string;
10
+ }) => React.JSX.Element;
7
11
  export default SignInQr;
@@ -1,39 +1,40 @@
1
1
  import { handleRespError } from '@open-tender/utils';
2
- import { useEffect, useState } from 'react';
2
+ import React, { useEffect, useMemo, useState } from 'react';
3
3
  import { useAppDispatch, useAppSelector } from '../app/hooks';
4
- import { useBarcode } from '../hooks';
4
+ import { useBarcodeScanner } from '../hooks';
5
5
  import { fetchCustomerIdentify, selectApi, selectCustomerIdentify, selectKioskConfig } from '../slices';
6
6
  var SignInQr = function (_a) {
7
- var close = _a.close, children = _a.children;
7
+ var close = _a.close, children = _a.children, listener = _a.listener, cameraScanner = _a.cameraScanner, type = _a.type;
8
8
  var dispatch = useAppDispatch();
9
9
  var _b = useState(false), submitted = _b[0], setSubmitted = _b[1];
10
10
  var _c = useState(false), hasRead = _c[0], setHasRead = _c[1];
11
11
  var _d = useState(null), errMsg = _d[0], setErrMsg = _d[1];
12
12
  var _e = useAppSelector(selectKioskConfig), config = _e.signInQr, errorMessageConfig = _e.errorMessage, modalContentConfig = _e.modalContent;
13
13
  var api = useAppSelector(selectApi);
14
- var scan = useBarcode(api);
14
+ var scan = useBarcodeScanner(listener, cameraScanner, type, api);
15
15
  var _f = useAppSelector(selectCustomerIdentify), customer = _f.data, loading = _f.loading, error = _f.error;
16
16
  var isLoading = loading === 'pending';
17
17
  var cancel = function () {
18
- if (!scan.code)
19
- scan.cancel();
18
+ if (!(scan === null || scan === void 0 ? void 0 : scan.code))
19
+ scan === null || scan === void 0 ? void 0 : scan.cancel();
20
20
  close();
21
21
  };
22
22
  var retry = function () {
23
+ (scan === null || scan === void 0 ? void 0 : scan.reset) && scan.reset();
23
24
  setHasRead(false);
24
25
  setErrMsg(null);
25
26
  };
26
27
  useEffect(function () {
27
- if (scan.error) {
28
+ if (scan === null || scan === void 0 ? void 0 : scan.error) {
28
29
  setErrMsg(scan.error);
29
30
  }
30
- else if (scan.code && !customer) {
31
+ else if ((scan === null || scan === void 0 ? void 0 : scan.code) && !customer) {
31
32
  dispatch(fetchCustomerIdentify({ qr_code: scan.code }));
32
33
  setSubmitted(true);
33
34
  }
34
35
  else if (!hasRead) {
35
36
  setHasRead(true);
36
- scan.read();
37
+ scan === null || scan === void 0 ? void 0 : scan.read();
37
38
  }
38
39
  }, [dispatch, scan, close, customer, hasRead]);
39
40
  var handlers = { close: cancel, retry: retry };
@@ -48,12 +49,15 @@ var SignInQr = function (_a) {
48
49
  }
49
50
  }
50
51
  }, [submitted, isLoading, error, close]);
51
- return children({
52
- config: config,
53
- handlers: handlers,
54
- errMsg: errMsg,
55
- errorMessageConfig: errorMessageConfig,
56
- modalContentConfig: modalContentConfig
57
- });
52
+ var CameraComponent = useMemo(function () { return scan === null || scan === void 0 ? void 0 : scan.camera; }, [scan]);
53
+ return (React.createElement(React.Fragment, null,
54
+ children({
55
+ config: config,
56
+ handlers: handlers,
57
+ errMsg: errMsg,
58
+ errorMessageConfig: errorMessageConfig,
59
+ modalContentConfig: modalContentConfig
60
+ }),
61
+ (scan === null || scan === void 0 ? void 0 : scan.showScanner) && scan.camera && CameraComponent && (React.createElement(CameraComponent, null))));
58
62
  };
59
63
  export default SignInQr;
@@ -39,6 +39,41 @@ var checkoutConfirmation = {
39
39
  },
40
40
  style: __assign(__assign({}, styles.textHeadline), { fontSize: theme.fontSizes.xxxlarge })
41
41
  },
42
+ checkoutConfirmation__printHeader: {
43
+ classes: '',
44
+ props: {},
45
+ style: {
46
+ alignItems: 'center',
47
+ flexBasis: 50,
48
+ flexGrow: 0,
49
+ flexShrink: 1,
50
+ justifyContent: 'center',
51
+ textAlign: 'center'
52
+ }
53
+ },
54
+ checkoutConfirmation__printTitle: {
55
+ classes: '',
56
+ props: {
57
+ as: 'h2',
58
+ text: 'Need a Receipt?'
59
+ },
60
+ style: __assign(__assign({}, styles.textHeading), { fontSize: theme.fontSizes.xlarge, marginBottom: theme.spacing.margin.small })
61
+ },
62
+ checkoutConfirmation__printContent: {
63
+ classes: '',
64
+ props: {},
65
+ style: {
66
+ alignItems: 'center',
67
+ justifyContent: 'center',
68
+ flexDirection: 'row',
69
+ gap: theme.spacing.margin.small
70
+ }
71
+ },
72
+ checkoutConfirmation__printButton: {
73
+ classes: '',
74
+ props: {},
75
+ style: __assign(__assign({}, styles.buttonSecondary), { flexGrow: 0, flexShrink: 0, borderRadius: 64, fontSize: theme.fontSizes.large, paddingBottom: 20, paddingLeft: 30, paddingRight: 30, paddingTop: 20 })
76
+ },
42
77
  checkoutConfirmation__content: {
43
78
  classes: '',
44
79
  props: {},
@@ -94,11 +129,6 @@ var checkoutConfirmation = {
94
129
  justifyContent: 'center'
95
130
  }
96
131
  },
97
- checkoutConfirmation__print: {
98
- classes: '',
99
- props: { text: 'Customize' },
100
- style: __assign(__assign({}, styles.buttonSecondary), { flexBasis: '400px', flexGrow: 0, flexShrink: 0, borderRadius: 64, fontSize: theme.fontSizes.large, paddingBottom: 20, paddingLeft: 30, paddingRight: 30, paddingTop: 20 })
101
- },
102
132
  checkoutConfirmation__proceed: {
103
133
  classes: '',
104
134
  props: { text: 'Add To Order' },
@@ -1,4 +1,8 @@
1
+ import { BarcodeScannerType, BarcodeScannerMethod } from './types';
1
2
  import useBarcode from './useBarcode';
3
+ import useBarcodeCameraScanner from './useBarcodeCameraScanner';
4
+ import { useBarcodeScanner } from './useBarcodeScanner';
5
+ import useBarcodeUSB from './useBarcodeUSB';
2
6
  import useCardSwipe from './useCardSwipe';
3
7
  import useChipDNATender from './useChipDNATender';
4
8
  import useCustomerRewards from './useCustomerRewards';
@@ -10,4 +14,4 @@ import useOrderValidate from './useOrderValidate';
10
14
  import usePrevious from './usePrevious';
11
15
  import usePunch from './usePunch';
12
16
  import useRefund from './useRefund';
13
- export { useBarcode, useCardSwipe, useChipDNATender, useCustomerRewards, useEmployee, useGiftCardBalance, useKioskImageUrl, useOrder, useOrderValidate, usePrevious, usePunch, useRefund };
17
+ export { useBarcode, useCardSwipe, useChipDNATender, useCustomerRewards, useEmployee, useGiftCardBalance, useKioskImageUrl, useOrder, useOrderValidate, usePrevious, usePunch, useRefund, useBarcodeCameraScanner, useBarcodeUSB, useBarcodeScanner, BarcodeScannerType, BarcodeScannerMethod };
@@ -1,4 +1,8 @@
1
+ import { BarcodeScannerType } from './types';
1
2
  import useBarcode from './useBarcode';
3
+ import useBarcodeCameraScanner from './useBarcodeCameraScanner';
4
+ import { useBarcodeScanner } from './useBarcodeScanner';
5
+ import useBarcodeUSB from './useBarcodeUSB';
2
6
  import useCardSwipe from './useCardSwipe';
3
7
  import useChipDNATender from './useChipDNATender';
4
8
  import useCustomerRewards from './useCustomerRewards';
@@ -10,4 +14,4 @@ import useOrderValidate from './useOrderValidate';
10
14
  import usePrevious from './usePrevious';
11
15
  import usePunch from './usePunch';
12
16
  import useRefund from './useRefund';
13
- export { useBarcode, useCardSwipe, useChipDNATender, useCustomerRewards, useEmployee, useGiftCardBalance, useKioskImageUrl, useOrder, useOrderValidate, usePrevious, usePunch, useRefund };
17
+ export { useBarcode, useCardSwipe, useChipDNATender, useCustomerRewards, useEmployee, useGiftCardBalance, useKioskImageUrl, useOrder, useOrderValidate, usePrevious, usePunch, useRefund, useBarcodeCameraScanner, useBarcodeUSB, useBarcodeScanner, BarcodeScannerType };
@@ -0,0 +1,22 @@
1
+ /// <reference types="react" />
2
+ export declare enum BarcodeScannerType {
3
+ NONE = "NONE",
4
+ MORPHSTICK = "MORPHSTICK",
5
+ USB = "USB",
6
+ CAMERA = "CAMERA"
7
+ }
8
+ export interface BarcodeScannerMethod {
9
+ code: string | null;
10
+ error: string | null;
11
+ read: () => Promise<void>;
12
+ cancel: () => Promise<void>;
13
+ reset?: () => Promise<void>;
14
+ camera?: () => React.ReactNode;
15
+ showScanner?: boolean;
16
+ }
17
+ export declare abstract class ScanListener {
18
+ constructor();
19
+ abstract read(callback?: any): Promise<void>;
20
+ abstract cancel(callback?: any): Promise<void>;
21
+ scannerComponent(callback?: any): any;
22
+ }
@@ -0,0 +1,17 @@
1
+ export var BarcodeScannerType;
2
+ (function (BarcodeScannerType) {
3
+ BarcodeScannerType["NONE"] = "NONE";
4
+ BarcodeScannerType["MORPHSTICK"] = "MORPHSTICK";
5
+ BarcodeScannerType["USB"] = "USB";
6
+ BarcodeScannerType["CAMERA"] = "CAMERA";
7
+ })(BarcodeScannerType || (BarcodeScannerType = {}));
8
+ var ScanListener = /** @class */ (function () {
9
+ function ScanListener() {
10
+ }
11
+ ScanListener.prototype.scannerComponent = function (callback) {
12
+ callback && callback();
13
+ return null;
14
+ };
15
+ return ScanListener;
16
+ }());
17
+ export { ScanListener };
@@ -0,0 +1,3 @@
1
+ import { ScanListener, BarcodeScannerMethod } from './types';
2
+ declare function useBarcodeCameraScanner(listener: ScanListener): BarcodeScannerMethod;
3
+ export default useBarcodeCameraScanner;
@@ -0,0 +1,54 @@
1
+ import { __awaiter, __generator } from "tslib";
2
+ import { useCallback, useRef, useState } from 'react';
3
+ function useBarcodeCameraScanner(listener) {
4
+ var _this = this;
5
+ var scannedCode = useRef('');
6
+ var _a = useState(null), error = _a[0], setError = _a[1];
7
+ var _b = useState(false), showScanner = _b[0], setShowScanner = _b[1];
8
+ var onCodeScanned = function (event) {
9
+ scannedCode.current = event.nativeEvent.codeStringValue;
10
+ setShowScanner(false);
11
+ };
12
+ var requestPermissionHandler = function (result) {
13
+ setShowScanner(result === 'granted');
14
+ setError(result !== 'granted'
15
+ ? 'Authorization Error: Cannot Access Device Camera'
16
+ : null);
17
+ };
18
+ var read = function () { return __awaiter(_this, void 0, void 0, function () {
19
+ return __generator(this, function (_a) {
20
+ listener.read(requestPermissionHandler);
21
+ return [2 /*return*/];
22
+ });
23
+ }); };
24
+ var cancel = function () { return __awaiter(_this, void 0, void 0, function () {
25
+ return __generator(this, function (_a) {
26
+ listener.cancel(function () { return setShowScanner(false); });
27
+ return [2 /*return*/];
28
+ });
29
+ }); };
30
+ var camera = useCallback(function () {
31
+ if (!showScanner) {
32
+ return null;
33
+ }
34
+ return listener.scannerComponent(onCodeScanned);
35
+ }, [listener, showScanner]);
36
+ var reset = function () { return __awaiter(_this, void 0, void 0, function () {
37
+ return __generator(this, function (_a) {
38
+ scannedCode.current = '';
39
+ setShowScanner(false);
40
+ setError(null);
41
+ return [2 /*return*/];
42
+ });
43
+ }); };
44
+ return {
45
+ read: read,
46
+ camera: camera,
47
+ error: error,
48
+ cancel: cancel,
49
+ reset: reset,
50
+ showScanner: showScanner,
51
+ code: scannedCode.current
52
+ };
53
+ }
54
+ export default useBarcodeCameraScanner;
@@ -0,0 +1,3 @@
1
+ import { PosAPI } from '../services';
2
+ import { BarcodeScannerMethod, ScanListener } from './types';
3
+ export declare const useBarcodeScanner: (listener: ScanListener, cameraScanner: ScanListener, type?: string, api?: PosAPI) => BarcodeScannerMethod | undefined;
@@ -0,0 +1,18 @@
1
+ import { BarcodeScannerType } from './types';
2
+ import useBarcode from './useBarcode';
3
+ import useBarcodeCameraScanner from './useBarcodeCameraScanner';
4
+ import useBarcodeUSB from './useBarcodeUSB';
5
+ export var useBarcodeScanner = function (listener, cameraScanner, type, api) {
6
+ var usbScan = useBarcodeUSB(listener);
7
+ var cameraScan = useBarcodeCameraScanner(cameraScanner);
8
+ var defaultScan = useBarcode(api);
9
+ switch (type) {
10
+ case BarcodeScannerType.CAMERA:
11
+ return cameraScan;
12
+ case BarcodeScannerType.USB:
13
+ return usbScan;
14
+ case BarcodeScannerType.MORPHSTICK:
15
+ return defaultScan;
16
+ }
17
+ return undefined;
18
+ };
@@ -0,0 +1,3 @@
1
+ import { ScanListener, BarcodeScannerMethod } from './types';
2
+ declare const useBarcodeUSB: (listener: ScanListener) => BarcodeScannerMethod;
3
+ export default useBarcodeUSB;
@@ -0,0 +1,50 @@
1
+ import { __awaiter, __generator } from "tslib";
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ var SCAN_MAX_TIME_DIFF = 100;
4
+ var useBarcodeUSB = function (listener) {
5
+ var barcodeArray = useRef([]);
6
+ var _a = useState(false), setCodeScanned = _a[1];
7
+ var _b = useState(null), error = _b[0], setError = _b[1];
8
+ var timer = useRef(undefined);
9
+ var updateBarcode = function (data) {
10
+ barcodeArray.current.push(data.pressedKey);
11
+ clearTimeout(timer === null || timer === void 0 ? void 0 : timer.current);
12
+ timer.current = setTimeout(function () { return setCodeScanned(function (prev) { return !prev; }); }, SCAN_MAX_TIME_DIFF);
13
+ };
14
+ var cancel = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
15
+ return __generator(this, function (_a) {
16
+ listener.cancel(function () { return clearTimeout(timer === null || timer === void 0 ? void 0 : timer.current); });
17
+ return [2 /*return*/];
18
+ });
19
+ }); }, [listener]);
20
+ var reset = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
21
+ return __generator(this, function (_a) {
22
+ cancel();
23
+ barcodeArray.current = [];
24
+ setCodeScanned(false);
25
+ setError(null);
26
+ return [2 /*return*/];
27
+ });
28
+ }); }, [cancel]);
29
+ useEffect(function () {
30
+ return function () {
31
+ reset();
32
+ };
33
+ }, [reset]);
34
+ var read = function () { return __awaiter(void 0, void 0, void 0, function () {
35
+ return __generator(this, function (_a) {
36
+ listener.read(updateBarcode);
37
+ return [2 /*return*/];
38
+ });
39
+ }); };
40
+ return {
41
+ code: barcodeArray.current.length > 0
42
+ ? barcodeArray.current.join('').trim()
43
+ : null,
44
+ read: read,
45
+ cancel: cancel,
46
+ reset: reset,
47
+ error: error
48
+ };
49
+ };
50
+ export default useBarcodeUSB;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-tender/store",
3
- "version": "1.1.26",
3
+ "version": "1.1.29",
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",