zammad/app/frontend/shared/composables/authentication/useAuthenticationUpdates.ts
2026-01-02 15:41:09 +02:00

52 lines
1.5 KiB
TypeScript

// Copyright (C) 2012-2026 Zammad Foundation, https://zammad-foundation.org/
import { watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useApplicationStore } from '#shared/stores/application.ts'
import { useAuthenticationStore } from '#shared/stores/authentication.ts'
import { useSessionStore } from '#shared/stores/session.ts'
// Add a watcher for authenticated changes (e.g. login/logout in a other browser tab).
const useAuthenticationChanges = () => {
const session = useSessionStore()
const authentication = useAuthenticationStore()
const application = useApplicationStore()
const router = useRouter()
const route = useRoute()
authentication.$subscribe(async (mutation, state) => {
if (state.authenticated && !session.id) {
session.checkSession().then(async (sessionId) => {
if (sessionId) {
await authentication.refreshAfterAuthentication()
}
if (route.name === 'Login') {
router.replace('/')
}
})
} else if (!state.authenticated && session.id && !state.externalLogout) {
await authentication.clearAuthentication()
router.replace('/login')
}
})
watch(
() => application.config.maintenance_mode,
async (newValue, oldValue) => {
if (
!oldValue &&
newValue &&
authentication.authenticated &&
!session.hasPermission(['admin.maintenance', 'maintenance'])
) {
await authentication.logout()
router.replace('/login')
}
},
)
}
export default useAuthenticationChanges