@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.
- package/dist/cjs/components/SignInOptions.d.ts +4 -1
- package/dist/cjs/components/SignInOptions.js +4 -2
- package/dist/cjs/components/SignInPhone.js +1 -1
- package/dist/cjs/components/SignInQr.d.ts +7 -3
- package/dist/cjs/components/SignInQr.js +20 -15
- package/dist/cjs/config/checkoutConfirmation.js +35 -5
- package/dist/cjs/hooks/index.d.ts +5 -1
- package/dist/cjs/hooks/index.js +9 -1
- package/dist/cjs/hooks/types.d.ts +22 -0
- package/dist/cjs/hooks/types.js +20 -0
- package/dist/cjs/hooks/useBarcodeCameraScanner.d.ts +3 -0
- package/dist/cjs/hooks/useBarcodeCameraScanner.js +56 -0
- package/dist/cjs/hooks/useBarcodeScanner.d.ts +3 -0
- package/dist/cjs/hooks/useBarcodeScanner.js +23 -0
- package/dist/cjs/hooks/useBarcodeUSB.d.ts +3 -0
- package/dist/cjs/hooks/useBarcodeUSB.js +52 -0
- package/dist/esm/components/SignInOptions.d.ts +4 -1
- package/dist/esm/components/SignInOptions.js +5 -3
- package/dist/esm/components/SignInPhone.js +1 -1
- package/dist/esm/components/SignInQr.d.ts +7 -3
- package/dist/esm/components/SignInQr.js +20 -16
- package/dist/esm/config/checkoutConfirmation.js +35 -5
- package/dist/esm/hooks/index.d.ts +5 -1
- package/dist/esm/hooks/index.js +5 -1
- package/dist/esm/hooks/types.d.ts +22 -0
- package/dist/esm/hooks/types.js +17 -0
- package/dist/esm/hooks/useBarcodeCameraScanner.d.ts +3 -0
- package/dist/esm/hooks/useBarcodeCameraScanner.js +54 -0
- package/dist/esm/hooks/useBarcodeScanner.d.ts +3 -0
- package/dist/esm/hooks/useBarcodeScanner.js +18 -0
- package/dist/esm/hooks/useBarcodeUSB.d.ts +3 -0
- package/dist/esm/hooks/useBarcodeUSB.js +50 -0
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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 };
|
package/dist/cjs/hooks/index.js
CHANGED
|
@@ -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,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,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,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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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 =
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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 };
|
package/dist/esm/hooks/index.js
CHANGED
|
@@ -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,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,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,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.
|
|
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",
|