浏览代码

First version of NavigatorStack

Pavel Yurchenko 1 年之前
父节点
当前提交
249b3fd907

+ 0 - 24
SUIExamples/ContentView.swift

@@ -1,24 +0,0 @@
-//
-//  ContentView.swift
-//  SUIExamples
-//
-//  Created by Pavel Yurchenko on 17.08.2024.
-//
-
-import SwiftUI
-
-struct ContentView: View {
-    var body: some View {
-        VStack {
-            Image(systemName: "globe")
-                .imageScale(.large)
-                .foregroundStyle(.tint)
-            Text("Hello, world!")
-        }
-        .padding()
-    }
-}
-
-#Preview {
-    ContentView()
-}

+ 14 - 0
SUIExamples/Core/DI.swift

@@ -0,0 +1,14 @@
+//
+//  DI.swift
+//  SUIExamples
+//
+//  Created by Pavel Yurchenko on 27.11.2024.
+//
+
+import Foundation
+
+final class DI {
+    static var shared: DI = .init()
+
+    let navigationStack = NavigatorStack()
+}

+ 21 - 0
SUIExamples/Modules/Main/MainBuilder.swift

@@ -0,0 +1,21 @@
+//
+//  MainBuilder.swift
+//  SUIExamples
+//
+//  Created by Pavel Yurchenko on 27.11.2024.
+//
+
+import SwiftUI
+
+struct MainBuilder {
+
+    func build() -> some View {
+        let navigatorStack = DI.shared.navigationStack
+        return MainView()
+            .environment(
+                MainVM(
+                    navigatorStack: navigatorStack
+                )
+            )
+    }
+}

+ 18 - 0
SUIExamples/Modules/Main/MainVM.swift

@@ -0,0 +1,18 @@
+//
+//  MainVM.swift
+//  SUIExamples
+//
+//  Created by Pavel Yurchenko on 27.11.2024.
+//
+
+import SwiftUI
+
+@Observable
+final class MainVM {
+    
+    private(set) var navigatorStack: NavigatorStack
+
+    init(navigatorStack: NavigatorStack) {
+        self.navigatorStack = navigatorStack
+    }
+}

+ 34 - 0
SUIExamples/Modules/Main/MainView.swift

@@ -0,0 +1,34 @@
+//
+//  MainView.swift
+//  SUIExamples
+//
+//  Created by Pavel Yurchenko on 17.08.2024.
+//
+
+import SwiftUI
+
+struct MainView: View {
+    @Environment(MainVM.self) private var vm
+
+    var body: some View {
+        VStack {
+            Button("Products") {
+                vm.navigatorStack.push(.products)
+            }
+            Button("Product 1") {
+                vm.navigatorStack.push(.product(id: 1))
+            }
+            Button("Cart") {
+                vm.navigatorStack.push(.cart)
+            }
+            Button("Feedback") {
+                vm.navigatorStack.push(.feedback)
+            }
+        }
+        .padding()
+    }
+}
+
+#Preview {
+    MainBuilder().build()
+}

+ 23 - 0
SUIExamples/Navigator/NavigatorStack.swift

@@ -0,0 +1,23 @@
+//
+//  NavigatorStack.swift
+//  SUIExamples
+//
+//  Created by Pavel Yurchenko on 27.11.2024.
+//
+
+import Foundation
+import SwiftUI
+
+final class NavigatorStack: ObservableObject {
+
+    @Published
+    var path = NavigationPath()
+
+    func push(_ route: Route) {
+        path.append(route)
+    }
+
+    func pop() {
+        path.removeLast()
+    }
+}

+ 31 - 0
SUIExamples/Navigator/Route.swift

@@ -0,0 +1,31 @@
+//
+//  Route.swift
+//  SUIExamples
+//
+//  Created by Pavel Yurchenko on 27.11.2024.
+//
+
+import SwiftUI
+
+enum Route: Hashable {
+    case main
+    case products
+    case product(id: Int)
+    case cart
+    case feedback
+
+    func buildModule() -> some View {
+        return switch self {
+        case .main:
+            MainBuilder().build()
+        case .products:
+            MainBuilder().build()
+        case .product:
+            MainBuilder().build()
+        case .cart:
+            MainBuilder().build()
+        case .feedback:
+            MainBuilder().build()
+        }
+    }
+}

+ 9 - 1
SUIExamples/SUIExamplesApp.swift

@@ -9,9 +9,17 @@ import SwiftUI
 
 @main
 struct SUIExamplesApp: App {
+
+    @StateObject private var navigatorStack: NavigatorStack = DI.shared.navigationStack
+
     var body: some Scene {
         WindowGroup {
-            ContentView()
+            NavigationStack(path: $navigatorStack.path){
+                MainBuilder().build()
+            }
+            .navigationDestination(for: Route.self) {
+                $0.buildModule()
+            }
         }
     }
 }