fix(sites-front) : refresh state apres switch/delete/401 + redirect logout

- logout.vue : navigateTo('/login') dans le finally, garanti meme si
  auth.logout() rejette.
- auth.ts : systeme de callbacks onAuthSessionCleared appeles par
  clearSession() (intercepteur 401 de useApi). Les composables modules
  s'abonnent pour reset leur state sans que Shared n'importe depuis
  modules/ (Option C validee par CLAUDE.md, module -> shared autorise).
- useCurrentSite.ts : enregistre un reset callback + apres un switch
  reussi, rafraichit useSidebar().loadSidebar() + refreshNuxtData()
  (sinon donnees de page obsoletes cote ancien site sous toast success).
- SiteSelector.vue : le court-circuit "tile deja active" est retire
  pour permettre un PATCH de resync quand un autre onglet a bascule le
  site entre temps. TODO cross-tab : ecouter un storage event dedie.
- sites.vue admin : auth.refreshUser() apres delete pour refleter le
  ON DELETE SET NULL cote user.current_site_id.
- Specs vitest : stub useSidebar/refreshNuxtData, test "tile active"
  retourne sur le nouveau contrat PATCH-toujours.
This commit is contained in:
Matthieu
2026-04-20 16:47:57 +02:00
parent caae752130
commit a15fc83222
7 changed files with 88 additions and 5 deletions

View File

@@ -24,6 +24,14 @@ vi.stubGlobal('useAuthStore', () => ({
vi.stubGlobal('useI18n', () => ({
t: (key: string) => key,
}))
// useSidebar est consomme par useCurrentSite pour rafraichir la sidebar
// apres un switch reussi. Stub minimal retournant un loadSidebar no-op.
vi.stubGlobal('useSidebar', () => ({
loadSidebar: vi.fn(),
}))
// refreshNuxtData est appele apres un switch pour invalider les donnees
// de page precedemment fetchees. Stub no-op pour les tests unitaires.
vi.stubGlobal('refreshNuxtData', vi.fn())
const SITE_A: Site = {
id: 1,