From b50a81028f3cad66b4bdae970cb843a84547cee1 Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Mon, 29 Jun 2026 09:25:57 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=ED=95=98=EB=8B=A8=20=EB=82=B4=EB=B9=84?= =?UTF-8?q?=20=EB=92=A4=EB=A1=9C=20=EB=B2=84=ED=8A=BC=EB=8F=84=20=ED=95=98?= =?UTF-8?q?=EB=93=9C=EC=9B=A8=EC=96=B4=20=EB=92=A4=EB=A1=9C=EC=99=80=20?= =?UTF-8?q?=EB=8F=99=EC=9D=BC=20=EB=8F=99=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 통합 핸들러 appBack.handleBack 추출: 오버레이 닫기 → 화면 뒤로 → 최상위에서 '한 번 더 누르면 종료' 토스트(네이티브) - 하단 내비 뒤로 버튼이 옛 로직(홈에서 무반응)이라 하드웨어 뒤로와 동작이 달랐던 문제 해결 — 둘이 같은 핸들러 사용 - capacitor.js 중복 로직 제거 Co-Authored-By: Claude Opus 4.8 --- src/capacitor.js | 30 ++------------------ src/components/layout/AppBottomNav.vue | 6 ++-- src/composables/appBack.js | 39 ++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 src/composables/appBack.js diff --git a/src/capacitor.js b/src/capacitor.js index 0605ad8..c01203c 100644 --- a/src/capacitor.js +++ b/src/capacitor.js @@ -1,37 +1,13 @@ // Capacitor 네이티브(안드로이드) 통합. 웹에서는 no-op. import { Capacitor } from '@capacitor/core' import { App as CapApp } from '@capacitor/app' -import { useUiStore } from '@/stores/ui' -import { appLock } from '@/composables/appLock' +import { handleBack } from '@/composables/appBack' export function setupCapacitor(router) { if (!Capacitor.isNativePlatform()) return - const ui = useUiStore() - let exitArmed = false - let exitTimer = null - - // 안드로이드 하드웨어 뒤로가기 우선순위: - // 1) 잠금 화면이면 우회 불가 → 종료 - // 2) 열린 전역 오버레이(회원가입/로그인/비번/사이드바) 닫기 - // 3) 화면 뒤로 - // 4) 최상위에서 한 번 더 누르면 종료(실수 종료 방지) - CapApp.addListener('backButton', ({ canGoBack }) => { - if (appLock.state.locked) { CapApp.exitApp(); return } - - if (ui.signupOpen) { ui.closeSignup(); return } - if (ui.loginOpen) { ui.closeLogin(); return } - if (ui.passwordOpen) { ui.closePassword(); return } - if (ui.sidebarOpen) { ui.closeSidebar(); return } - - if (canGoBack && window.history.length > 1) { router.back(); return } - - if (exitArmed) { CapApp.exitApp(); return } - exitArmed = true - window.dispatchEvent(new CustomEvent('app:toast', { detail: '한 번 더 누르면 종료됩니다' })) - clearTimeout(exitTimer) - exitTimer = setTimeout(() => { exitArmed = false }, 2000) - }) + // 안드로이드 하드웨어 뒤로가기 → 하단 내비 뒤로 버튼과 동일한 통합 처리 + CapApp.addListener('backButton', () => handleBack(router)) // 네이티브 표시용 클래스 (safe-area 등 스타일 분기) document.documentElement.classList.add('is-native') diff --git a/src/components/layout/AppBottomNav.vue b/src/components/layout/AppBottomNav.vue index b014907..862b685 100644 --- a/src/components/layout/AppBottomNav.vue +++ b/src/components/layout/AppBottomNav.vue @@ -1,6 +1,7 @@