Skip to content
Snippets Groups Projects
Commit da229f1f authored by Reiter, Christoph's avatar Reiter, Christoph :snake:
Browse files

Don't change the DOM directly

Instead handle everything throuh property updates.
parent be353109
No related branches found
No related tags found
No related merge requests found
{ {
"no-camera-access": "Zugriff auf Kamera nicht möglich (bitte stellen Sie sicher, dass eine Webcam aktiviert ist)", "no-camera-access": "Zugriff auf Kamera nicht möglich (bitte stellen Sie sicher, dass eine Webcam aktiviert ist)",
"finished-scan": "Scannen erfolgreich abgeschlossen.", "finished-scan": "Scannen abgeschlossen.",
"loading-video": "Video laden ...", "loading-video": "Video laden ...",
"no-qr-detected": "Kein QR-Code erkannt.", "no-qr-detected": "Kein QR-Code erkannt.",
"no-support": "Ihr Browser unterstützt keine Videoaufnahmen.", "no-support": "Ihr Browser unterstützt keine Videoaufnahmen.",
......
{ {
"no-camera-access": "Unable to access video stream (please make sure you have a webcam enabled)", "no-camera-access": "Unable to access video stream (please make sure you have a webcam enabled)",
"finished-scan": "Finished scanning successfully.", "finished-scan": "Finished scanning.",
"loading-video": "⌛ Loading video...", "loading-video": "⌛ Loading video...",
"no-qr-detected": "No QR code detected.", "no-qr-detected": "No QR code detected.",
"no-support": "Your browser does not support video recording.", "no-support": "Your browser does not support video recording.",
......
...@@ -88,6 +88,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -88,6 +88,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
this.matchRegex = '.*'; this.matchRegex = '.*';
this._videoElement = null; this._videoElement = null;
this._outputData = null;
} }
static get scopedElements() { static get scopedElements() {
...@@ -113,6 +114,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -113,6 +114,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
_devices: { type: Map, attribute: false}, _devices: { type: Map, attribute: false},
_loadingMessage: { type: String, attribute: false }, _loadingMessage: { type: String, attribute: false },
matchRegex: { type: String, attribute: 'match-regex' }, matchRegex: { type: String, attribute: 'match-regex' },
_outputData: { type: String, attribute: false },
}; };
} }
...@@ -168,11 +170,6 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -168,11 +170,6 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
let video = document.createElement("video"); let video = document.createElement("video");
let canvasElement = this._("#canvas"); let canvasElement = this._("#canvas");
let canvas = canvasElement.getContext("2d");
let loadingMessage = this._("#loadingMessage");
let outputContainer = this._("#output");
let outputMessage = this._("#outputMessage");
let outputData = this._("#outputData");
let qrContainer = this._("#qr"); let qrContainer = this._("#qr");
let scroll = false; let scroll = false;
...@@ -196,6 +193,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -196,6 +193,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
} catch(e) { } catch(e) {
console.log(e); console.log(e);
} }
this.askPermission = false;
if (stream !== null) { if (stream !== null) {
video.srcObject = stream; video.srcObject = stream;
...@@ -203,13 +201,14 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -203,13 +201,14 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
video.play(); video.play();
this.videoRunning = true; this.videoRunning = true;
qrContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
if (this._requestID !== null) { if (this._requestID !== null) {
cancelAnimationFrame(this._requestID); cancelAnimationFrame(this._requestID);
this._requestID = null; this._requestID = null;
} }
console.assert(this._requestID === null); console.assert(this._requestID === null);
this._videoElement = video; this._videoElement = video;
this.loading = true;
this._loadingMessage = i18n.t('loading-video');
this._requestID = requestAnimationFrame(tick); this._requestID = requestAnimationFrame(tick);
} }
...@@ -220,16 +219,12 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -220,16 +219,12 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
function tick() { function tick() {
that._requestID = null; that._requestID = null;
that.loading = true;
that._loadingMessage = i18n.t('loading-video');
if (video.readyState === video.HAVE_ENOUGH_DATA) { if (video.readyState === video.HAVE_ENOUGH_DATA) {
loadingMessage.hidden = true;
that.loading = false; that.loading = false;
canvasElement.hidden = false;
outputContainer.hidden = false;
canvasElement.height = video.videoHeight; canvasElement.height = video.videoHeight;
canvasElement.width = video.videoWidth; canvasElement.width = video.videoWidth;
let canvas = canvasElement.getContext("2d");
canvas.drawImage(video, 0, 0, canvasElement.width, canvasElement.height); canvas.drawImage(video, 0, 0, canvasElement.width, canvasElement.height);
let maskWidth = canvasElement.width; let maskWidth = canvasElement.width;
...@@ -289,16 +284,13 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -289,16 +284,13 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
canvas.fill(); canvas.fill();
if (code) { if (code) {
outputMessage.hidden = true;
outputData.parentElement.hidden = false;
if (lastSentData !== code.data) { if (lastSentData !== code.data) {
that._outputData = code.data;
that.sendUrl(code.data); that.sendUrl(code.data);
outputData.innerText = code.data;
} }
lastSentData = code.data; lastSentData = code.data;
} else { } else {
outputMessage.hidden = false; that._outputData = null;
outputData.parentElement.hidden = true;
lastSentData = null; lastSentData = null;
} }
} }
...@@ -341,15 +333,9 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -341,15 +333,9 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
this._requestID = null; this._requestID = null;
} }
let loadingMessage = this._("#loadingMessage");
loadingMessage.hidden = false;
let canvasElement = this._("#canvas");
canvasElement.hidden = true;
let outputContainer = this._("#output");
outputContainer.hidden = true;
this.askPermission = false; this.askPermission = false;
this.videoRunning = false; this.videoRunning = false;
this.loading = false;
this._loadingMessage = i18n.t('finished-scan'); this._loadingMessage = i18n.t('finished-scan');
} }
...@@ -391,22 +377,18 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -391,22 +377,18 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
max-height: 100%; max-height: 100%;
} }
#output { .output {
margin-top: 20px; margin-top: 20px;
background: #eee; background: #eee;
padding: 10px; padding: 10px;
padding-bottom: 0; padding-bottom: 0;
} }
#output div { .output div {
padding-bottom: 10px; padding-bottom: 10px;
word-wrap: break-word; word-wrap: break-word;
} }
#noQRFound {
text-align: center;
}
.spinner{ .spinner{
margin-right: 10px; margin-right: 10px;
font-size: 0.7em; font-size: 0.7em;
...@@ -451,6 +433,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -451,6 +433,7 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
render() { render() {
let hasDevices = this._devices.size > 0; let hasDevices = this._devices.size > 0;
let showCanvas = this.videoRunning && !this.askPermission && !this.loading;
return html` return html`
<div class="columns"> <div class="columns">
...@@ -469,18 +452,19 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) { ...@@ -469,18 +452,19 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
</div> </div>
<div id="loadingMessage" class=" ${classMap({hidden: !this.askPermission})}"> <div id="loadingMessage" class="${classMap({hidden: showCanvas})}">
<div class="wrapper-msg"> <div class="wrapper-msg">
<dbp-mini-spinner class="spinner ${classMap({hidden: !this.loading})}"></dbp-mini-spinner> <dbp-mini-spinner class="spinner ${classMap({hidden: !this.loading})}"></dbp-mini-spinner>
<div class="loadingMsg">${this._loadingMessage}</div> <div class="loadingMsg">${this._loadingMessage}</div>
</div> </div>
</div> </div>
<canvas id="canvas" hidden class=""></canvas> <canvas id="canvas" class="${classMap({hidden: !showCanvas})}"></canvas>
<pre id="error"></pre> <div class="output ${classMap({hidden: !(this.showOutput && showCanvas)})}">
${ (this._outputData !== null) ? html`
<div id="output" hidden class=" ${classMap({hidden: !this.showOutput})}"> <div><b>${i18n.t('data')}:</b> <span>${this._outputData}</span></div>
<div id="outputMessage">${i18n.t('no-qr-detected')}</div> ` : html`
<div hidden><b>${i18n.t('data')}:</b> <span id="outputData"></span></div> <div>${i18n.t('no-qr-detected')}</div>
`}
</div> </div>
</div> </div>
<div class="${classMap({hidden: hasDevices})}"> <div class="${classMap({hidden: hasDevices})}">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment