- add: createPushSubscription :
'Subscribed to FreePlanet.app!', 'You can now receive Notification and Messages.'
This commit is contained in:
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
import { register } from 'register-service-worker'
|
import { register } from 'register-service-worker'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
register(process.env.SERVICE_WORKER_FILE, {
|
register(process.env.SERVICE_WORKER_FILE, {
|
||||||
ready() {
|
ready() {
|
||||||
console.log('READY::: App is being served from cache by a service worker.')
|
console.log('READY::: App is being served from cache by a service worker.')
|
||||||
@@ -12,7 +14,6 @@ register(process.env.SERVICE_WORKER_FILE, {
|
|||||||
|
|
||||||
registered(registration) { // registration -> a ServiceWorkerRegistration instance
|
registered(registration) { // registration -> a ServiceWorkerRegistration instance
|
||||||
console.log('REGISTERED::: !!!', process.env.SERVICE_WORKER_FILE)
|
console.log('REGISTERED::: !!!', process.env.SERVICE_WORKER_FILE)
|
||||||
|
|
||||||
},
|
},
|
||||||
cached(registration) {
|
cached(registration) {
|
||||||
console.log('CACHED::: Content has been cached for offline use.')
|
console.log('CACHED::: Content has been cached for offline use.')
|
||||||
|
|||||||
41
src/App.scss
Normal file
41
src/App.scss
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
.fade-enter-active, .fade-leave-active {
|
||||||
|
transition: opacity .2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */
|
||||||
|
{
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-enter {
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-enter-active {
|
||||||
|
animation: slide-in 0.2s ease-out forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-leave {
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide-leave-active {
|
||||||
|
animation: slide-out 0.5s ease-out forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slide-in {
|
||||||
|
from {
|
||||||
|
transform: translateX(-500px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slide-out {
|
||||||
|
from {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: translateX(1600px);
|
||||||
|
}
|
||||||
|
}
|
||||||
55
src/App.ts
Normal file
55
src/App.ts
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
import Vue from 'vue'
|
||||||
|
import { Component } from 'vue-property-decorator'
|
||||||
|
import { UserStore } from '@store'
|
||||||
|
import { EventBus, RootState, storeBuilder, DebugMode } from '@store'
|
||||||
|
import router from './router'
|
||||||
|
|
||||||
|
import $ from 'jquery'
|
||||||
|
|
||||||
|
import Header from './components/Header.vue'
|
||||||
|
|
||||||
|
import globalroutines from './globalroutines/index'
|
||||||
|
import { GlobalStore } from "./store/Modules"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
components: {
|
||||||
|
appHeader: Header
|
||||||
|
},
|
||||||
|
router
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
export default class App extends Vue {
|
||||||
|
public backgroundColor = 'whitesmoke'
|
||||||
|
public isSubscribed = false
|
||||||
|
public $q
|
||||||
|
|
||||||
|
|
||||||
|
created() {
|
||||||
|
if (process.env.DEV) {
|
||||||
|
console.info('SESSIONE IN SVILUPPO ! (DEV)')
|
||||||
|
console.info(process.env)
|
||||||
|
}
|
||||||
|
if (process.env.PROD) {
|
||||||
|
console.info('SESSIONE IN PRODUZIONE!')
|
||||||
|
console.info(process.env)
|
||||||
|
}
|
||||||
|
|
||||||
|
UserStore.actions.autologin()
|
||||||
|
.then((loginEseguito) => {
|
||||||
|
if (loginEseguito) {
|
||||||
|
globalroutines(this, 'loadapp', '')
|
||||||
|
// this.$router.replace('/')
|
||||||
|
|
||||||
|
// Create Subscription to Push Notification
|
||||||
|
GlobalStore.actions.createPushSubscription()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
90
src/App.vue
90
src/App.vue
@@ -15,92 +15,8 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts" src="./App.ts">
|
||||||
import Vue from "vue"
|
|
||||||
import { Component } from 'vue-property-decorator'
|
|
||||||
import { UserStore } from '@store'
|
|
||||||
import { EventBus, RootState, storeBuilder, DebugMode } from '@store'
|
|
||||||
import router from "./router"
|
|
||||||
|
|
||||||
import $ from "jquery"
|
|
||||||
|
|
||||||
import Header from './components/Header.vue'
|
|
||||||
|
|
||||||
import globalroutines from './globalroutines/index'
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
components: {
|
|
||||||
appHeader: Header,
|
|
||||||
},
|
|
||||||
router
|
|
||||||
})
|
|
||||||
export default class App extends Vue {
|
|
||||||
public backgroundColor = 'whitesmoke'
|
|
||||||
|
|
||||||
created() {
|
|
||||||
//this.title = 'My Vue and CosmosDB Heroes App'
|
|
||||||
if (process.env.DEV) {
|
|
||||||
console.info("SESSIONE IN SVILUPPO ! (DEV)")
|
|
||||||
console.info(process.env)
|
|
||||||
}
|
|
||||||
if (process.env.PROD) {
|
|
||||||
console.info("SESSIONE IN PRODUZIONE!")
|
|
||||||
console.info(process.env)
|
|
||||||
}
|
|
||||||
|
|
||||||
UserStore.actions.autologin()
|
|
||||||
.then((loginEseguito) => {
|
|
||||||
if (loginEseguito) {
|
|
||||||
globalroutines(this, 'loadapp', '')
|
|
||||||
// this.$router.replace('/')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
<style>
|
@import './App.scss';
|
||||||
|
|
||||||
.fade-enter-active, .fade-leave-active {
|
|
||||||
transition: opacity .2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */
|
|
||||||
{
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.slide-enter {
|
|
||||||
}
|
|
||||||
|
|
||||||
.slide-enter-active {
|
|
||||||
animation: slide-in 0.2s ease-out forwards;
|
|
||||||
}
|
|
||||||
|
|
||||||
.slide-leave {
|
|
||||||
}
|
|
||||||
|
|
||||||
.slide-leave-active {
|
|
||||||
animation: slide-out 0.5s ease-out forwards;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes slide-in {
|
|
||||||
from {
|
|
||||||
transform: translateX(-500px);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
transform: translateX(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes slide-out {
|
|
||||||
from {
|
|
||||||
transform: translateX(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
to {
|
|
||||||
transform: translateX(1600px);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import objectId from "./objectId";
|
||||||
|
|
||||||
console.log('utility.js')
|
console.log('utility.js')
|
||||||
|
|
||||||
// var dbPromise = idb.open('mydb1', 1, function (db) {
|
// var dbPromise = idb.open('mydb1', 1, function (db) {
|
||||||
@@ -79,3 +81,5 @@ function dataURItoBlob(dataURI) {
|
|||||||
var blob = new Blob([ab], { type: mimeString });
|
var blob = new Blob([ab], { type: mimeString });
|
||||||
return blob;
|
return blob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default urlBase64ToUint8Array
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ export interface IPost {
|
|||||||
|
|
||||||
export interface IGlobalState {
|
export interface IGlobalState {
|
||||||
conta: number
|
conta: number
|
||||||
|
isSubscribed: boolean
|
||||||
isLoginPage: boolean
|
isLoginPage: boolean
|
||||||
layoutNeeded: boolean
|
layoutNeeded: boolean
|
||||||
mobileMode: boolean
|
mobileMode: boolean
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ export default class Home extends Vue {
|
|||||||
|
|
||||||
created() {
|
created() {
|
||||||
// console.log('Home created...')
|
// console.log('Home created...')
|
||||||
|
|
||||||
|
GlobalStore.actions.prova()
|
||||||
}
|
}
|
||||||
|
|
||||||
mystilecard() {
|
mystilecard() {
|
||||||
@@ -37,6 +39,7 @@ export default class Home extends Vue {
|
|||||||
get conta() {
|
get conta() {
|
||||||
return GlobalStore.state.conta
|
return GlobalStore.state.conta
|
||||||
}
|
}
|
||||||
|
|
||||||
set conta(valore) {
|
set conta(valore) {
|
||||||
GlobalStore.actions.setConta(valore)
|
GlobalStore.actions.setConta(valore)
|
||||||
let my = this.$q.i18n.lang
|
let my = this.$q.i18n.lang
|
||||||
@@ -93,30 +96,30 @@ export default class Home extends Vue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
urlBase64ToUint8Array(base64String) {
|
urlBase64ToUint8Array(base64String) {
|
||||||
let padding = '='.repeat((4 - base64String.length % 4) % 4);
|
let padding = '='.repeat((4 - base64String.length % 4) % 4)
|
||||||
let base64 = (base64String + padding)
|
let base64 = (base64String + padding)
|
||||||
.replace(/\-/g, '+')
|
.replace(/\-/g, '+')
|
||||||
.replace(/_/g, '/');
|
.replace(/_/g, '/')
|
||||||
|
|
||||||
let rawData = window.atob(base64);
|
let rawData = window.atob(base64)
|
||||||
let outputArray = new Uint8Array(rawData.length);
|
let outputArray = new Uint8Array(rawData.length)
|
||||||
|
|
||||||
for (let i = 0; i < rawData.length; ++i) {
|
for (let i = 0; i < rawData.length; ++i) {
|
||||||
outputArray[i] = rawData.charCodeAt(i);
|
outputArray[i] = rawData.charCodeAt(i)
|
||||||
}
|
}
|
||||||
return outputArray;
|
return outputArray
|
||||||
}
|
}
|
||||||
|
|
||||||
dataURItoBlob(dataURI) {
|
dataURItoBlob(dataURI) {
|
||||||
let byteString = atob(dataURI.split(',')[1]);
|
let byteString = atob(dataURI.split(',')[1])
|
||||||
let mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
|
let mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
|
||||||
let ab = new ArrayBuffer(byteString.length);
|
let ab = new ArrayBuffer(byteString.length)
|
||||||
let ia = new Uint8Array(ab);
|
let ia = new Uint8Array(ab)
|
||||||
for (let i = 0; i < byteString.length; i++) {
|
for (let i = 0; i < byteString.length; i++) {
|
||||||
ia[i] = byteString.charCodeAt(i);
|
ia[i] = byteString.charCodeAt(i)
|
||||||
}
|
}
|
||||||
let blob = new Blob([ab], { type: mimeString });
|
let blob = new Blob([ab], { type: mimeString })
|
||||||
return blob;
|
return blob
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -142,7 +145,7 @@ export default class Home extends Vue {
|
|||||||
|
|
||||||
navigator.serviceWorker.ready
|
navigator.serviceWorker.ready
|
||||||
.then(function (swreg) {
|
.then(function (swreg) {
|
||||||
swreg.showNotification(mythis.$t('notification.title_subscribed'), options)
|
swreg.showNotification('aaa', options)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -164,54 +167,6 @@ export default class Home extends Vue {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
configurePushSub() {
|
|
||||||
if (!('serviceWorker' in navigator)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('configurePushSub')
|
|
||||||
|
|
||||||
let reg
|
|
||||||
const mythis = this
|
|
||||||
const mykey = process.env.PUBLICKEY_PUSH
|
|
||||||
navigator.serviceWorker.ready
|
|
||||||
.then(function(swreg) {
|
|
||||||
reg = swreg
|
|
||||||
return swreg.pushManager.getSubscription()
|
|
||||||
})
|
|
||||||
.then(function(sub) {
|
|
||||||
if (sub === null) {
|
|
||||||
// Create a new subscription
|
|
||||||
let convertedVapidPublicKey = mythis.urlBase64ToUint8Array(mykey)
|
|
||||||
return reg.pushManager.subscribe({
|
|
||||||
userVisibleOnly: true,
|
|
||||||
applicationServerKey: convertedVapidPublicKey
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
// We have a subscription
|
|
||||||
return sub
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.then(function(newSub) {
|
|
||||||
console.log('Body newSubscription: ', newSub)
|
|
||||||
return fetch(process.env.MONGODB_HOST + '/subscribe', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Accept': 'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify(newSub)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.then(function(res) {
|
|
||||||
if (res.ok) {
|
|
||||||
mythis.showNotificationExample()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(function(err) {
|
|
||||||
console.log(err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
test_fetch() {
|
test_fetch() {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<q-btn v-if="getPermission() !== 'granted'" class="enable-notifications" color="primary" rounded size="lg" icon="notifications" @click="askfornotification" :label="$t('notification.ask')"/>
|
<q-btn v-if="getPermission() !== 'granted'" class="enable-notifications" color="primary" rounded size="lg" icon="notifications" @click="askfornotification" :label="$t('notification.ask')"/>
|
||||||
<q-btn v-if="getPermission() === 'granted'" class="enable-notifications" color="primary" rounded size="lg" icon="notifications" @click="showNotificationExample" label="Send Notification"/>
|
<q-btn v-if="getPermission() === 'granted'" class="enable-notifications" color="primary" rounded size="lg" icon="notifications" @click="showNotificationExample" label="Send Notification"/>
|
||||||
<q-btn v-if="getPermission() === 'granted'" class="enable-notifications" color="secondary" rounded size="lg" icon="notifications" @click="configurePushSub" label="Send Push Notification !"/>
|
<!--<q-btn v-if="getPermission() === 'granted'" class="enable-notifications" color="secondary" rounded size="lg" icon="notifications" @click="createPushSubscription" label="Create Push Subscription !"/>-->
|
||||||
<br>
|
<br>
|
||||||
<div>
|
<div>
|
||||||
<q-chip square color="secondary">
|
<q-chip square color="secondary">
|
||||||
|
|||||||
@@ -1,9 +1,16 @@
|
|||||||
import { IGlobalState } from 'model'
|
import { IGlobalState } from 'model'
|
||||||
import { storeBuilder } from './Store/Store'
|
import { storeBuilder } from './Store/Store'
|
||||||
|
|
||||||
|
import Vue from 'vue'
|
||||||
|
|
||||||
|
import urlBase64ToUint8Array from '../../js/utility'
|
||||||
|
|
||||||
|
import messages from '../../statics/i18n'
|
||||||
|
import { UserStore } from "@store"
|
||||||
|
|
||||||
const state: IGlobalState = {
|
const state: IGlobalState = {
|
||||||
conta: 0,
|
conta: 0,
|
||||||
|
isSubscribed: false,
|
||||||
isLoginPage: false,
|
isLoginPage: false,
|
||||||
layoutNeeded: true,
|
layoutNeeded: true,
|
||||||
mobileMode: false,
|
mobileMode: false,
|
||||||
@@ -70,8 +77,109 @@ namespace Actions {
|
|||||||
Mutations.mutations.setConta(num)
|
Mutations.mutations.setConta(num)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createPushSubscription(context) {
|
||||||
|
if (!('serviceWorker' in navigator)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('createPushSubscription')
|
||||||
|
|
||||||
|
let reg
|
||||||
|
const mykey = process.env.PUBLICKEY_PUSH
|
||||||
|
const mystate = state
|
||||||
|
navigator.serviceWorker.ready
|
||||||
|
.then(function (swreg) {
|
||||||
|
reg = swreg
|
||||||
|
return swreg.pushManager.getSubscription()
|
||||||
|
})
|
||||||
|
.then(function (subscription) {
|
||||||
|
mystate.isSubscribed = !(subscription === null)
|
||||||
|
|
||||||
|
if (mystate.isSubscribed) {
|
||||||
|
console.log('User is already Subscribed!')
|
||||||
|
} else {
|
||||||
|
// Create a new subscription
|
||||||
|
let convertedVapidPublicKey = urlBase64ToUint8Array(mykey)
|
||||||
|
return reg.pushManager.subscribe({
|
||||||
|
userVisibleOnly: true,
|
||||||
|
applicationServerKey: convertedVapidPublicKey
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(function (newSub) {
|
||||||
|
if (newSub) {
|
||||||
|
saveNewSubscriptionToServer(context, newSub)
|
||||||
|
mystate.isSubscribed = true;
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
})
|
||||||
|
.catch(function (err) {
|
||||||
|
console.log(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calling the Server to Save in the MongoDB the Subscriber
|
||||||
|
function saveNewSubscriptionToServer(context, newSub) {
|
||||||
|
console.log('saveSubscriptionToServer: ', newSub)
|
||||||
|
console.log('context', context)
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
title: t('notification.title_subscribed'),
|
||||||
|
content: t('notification.subscribed'),
|
||||||
|
openUrl: '/'
|
||||||
|
}
|
||||||
|
|
||||||
|
let myres = {
|
||||||
|
options: { ...options },
|
||||||
|
subs: newSub
|
||||||
|
}
|
||||||
|
|
||||||
|
return fetch(process.env.MONGODB_HOST + '/subscribe', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(myres)
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function t(params) {
|
||||||
|
let msg = params.split('.')
|
||||||
|
let lang = UserStore.state.lang
|
||||||
|
|
||||||
|
let stringa = messages[lang]
|
||||||
|
|
||||||
|
let ris = stringa
|
||||||
|
msg.forEach(param => {
|
||||||
|
ris = ris[param]
|
||||||
|
})
|
||||||
|
|
||||||
|
return ris
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function prova(context) {
|
||||||
|
// console.log('prova')
|
||||||
|
|
||||||
|
// let msg = t('notification.title_subscribed')
|
||||||
|
|
||||||
|
// console.log('msg', msg)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadAfterLogin (context) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export const actions = {
|
export const actions = {
|
||||||
setConta: b.dispatch(setConta)
|
setConta: b.dispatch(setConta),
|
||||||
|
createPushSubscription: b.dispatch(createPushSubscription),
|
||||||
|
loadAfterLogin: b.dispatch(loadAfterLogin),
|
||||||
|
prova: b.dispatch(prova)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -496,6 +496,8 @@ namespace Actions {
|
|||||||
GlobalStore.mutations.setleftDrawerOpen(localStorage.getItem(rescodes.localStorage.leftDrawerOpen) === 'true')
|
GlobalStore.mutations.setleftDrawerOpen(localStorage.getItem(rescodes.localStorage.leftDrawerOpen) === 'true')
|
||||||
GlobalStore.mutations.setCategorySel(localStorage.getItem(rescodes.localStorage.categorySel))
|
GlobalStore.mutations.setCategorySel(localStorage.getItem(rescodes.localStorage.categorySel))
|
||||||
|
|
||||||
|
GlobalStore.actions.loadAfterLogin()
|
||||||
|
|
||||||
Todos.actions.dbLoadTodo(true)
|
Todos.actions.dbLoadTodo(true)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
import { Component, Prop, Watch } from 'vue-property-decorator'
|
import { Component, Prop, Watch } from 'vue-property-decorator'
|
||||||
import { UserStore } from '@store'
|
import { GlobalStore, UserStore } from '@store'
|
||||||
import { rescodes } from '../../../store/Modules/rescodes'
|
import { rescodes } from '../../../store/Modules/rescodes'
|
||||||
import { serv_constants } from '../../../store/Modules/serv_constants'
|
import { serv_constants } from '../../../store/Modules/serv_constants'
|
||||||
|
|
||||||
@@ -120,6 +120,8 @@ export default class Signin extends Vue {
|
|||||||
if (riscode === rescodes.OK) {
|
if (riscode === rescodes.OK) {
|
||||||
router.push('/signin')
|
router.push('/signin')
|
||||||
globalroutines(this, 'loadapp', '')
|
globalroutines(this, 'loadapp', '')
|
||||||
|
|
||||||
|
GlobalStore.actions.createPushSubscription()
|
||||||
}
|
}
|
||||||
this.checkErrors(riscode)
|
this.checkErrors(riscode)
|
||||||
this.$q.loading.hide()
|
this.$q.loading.hide()
|
||||||
|
|||||||
Reference in New Issue
Block a user