Files
Coltura/frontend/shared/composables/useSidebar.ts
matthieu fa8e46471d fix(frontend) : auto-reset useSidebar et useModules sur 401/logout
Les deux composables ont un state singleton au niveau module mais
n'etaient reinitialises que dans logout.vue — un 401 silencieux (JWT
expire) laissait la sidebar et la liste de modules actifs de l'ancien
user visible jusqu'a ce qu'un nouveau login complete `loadSidebar()`.

Aligne le pattern sur useAuditLog (deja conforme) : enregistrement
automatique sur `onAuthSessionCleared` au niveau module, via une
fonction `reset*State()` privee reutilisee par la methode publique
`reset*()` exposee dans le composable.

Respect de la regle CLAUDE.md : "composables avec state singleton
doivent etre reinitialises au logout".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 14:21:49 +02:00

59 lines
1.6 KiB
TypeScript

import { ref } from 'vue'
import type { SidebarSection } from '~/shared/types'
import { onAuthSessionCleared } from '~/shared/stores/auth'
const sections = ref<SidebarSection[]>([])
const disabledRoutes = ref<string[]>([])
const loaded = ref(false)
function resetSidebarState(): void {
sections.value = []
disabledRoutes.value = []
loaded.value = false
}
// Auto-enregistrement singleton : purge la sidebar sur 401/logout pour
// eviter qu'un nouvel utilisateur logue sur le meme onglet voie transitoirement
// les items de l'ancienne session (cf. CLAUDE.md : « composables avec state
// singleton doivent etre reinitialises au logout »).
onAuthSessionCleared(resetSidebarState)
export function useSidebar() {
async function loadSidebar() {
try {
const api = useApi()
const data = await api.get<{ sections: SidebarSection[]; disabledRoutes: string[] }>(
'/sidebar',
{},
{ toast: false }
)
sections.value = data.sections ?? []
disabledRoutes.value = data.disabledRoutes ?? []
loaded.value = true
} catch {
sections.value = []
disabledRoutes.value = []
loaded.value = true
}
}
function isRouteDisabled(path: string): boolean {
return disabledRoutes.value.some(
disabled => path === disabled || path.startsWith(disabled + '/')
)
}
function resetSidebar() {
resetSidebarState()
}
return {
sections,
disabledRoutes,
loaded,
loadSidebar,
resetSidebar,
isRouteDisabled,
}
}