react-barcode-scanner
Version:
A barcode scanner base on Barcode Detector
86 lines (85 loc) • 3.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useCamera = useCamera;
var tslib_1 = require("tslib");
var react_1 = require("react");
var utils_1 = require("../helper/utils");
var use_stream_state_1 = require("./use-stream-state");
var DEFAULT_CONSTRAINTS = {
width: { min: 640, ideal: 1280 },
height: { min: 480, ideal: 720 },
facingMode: {
ideal: 'environment'
},
advanced: [
{ width: 1920, height: 1280 },
{ aspectRatio: 1.333 }
]
};
function useCamera(ref, trackConstraints) {
var _this = this;
var _a = (0, react_1.useState)(false), isCameraReady = _a[0], setIsCameraReady = _a[1];
var _b = (0, react_1.useState)(), error = _b[0], setError = _b[1];
var _c = (0, use_stream_state_1.useStreamState)(), setStream = _c[1];
(0, react_1.useEffect)(function () {
if (!window.isSecureContext) {
setError(new Error("[react-barcode-scanner]: \n Browser ask for secure origin (such as https) when use getUserMedia,\n reference: https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins\n "));
}
}, []);
var constraints = (0, react_1.useMemo)(function () {
var videoConstraints = Object.assign({}, DEFAULT_CONSTRAINTS, trackConstraints);
return {
audio: false,
video: videoConstraints
};
}, [trackConstraints]);
(0, react_1.useEffect)(function () {
var cancelled = false;
var stream;
var _ = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var target;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
setError(undefined);
target = ref.current;
if (target == null)
return [2];
return [4, navigator.mediaDevices.getUserMedia(constraints)];
case 1:
stream = _a.sent();
if (target.mozSrcObject !== undefined) {
target.mozSrcObject = stream;
}
else {
target.srcObject = stream;
}
return [4, (0, utils_1.eventListener)(target, 'loadeddata')];
case 2:
_a.sent();
return [4, (0, utils_1.timeout)(500)];
case 3:
_a.sent();
setIsCameraReady(true);
setStream(stream);
return [2];
}
});
}); };
var close = function () {
stream === null || stream === void 0 ? void 0 : stream.getTracks().forEach(function (track) { track.stop(); });
};
void _().then(function () {
if (cancelled) {
close();
}
}).catch(function (err) {
setError(err);
});
return function () {
cancelled = true;
close();
};
}, [ref, constraints, setStream]);
return { isCameraReady: isCameraReady, error: error };
}