/** * Composable de lecture des modules actifs (source : `/api/modules`). * * State singleton au niveau module : `useSidebar` suit la meme convention. * Chargement idempotent via le flag `loaded`, reset automatique au logout * via `onAuthSessionCleared` (cf. CLAUDE.md : « composables avec state * singleton doivent etre reinitialises au logout »). */ import { ref } from 'vue' import { onAuthSessionCleared } from '~/shared/stores/auth' const activeModuleIds = ref([]) const loaded = ref(false) function resetModulesState(): void { activeModuleIds.value = [] loaded.value = false } onAuthSessionCleared(resetModulesState) export function useModules() { async function loadModules() { try { const api = useApi() const data = await api.get<{ modules: string[] }>( '/modules', {}, { toast: false }, ) activeModuleIds.value = data.modules ?? [] loaded.value = true } catch { // Swallow volontaire aligne sur useSidebar : un echec reseau ne // doit pas bloquer le rendu, l'app affichera juste sans la // granularite module (selector masque par defaut). activeModuleIds.value = [] loaded.value = true } } function isModuleActive(id: string): boolean { return activeModuleIds.value.includes(id) } function resetModules() { resetModulesState() } return { activeModuleIds, loaded, loadModules, isModuleActive, resetModules, } }