2022-09-15 19:15:07 +02:00
|
|
|
<template>
|
2022-11-14 14:21:59 +01:00
|
|
|
<div v-if="!userLoaded" class="bg-neutral-100 dark:bg-neutral-900 text-primary h-screen flex justify-center items-center">
|
|
|
|
<div>
|
|
|
|
<Icon size="4em" name="ion:load-c" class="animate-spin" />
|
|
|
|
<h2 class="mt-2 font-bold">Loading...</h2>
|
|
|
|
</div>
|
2022-09-20 15:53:44 +02:00
|
|
|
</div>
|
2022-12-04 11:57:53 +01:00
|
|
|
<div v-else class="">
|
2022-09-20 15:53:44 +02:00
|
|
|
<div v-if="isAuthenticated" class="bg-neutral-100 dark:bg-neutral-900 text-primary h-screen flex flex-col">
|
|
|
|
<LayoutTopbar />
|
|
|
|
<div class="overflow-y-auto pt-3">
|
|
|
|
<NuxtPage />
|
|
|
|
</div>
|
|
|
|
<LayoutNavbar class="mt-auto" />
|
|
|
|
</div>
|
|
|
|
<div v-else class="bg-neutral-100 dark:bg-neutral-900 text-primary h-screen flex flex-col">
|
|
|
|
<Login />
|
2022-09-19 15:11:13 +02:00
|
|
|
</div>
|
2022-09-15 19:15:07 +02:00
|
|
|
</div>
|
2022-09-19 09:36:47 +02:00
|
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
2022-09-22 16:39:11 +02:00
|
|
|
import { doc, getFirestore, serverTimestamp, writeBatch, collection, getDoc } from "firebase/firestore";
|
2022-09-20 15:53:44 +02:00
|
|
|
import { getAuth, onAuthStateChanged, signInWithEmailAndPassword } from "firebase/auth";
|
2022-09-30 21:17:12 +02:00
|
|
|
import { getMessaging, getToken, onMessage } from "firebase/messaging";
|
|
|
|
import { PushNotifications } from '@capacitor/push-notifications';
|
2022-09-30 14:24:36 +02:00
|
|
|
import { Device } from '@capacitor/device';
|
2022-11-14 14:41:41 +01:00
|
|
|
import { useToast } from 'vue-toastification'
|
2022-09-19 09:36:47 +02:00
|
|
|
|
|
|
|
const db = getFirestore()
|
2022-09-20 15:53:44 +02:00
|
|
|
const route = useRoute()
|
2022-11-14 14:41:41 +01:00
|
|
|
const toast = useToast()
|
2022-09-20 15:53:44 +02:00
|
|
|
|
|
|
|
const isAuthenticated = ref(false)
|
|
|
|
const user = ref('frikandel')
|
2022-11-13 19:48:40 +01:00
|
|
|
const registrationToken = ref('')
|
2022-09-20 15:53:44 +02:00
|
|
|
const auth = ref(null)
|
|
|
|
const userLoaded = ref(false)
|
2022-09-22 16:39:11 +02:00
|
|
|
const userData = ref(null)
|
|
|
|
const userPersons = ref([])
|
2022-09-26 16:23:45 +02:00
|
|
|
const userAllPersons = ref([])
|
2022-09-27 16:00:09 +02:00
|
|
|
const calEvents = ref([])
|
2022-09-27 17:33:00 +02:00
|
|
|
const news = ref(null)
|
2022-12-04 10:29:11 +01:00
|
|
|
const contestTimes = ref(null)
|
|
|
|
const competitors = ref([])
|
2022-09-20 15:53:44 +02:00
|
|
|
|
2022-10-01 13:40:29 +02:00
|
|
|
const messaging = ref(null)
|
2022-09-30 14:24:36 +02:00
|
|
|
|
2022-09-20 15:53:44 +02:00
|
|
|
onMounted(() => {
|
|
|
|
auth.value = getAuth()
|
|
|
|
|
2022-09-30 21:17:12 +02:00
|
|
|
if (process.client) {
|
2022-10-01 13:25:56 +02:00
|
|
|
if ('serviceWorker' in navigator && window.isSecureContext) {
|
2022-10-04 17:06:49 +02:00
|
|
|
Device.getInfo().then(info => {
|
|
|
|
if (info.platform === 'web') registerSW()
|
2022-10-01 13:40:29 +02:00
|
|
|
});
|
2022-10-04 17:06:49 +02:00
|
|
|
|
2022-10-01 13:25:56 +02:00
|
|
|
}
|
2022-09-30 21:17:12 +02:00
|
|
|
}
|
|
|
|
|
2022-09-22 16:39:11 +02:00
|
|
|
onAuthStateChanged(auth.value, async (usr) => {
|
2022-09-20 15:53:44 +02:00
|
|
|
if (usr) {
|
|
|
|
user.value = usr
|
2022-09-22 16:39:11 +02:00
|
|
|
|
|
|
|
let docRef = doc(db, "users", user.value.uid);
|
|
|
|
let docSnap = await getDoc(docRef);
|
|
|
|
|
|
|
|
if (docSnap.exists()) {
|
|
|
|
const data = docSnap.data()
|
|
|
|
userData.value = data
|
|
|
|
getPersons(userData.value.relatiecodes)
|
|
|
|
}
|
|
|
|
|
2022-09-27 17:33:00 +02:00
|
|
|
if (!userData.value.sendNews && route.path === '/news/newmessage') navigateTo('/')
|
|
|
|
if (!userData.value.admin && route.path.startsWith('/settings/admin')) navigateTo('/')
|
|
|
|
|
2022-09-22 16:39:11 +02:00
|
|
|
isAuthenticated.value = true
|
|
|
|
|
2022-09-30 14:24:36 +02:00
|
|
|
logDeviceInfo()
|
2022-09-29 16:34:00 +02:00
|
|
|
|
2022-09-20 15:53:44 +02:00
|
|
|
} else {
|
|
|
|
isAuthenticated.value = false
|
|
|
|
user.value = null
|
2022-09-22 16:39:11 +02:00
|
|
|
userData.value = null
|
|
|
|
userPersons.value = []
|
2022-09-20 15:53:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
userLoaded.value = true
|
|
|
|
})
|
|
|
|
})
|
2022-09-19 09:36:47 +02:00
|
|
|
|
2022-09-22 16:39:11 +02:00
|
|
|
const getPersons = async (persons) => {
|
|
|
|
userPersons.value = [];
|
|
|
|
|
|
|
|
for (let i = 0; i < persons.length; i++) {
|
|
|
|
const docRef = doc(db, "ledenlijst", persons[i]);
|
|
|
|
const docSnap = await getDoc(docRef);
|
2022-09-19 09:36:47 +02:00
|
|
|
|
2022-09-22 16:39:11 +02:00
|
|
|
if (docSnap.exists()) {
|
|
|
|
userPersons.value.push(docSnap.data())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-29 16:34:00 +02:00
|
|
|
const setupNotifications = () => {
|
|
|
|
console.log('Initializing HomePage');
|
|
|
|
|
|
|
|
// Request permission to use push notifications
|
|
|
|
// iOS will prompt user and return if they granted permission or not
|
|
|
|
// Android will just grant without prompting
|
|
|
|
PushNotifications.requestPermissions().then(result => {
|
|
|
|
if (result.receive === 'granted') {
|
|
|
|
// Register with Apple / Google to receive push via APNS/FCM
|
2022-11-14 14:41:41 +01:00
|
|
|
PushNotifications.register()
|
2022-09-29 16:34:00 +02:00
|
|
|
} else {
|
2022-11-14 14:41:41 +01:00
|
|
|
toast.error('Error tijdens het registrenen van push notificaties')
|
2022-09-29 16:34:00 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// On success, we should be able to receive notifications
|
|
|
|
PushNotifications.addListener('registration',
|
|
|
|
(token) => {
|
2022-11-07 15:29:15 +01:00
|
|
|
// alert('Push registration success, token: ' + token.value);
|
2022-11-14 14:41:41 +01:00
|
|
|
registrationToken.value = token
|
2022-11-13 20:00:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
fetch('https://api.xeovalyte.com/subscribetotopic', {
|
|
|
|
method: 'POST',
|
|
|
|
headers: {
|
|
|
|
Authorization: 'Basic WGVvdmFseXRlOmtNKjhuRXMzNTchalJlXm1KYnZrRSFOIw==',
|
|
|
|
'content-type': 'application/json'
|
|
|
|
},
|
2022-11-13 20:13:40 +01:00
|
|
|
body: JSON.stringify({ topic: 'all', registrationToken: token.value })
|
2022-11-13 20:00:29 +01:00
|
|
|
}).then(response => response.json())
|
|
|
|
.then(response => {
|
|
|
|
console.log(response)
|
|
|
|
})
|
|
|
|
.catch(err => {
|
|
|
|
console.log(err)
|
2022-11-14 14:41:41 +01:00
|
|
|
toast.error('Error tijdens het registreren van push notificaties')
|
2022-11-13 20:00:29 +01:00
|
|
|
});
|
2022-09-29 16:34:00 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
// Some issue with our setup and push will not work
|
|
|
|
PushNotifications.addListener('registrationError',
|
|
|
|
(error) => {
|
2022-11-14 14:41:41 +01:00
|
|
|
toast.error('Error tijdens het registreren van push notificaties')
|
|
|
|
|
|
|
|
console.log(error)
|
2022-09-29 16:34:00 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
// Show us the notification payload if the app is open on our device
|
|
|
|
PushNotifications.addListener('pushNotificationReceived',
|
|
|
|
(notification) => {
|
2022-11-07 15:29:15 +01:00
|
|
|
|
2022-11-14 14:41:41 +01:00
|
|
|
toast.info(`${notification.title}`, {
|
|
|
|
onClick: () => navigateTo('/news')
|
2022-11-07 15:29:15 +01:00
|
|
|
})
|
2022-11-14 14:41:41 +01:00
|
|
|
|
2022-09-29 16:34:00 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
// Method called when tapping on a notification
|
|
|
|
PushNotifications.addListener('pushNotificationActionPerformed',
|
|
|
|
(notification) => {
|
2022-11-07 15:29:15 +01:00
|
|
|
navigateTo('/news')
|
2022-09-29 16:34:00 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-09-30 21:17:12 +02:00
|
|
|
const registerFCM = () => {
|
2022-10-01 13:40:29 +02:00
|
|
|
getToken(messaging.value, { vapidKey: 'BI7l3nyGV6wJcFh7wrwmQ42W7RSXl46bmhXZJmDd4P-0K_JFP0ClTqjO-rr5H5DXBbmVR4kXwxFpUlo_d6cUy4Q' }).then((currentToken) => {
|
2022-09-30 21:17:12 +02:00
|
|
|
if (currentToken) {
|
|
|
|
console.log(currentToken)
|
2022-11-08 14:41:39 +01:00
|
|
|
fetch('https://api.xeovalyte.com/subscribetotopic', {
|
|
|
|
method: 'POST',
|
|
|
|
headers: {
|
|
|
|
Authorization: 'Basic WGVvdmFseXRlOmtNKjhuRXMzNTchalJlXm1KYnZrRSFOIw==',
|
|
|
|
'content-type': 'application/json'
|
|
|
|
},
|
|
|
|
body: JSON.stringify({ topic: 'all', registrationToken: currentToken })
|
|
|
|
}).then(response => response.json())
|
|
|
|
.then(response => {
|
|
|
|
console.log(response)
|
|
|
|
})
|
|
|
|
.catch(err => {
|
|
|
|
console.log(err)
|
|
|
|
});
|
2022-09-30 21:17:12 +02:00
|
|
|
} else {
|
|
|
|
// Show permission request UI
|
|
|
|
console.log('No registration token available. Request permission to generate one.');
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
}).catch((err) => {
|
|
|
|
console.log('An error occurred while retrieving token. ', err);
|
|
|
|
// ...
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-10-04 17:06:49 +02:00
|
|
|
const registerSW = () => {
|
|
|
|
messaging.value = getMessaging()
|
|
|
|
navigator.serviceWorker.register('/sw.js').catch(e => alert(e));
|
|
|
|
|
|
|
|
onMessage(messaging.value, (payload) => {
|
|
|
|
console.log('Message received. ', payload);
|
|
|
|
|
2022-11-14 14:41:41 +01:00
|
|
|
toast.info(`${payload.notification.title}`, {
|
|
|
|
onClick: () => navigateTo('/news')
|
2022-11-07 15:29:15 +01:00
|
|
|
})
|
|
|
|
|
2022-10-04 17:06:49 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-09-30 14:24:36 +02:00
|
|
|
const logDeviceInfo = async () => {
|
|
|
|
const info = await Device.getInfo();
|
|
|
|
|
|
|
|
console.log(info);
|
|
|
|
|
|
|
|
if (info.platform !== 'web') setupNotifications()
|
2022-09-30 21:17:12 +02:00
|
|
|
else registerFCM()
|
2022-09-30 14:24:36 +02:00
|
|
|
};
|
|
|
|
|
2022-09-22 16:39:11 +02:00
|
|
|
const ledenlijst = ref([])
|
2022-09-19 15:11:13 +02:00
|
|
|
|
2022-12-04 10:29:11 +01:00
|
|
|
provide('firebase', { db, ledenlijst, isAuthenticated, user, userData, userPersons, auth, userAllPersons, getPersons, calEvents, news, registrationToken, contestTimes, competitors })
|
2022-11-13 19:48:40 +01:00
|
|
|
</script>
|
2022-12-04 10:29:11 +01:00
|
|
|
|
2022-12-04 11:57:53 +01:00
|
|
|
<style scoped>
|
2022-12-04 10:29:11 +01:00
|
|
|
.body {
|
2022-12-04 11:57:53 +01:00
|
|
|
padding-top: 10px;
|
2022-12-04 10:29:11 +01:00
|
|
|
margin-bottom: env(safe-area-inset-bottom);
|
|
|
|
}
|
|
|
|
|
|
|
|
</style>
|