diff --git a/ios/App/App/MainViewController.swift b/ios/App/App/MainViewController.swift index f0749650..273fb654 100644 --- a/ios/App/App/MainViewController.swift +++ b/ios/App/App/MainViewController.swift @@ -6,5 +6,8 @@ class MainViewController: CAPBridgeViewController { override open func capacitorDidLoad() { bridge?.registerPluginInstance(FindersBillingPlugin()) + + // 엣지 스와이프 뒤로가기 — SPA(pushState) 히스토리에도 동작 + webView?.allowsBackForwardNavigationGestures = true } } diff --git a/src/layouts/RootLayout.tsx b/src/layouts/RootLayout.tsx index c3b3bb47..e8d688b7 100644 --- a/src/layouts/RootLayout.tsx +++ b/src/layouts/RootLayout.tsx @@ -1,18 +1,26 @@ -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { useNavigate, Outlet } from "react-router"; import { App } from "@capacitor/app"; import { Capacitor } from "@capacitor/core"; import GlobalLoginDialog from "@/components/common/GlobalLoginDialog"; +import { DialogBox } from "@/components/common/DialogBox"; import { useNewPostState } from "@/store/useNewPostState.store"; export default function RootLayout() { const navigate = useNavigate(); + const [exitDialogOpen, setExitDialogOpen] = useState(false); useEffect(() => { if (!Capacitor.isNativePlatform()) return; // Promise 자체를 붙잡아, resolve 타이밍과 무관하게 클린업에서 리스너를 제거한다. const handlePromise = App.addListener("backButton", ({ canGoBack }) => { + // 종료 다이얼로그가 떠 있으면 뒤로가기로 닫기만 한다 + if (exitDialogOpen) { + setExitDialogOpen(false); + return; + } + // 게시글 등록 직후엔 하드웨어 뒤로가기도 이전 작성 단계가 아니라 피드로 이동 if (useNewPostState.getState().isNewPost) { useNewPostState.getState().setIsNewPost(false); @@ -23,18 +31,26 @@ export default function RootLayout() { if (canGoBack) { navigate(-1); } else { - App.exitApp(); + setExitDialogOpen(true); } }); return () => { handlePromise.then((handle) => handle.remove()); }; - }, [navigate]); + }, [navigate, exitDialogOpen]); return (
+ App.exitApp()} + onCancel={() => setExitDialogOpen(false)} + /> {/* safe-area + 중앙 레이아웃(PC) + 패딩(모바일) */}
{/* Rootlayout으로 감싸진 모든 컴포넌트 렌더링*/} diff --git a/src/router/Router.tsx b/src/router/Router.tsx index 68bcbd99..38c6eb72 100644 --- a/src/router/Router.tsx +++ b/src/router/Router.tsx @@ -267,7 +267,8 @@ const router = createBrowserRouter([ { Component: RootLayout, children: [ - { index: true, element: }, + // replace가 아니면 히스토리에 "/"가 남아 Android 뒤로가기로 앱이 안 닫힘 + { index: true, element: }, // auth prefix를 한 번만 { path: "auth", children: authRoutes },