Add zxing JavaScript barcode scanning support for NW.js

master
Skylar Ittner 5 years ago
parent ae74a87889
commit 22fb101a74

@ -14,7 +14,8 @@ rm -r ./{ansicolors,buffer-from,canvas-renderer,cardinal,concat-stream,core-util
rm -r ./{earcut,esm,esprima,geojson-vt,gl-matrix,grid-index,ieee754,inherits,isarray,kdbush,@mapbox,minimist,murmurhash-js}
rm -r ./{path-to-regexp,pbf,potpack,process-nextick-args,protocol-buffers-schema,quickselect}
rm -r ./{readable-stream,redeyed,resolve-protobuf-schema,rw,safe-buffer,sharkdown,split,ssr-window,string_decoder}
rm -r ./{supercluster,template7,through,tinyqueue,topojson-client,typedarray,util-deprecate,vector-tile,vt-pbf,whatwg-fetch,wgs84}
rm -r ./{supercluster,template7,text-encoding,through,tinyqueue,topojson-client,ts-custom-error,typedarray}
rm -r ./{util-deprecate,vector-tile,vt-pbf,whatwg-fetch,wgs84}
rm -r @fortawesome/fontawesome-free/{js,less,scss,sprites,svgs}
rm -r @fortawesome/fontawesome-free/css/{all.css,brands.css,brands.min.css,fontawesome.css,fontawesome.min.css,regular.css,\
@ -39,6 +40,9 @@ rm -r leaflet/dist/{leaflet.js.map,leaflet-src.esm.js,leaflet-src.esm.js.map,lea
rm -r leaflet.vectorgrid/{docs,leafdoc-templates,node_modules,package.json,README.md,src}
rm -r leaflet.vectorgrid/dist/{Leaflet.VectorGrid.bundled.js.map,Leaflet.VectorGrid.bundled.min.js,Leaflet.VectorGrid.js,Leaflet.VectorGrid.js.map,Leaflet.VectorGrid.min.js,vectorgrid-api-docs.html}
rm -r @zxing/library/{esm5,CONTRIBUTING.md,README.md}
rm -r @zxing/library/umd/index.min.js.map
echo "Size after: $(du -sh | cut -d ' ' -f 1)"
echo "Cleanup complete!"

@ -64,4 +64,40 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
.badges .badge i {
font-size: 35px;
}
#web-barcode-ui {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
display: block;
background: rgba(0,0,0,0.75);
}
#web-barcode-ui.hidden {
display: none;
}
#web-barcode-ui video#barcode-viewer {
max-width: calc(100% - 2em);
max-height: calc(100% - 2em);
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 1em;
}
#web-barcode-ui .text {
position: absolute;
left: 0;
bottom: 0;
width: 100vw;
padding: 1em 5px 1em 5px;
color: white;
text-align: center;
background: rgba(0,0,0,0.5);
}

@ -27,6 +27,13 @@
</div>
<div id="web-barcode-ui" class="hidden">
<video id="barcode-viewer"></video>
<div class="text">
Scan a barcode with your camera. Click or tap anywhere to cancel.
</div>
</div>
<script src="cordova.js"></script>
<script src="node_modules/jquery/dist/jquery.min.js"></script>

@ -47,49 +47,35 @@ function setupProfile() {
}
function scanCode() {
if (platform_type != "cordova") {
app.dialog.alert("You can't scan barcodes with this device.", "Sorry!");
}
cordova.plugins.barcodeScanner.scan(
function (result) {
if (!result.cancelled) {
callAPI("code", {
username: localStorage.getItem("username"),
password: localStorage.getItem("password"),
code: result.text
}, function (resp) {
if (resp.item == "" && resp.munzee == "") {
app.dialog.alert("You didn't find anything new.", "");
} else {
if (resp.item == "") {
$("#founditem-block").addClass("display-none");
} else {
$("#founditem-name").text(resp.item);
$("#founditem-block").removeClass("display-none");
}
if (resp.munzee == "") {
$("#foundmunzee-block").addClass("display-none");
} else {
$("#foundmunzee-name").text(resp.munzee);
$("#foundmunzee-block").removeClass("display-none");
}
app.popup.open("#founditem-popup");
}
}, function (msg) {
app.dialog.alert(msg, "Error");
});
scanBarcode(function (text) {
callAPI("code", {
username: localStorage.getItem("username"),
password: localStorage.getItem("password"),
code: text
}, function (resp) {
if (resp.item == "" && resp.munzee == "") {
app.dialog.alert("You didn't find anything new.", "");
} else {
if (resp.item == "") {
$("#founditem-block").addClass("display-none");
} else {
$("#founditem-name").text(resp.item);
$("#founditem-block").removeClass("display-none");
}
if (resp.munzee == "") {
$("#foundmunzee-block").addClass("display-none");
} else {
$("#foundmunzee-name").text(resp.munzee);
$("#foundmunzee-block").removeClass("display-none");
}
},
function (error) {
app.dialog.alert(error, "Scan Error");
},
{
showTorchButton: true,
prompt: "Find a code",
resultDisplayDuration: 0,
disableSuccessBeep: true
app.popup.open("#founditem-popup");
}
);
}, function (msg) {
app.dialog.alert(msg, "Error");
});
}, function (error) {
app.dialog.alert(error, "Scan Error");
});
}
function openPlace(id, name) {

@ -14,6 +14,10 @@ var openBrowser = function (url) {
}
var scanBarcode = function (success, error) {
app.dialog.alert("You can't scan barcodes with this device.", "Sorry!");
}
var getLocation = function (success, error) {
if ("geolocation" in navigator) {
navigator.geolocation.getCurrentPosition(function (position) {
@ -80,6 +84,27 @@ function initCordova() {
openBrowser = function (url) {
cordova.InAppBrowser.open(url, '_blank', 'location=yes');
}
scanBarcode = function (success, error) {
cordova.plugins.barcodeScanner.scan(
function (result) {
if (!result.cancelled) {
success(result.text);
}
},
function (err) {
if (typeof error == "function") {
error(err);
}
},
{
showTorchButton: true,
prompt: "Find a code",
resultDisplayDuration: 0,
disableSuccessBeep: true
}
);
}
}
function initNW() {
@ -113,6 +138,41 @@ function initNW() {
browserwin.menu = browsermenu;
});
}
$("body").append('<script src="node_modules/@zxing/library/umd/index.min.js"></script>');
scanBarcode = function (success, error) {
$("#web-barcode-ui").removeClass("hidden");
// Stolen from https://zxing-js.github.io/library/examples/multi-camera/
const codeReader = new ZXing.BrowserMultiFormatReader();
console.log('ZXing code reader initialized');
codeReader.getVideoInputDevices()
.then((videoInputDevices) => {
selectedDeviceId = videoInputDevices[0].deviceId;
codeReader.decodeFromInputVideoDeviceContinuously(selectedDeviceId, 'barcode-viewer', (result, err) => {
if (result) {
console.log(result);
codeReader.reset();
$("#web-barcode-ui").addClass("hidden");
success(result.text);
}
if (err && !(err instanceof ZXing.NotFoundException)) {
console.error(err);
codeReader.reset();
$("#web-barcode-ui").addClass("hidden");
error(err);
}
});
})
.catch((err) => {
console.error(err);
});
$("#web-barcode-ui").on("click", function () {
codeReader.reset();
$("#web-barcode-ui").addClass("hidden");
});
};
}
function initBrowser() {

@ -5,6 +5,7 @@
"license": "MPL-2.0",
"dependencies": {
"@fortawesome/fontawesome-free": "^5.8.1",
"@zxing/library": "^0.14.2",
"framework7": "^4.3.0",
"jdenticon": "^2.1.1",
"jquery": "^3.4.0",

@ -66,6 +66,15 @@
resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe"
integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==
"@zxing/library@^0.14.2":
version "0.14.2"
resolved "https://registry.yarnpkg.com/@zxing/library/-/library-0.14.2.tgz#686a4218857b21e4a6c64561769d9901bf623d94"
integrity sha512-n621ErZ7tba9/7GlU6LsfbDgx1fnjZNxblwKU5W4p8vHGIJ2X+/F9rAUyHq8PAUN3HkZaelhS58qhnbbVH8SBA==
dependencies:
ts-custom-error "^3.0.0"
optionalDependencies:
text-encoding "^0.7.0"
ansicolors@~0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef"
@ -373,6 +382,11 @@ template7@^1.4.1:
resolved "https://registry.yarnpkg.com/template7/-/template7-1.4.1.tgz#c3b2b03d6879e1c5f8a79067c961c8896ffaeec6"
integrity sha512-sYZ9Wl5kFuNSvLcMPq8z4oenG7rDho6KnB2vWyvMJCdI1guJhxTEU0TCwr6Nd1Jx34kSOmrpJakMGxJgCc55yg==
text-encoding@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643"
integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==
through@2:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@ -390,6 +404,11 @@ topojson-client@^2.1.0:
dependencies:
commander "2"
ts-custom-error@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/ts-custom-error/-/ts-custom-error-3.1.0.tgz#2abcd25b253ca209036a51870318da9b1de93107"
integrity sha512-EIL1r8RKfa006lLhSSVsAlvu6/BgRdSLSxibP27zq66ydh6Kbsjv1pV7VAD7TxQfdQ9begiQW0QVjsnr9KvVrw==
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"

Loading…
Cancel
Save