-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNavigationManager.swift
57 lines (47 loc) · 1.96 KB
/
NavigationManager.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import SwiftUI
class NavigationManager: ObservableObject {
@Published var currentScreen: ScreenWrapper
@Published var isToolbarHidden: Bool = false
@Published var isBottomBarHidden: Bool = false
@Published var currentRootScreenType: RootScreenType = .home
@Published var selectedTab: RootScreenType? = .home
private var screenHistory: [ScreenWrapper] = []
private let rootScreenInitializers: [RootScreenType: () -> AnyView] = [
.home: { AnyView(HomeScreenView()) },
.products: { AnyView(ProductsScreenView()) },
.cart: { AnyView(CartScreenView()) },
.settings: { AnyView(SettingsScreenView()) }
]
init(initialScreen: ScreenWrapper) {
self.currentScreen = initialScreen
self.setStartDestinationScreen(initialScreen: initialScreen)
}
private func setStartDestinationScreen(initialScreen: ScreenWrapper) {
self.currentScreen = initialScreen
self.currentRootScreenType = initialScreen.type ?? .home
self.screenHistory.append(self.currentScreen)
}
func navigateToRootScreen(screen: ScreenWrapper, selectedTab: RootScreenType? = .home) {
self.currentScreen = screen
self.selectedTab = selectedTab
self.screenHistory.append(screen)
self.currentRootScreenType = screen.type ?? .home
}
func navigateBack() {
if screenHistory.count > 1 {
screenHistory.removeLast()
if let previousScreen = screenHistory.last {
self.currentScreen = previousScreen
}
}
}
func navigateToScreen(_ view: AnyView) {
let secondaryScreen = ScreenWrapper(screen: view, type: nil)
self.currentScreen = secondaryScreen
self.screenHistory.append(secondaryScreen)
}
func setVisibility(hideToolbar: Bool, hideBottomBar: Bool) {
self.isToolbarHidden = hideToolbar
self.isBottomBarHidden = hideBottomBar
}
}