implemented new polling system for user account changes
This commit is contained in:
@@ -32,7 +32,7 @@ const router = createRouter({
|
||||
// ADMIN / STAFF ROUTES
|
||||
{
|
||||
path: '/administration',
|
||||
meta: { requiresAuth: true, memberOnly: true, roles: ['staff', 'admin'] },
|
||||
meta: { requiresAuth: true, memberOnly: true, roles: ['17th Administrator', '17th HQ', '17th Command'] },
|
||||
children: [
|
||||
{ path: 'applications', component: () => import('@/pages/ManageApplications.vue') },
|
||||
{ path: 'applications/:id', component: () => import('@/pages/ManageApplications.vue') },
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import { ref, computed } from 'vue'
|
||||
import { ref, computed, watch } from 'vue'
|
||||
import { defineStore } from 'pinia'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
|
||||
const POLL_INTERVAL = 10_000
|
||||
|
||||
export const useUserStore = defineStore('user', () => {
|
||||
const user = ref(null)
|
||||
@@ -33,5 +36,57 @@ export const useUserStore = defineStore('user', () => {
|
||||
return requiredRoles.some(r => roles.value.has(r))
|
||||
}
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
watch(user, (newUser) => {
|
||||
if (!newUser) return
|
||||
console.log(newUser);
|
||||
|
||||
const currentRoute = route.meta
|
||||
|
||||
// Member-only route
|
||||
if (currentRoute.memberOnly && state.value !== 'member') {
|
||||
router.replace('/unauthorized')
|
||||
return
|
||||
}
|
||||
|
||||
// Role-based route
|
||||
if (currentRoute.roles && !hasRole('Dev') && !hasAnyRole(currentRoute.roles as string[])) {
|
||||
return '/unauthorized'
|
||||
}
|
||||
},
|
||||
{ deep: true } // deep watch ensures nested changes trigger
|
||||
)
|
||||
|
||||
//polling system
|
||||
let pollTimeout: number | null = null
|
||||
let polling = false;
|
||||
let lastVersion: string | null = null
|
||||
|
||||
async function poll() {
|
||||
// Only poll if tab is visible
|
||||
if (document.hidden) {
|
||||
polling = false;
|
||||
return
|
||||
}
|
||||
|
||||
await loadUser();
|
||||
|
||||
scheduleNext()
|
||||
}
|
||||
|
||||
function scheduleNext() {
|
||||
polling = true;
|
||||
pollTimeout = window.setTimeout(poll, POLL_INTERVAL)
|
||||
}
|
||||
|
||||
poll() //start polling
|
||||
|
||||
document.addEventListener('visibilitychange', () => {
|
||||
if (!document.hidden && polling === false) {
|
||||
poll()
|
||||
}
|
||||
})
|
||||
|
||||
return { user, isLoggedIn, roles, loadUser, loaded, hasAnyRole, hasRole, state }
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user