From 4d7ff9be263c6a9c68e7395e645ac375fd24d9df Mon Sep 17 00:00:00 2001 From: matthieu Date: Wed, 20 May 2026 00:57:41 +0200 Subject: [PATCH] =?UTF-8?q?feat(mail)=20:=20sidebar=20=E2=80=94=20lien=20M?= =?UTF-8?q?essagerie=20+=20badge=20unread=20+=20polling=20lifecycle=20(sta?= =?UTF-8?q?rt=20au=20login,=20stop=20au=20logout)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/layouts/default.vue | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue index 4894ea4..f3e6b53 100644 --- a/frontend/layouts/default.vue +++ b/frontend/layouts/default.vue @@ -53,6 +53,23 @@ :collapsed="sidebarIsCollapsed" @click="ui.closeMobileSidebar()" /> +
+ + + {{ mailStore.globalUnreadCount > 99 ? '99+' : mailStore.globalUnreadCount }} + +
{ + const roles: string[] = auth.user?.roles ?? [] + const isClientOnly = roles.includes('ROLE_CLIENT') + && !roles.includes('ROLE_ADMIN') + && !roles.includes('ROLE_USER') + return !isClientOnly && (roles.includes('ROLE_USER') || roles.includes('ROLE_ADMIN')) +}) + // On mobile, sidebar is always expanded (not collapsed icon mode) const sidebarIsCollapsed = computed(() => { if (ui.sidebarOpen) return false @@ -207,6 +233,17 @@ watch( onMounted(() => { timerStore.fetchActive() + if (isMailVisible.value) { + mailStore.startPolling() + } +}) + +watch(() => auth.user, (user) => { + if (!user) { + mailStore.stopPolling() + } else if (isMailVisible.value) { + mailStore.startPolling() + } }) const completeDrawerOpen = ref(false)