188 lines
5.7 KiB
Vue
188 lines
5.7 KiB
Vue
<template>
|
|
<div>
|
|
<div class="q-ma-md" v-if="askForPermission">
|
|
<p>Um den QR-Code scannen zu können, müssen Sie den Zugriff auf Ihre Kamera erlauben.</p>
|
|
|
|
<q-btn @click="toggleCamera(!activateCamera)" :loading="loading" unelevated color="positive" stack
|
|
icon="photo_camera"
|
|
label="QR-Code scannen" class="full-width"/>
|
|
</div>
|
|
<div v-if="activateCamera">
|
|
<qrcode-drop-zone @decode="onDecode" @init="logErrors">
|
|
<qrcode-stream :paused="paused" @decode="onDecode" @init="onInit">
|
|
<div v-if="validating" >
|
|
<div class="light-dimmed fit">
|
|
</div>
|
|
<q-spinner-oval
|
|
class="absolute-center"
|
|
color="primary"
|
|
size="10em"
|
|
/>
|
|
</div>
|
|
</qrcode-stream>
|
|
</qrcode-drop-zone>
|
|
<div class="q-ma-md">
|
|
<q-btn v-if="!askForPermission" @click="toggleCamera(!activateCamera)" :loading="loading" unelevated color="primary" stack
|
|
label="Schließen" class="full-width"/>
|
|
</div>
|
|
</div>
|
|
<qrcode-capture v-if="noStreamApiSupport" @decode="onDecode"/>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'qrscanner',
|
|
data() {
|
|
return {
|
|
askForPermission: true,
|
|
activateCamera: false,
|
|
isValid: false,
|
|
validating: false,
|
|
loading: false,
|
|
paused: false,
|
|
result: null,
|
|
params: null,
|
|
noStreamApiSupport: false
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
async onDecode(content) {
|
|
this.result = content;
|
|
|
|
this.pauseCamera();
|
|
|
|
this.validating = true;
|
|
this.isValid = await this.validate();
|
|
this.validating = false;
|
|
|
|
this.unPauseCamera();
|
|
// window.setTimeout(() => {
|
|
// this.unPauseCamera();
|
|
// }, 2000)
|
|
},
|
|
|
|
validate() {
|
|
return new Promise(resolve => {
|
|
let params = this.setParams();
|
|
if (!params.cacheID || !params.stationID || !params.durchgefuehrterCacheID) {
|
|
console.log(params);
|
|
console.log("Parameter konnten nicht erkannt werden.");
|
|
resolve(false)
|
|
} else {
|
|
this.$axios.get('/api/checkStation', {params})
|
|
.then((response) => {
|
|
console.log("resolve(true)");
|
|
console.log("cache access definition");
|
|
console.log(response.data.cacheAccesDefinition);
|
|
resolve(true);
|
|
if (Number(response.data.cacheAccesDefinition.id) === 0) {
|
|
this.$router.push({path: `/station/${params.cacheID}/${params.stationID}`});
|
|
} else if (Number(response.data.cacheAccesDefinition.id) === 1) {
|
|
this.$router.push({path: `/CacheEnd/${params.cacheID}`});
|
|
}
|
|
}).catch((error) => {
|
|
console.log("resolve(false)");
|
|
// Error
|
|
let msg;
|
|
let title;
|
|
if (error.response) {
|
|
// The request was made and the server responded with a status code
|
|
title = "Problem with response!";
|
|
msg = error.response.data.message
|
|
? error.response.data.message
|
|
: error.response.data;
|
|
} else if (error.request) {
|
|
// The request was made but no response was received
|
|
title = "Problem with request!";
|
|
msg = "Der Server antwortet nicht."
|
|
console.log(error.request);
|
|
} else {
|
|
// Something happened in setting up the request that triggered an Error
|
|
title = "Error";
|
|
msg = error.message;
|
|
console.log('Error', error.message.data);
|
|
}
|
|
console.log(error.config);
|
|
this.$store.commit('dialog/NEW_MESSAGE_DIALOG', {message: msg, title: title,});
|
|
resolve(false);
|
|
});
|
|
}
|
|
})
|
|
},
|
|
|
|
setParams() {
|
|
console.log("setParams: ");
|
|
let params = {};
|
|
params.cacheID = this.result.split('/')[0];
|
|
params.stationID = this.result.split('/')[1];
|
|
params.durchgefuehrterCacheID = params.cacheID;
|
|
console.log(params.cacheID + " und " + params.stationID);
|
|
if (localStorage.getItem('userToken')) {
|
|
params.token = JSON.parse(localStorage.getItem('userToken')).token;
|
|
}
|
|
this.updateProps()
|
|
console.log("emitted params!")
|
|
return params;
|
|
},
|
|
|
|
updateProps() {
|
|
this.$emit('result', this.params)
|
|
},
|
|
updateCameraState() {
|
|
this.$emit('camera', this.activateCamera)
|
|
},
|
|
|
|
pauseCamera() {
|
|
this.paused = true
|
|
},
|
|
|
|
unPauseCamera() {
|
|
this.paused = false
|
|
},
|
|
|
|
toggleCamera(bool) {
|
|
this.activateCamera = bool;
|
|
if (this.askForPermission === false) {
|
|
this.askForPermission = true;
|
|
}
|
|
this.updateCameraState();
|
|
},
|
|
|
|
logErrors(promise) {
|
|
promise.catch(console.error)
|
|
},
|
|
|
|
async onInit(promise) {
|
|
this.loading = true;
|
|
try {
|
|
await promise
|
|
} catch (error) {
|
|
if (error.name === 'StreamApiNotSupportedError') {
|
|
this.noStreamApiSupport = true
|
|
}
|
|
} finally {
|
|
this.loading = false;
|
|
this.askForPermission = false;
|
|
}
|
|
}
|
|
},
|
|
beforeRouteUpdate(to, from, next) {
|
|
this.askForPermission = true;
|
|
this.activateCamera = false;
|
|
this.isValid = false;
|
|
this.validating = false;
|
|
this.loading = false;
|
|
this.paused = false;
|
|
this.result = null;
|
|
this.params = null;
|
|
this.noStreamApiSupport = false;
|
|
next()
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
</style>
|