diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 34e0e77..244a73b 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -5,10 +5,19 @@ import { RouterView } from 'vue-router' import SessionExpiredDialog from '@/components/feedback/SessionExpiredDialog.vue' import ToastHost from '@/components/feedback/ToastHost.vue' +import { useClock } from '@/composables/useClock' import { useLogoutSync } from '@/composables/useLogoutBroadcast' +import { useMailRealtime } from '@/composables/useMailRealtime' +import { useNewMailNotifier } from '@/composables/useNewMailNotifier' // 다른 탭에서 로그아웃하면 이 탭도 로그인 화면으로 간다 (계약 1절 "클라이언트 처리 규칙") useLogoutSync() + +// 실시간 새 메일 — 로그인한 동안 앱 전체에서 돈다(설정 등 다른 화면에서도 바탕화면 알림 · 연결 상태가 이어지게). +// 메일 화면은 이 소식을 받아 목록 · 개수를 맞춘다 (계약 2절 "실시간 알림" — MailLayout 의 useMailStatePolling). +// 사용자가 웹메일 탭(어느 탭이든)으로 돌아오면 띄운 바탕화면 알림을 닫는다 +const newMailNotifier = useNewMailNotifier() +useMailRealtime({ clock: useClock(), onNewMail: newMailNotifier.notify, onUserReturn: newMailNotifier.dismiss })