refactor(navigation): 전역 경로 기반 단일 내비게이션 흐름으로 전환한다
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user