use-scan-detection
Advanced tools
Comparing version 0.2.1 to 0.2.2
interface config { | ||
/** Maximum time between characters in milliseconds. Used to determine if input is from keyboard or a scanner. Defaults to 50ms.*/ | ||
waitTime?: number; | ||
/** Time to wait from last character to then trigger an evaluation of the buffer. */ | ||
timeToEvaluate?: number; | ||
/** Average time between characters in milliseconds. Used to determine if input is from keyboard or a scanner. Defaults to 50ms.*/ | ||
averageWaitTime?: number; | ||
/** Character that barcode scanner prefixes input with.*/ | ||
startCharacter?: number; | ||
startCharacter?: Array<number>; | ||
/** Character that barcode scanner suffixes input with. Defaults to line return.*/ | ||
endCharacter?: number; | ||
endCharacter?: Array<number>; | ||
/** Callback to use on complete scan input.*/ | ||
@@ -27,3 +29,3 @@ onComplete: (code: String) => void; | ||
*/ | ||
declare const useScanDetection: ({ waitTime, startCharacter, endCharacter, onComplete, onError, minLength, ignoreIfFocusOn, stopPropagation, preventDefault, container }: config) => void; | ||
declare const useScanDetection: ({ timeToEvaluate, averageWaitTime, startCharacter, endCharacter, onComplete, onError, minLength, ignoreIfFocusOn, stopPropagation, preventDefault, container }: config) => void; | ||
export default useScanDetection; |
@@ -9,3 +9,3 @@ "use strict"; | ||
var useScanDetection = function (_a) { | ||
var _b = _a.waitTime, waitTime = _b === void 0 ? 50 : _b, startCharacter = _a.startCharacter, _c = _a.endCharacter, endCharacter = _c === void 0 ? 13 : _c, onComplete = _a.onComplete, onError = _a.onError, _d = _a.minLength, minLength = _d === void 0 ? 1 : _d, ignoreIfFocusOn = _a.ignoreIfFocusOn, _e = _a.stopPropagation, stopPropagation = _e === void 0 ? false : _e, _f = _a.preventDefault, preventDefault = _f === void 0 ? false : _f, _g = _a.container, container = _g === void 0 ? document : _g; | ||
var _b = _a.timeToEvaluate, timeToEvaluate = _b === void 0 ? 100 : _b, _c = _a.averageWaitTime, averageWaitTime = _c === void 0 ? 50 : _c, _d = _a.startCharacter, startCharacter = _d === void 0 ? [] : _d, _e = _a.endCharacter, endCharacter = _e === void 0 ? [13, 27] : _e, onComplete = _a.onComplete, onError = _a.onError, _f = _a.minLength, minLength = _f === void 0 ? 1 : _f, ignoreIfFocusOn = _a.ignoreIfFocusOn, _g = _a.stopPropagation, stopPropagation = _g === void 0 ? false : _g, _h = _a.preventDefault, preventDefault = _h === void 0 ? false : _h, _j = _a.container, container = _j === void 0 ? document : _j; | ||
var buffer = react_1.useRef([]); | ||
@@ -16,18 +16,37 @@ var timeout = react_1.useRef(false); | ||
}; | ||
var evaluateBuffer = function () { | ||
clearTimeout(timeout.current); | ||
var sum = buffer.current | ||
.map(function (_a, k, arr) { | ||
var time = _a.time; | ||
return k > 0 ? time - arr[k - 1].time : 0; | ||
}) | ||
.slice(1) | ||
.reduce(function (total, delta) { return total + delta; }, 0); | ||
var avg = sum / (buffer.current.length - 1); | ||
var code = buffer.current | ||
.slice(startCharacter.length > 0 ? 1 : 0) | ||
.map(function (_a) { | ||
var char = _a.char; | ||
return char; | ||
}) | ||
.join(""); | ||
if (avg <= averageWaitTime | ||
&& buffer.current.slice(startCharacter.length > 0 ? 1 : 0).length >= minLength) { | ||
onComplete(code); | ||
} | ||
else { | ||
avg <= averageWaitTime && !!onError && onError(code); | ||
} | ||
clearBuffer(); | ||
}; | ||
var onKeyDown = react_1.useCallback(function (event) { | ||
if (event.currentTarget !== ignoreIfFocusOn) { | ||
if (event.keyCode === endCharacter) { | ||
clearTimeout(timeout.current); | ||
if (buffer.current.length >= minLength) { | ||
onComplete(buffer.current.slice(!!startCharacter ? 1 : 0).join("")); | ||
} | ||
else if (!!onError) { | ||
onError("incomplete scan detected"); | ||
} | ||
clearBuffer(); | ||
if (endCharacter.includes(event.keyCode)) { | ||
evaluateBuffer(); | ||
} | ||
if (buffer.current.length > 0 || event.keyCode === startCharacter || !startCharacter) { | ||
if (buffer.current.length > 0 || startCharacter.includes(event.keyCode) || startCharacter.length === 0) { | ||
clearTimeout(timeout.current); | ||
timeout.current = setTimeout(clearBuffer, waitTime); | ||
buffer.current.push(event.key); | ||
timeout.current = setTimeout(evaluateBuffer, timeToEvaluate); | ||
buffer.current.push({ time: performance.now(), char: event.key }); | ||
} | ||
@@ -44,3 +63,3 @@ } | ||
endCharacter, | ||
waitTime, | ||
timeToEvaluate, | ||
onComplete, | ||
@@ -47,0 +66,0 @@ onError, |
{ | ||
"name": "use-scan-detection", | ||
"version": "0.2.1", | ||
"version": "0.2.2", | ||
"description": "A react hook for detecting barcode scanner input.", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
Sorry, the diff of this file is not supported yet
20880
428