@chayns-components/scanner 5.0.0-beta.1265

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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -0
  3. package/lib/cjs/components/code-scanner/CodeScanner.js +227 -0
  4. package/lib/cjs/components/code-scanner/CodeScanner.js.map +1 -0
  5. package/lib/cjs/components/code-scanner/CodeScanner.styles.js +34 -0
  6. package/lib/cjs/components/code-scanner/CodeScanner.styles.js.map +1 -0
  7. package/lib/cjs/components/code-scanner/scanner-toolbar/ScannerToolbar.js +149 -0
  8. package/lib/cjs/components/code-scanner/scanner-toolbar/ScannerToolbar.js.map +1 -0
  9. package/lib/cjs/components/code-scanner/scanner-toolbar/ScannerToolbar.styles.js +50 -0
  10. package/lib/cjs/components/code-scanner/scanner-toolbar/ScannerToolbar.styles.js.map +1 -0
  11. package/lib/cjs/constants/codeScanner.js +20 -0
  12. package/lib/cjs/constants/codeScanner.js.map +1 -0
  13. package/lib/cjs/hooks/codeScanner.js +16 -0
  14. package/lib/cjs/hooks/codeScanner.js.map +1 -0
  15. package/lib/cjs/hooks/loadscript.js +44 -0
  16. package/lib/cjs/hooks/loadscript.js.map +1 -0
  17. package/lib/cjs/index.js +33 -0
  18. package/lib/cjs/index.js.map +1 -0
  19. package/lib/cjs/types/barcode.d.js +6 -0
  20. package/lib/cjs/types/barcode.d.js.map +1 -0
  21. package/lib/cjs/types/codeScanner.js +14 -0
  22. package/lib/cjs/types/codeScanner.js.map +1 -0
  23. package/lib/cjs/types/global.d.js +2 -0
  24. package/lib/cjs/types/global.d.js.map +1 -0
  25. package/lib/cjs/utils/animate.js +25 -0
  26. package/lib/cjs/utils/animate.js.map +1 -0
  27. package/lib/cjs/utils/errorDialog.js +13 -0
  28. package/lib/cjs/utils/errorDialog.js.map +1 -0
  29. package/lib/cjs/utils/loadScript.js +15 -0
  30. package/lib/cjs/utils/loadScript.js.map +1 -0
  31. package/lib/cjs/utils/support.js +11 -0
  32. package/lib/cjs/utils/support.js.map +1 -0
  33. package/lib/esm/components/code-scanner/CodeScanner.js +218 -0
  34. package/lib/esm/components/code-scanner/CodeScanner.js.map +1 -0
  35. package/lib/esm/components/code-scanner/CodeScanner.styles.js +27 -0
  36. package/lib/esm/components/code-scanner/CodeScanner.styles.js.map +1 -0
  37. package/lib/esm/components/code-scanner/scanner-toolbar/ScannerToolbar.js +141 -0
  38. package/lib/esm/components/code-scanner/scanner-toolbar/ScannerToolbar.js.map +1 -0
  39. package/lib/esm/components/code-scanner/scanner-toolbar/ScannerToolbar.styles.js +43 -0
  40. package/lib/esm/components/code-scanner/scanner-toolbar/ScannerToolbar.styles.js.map +1 -0
  41. package/lib/esm/constants/codeScanner.js +14 -0
  42. package/lib/esm/constants/codeScanner.js.map +1 -0
  43. package/lib/esm/hooks/codeScanner.js +10 -0
  44. package/lib/esm/hooks/codeScanner.js.map +1 -0
  45. package/lib/esm/hooks/loadscript.js +37 -0
  46. package/lib/esm/hooks/loadscript.js.map +1 -0
  47. package/lib/esm/index.js +3 -0
  48. package/lib/esm/index.js.map +1 -0
  49. package/lib/esm/types/barcode.d.js +4 -0
  50. package/lib/esm/types/barcode.d.js.map +1 -0
  51. package/lib/esm/types/codeScanner.js +8 -0
  52. package/lib/esm/types/codeScanner.js.map +1 -0
  53. package/lib/esm/types/global.d.js +2 -0
  54. package/lib/esm/types/global.d.js.map +1 -0
  55. package/lib/esm/utils/animate.js +18 -0
  56. package/lib/esm/utils/animate.js.map +1 -0
  57. package/lib/esm/utils/errorDialog.js +6 -0
  58. package/lib/esm/utils/errorDialog.js.map +1 -0
  59. package/lib/esm/utils/loadScript.js +8 -0
  60. package/lib/esm/utils/loadScript.js.map +1 -0
  61. package/lib/esm/utils/support.js +3 -0
  62. package/lib/esm/utils/support.js.map +1 -0
  63. package/lib/types/components/code-scanner/CodeScanner.d.ts +54 -0
  64. package/lib/types/components/code-scanner/CodeScanner.styles.d.ts +7 -0
  65. package/lib/types/components/code-scanner/scanner-toolbar/ScannerToolbar.d.ts +45 -0
  66. package/lib/types/components/code-scanner/scanner-toolbar/ScannerToolbar.styles.d.ts +7 -0
  67. package/lib/types/constants/codeScanner.d.ts +3 -0
  68. package/lib/types/hooks/codeScanner.d.ts +2 -0
  69. package/lib/types/hooks/loadscript.d.ts +4 -0
  70. package/lib/types/index.d.ts +2 -0
  71. package/lib/types/types/codeScanner.d.ts +16 -0
  72. package/lib/types/utils/animate.d.ts +1 -0
  73. package/lib/types/utils/errorDialog.d.ts +1 -0
  74. package/lib/types/utils/loadScript.d.ts +1 -0
  75. package/lib/types/utils/support.d.ts +2 -0
  76. package/package.json +87 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Tobit Laboratories AG
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,34 @@
1
+ <div align="center">
2
+ <h1>
3
+ <img src="https://raw.githubusercontent.com/TobitSoftware/chayns-components/master/assets/logo.png" width="600px" alt="chayns-components" />
4
+ </h1>
5
+ <p>A set of beautiful React components for developing your own applications with chayns.</p>
6
+ <div>
7
+ <img src="https://img.shields.io/npm/dm/@chayns-components/core.svg?style=for-the-badge" alt="" />
8
+ <img src="https://img.shields.io/npm/v/@chayns-components/core?style=for-the-badge" alt="" />
9
+ <img src="https://img.shields.io/github/license/TobitSoftware/chayns-components?style=for-the-badge" alt="" />
10
+ <img src="https://img.shields.io/github/contributors/TobitSoftware/chayns-components?style=for-the-badge" alt="" />
11
+ </div>
12
+ </div>
13
+
14
+ ---
15
+
16
+ ## Installation
17
+
18
+ First you need to install the core part of the chayns-components.
19
+
20
+ ```bash
21
+ # NPM
22
+ npm install @chayns-components/scanner
23
+
24
+ # Yarn
25
+ yarn add @chayns-components/scanner
26
+ ```
27
+
28
+ > **Information:** Since the components have now been implemented with the styled-components
29
+ > library, the styles are delivered directly with the components. There is no need to load an extra
30
+ > stylesheet anymore.
31
+
32
+ ## Usage
33
+
34
+ For detailed usage visit the [storybook](https://components.chayns.site/storybook).
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _chaynsApi = require("chayns-api");
9
+ var _core = require("@chayns-components/core");
10
+ var _CodeScanner = require("./CodeScanner.styles");
11
+ var _codeScanner = require("../../types/codeScanner");
12
+ var _codeScanner2 = require("../../constants/codeScanner");
13
+ var _support = require("../../utils/support");
14
+ var _errorDialog = require("../../utils/errorDialog");
15
+ var _ScannerToolbar = _interopRequireDefault(require("./scanner-toolbar/ScannerToolbar"));
16
+ var _loadscript = require("../../hooks/loadscript");
17
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
19
+ const CodeScanner = ({
20
+ shouldTriggerForSameCode = false,
21
+ onScan,
22
+ allowedFormats = _codeScanner2.ALL_FORMATS,
23
+ trackConstraints = _codeScanner2.DEFAULT_TRACK_CONSTRAINTS,
24
+ videoConstraints = _codeScanner2.DEFAULT_VIDEO_CONSTRAINTS,
25
+ minZoom = 2,
26
+ maxZoom = 10,
27
+ isFileSelectDisabled = false,
28
+ isTorchDisabled = false,
29
+ isZoomDisabled = false,
30
+ scanInterval = 250,
31
+ errorMessages
32
+ }) => {
33
+ const [isPolyfillLoaded, setIsPolyfillLoaded] = (0, _react.useState)(false);
34
+ const [videoRef, setVideoRef] = (0, _react.useState)(null);
35
+ const [barcodeDetector, setBarcodeDetector] = (0, _react.useState)();
36
+ const [stream, setStream] = (0, _react.useState)();
37
+ const [scannerError, setScannerError] = (0, _react.useState)(undefined);
38
+ const [isScanningFile, setIsScanningFile] = (0, _react.useState)(false);
39
+ const [isHandlingCode, setIsHandlingCode] = (0, _react.useState)(false);
40
+ const lastCode = (0, _react.useRef)();
41
+ const handleStopRef = (0, _react.useRef)();
42
+ const {
43
+ loadQrCodeDetector
44
+ } = (0, _loadscript.useScannerPolyfill)();
45
+ const errorText = (0, _react.useMemo)(() => {
46
+ if (typeof scannerError === 'undefined') {
47
+ return undefined;
48
+ }
49
+ switch (scannerError) {
50
+ case _codeScanner.ScannerErrorType.NO_CAMERA_ACCESS:
51
+ return errorMessages.noPermission;
52
+ case _codeScanner.ScannerErrorType.CAMERA_ALREADY_IN_USE:
53
+ return errorMessages.alreadyInUse;
54
+ default:
55
+ return errorMessages.cameraNotAvailable;
56
+ }
57
+ }, [errorMessages, scannerError]);
58
+ const handleScan = (0, _react.useCallback)(code => {
59
+ if (!onScan) return;
60
+ const result = onScan(code);
61
+ if (result instanceof Promise) {
62
+ setIsHandlingCode(true);
63
+ void result.finally(() => setIsHandlingCode(false));
64
+ }
65
+ }, [onScan]);
66
+ const handleScanResult = (0, _react.useCallback)(result => {
67
+ if (!result.length) return;
68
+ const code = result[0];
69
+ if (!code) {
70
+ return;
71
+ }
72
+ if (allowedFormats && !allowedFormats.includes(code.format)) {
73
+ return;
74
+ }
75
+ if (shouldTriggerForSameCode) {
76
+ handleScan({
77
+ format: code.format,
78
+ value: code.rawValue
79
+ });
80
+ return;
81
+ }
82
+ if (lastCode.current && code.rawValue === lastCode.current) {
83
+ return;
84
+ }
85
+ lastCode.current = code.rawValue;
86
+ handleScan({
87
+ format: code.format,
88
+ value: code.rawValue
89
+ });
90
+ }, [handleScan, shouldTriggerForSameCode, allowedFormats]);
91
+ const handleVideoInitialization = (0, _react.useCallback)(async () => {
92
+ if (!navigator.mediaDevices.getUserMedia || !videoRef || !isPolyfillLoaded) return;
93
+ let res;
94
+ try {
95
+ res = await navigator.mediaDevices.getUserMedia({
96
+ video: videoConstraints
97
+ });
98
+ } catch (e) {
99
+ const error = e;
100
+ if (error.name === 'NotAllowedError') {
101
+ setScannerError(_codeScanner.ScannerErrorType.NO_CAMERA_ACCESS);
102
+ } else if (error.name === 'NotReadableError') {
103
+ setScannerError(_codeScanner.ScannerErrorType.CAMERA_ALREADY_IN_USE);
104
+ } else if (error.name === 'NotFoundError') {
105
+ setScannerError(_codeScanner.ScannerErrorType.DEVICE_NOT_FOUND);
106
+ } else {
107
+ setScannerError(_codeScanner.ScannerErrorType.UNKNOWN);
108
+ console.warn(e);
109
+ }
110
+ }
111
+ if (res) {
112
+ res.getVideoTracks().forEach(elem => {
113
+ var _trackConstraints$adv;
114
+ const constraints = {
115
+ ...trackConstraints,
116
+ advanced: ((_trackConstraints$adv = trackConstraints.advanced) === null || _trackConstraints$adv === void 0 ? void 0 : _trackConstraints$adv.map(a => ({
117
+ ...a
118
+ }))) || []
119
+ };
120
+ if ((0, _support.checkTrackSupport)(elem, 'zoom')) {
121
+ constraints.advanced.push({
122
+ zoom: minZoom
123
+ });
124
+ }
125
+ void elem.applyConstraints(constraints);
126
+ });
127
+ setStream(res);
128
+ videoRef.srcObject = res;
129
+ await videoRef.play();
130
+ }
131
+ const codeDetector = new BarcodeDetector(allowedFormats ? {
132
+ formats: allowedFormats
133
+ } : undefined);
134
+ setBarcodeDetector(codeDetector);
135
+ }, [isPolyfillLoaded, minZoom, trackConstraints, allowedFormats, videoConstraints, videoRef]);
136
+ const handleStopCameraAccess = (0, _react.useCallback)(() => {
137
+ if (videoRef) {
138
+ videoRef.pause();
139
+ }
140
+ if (barcodeDetector) {
141
+ setBarcodeDetector(undefined);
142
+ }
143
+ if (stream) {
144
+ stream.getTracks().forEach(track => track.stop());
145
+ setStream(undefined);
146
+ }
147
+ }, [barcodeDetector, stream, videoRef]);
148
+
149
+ // Load BarCodeDetector
150
+ (0, _react.useEffect)(() => {
151
+ void loadQrCodeDetector().then(() => {
152
+ setIsPolyfillLoaded(true);
153
+ });
154
+ return () => {
155
+ if (handleStopRef.current) handleStopRef.current();
156
+ };
157
+ }, [loadQrCodeDetector]);
158
+ (0, _react.useEffect)(() => {
159
+ handleStopRef.current = handleStopCameraAccess;
160
+ }, [handleStopCameraAccess]);
161
+ (0, _react.useEffect)(() => {
162
+ const idPromise = (0, _chaynsApi.addVisibilityChangeListener)(({
163
+ isVisible
164
+ }) => {
165
+ if (!isVisible) {
166
+ handleStopCameraAccess();
167
+ } else {
168
+ void handleVideoInitialization();
169
+ }
170
+ });
171
+ return () => {
172
+ void idPromise.then(id => {
173
+ void (0, _chaynsApi.removeVisibilityChangeListener)(id);
174
+ });
175
+ };
176
+ }, [handleStopCameraAccess, handleVideoInitialization]);
177
+ (0, _react.useEffect)(() => {
178
+ if (!barcodeDetector || !videoRef) return undefined;
179
+ if (!isScanningFile && !isHandlingCode) {
180
+ const interval = setInterval(() => {
181
+ void barcodeDetector.detect(videoRef).then(handleScanResult);
182
+ }, scanInterval);
183
+ return () => clearInterval(interval);
184
+ }
185
+ return undefined;
186
+ }, [barcodeDetector, handleScanResult, isHandlingCode, isScanningFile, videoRef, scanInterval]);
187
+ (0, _react.useEffect)(() => {
188
+ if (!navigator.mediaDevices.enumerateDevices || !navigator.mediaDevices.getUserMedia || !videoRef || !isPolyfillLoaded) {
189
+ return;
190
+ }
191
+ void handleVideoInitialization();
192
+ }, [handleVideoInitialization, isPolyfillLoaded, videoRef]);
193
+ return /*#__PURE__*/_react.default.createElement(_CodeScanner.StyledCodeScanner, null, (!barcodeDetector || errorText) && /*#__PURE__*/_react.default.createElement(_CodeScanner.StyledCodeScannerTextWrapper, null, !barcodeDetector && !errorText && /*#__PURE__*/_react.default.createElement(_core.SmallWaitCursor, null), errorText && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_core.Icon, {
194
+ icons: ['fa fa-webcam-slash'],
195
+ size: 40,
196
+ color: "rgb(128, 128, 128)"
197
+ }), errorText)), /*#__PURE__*/_react.default.createElement(_CodeScanner.StyledCodeScannerPreview, {
198
+ ref: setVideoRef,
199
+ autoPlay: true,
200
+ playsInline: true,
201
+ height: "100%",
202
+ width: "100%",
203
+ $isVisible: !!barcodeDetector && !errorText
204
+ }), !!barcodeDetector && /*#__PURE__*/_react.default.createElement(_ScannerToolbar.default, {
205
+ videoConstraints: videoConstraints,
206
+ onFileSelect: data => {
207
+ setIsScanningFile(true);
208
+ void barcodeDetector.detect(data).then(value => {
209
+ if (value.length) {
210
+ handleScanResult(value);
211
+ } else {
212
+ void (0, _errorDialog.createErrorAlertDialog)(errorMessages.noCodeFound).open();
213
+ }
214
+ }).finally(() => setIsScanningFile(false));
215
+ },
216
+ isScanningFile: isScanningFile,
217
+ hasScannerError: typeof scannerError !== 'undefined',
218
+ stream: stream,
219
+ minZoom: minZoom,
220
+ maxZoom: maxZoom,
221
+ isZoomDisabled: isZoomDisabled,
222
+ isTorchDisabled: isTorchDisabled,
223
+ isFileSelectDisabled: isFileSelectDisabled
224
+ }));
225
+ };
226
+ var _default = exports.default = CodeScanner;
227
+ //# sourceMappingURL=CodeScanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeScanner.js","names":["_react","_interopRequireWildcard","require","_chaynsApi","_core","_CodeScanner","_codeScanner","_codeScanner2","_support","_errorDialog","_ScannerToolbar","_interopRequireDefault","_loadscript","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","CodeScanner","shouldTriggerForSameCode","onScan","allowedFormats","ALL_FORMATS","trackConstraints","DEFAULT_TRACK_CONSTRAINTS","videoConstraints","DEFAULT_VIDEO_CONSTRAINTS","minZoom","maxZoom","isFileSelectDisabled","isTorchDisabled","isZoomDisabled","scanInterval","errorMessages","isPolyfillLoaded","setIsPolyfillLoaded","useState","videoRef","setVideoRef","barcodeDetector","setBarcodeDetector","stream","setStream","scannerError","setScannerError","undefined","isScanningFile","setIsScanningFile","isHandlingCode","setIsHandlingCode","lastCode","useRef","handleStopRef","loadQrCodeDetector","useScannerPolyfill","errorText","useMemo","ScannerErrorType","NO_CAMERA_ACCESS","noPermission","CAMERA_ALREADY_IN_USE","alreadyInUse","cameraNotAvailable","handleScan","useCallback","code","result","Promise","finally","handleScanResult","length","includes","format","value","rawValue","current","handleVideoInitialization","navigator","mediaDevices","getUserMedia","res","video","error","name","DEVICE_NOT_FOUND","UNKNOWN","console","warn","getVideoTracks","forEach","elem","_trackConstraints$adv","constraints","advanced","map","a","checkTrackSupport","push","zoom","applyConstraints","srcObject","play","codeDetector","BarcodeDetector","formats","handleStopCameraAccess","pause","getTracks","track","stop","useEffect","then","idPromise","addVisibilityChangeListener","isVisible","id","removeVisibilityChangeListener","interval","setInterval","detect","clearInterval","enumerateDevices","createElement","StyledCodeScanner","StyledCodeScannerTextWrapper","SmallWaitCursor","Fragment","Icon","icons","size","color","StyledCodeScannerPreview","ref","autoPlay","playsInline","height","width","$isVisible","onFileSelect","data","createErrorAlertDialog","noCodeFound","open","hasScannerError","_default","exports"],"sources":["../../../../src/components/code-scanner/CodeScanner.tsx"],"sourcesContent":["import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { addVisibilityChangeListener, removeVisibilityChangeListener } from 'chayns-api';\nimport { Icon, SmallWaitCursor } from '@chayns-components/core';\nimport {\n StyledCodeScanner,\n StyledCodeScannerPreview,\n StyledCodeScannerTextWrapper,\n} from './CodeScanner.styles';\nimport {\n CodeReaderOnScanCallback,\n ScannerErrorMessages,\n ScannerErrorType,\n} from '../../types/codeScanner';\nimport {\n ALL_FORMATS,\n DEFAULT_TRACK_CONSTRAINTS,\n DEFAULT_VIDEO_CONSTRAINTS,\n} from '../../constants/codeScanner';\nimport { checkTrackSupport } from '../../utils/support';\nimport { createErrorAlertDialog } from '../../utils/errorDialog';\nimport ScannerToolbar from './scanner-toolbar/ScannerToolbar';\nimport { useScannerPolyfill } from '../../hooks/loadscript';\n\ntype CodeScannerProps = {\n /**\n * Defines which barcode formats are allowed to be detected.\n */\n allowedFormats?: Array<BarcodeFormat>;\n /**\n * The interval of the scans.\n */\n scanInterval?: number;\n /**\n * Custom error messages for various scanner states or failures.\n */\n errorMessages: ScannerErrorMessages;\n /**\n * Disables the file select feature if set to true.\n */\n isFileSelectDisabled?: boolean;\n /**\n * Disables the torch (flashlight) feature if set to true.\n */\n isTorchDisabled?: boolean;\n /**\n * Disables the zoom control if set to true.\n */\n isZoomDisabled?: boolean;\n /**\n * Maximum allowed zoom level for the camera.\n */\n maxZoom?: number;\n /**\n * Minimum allowed zoom level for the camera.\n */\n minZoom?: number;\n /**\n * Callback function triggered when a code is successfully scanned.\n */\n onScan?: CodeReaderOnScanCallback;\n /**\n * If true, allows scanning the same code multiple times in a row.\n */\n shouldTriggerForSameCode?: boolean;\n /**\n * Custom media track constraints for controlling the video input.\n */\n trackConstraints?: MediaTrackConstraints;\n /**\n * Additional video constraints for the camera feed.\n */\n videoConstraints?: MediaTrackConstraints;\n};\n\nconst CodeScanner: FC<CodeScannerProps> = ({\n shouldTriggerForSameCode = false,\n onScan,\n allowedFormats = ALL_FORMATS,\n trackConstraints = DEFAULT_TRACK_CONSTRAINTS,\n videoConstraints = DEFAULT_VIDEO_CONSTRAINTS,\n minZoom = 2,\n maxZoom = 10,\n isFileSelectDisabled = false,\n isTorchDisabled = false,\n isZoomDisabled = false,\n scanInterval = 250,\n errorMessages,\n}) => {\n const [isPolyfillLoaded, setIsPolyfillLoaded] = useState(false);\n const [videoRef, setVideoRef] = useState<HTMLVideoElement | null>(null);\n const [barcodeDetector, setBarcodeDetector] = useState<BarcodeDetector>();\n const [stream, setStream] = useState<MediaStream>();\n const [scannerError, setScannerError] = useState<ScannerErrorType | undefined>(undefined);\n const [isScanningFile, setIsScanningFile] = useState(false);\n const [isHandlingCode, setIsHandlingCode] = useState(false);\n const lastCode = useRef<string>();\n const handleStopRef = useRef<() => void>();\n\n const { loadQrCodeDetector } = useScannerPolyfill();\n\n const errorText = useMemo(() => {\n if (typeof scannerError === 'undefined') {\n return undefined;\n }\n\n switch (scannerError) {\n case ScannerErrorType.NO_CAMERA_ACCESS:\n return errorMessages.noPermission;\n case ScannerErrorType.CAMERA_ALREADY_IN_USE:\n return errorMessages.alreadyInUse;\n default:\n return errorMessages.cameraNotAvailable;\n }\n }, [errorMessages, scannerError]);\n\n const handleScan = useCallback(\n (code: { format: BarcodeFormat; value: string }) => {\n if (!onScan) return;\n const result = onScan(code);\n if (result instanceof Promise) {\n setIsHandlingCode(true);\n void result.finally(() => setIsHandlingCode(false));\n }\n },\n [onScan],\n );\n\n const handleScanResult = useCallback(\n (result: Array<DetectedBarcode>) => {\n if (!result.length) return;\n\n const code = result[0];\n\n if (!code) {\n return;\n }\n\n if (allowedFormats && !allowedFormats.includes(code.format)) {\n return;\n }\n\n if (shouldTriggerForSameCode) {\n handleScan({ format: code.format, value: code.rawValue });\n return;\n }\n\n if (lastCode.current && code.rawValue === lastCode.current) {\n return;\n }\n\n lastCode.current = code.rawValue;\n handleScan({ format: code.format, value: code.rawValue });\n },\n [handleScan, shouldTriggerForSameCode, allowedFormats],\n );\n\n const handleVideoInitialization = useCallback(async () => {\n if (!navigator.mediaDevices.getUserMedia || !videoRef || !isPolyfillLoaded) return;\n\n let res: MediaStream | undefined;\n\n try {\n res = await navigator.mediaDevices.getUserMedia({\n video: videoConstraints,\n });\n } catch (e) {\n const error = e as Error;\n\n if (error.name === 'NotAllowedError') {\n setScannerError(ScannerErrorType.NO_CAMERA_ACCESS);\n } else if (error.name === 'NotReadableError') {\n setScannerError(ScannerErrorType.CAMERA_ALREADY_IN_USE);\n } else if (error.name === 'NotFoundError') {\n setScannerError(ScannerErrorType.DEVICE_NOT_FOUND);\n } else {\n setScannerError(ScannerErrorType.UNKNOWN);\n console.warn(e);\n }\n }\n\n if (res) {\n res.getVideoTracks().forEach((elem) => {\n const constraints = {\n ...trackConstraints,\n advanced: trackConstraints.advanced?.map((a) => ({ ...a })) || [],\n };\n\n if (checkTrackSupport(elem, 'zoom')) {\n constraints.advanced.push({ zoom: minZoom });\n }\n\n void elem.applyConstraints(constraints);\n });\n\n setStream(res);\n\n videoRef.srcObject = res;\n\n await videoRef.play();\n }\n\n const codeDetector = new BarcodeDetector(\n allowedFormats ? { formats: allowedFormats } : undefined,\n );\n\n setBarcodeDetector(codeDetector);\n }, [isPolyfillLoaded, minZoom, trackConstraints, allowedFormats, videoConstraints, videoRef]);\n\n const handleStopCameraAccess = useCallback(() => {\n if (videoRef) {\n videoRef.pause();\n }\n\n if (barcodeDetector) {\n setBarcodeDetector(undefined);\n }\n\n if (stream) {\n stream.getTracks().forEach((track) => track.stop());\n setStream(undefined);\n }\n }, [barcodeDetector, stream, videoRef]);\n\n // Load BarCodeDetector\n useEffect(() => {\n void loadQrCodeDetector().then(() => {\n setIsPolyfillLoaded(true);\n });\n\n return () => {\n if (handleStopRef.current) handleStopRef.current();\n };\n }, [loadQrCodeDetector]);\n\n useEffect(() => {\n handleStopRef.current = handleStopCameraAccess;\n }, [handleStopCameraAccess]);\n\n useEffect(() => {\n const idPromise = addVisibilityChangeListener(({ isVisible }) => {\n if (!isVisible) {\n handleStopCameraAccess();\n } else {\n void handleVideoInitialization();\n }\n });\n\n return () => {\n void idPromise.then((id) => {\n void removeVisibilityChangeListener(id);\n });\n };\n }, [handleStopCameraAccess, handleVideoInitialization]);\n\n useEffect(() => {\n if (!barcodeDetector || !videoRef) return undefined;\n\n if (!isScanningFile && !isHandlingCode) {\n const interval = setInterval(() => {\n void barcodeDetector.detect(videoRef).then(handleScanResult);\n }, scanInterval);\n\n return () => clearInterval(interval);\n }\n\n return undefined;\n }, [barcodeDetector, handleScanResult, isHandlingCode, isScanningFile, videoRef, scanInterval]);\n\n useEffect(() => {\n if (\n !navigator.mediaDevices.enumerateDevices ||\n !navigator.mediaDevices.getUserMedia ||\n !videoRef ||\n !isPolyfillLoaded\n ) {\n return;\n }\n\n void handleVideoInitialization();\n }, [handleVideoInitialization, isPolyfillLoaded, videoRef]);\n\n return (\n <StyledCodeScanner>\n {(!barcodeDetector || errorText) && (\n <StyledCodeScannerTextWrapper>\n {!barcodeDetector && !errorText && <SmallWaitCursor />}\n {errorText && (\n <>\n <Icon\n icons={['fa fa-webcam-slash']}\n size={40}\n color=\"rgb(128, 128, 128)\"\n />\n {errorText}\n </>\n )}\n </StyledCodeScannerTextWrapper>\n )}\n <StyledCodeScannerPreview\n ref={setVideoRef}\n autoPlay\n playsInline\n height=\"100%\"\n width=\"100%\"\n $isVisible={!!barcodeDetector && !errorText}\n />\n {!!barcodeDetector && (\n <ScannerToolbar\n videoConstraints={videoConstraints}\n onFileSelect={(data) => {\n setIsScanningFile(true);\n\n void barcodeDetector\n .detect(data)\n .then((value) => {\n if (value.length) {\n handleScanResult(value);\n } else {\n void createErrorAlertDialog(errorMessages.noCodeFound).open();\n }\n })\n .finally(() => setIsScanningFile(false));\n }}\n isScanningFile={isScanningFile}\n hasScannerError={typeof scannerError !== 'undefined'}\n stream={stream}\n minZoom={minZoom}\n maxZoom={maxZoom}\n isZoomDisabled={isZoomDisabled}\n isTorchDisabled={isTorchDisabled}\n isFileSelectDisabled={isFileSelectDisabled}\n />\n )}\n </StyledCodeScanner>\n );\n};\n\nexport default CodeScanner;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.StyledCodeScannerTextWrapper = exports.StyledCodeScannerPreview = exports.StyledCodeScanner = void 0;
7
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ const StyledCodeScanner = exports.StyledCodeScanner = _styledComponents.default.div`
10
+ display: flex;
11
+ justify-content: center;
12
+ align-items: center;
13
+ `;
14
+ const StyledCodeScannerTextWrapper = exports.StyledCodeScannerTextWrapper = _styledComponents.default.div`
15
+ width: 640px;
16
+ display: flex;
17
+ justify-content: center;
18
+ align-items: center;
19
+ aspect-ratio: 3 / 2;
20
+ flex-direction: column;
21
+ text-align: center;
22
+ padding: 20px;
23
+ `;
24
+ const StyledCodeScannerPreview = exports.StyledCodeScannerPreview = _styledComponents.default.video`
25
+ width: 100%;
26
+ height: 100%;
27
+
28
+ ${({
29
+ $isVisible
30
+ }) => !$isVisible && `
31
+ display: none;
32
+ `}
33
+ `;
34
+ //# sourceMappingURL=CodeScanner.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeScanner.styles.js","names":["_styledComponents","_interopRequireDefault","require","e","__esModule","default","StyledCodeScanner","exports","styled","div","StyledCodeScannerTextWrapper","StyledCodeScannerPreview","video","$isVisible"],"sources":["../../../../src/components/code-scanner/CodeScanner.styles.ts"],"sourcesContent":["import styled from 'styled-components';\n\nexport const StyledCodeScanner = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\ntype StyledCodeScannerPreviewProps = {\n $isVisible: boolean;\n};\n\nexport const StyledCodeScannerTextWrapper = styled.div`\n width: 640px;\n display: flex;\n justify-content: center;\n align-items: center;\n aspect-ratio: 3 / 2;\n flex-direction: column;\n text-align: center;\n padding: 20px;\n`;\n\nexport const StyledCodeScannerPreview = styled.video<StyledCodeScannerPreviewProps>`\n width: 100%;\n height: 100%;\n\n ${({ $isVisible }) =>\n !$isVisible &&\n `\n display: none;\n `}\n`;\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAuC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEhC,MAAMG,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAGE,yBAAM,CAACC,GAAG;AAC3C;AACA;AACA;AACA,CAAC;AAMM,MAAMC,4BAA4B,GAAAH,OAAA,CAAAG,4BAAA,GAAGF,yBAAM,CAACC,GAAG;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAEM,MAAME,wBAAwB,GAAAJ,OAAA,CAAAI,wBAAA,GAAGH,yBAAM,CAACI,KAAoC;AACnF;AACA;AACA;AACA,MAAM,CAAC;EAAEC;AAAW,CAAC,KACb,CAACA,UAAU,IACX;AACR;AACA,KAAK;AACL,CAAC","ignoreList":[]}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _core = require("@chayns-components/core");
9
+ var _ScannerToolbar = require("./ScannerToolbar.styles");
10
+ var _support = require("../../../utils/support");
11
+ var _animate = require("../../../utils/animate");
12
+ var _codeScanner = _interopRequireDefault(require("../../../hooks/codeScanner"));
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
+ const ScannerToolbar = ({
16
+ videoConstraints,
17
+ onFileSelect,
18
+ isScanningFile,
19
+ hasScannerError = false,
20
+ stream,
21
+ minZoom: minZoomProp = 1,
22
+ maxZoom: maxZoomProp = 3,
23
+ isZoomDisabled = false,
24
+ isTorchDisabled = false,
25
+ isFileSelectDisabled = false
26
+ }) => {
27
+ const [tracks, setTrack] = (0, _react.useState)();
28
+ const [isZoomed, setIsZoomed] = (0, _react.useState)();
29
+ const previousIsZoomed = (0, _codeScanner.default)(isZoomed);
30
+ const [isZoomSupported, setIsZoomSupported] = (0, _react.useState)(false);
31
+ const [isTorchActive, setIsTorchActive] = (0, _react.useState)(false);
32
+ const [isTorchSupported, setIsTorchSupported] = (0, _react.useState)(false);
33
+ const [isImageSelectActive, setIsImageSelectActive] = (0, _react.useState)(false);
34
+ const minZoom = (0, _react.useRef)(minZoomProp);
35
+ const maxZoom = (0, _react.useRef)(maxZoomProp);
36
+ (0, _react.useEffect)(() => {
37
+ if (hasScannerError) {
38
+ setIsTorchSupported(false);
39
+ setIsZoomSupported(false);
40
+ setIsZoomed(false);
41
+ setTrack(undefined);
42
+ } else if (stream) {
43
+ const videoTracks = stream.getVideoTracks();
44
+ let canZoom = false;
45
+ let canTorch = false;
46
+ videoTracks.forEach(track => {
47
+ if ((0, _support.checkTrackSupport)(track, 'zoom')) {
48
+ canZoom = true;
49
+ const capabilities = track.getCapabilities();
50
+ if (capabilities.zoom.min > minZoomProp) {
51
+ minZoom.current = capabilities.zoom.min;
52
+ }
53
+ if (capabilities.zoom.max < maxZoomProp) {
54
+ maxZoom.current = capabilities.zoom.max;
55
+ }
56
+ }
57
+ if ((0, _support.checkTrackSupport)(track, 'torch')) {
58
+ canTorch = true;
59
+ }
60
+ });
61
+ if (canZoom && !isZoomDisabled) {
62
+ setIsZoomSupported(true);
63
+ setIsZoomed(false);
64
+ }
65
+ setIsTorchSupported(canTorch && !isTorchDisabled);
66
+ setTrack(videoTracks);
67
+ }
68
+ }, [videoConstraints, hasScannerError, stream, minZoomProp, maxZoomProp, isZoomDisabled, isTorchDisabled]);
69
+ (0, _react.useEffect)(() => {
70
+ if (tracks !== null && tracks !== void 0 && tracks.length && isZoomSupported) {
71
+ if (typeof previousIsZoomed === 'undefined') {
72
+ tracks.forEach(track => {
73
+ if ((0, _support.checkTrackSupport)(track, 'zoom')) {
74
+ void track.applyConstraints({
75
+ advanced: [{
76
+ zoom: isZoomed ? maxZoom.current : minZoom.current
77
+ }]
78
+ });
79
+ }
80
+ });
81
+ } else if (previousIsZoomed !== isZoomed) {
82
+ (0, _animate.animateNumericValue)(previousIsZoomed ? maxZoom.current : minZoom.current, isZoomed ? maxZoom.current : minZoom.current, 500, value => {
83
+ tracks.forEach(track => {
84
+ if ((0, _support.checkTrackSupport)(track, 'zoom')) {
85
+ void track.applyConstraints({
86
+ advanced: [{
87
+ zoom: value
88
+ }]
89
+ });
90
+ }
91
+ });
92
+ });
93
+ }
94
+ }
95
+ }, [isZoomSupported, isZoomed, previousIsZoomed, tracks]);
96
+ (0, _react.useEffect)(() => {
97
+ if (tracks !== null && tracks !== void 0 && tracks.length && isTorchSupported) {
98
+ tracks.forEach(track => {
99
+ if ((0, _support.checkTrackSupport)(track, 'torch')) {
100
+ void track.applyConstraints({
101
+ advanced: [{
102
+ torch: isTorchActive
103
+ }]
104
+ });
105
+ }
106
+ });
107
+ }
108
+ }, [isTorchActive, isTorchSupported, tracks]);
109
+ return /*#__PURE__*/_react.default.createElement(_ScannerToolbar.StyledScannerToolbar, null, /*#__PURE__*/_react.default.createElement(_ScannerToolbar.StyledScannerToolbarButton, {
110
+ $isAvailable: isTorchSupported,
111
+ $isActive: isTorchActive,
112
+ onClick: () => {
113
+ setIsTorchActive(prev => !prev);
114
+ }
115
+ }, /*#__PURE__*/_react.default.createElement(_core.Icon, {
116
+ icons: ['far fa-lightbulb'],
117
+ size: 25
118
+ })), /*#__PURE__*/_react.default.createElement(_ScannerToolbar.StyledScannerToolbarButton, {
119
+ $isAvailable: isZoomSupported,
120
+ $isActive: isZoomed,
121
+ onClick: () => {
122
+ setIsZoomed(prev => !prev);
123
+ }
124
+ }, /*#__PURE__*/_react.default.createElement(_core.Icon, {
125
+ icons: ['far fa-search-plus'],
126
+ size: 25
127
+ })), /*#__PURE__*/_react.default.createElement(_ScannerToolbar.StyledScannerToolbarButton, {
128
+ $isAvailable: !isFileSelectDisabled,
129
+ $isActive: isImageSelectActive || isScanningFile,
130
+ onClick: () => {
131
+ setIsImageSelectActive(true);
132
+ (0, _core.selectFiles)({
133
+ multiple: false,
134
+ type: 'image/*'
135
+ }).then(files => {
136
+ if (files && files[0]) {
137
+ onFileSelect(files[0]);
138
+ }
139
+ }).catch(console.error).finally(() => {
140
+ setIsImageSelectActive(false);
141
+ });
142
+ }
143
+ }, /*#__PURE__*/_react.default.createElement(_core.Icon, {
144
+ icons: ['far fa-folder-image'],
145
+ size: 25
146
+ })));
147
+ };
148
+ var _default = exports.default = ScannerToolbar;
149
+ //# sourceMappingURL=ScannerToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScannerToolbar.js","names":["_react","_interopRequireWildcard","require","_core","_ScannerToolbar","_support","_animate","_codeScanner","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ScannerToolbar","videoConstraints","onFileSelect","isScanningFile","hasScannerError","stream","minZoom","minZoomProp","maxZoom","maxZoomProp","isZoomDisabled","isTorchDisabled","isFileSelectDisabled","tracks","setTrack","useState","isZoomed","setIsZoomed","previousIsZoomed","usePrevious","isZoomSupported","setIsZoomSupported","isTorchActive","setIsTorchActive","isTorchSupported","setIsTorchSupported","isImageSelectActive","setIsImageSelectActive","useRef","useEffect","undefined","videoTracks","getVideoTracks","canZoom","canTorch","forEach","track","checkTrackSupport","capabilities","getCapabilities","zoom","min","current","max","length","applyConstraints","advanced","animateNumericValue","value","torch","createElement","StyledScannerToolbar","StyledScannerToolbarButton","$isAvailable","$isActive","onClick","prev","Icon","icons","size","selectFiles","multiple","type","then","files","catch","console","error","finally","_default","exports"],"sources":["../../../../../src/components/code-scanner/scanner-toolbar/ScannerToolbar.tsx"],"sourcesContent":["import React, { FC, useEffect, useRef, useState } from 'react';\nimport { Icon, selectFiles } from '@chayns-components/core';\nimport { StyledScannerToolbar, StyledScannerToolbarButton } from './ScannerToolbar.styles';\nimport { checkTrackSupport } from '../../../utils/support';\nimport { animateNumericValue } from '../../../utils/animate';\nimport usePrevious from '../../../hooks/codeScanner';\n\ntype ScannerToolbarProps = {\n /**\n * Indicates whether the scanner currently has an active error.\n */\n hasScannerError?: boolean;\n /**\n * Disables the file select option if set to true.\n */\n isFileSelectDisabled?: boolean;\n /**\n * Disables the torch (flashlight) button if set to true.\n */\n isTorchDisabled?: boolean;\n /**\n * Indicates if a file is currently being scanned.\n */\n isScanningFile: boolean;\n /**\n * Disables the zoom slider if set to true.\n */\n isZoomDisabled?: boolean;\n /**\n * Maximum allowed zoom level for the camera.\n */\n maxZoom?: number;\n /**\n * Minimum allowed zoom level for the camera.\n */\n minZoom?: number;\n /**\n * Callback triggered when a file is selected for scanning.\n */\n onFileSelect: (file: File) => void;\n /**\n * The active media stream used by the scanner.\n */\n stream?: MediaStream;\n /**\n * Defines constraints for the video element, e.g., resolution or facing mode.\n */\n videoConstraints: MediaTrackConstraints;\n};\n\nconst ScannerToolbar: FC<ScannerToolbarProps> = ({\n videoConstraints,\n onFileSelect,\n isScanningFile,\n hasScannerError = false,\n stream,\n minZoom: minZoomProp = 1,\n maxZoom: maxZoomProp = 3,\n isZoomDisabled = false,\n isTorchDisabled = false,\n isFileSelectDisabled = false,\n}) => {\n const [tracks, setTrack] = useState<MediaStreamTrack[]>();\n const [isZoomed, setIsZoomed] = useState<boolean>();\n const previousIsZoomed = usePrevious(isZoomed);\n const [isZoomSupported, setIsZoomSupported] = useState(false);\n const [isTorchActive, setIsTorchActive] = useState(false);\n const [isTorchSupported, setIsTorchSupported] = useState(false);\n const [isImageSelectActive, setIsImageSelectActive] = useState(false);\n\n const minZoom = useRef(minZoomProp);\n const maxZoom = useRef(maxZoomProp);\n\n useEffect(() => {\n if (hasScannerError) {\n setIsTorchSupported(false);\n setIsZoomSupported(false);\n setIsZoomed(false);\n setTrack(undefined);\n } else if (stream) {\n const videoTracks = stream.getVideoTracks();\n\n let canZoom = false;\n let canTorch = false;\n\n videoTracks.forEach((track) => {\n if (checkTrackSupport(track, 'zoom')) {\n canZoom = true;\n\n const capabilities = track.getCapabilities();\n\n if (capabilities.zoom.min > minZoomProp) {\n minZoom.current = capabilities.zoom.min;\n }\n if (capabilities.zoom.max < maxZoomProp) {\n maxZoom.current = capabilities.zoom.max;\n }\n }\n if (checkTrackSupport(track, 'torch')) {\n canTorch = true;\n }\n });\n\n if (canZoom && !isZoomDisabled) {\n setIsZoomSupported(true);\n setIsZoomed(false);\n }\n\n setIsTorchSupported(canTorch && !isTorchDisabled);\n setTrack(videoTracks);\n }\n }, [\n videoConstraints,\n hasScannerError,\n stream,\n minZoomProp,\n maxZoomProp,\n isZoomDisabled,\n isTorchDisabled,\n ]);\n\n useEffect(() => {\n if (tracks?.length && isZoomSupported) {\n if (typeof previousIsZoomed === 'undefined') {\n tracks.forEach((track) => {\n if (checkTrackSupport(track, 'zoom')) {\n void track.applyConstraints({\n advanced: [{ zoom: isZoomed ? maxZoom.current : minZoom.current }],\n });\n }\n });\n } else if (previousIsZoomed !== isZoomed) {\n animateNumericValue(\n previousIsZoomed ? maxZoom.current : minZoom.current,\n isZoomed ? maxZoom.current : minZoom.current,\n 500,\n (value) => {\n tracks.forEach((track) => {\n if (checkTrackSupport(track, 'zoom')) {\n void track.applyConstraints({\n advanced: [{ zoom: value }],\n });\n }\n });\n },\n );\n }\n }\n }, [isZoomSupported, isZoomed, previousIsZoomed, tracks]);\n\n useEffect(() => {\n if (tracks?.length && isTorchSupported) {\n tracks.forEach((track) => {\n if (checkTrackSupport(track, 'torch')) {\n void track.applyConstraints({\n advanced: [{ torch: isTorchActive }],\n });\n }\n });\n }\n }, [isTorchActive, isTorchSupported, tracks]);\n\n return (\n <StyledScannerToolbar>\n <StyledScannerToolbarButton\n $isAvailable={isTorchSupported}\n $isActive={isTorchActive}\n onClick={() => {\n setIsTorchActive((prev) => !prev);\n }}\n >\n <Icon icons={['far fa-lightbulb']} size={25} />\n </StyledScannerToolbarButton>\n <StyledScannerToolbarButton\n $isAvailable={isZoomSupported}\n $isActive={isZoomed}\n onClick={() => {\n setIsZoomed((prev) => !prev);\n }}\n >\n <Icon icons={['far fa-search-plus']} size={25} />\n </StyledScannerToolbarButton>\n <StyledScannerToolbarButton\n $isAvailable={!isFileSelectDisabled}\n $isActive={isImageSelectActive || isScanningFile}\n onClick={() => {\n setIsImageSelectActive(true);\n selectFiles({\n multiple: false,\n type: 'image/*',\n })\n .then((files) => {\n if (files && files[0]) {\n onFileSelect(files[0]);\n }\n })\n .catch(console.error)\n .finally(() => {\n setIsImageSelectActive(false);\n });\n }}\n >\n <Icon icons={['far fa-folder-image']} size={25} />\n </StyledScannerToolbarButton>\n </StyledScannerToolbar>\n );\n};\n\nexport default ScannerToolbar;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,QAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAC,sBAAA,CAAAN,OAAA;AAAqD,SAAAM,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAR,wBAAAQ,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAZ,uBAAA,YAAAA,CAAAQ,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AA6CrD,MAAMgB,cAAuC,GAAGA,CAAC;EAC7CC,gBAAgB;EAChBC,YAAY;EACZC,cAAc;EACdC,eAAe,GAAG,KAAK;EACvBC,MAAM;EACNC,OAAO,EAAEC,WAAW,GAAG,CAAC;EACxBC,OAAO,EAAEC,WAAW,GAAG,CAAC;EACxBC,cAAc,GAAG,KAAK;EACtBC,eAAe,GAAG,KAAK;EACvBC,oBAAoB,GAAG;AAC3B,CAAC,KAAK;EACF,MAAM,CAACC,MAAM,EAAEC,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAAqB,CAAC;EACzD,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAG,IAAAF,eAAQ,EAAU,CAAC;EACnD,MAAMG,gBAAgB,GAAG,IAAAC,oBAAW,EAACH,QAAQ,CAAC;EAC9C,MAAM,CAACI,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAN,eAAQ,EAAC,KAAK,CAAC;EAC7D,MAAM,CAACO,aAAa,EAAEC,gBAAgB,CAAC,GAAG,IAAAR,eAAQ,EAAC,KAAK,CAAC;EACzD,MAAM,CAACS,gBAAgB,EAAEC,mBAAmB,CAAC,GAAG,IAAAV,eAAQ,EAAC,KAAK,CAAC;EAC/D,MAAM,CAACW,mBAAmB,EAAEC,sBAAsB,CAAC,GAAG,IAAAZ,eAAQ,EAAC,KAAK,CAAC;EAErE,MAAMT,OAAO,GAAG,IAAAsB,aAAM,EAACrB,WAAW,CAAC;EACnC,MAAMC,OAAO,GAAG,IAAAoB,aAAM,EAACnB,WAAW,CAAC;EAEnC,IAAAoB,gBAAS,EAAC,MAAM;IACZ,IAAIzB,eAAe,EAAE;MACjBqB,mBAAmB,CAAC,KAAK,CAAC;MAC1BJ,kBAAkB,CAAC,KAAK,CAAC;MACzBJ,WAAW,CAAC,KAAK,CAAC;MAClBH,QAAQ,CAACgB,SAAS,CAAC;IACvB,CAAC,MAAM,IAAIzB,MAAM,EAAE;MACf,MAAM0B,WAAW,GAAG1B,MAAM,CAAC2B,cAAc,CAAC,CAAC;MAE3C,IAAIC,OAAO,GAAG,KAAK;MACnB,IAAIC,QAAQ,GAAG,KAAK;MAEpBH,WAAW,CAACI,OAAO,CAAEC,KAAK,IAAK;QAC3B,IAAI,IAAAC,0BAAiB,EAACD,KAAK,EAAE,MAAM,CAAC,EAAE;UAClCH,OAAO,GAAG,IAAI;UAEd,MAAMK,YAAY,GAAGF,KAAK,CAACG,eAAe,CAAC,CAAC;UAE5C,IAAID,YAAY,CAACE,IAAI,CAACC,GAAG,GAAGlC,WAAW,EAAE;YACrCD,OAAO,CAACoC,OAAO,GAAGJ,YAAY,CAACE,IAAI,CAACC,GAAG;UAC3C;UACA,IAAIH,YAAY,CAACE,IAAI,CAACG,GAAG,GAAGlC,WAAW,EAAE;YACrCD,OAAO,CAACkC,OAAO,GAAGJ,YAAY,CAACE,IAAI,CAACG,GAAG;UAC3C;QACJ;QACA,IAAI,IAAAN,0BAAiB,EAACD,KAAK,EAAE,OAAO,CAAC,EAAE;UACnCF,QAAQ,GAAG,IAAI;QACnB;MACJ,CAAC,CAAC;MAEF,IAAID,OAAO,IAAI,CAACvB,cAAc,EAAE;QAC5BW,kBAAkB,CAAC,IAAI,CAAC;QACxBJ,WAAW,CAAC,KAAK,CAAC;MACtB;MAEAQ,mBAAmB,CAACS,QAAQ,IAAI,CAACvB,eAAe,CAAC;MACjDG,QAAQ,CAACiB,WAAW,CAAC;IACzB;EACJ,CAAC,EAAE,CACC9B,gBAAgB,EAChBG,eAAe,EACfC,MAAM,EACNE,WAAW,EACXE,WAAW,EACXC,cAAc,EACdC,eAAe,CAClB,CAAC;EAEF,IAAAkB,gBAAS,EAAC,MAAM;IACZ,IAAIhB,MAAM,aAANA,MAAM,eAANA,MAAM,CAAE+B,MAAM,IAAIxB,eAAe,EAAE;MACnC,IAAI,OAAOF,gBAAgB,KAAK,WAAW,EAAE;QACzCL,MAAM,CAACsB,OAAO,CAAEC,KAAK,IAAK;UACtB,IAAI,IAAAC,0BAAiB,EAACD,KAAK,EAAE,MAAM,CAAC,EAAE;YAClC,KAAKA,KAAK,CAACS,gBAAgB,CAAC;cACxBC,QAAQ,EAAE,CAAC;gBAAEN,IAAI,EAAExB,QAAQ,GAAGR,OAAO,CAACkC,OAAO,GAAGpC,OAAO,CAACoC;cAAQ,CAAC;YACrE,CAAC,CAAC;UACN;QACJ,CAAC,CAAC;MACN,CAAC,MAAM,IAAIxB,gBAAgB,KAAKF,QAAQ,EAAE;QACtC,IAAA+B,4BAAmB,EACf7B,gBAAgB,GAAGV,OAAO,CAACkC,OAAO,GAAGpC,OAAO,CAACoC,OAAO,EACpD1B,QAAQ,GAAGR,OAAO,CAACkC,OAAO,GAAGpC,OAAO,CAACoC,OAAO,EAC5C,GAAG,EACFM,KAAK,IAAK;UACPnC,MAAM,CAACsB,OAAO,CAAEC,KAAK,IAAK;YACtB,IAAI,IAAAC,0BAAiB,EAACD,KAAK,EAAE,MAAM,CAAC,EAAE;cAClC,KAAKA,KAAK,CAACS,gBAAgB,CAAC;gBACxBC,QAAQ,EAAE,CAAC;kBAAEN,IAAI,EAAEQ;gBAAM,CAAC;cAC9B,CAAC,CAAC;YACN;UACJ,CAAC,CAAC;QACN,CACJ,CAAC;MACL;IACJ;EACJ,CAAC,EAAE,CAAC5B,eAAe,EAAEJ,QAAQ,EAAEE,gBAAgB,EAAEL,MAAM,CAAC,CAAC;EAEzD,IAAAgB,gBAAS,EAAC,MAAM;IACZ,IAAIhB,MAAM,aAANA,MAAM,eAANA,MAAM,CAAE+B,MAAM,IAAIpB,gBAAgB,EAAE;MACpCX,MAAM,CAACsB,OAAO,CAAEC,KAAK,IAAK;QACtB,IAAI,IAAAC,0BAAiB,EAACD,KAAK,EAAE,OAAO,CAAC,EAAE;UACnC,KAAKA,KAAK,CAACS,gBAAgB,CAAC;YACxBC,QAAQ,EAAE,CAAC;cAAEG,KAAK,EAAE3B;YAAc,CAAC;UACvC,CAAC,CAAC;QACN;MACJ,CAAC,CAAC;IACN;EACJ,CAAC,EAAE,CAACA,aAAa,EAAEE,gBAAgB,EAAEX,MAAM,CAAC,CAAC;EAE7C,oBACIzC,MAAA,CAAAW,OAAA,CAAAmE,aAAA,CAAC1E,eAAA,CAAA2E,oBAAoB,qBACjB/E,MAAA,CAAAW,OAAA,CAAAmE,aAAA,CAAC1E,eAAA,CAAA4E,0BAA0B;IACvBC,YAAY,EAAE7B,gBAAiB;IAC/B8B,SAAS,EAAEhC,aAAc;IACzBiC,OAAO,EAAEA,CAAA,KAAM;MACXhC,gBAAgB,CAAEiC,IAAI,IAAK,CAACA,IAAI,CAAC;IACrC;EAAE,gBAEFpF,MAAA,CAAAW,OAAA,CAAAmE,aAAA,CAAC3E,KAAA,CAAAkF,IAAI;IAACC,KAAK,EAAE,CAAC,kBAAkB,CAAE;IAACC,IAAI,EAAE;EAAG,CAAE,CACtB,CAAC,eAC7BvF,MAAA,CAAAW,OAAA,CAAAmE,aAAA,CAAC1E,eAAA,CAAA4E,0BAA0B;IACvBC,YAAY,EAAEjC,eAAgB;IAC9BkC,SAAS,EAAEtC,QAAS;IACpBuC,OAAO,EAAEA,CAAA,KAAM;MACXtC,WAAW,CAAEuC,IAAI,IAAK,CAACA,IAAI,CAAC;IAChC;EAAE,gBAEFpF,MAAA,CAAAW,OAAA,CAAAmE,aAAA,CAAC3E,KAAA,CAAAkF,IAAI;IAACC,KAAK,EAAE,CAAC,oBAAoB,CAAE;IAACC,IAAI,EAAE;EAAG,CAAE,CACxB,CAAC,eAC7BvF,MAAA,CAAAW,OAAA,CAAAmE,aAAA,CAAC1E,eAAA,CAAA4E,0BAA0B;IACvBC,YAAY,EAAE,CAACzC,oBAAqB;IACpC0C,SAAS,EAAE5B,mBAAmB,IAAIvB,cAAe;IACjDoD,OAAO,EAAEA,CAAA,KAAM;MACX5B,sBAAsB,CAAC,IAAI,CAAC;MAC5B,IAAAiC,iBAAW,EAAC;QACRC,QAAQ,EAAE,KAAK;QACfC,IAAI,EAAE;MACV,CAAC,CAAC,CACGC,IAAI,CAAEC,KAAK,IAAK;QACb,IAAIA,KAAK,IAAIA,KAAK,CAAC,CAAC,CAAC,EAAE;UACnB9D,YAAY,CAAC8D,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B;MACJ,CAAC,CAAC,CACDC,KAAK,CAACC,OAAO,CAACC,KAAK,CAAC,CACpBC,OAAO,CAAC,MAAM;QACXzC,sBAAsB,CAAC,KAAK,CAAC;MACjC,CAAC,CAAC;IACV;EAAE,gBAEFvD,MAAA,CAAAW,OAAA,CAAAmE,aAAA,CAAC3E,KAAA,CAAAkF,IAAI;IAACC,KAAK,EAAE,CAAC,qBAAqB,CAAE;IAACC,IAAI,EAAE;EAAG,CAAE,CACzB,CACV,CAAC;AAE/B,CAAC;AAAC,IAAAU,QAAA,GAAAC,OAAA,CAAAvF,OAAA,GAEaiB,cAAc","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.StyledScannerToolbarButton = exports.StyledScannerToolbar = void 0;
7
+ var _styledComponents = _interopRequireWildcard(require("styled-components"));
8
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
9
+ const StyledScannerToolbar = exports.StyledScannerToolbar = _styledComponents.default.div`
10
+ position: absolute;
11
+ bottom: 0;
12
+ left: 0;
13
+ right: 0;
14
+ height: 85px;
15
+ padding: 20px;
16
+ display: flex;
17
+ justify-content: space-between;
18
+
19
+ color: white;
20
+ `;
21
+ const StyledScannerToolbarButton = exports.StyledScannerToolbarButton = _styledComponents.default.div`
22
+ display: flex;
23
+ justify-content: center;
24
+ align-items: center;
25
+ height: 45px;
26
+ width: 45px;
27
+ cursor: pointer;
28
+ border-radius: 50%;
29
+
30
+ ${({
31
+ $isAvailable = false
32
+ }) => !$isAvailable && (0, _styledComponents.css)`
33
+ cursor: default;
34
+ opacity: 0;
35
+ pointer-events: none;
36
+ `};
37
+
38
+ ${({
39
+ $isActive = false
40
+ }) => $isActive && (0, _styledComponents.css)`
41
+ background-color: rgba(255, 255, 255, 0.2);
42
+ `};
43
+
44
+ text-shadow: 0 0 10px black;
45
+
46
+ i {
47
+ color: white;
48
+ }
49
+ `;
50
+ //# sourceMappingURL=ScannerToolbar.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScannerToolbar.styles.js","names":["_styledComponents","_interopRequireWildcard","require","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","StyledScannerToolbar","exports","styled","div","StyledScannerToolbarButton","$isAvailable","css","$isActive"],"sources":["../../../../../src/components/code-scanner/scanner-toolbar/ScannerToolbar.styles.ts"],"sourcesContent":["import styled, { css } from 'styled-components';\n\nexport const StyledScannerToolbar = styled.div`\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 85px;\n padding: 20px;\n display: flex;\n justify-content: space-between;\n\n color: white;\n`;\n\ntype ScannerToolbarButtonProps = {\n $isAvailable?: boolean;\n $isActive?: boolean;\n};\n\nexport const StyledScannerToolbarButton = styled.div<ScannerToolbarButtonProps>`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 45px;\n width: 45px;\n cursor: pointer;\n border-radius: 50%;\n\n ${({ $isAvailable = false }) =>\n !$isAvailable &&\n css`\n cursor: default;\n opacity: 0;\n pointer-events: none;\n `};\n\n ${({ $isActive = false }) =>\n $isActive &&\n css`\n background-color: rgba(255, 255, 255, 0.2);\n `};\n\n text-shadow: 0 0 10px black;\n\n i {\n color: white;\n }\n`;\n"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,uBAAA,CAAAC,OAAA;AAAgD,SAAAD,wBAAAE,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAJ,uBAAA,YAAAA,CAAAE,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAEzC,MAAMkB,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,GAAGE,yBAAM,CAACC,GAAG;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAOM,MAAMC,0BAA0B,GAAAH,OAAA,CAAAG,0BAAA,GAAGF,yBAAM,CAACC,GAA8B;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,CAAC;EAAEE,YAAY,GAAG;AAAM,CAAC,KACvB,CAACA,YAAY,IACb,IAAAC,qBAAG;AACX;AACA;AACA;AACA,SAAS;AACT;AACA,MAAM,CAAC;EAAEC,SAAS,GAAG;AAAM,CAAC,KACpBA,SAAS,IACT,IAAAD,qBAAG;AACX;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DEFAULT_VIDEO_CONSTRAINTS = exports.DEFAULT_TRACK_CONSTRAINTS = exports.ALL_FORMATS = void 0;
7
+ const ALL_FORMATS = exports.ALL_FORMATS = ['code_128', 'code_39', 'code_93', 'codabar', 'ean_13', 'ean_8', 'itf', 'qr_code', 'upc_a', 'upc_e'];
8
+ const DEFAULT_VIDEO_CONSTRAINTS = exports.DEFAULT_VIDEO_CONSTRAINTS = {
9
+ facingMode: {
10
+ ideal: 'environment'
11
+ }
12
+ };
13
+ const DEFAULT_TRACK_CONSTRAINTS = exports.DEFAULT_TRACK_CONSTRAINTS = {
14
+ width: 640,
15
+ height: 480,
16
+ frameRate: 25,
17
+ noiseSuppression: false,
18
+ facingMode: 'environment'
19
+ };
20
+ //# sourceMappingURL=codeScanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeScanner.js","names":["ALL_FORMATS","exports","DEFAULT_VIDEO_CONSTRAINTS","facingMode","ideal","DEFAULT_TRACK_CONSTRAINTS","width","height","frameRate","noiseSuppression"],"sources":["../../../src/constants/codeScanner.ts"],"sourcesContent":["export const ALL_FORMATS: Array<BarcodeFormat> = [\n 'code_128',\n 'code_39',\n 'code_93',\n 'codabar',\n 'ean_13',\n 'ean_8',\n 'itf',\n 'qr_code',\n 'upc_a',\n 'upc_e',\n];\n\nexport const DEFAULT_VIDEO_CONSTRAINTS: MediaTrackConstraints = {\n facingMode: {\n ideal: 'environment',\n },\n};\n\nexport const DEFAULT_TRACK_CONSTRAINTS: MediaTrackConstraints = {\n width: 640,\n height: 480,\n frameRate: 25,\n noiseSuppression: false,\n facingMode: 'environment',\n};\n"],"mappings":";;;;;;AAAO,MAAMA,WAAiC,GAAAC,OAAA,CAAAD,WAAA,GAAG,CAC7C,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,QAAQ,EACR,OAAO,EACP,KAAK,EACL,SAAS,EACT,OAAO,EACP,OAAO,CACV;AAEM,MAAME,yBAAgD,GAAAD,OAAA,CAAAC,yBAAA,GAAG;EAC5DC,UAAU,EAAE;IACRC,KAAK,EAAE;EACX;AACJ,CAAC;AAEM,MAAMC,yBAAgD,GAAAJ,OAAA,CAAAI,yBAAA,GAAG;EAC5DC,KAAK,EAAE,GAAG;EACVC,MAAM,EAAE,GAAG;EACXC,SAAS,EAAE,EAAE;EACbC,gBAAgB,EAAE,KAAK;EACvBN,UAAU,EAAE;AAChB,CAAC","ignoreList":[]}