Files
arasystem/frontend/src/App.vue
T
ttipo 1881ec7a42 feat(frontend): 13단계 전환 준비 화면 — 새 비밀번호 · 2단계 켜기 단계 · 유예 줄 · 메일 프로그램 연결 · 30일 안내 · 문의 줄
- 제한된 세션: restriction 이 있으면 보호 화면 대신 로그인 틀의 그 단계(새 비밀번호 → 2단계 켜기)로, AUTH_010 은 알림 없이 me 를 다시 받아 옮긴다.
  제한된 동안은 나가기 확인을 묻지 않고(확인에서 이동을 취소하면 메일 화면에 갇혔다 — 리뷰) 실시간 알림을 열지 않는다.
- 로그인 때 넣은 비밀번호는 반응형이 아닌 클로저에 10분 · 세션이 끝나면 지운다. 2단계를 켠 직원의 새 비밀번호 단계는 다음 코드를 받는다.
- 유예 노란 줄(시작일 전날까지), 설정 › 2단계 인증의 필수 안내, 설정 › 메일 프로그램 연결(펼침 줄 · 새 Outlook 은 권하지 않음), 휴지통 · 스팸메일함 30일 줄, 로그인 · 코드 단계의 문의 줄.
검증: lint · type-check · 단위 2,354 · 실사용 시험 89/89.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 15:37:14 +09:00

39 lines
2.0 KiB
Vue

<script setup lang="ts">
// 최상위 레이아웃 — 라우터 뷰 + 전역 피드백(알림 · 세션 만료 대화상자)
// 모듈별 레이아웃(전역 셸 등)은 라우트 단위로 둔다 (pages/mail/MailLayout.vue)
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 { useLargeFileAlerts } from '@/composables/useLargeFileAlerts'
import { useLogoutSync } from '@/composables/useLogoutBroadcast'
import { useMailRealtime } from '@/composables/useMailRealtime'
import { useNewMailNotifier } from '@/composables/useNewMailNotifier'
import { useSessionRestriction } from '@/composables/useSessionRestriction'
// 다른 탭에서 로그아웃하면 이 탭도 로그인 화면으로 간다 (계약 1절 "클라이언트 처리 규칙")
useLogoutSync()
// 세션에 제한(새 비밀번호 · 2단계 켜기 — 13단계)이 생기면 보호 화면을 떠나 로그인 틀의 그 단계로 간다
useSessionRestriction()
// 실시간 새 메일 — 로그인한 동안 앱 전체에서 돈다(설정 등 다른 화면에서도 바탕화면 알림 · 연결 상태가 이어지게).
// 메일 화면은 이 소식을 받아 목록 · 개수를 맞춘다 (계약 2절 "실시간 알림" — MailLayout 의 useMailStatePolling).
// 사용자가 웹메일 탭(어느 탭이든)으로 돌아오면 띄운 바탕화면 알림을 닫는다.
// 올린 대용량 파일의 위험 판정(11단계)도 이 연결로 온다 — 탭마다 알림 · 쓰기 화면의 그 파일을 "위험"으로 (useLargeFileAlerts)
const newMailNotifier = useNewMailNotifier()
const largeFileAlerts = useLargeFileAlerts()
useMailRealtime({
clock: useClock(),
onNewMail: newMailNotifier.notify,
onUserReturn: newMailNotifier.dismiss,
onLargeFile: largeFileAlerts.notify,
})
</script>
<template>
<RouterView />
<ToastHost />
<SessionExpiredDialog />
</template>