refactor(navigation): 전역 경로 기반 단일 내비게이션 흐름으로 전환한다

This commit is contained in:
Yu Sung
2026-03-06 16:34:44 +09:00
parent f145de87aa
commit 42ce09d927
34 changed files with 1181 additions and 873 deletions

View File

@@ -7,13 +7,23 @@
import Foundation
struct AppRoute: Hashable {
let id = UUID()
}
class AppState: ObservableObject {
static let shared = AppState()
private var appStepBackStack = [AppStep]()
private var routeStepMap: [AppRoute: AppStep] = [:]
@Published var alreadyUpdatedMarketingInfo = false
@Published private(set) var appStep: AppStep = .splash
@Published private(set) var rootStep: AppStep = .splash
@Published var navigationPath: [AppRoute] = [] {
didSet {
syncStepWithNavigationPath()
}
}
@Published var isShowPlayer = false {
didSet {
@@ -53,28 +63,52 @@ class AppState: ObservableObject {
@Published var isShowErrorPopup = false
@Published var errorMessage = ""
func setAppStep(step: AppStep) {
switch step {
case .splash, .main:
appStepBackStack.removeAll()
default:
appStepBackStack.append(appStep)
}
private func syncStepWithNavigationPath() {
let validRoutes = Set(navigationPath)
routeStepMap = routeStepMap.filter { validRoutes.contains($0.key) }
if let route = navigationPath.last,
let step = routeStepMap[route] {
appStep = step
} else {
appStep = rootStep
}
}
func appStep(for route: AppRoute) -> AppStep? {
routeStepMap[route]
}
func setAppStep(step: AppStep) {
DispatchQueue.main.async {
self.appStep = step
switch step {
case .splash, .main:
self.rootStep = step
self.routeStepMap.removeAll()
self.navigationPath.removeAll()
self.appStep = step
default:
let route = AppRoute()
self.routeStepMap[route] = step
self.navigationPath.append(route)
self.appStep = step
}
}
}
func back() {
if let step = appStepBackStack.popLast() {
self.appStep = step
} else {
self.appStep = .main
DispatchQueue.main.async {
if self.navigationPath.isEmpty {
self.rootStep = .main
self.appStep = .main
return
}
_ = self.navigationPath.popLast()
}
}
// ( -> ) UI
func softRestart() {
isRestartApp = true