Prechádzať zdrojové kódy

All coordinator are ObservableObjects now, using navigation views for each coordinator

Pavel Yurchenko 1 rok pred
rodič
commit
f8efdfd1c2

+ 1 - 1
CoordinatorSUI/Sources/CoordinatorSUI/BaseCoordinator.swift

@@ -7,7 +7,7 @@
 
 import SwiftUI
 
-open class BaseCoordinator: Coordinator {
+open class BaseCoordinator: Coordinator, ObservableObject {
 
     // MARK: - Public properties
 

+ 1 - 1
CoordinatorSUIExamples/CoordinatorSUIExamples/Application/ApplicationCoordinator.swift

@@ -15,7 +15,7 @@ enum ApplicationTab: String {
     case feedback = "Feedback"
 }
 
-final class ApplicationCoordinator: BaseCoordinator, ObservableObject {
+final class ApplicationCoordinator: BaseCoordinator {
 
     @Published
     var tabSelection: ApplicationTab = .main

+ 3 - 30
CoordinatorSUIExamples/CoordinatorSUIExamples/Application/SUIExamplesApp.swift

@@ -13,10 +13,6 @@ struct SUIExamplesApp: App {
 
     static let applicationCoordinator = ApplicationCoordinator()
 
-    @StateObject private var mainCoordinator = applicationCoordinator.mainCoordinator
-    @StateObject private var mainRouter = applicationCoordinator.mainCoordinator.currentRouter
-
-    @StateObject private var productsRouter = applicationCoordinator.productsCoordinator.currentRouter
     @StateObject private var feedbackRouter = applicationCoordinator.feedbackCoordinator.currentRouter
     @StateObject private var appCoordinator = applicationCoordinator
 
@@ -24,38 +20,15 @@ struct SUIExamplesApp: App {
         WindowGroup {
             TabView(selection: $appCoordinator.tabSelection) {
                 Tab(ApplicationTab.main.rawValue, systemImage: "tray.and.arrow.down.fill", value: ApplicationTab.main) {
-                    NavigationStack(path: $mainRouter.path) {
-                        appCoordinator.mainCoordinator.run()
-                        .navigationDestination(
-                            for: Route.self,
-                            destination: appCoordinator.mainCoordinator.buildDestination
-                        )
-                    }
-                    .sheet(
-                        item: $mainCoordinator.presentation,
-                        onDismiss: mainCoordinator.onDismissPresentation,
-                        content: mainCoordinator.buildPresentation
-                    )
+                    MainNavigationView.build(with: appCoordinator.mainCoordinator)
                 }
 
                 Tab(ApplicationTab.products.rawValue, systemImage: "tray.and.arrow.down.fill", value: ApplicationTab.products) {
-                    NavigationStack(path: $productsRouter.path) {
-                        appCoordinator.productsCoordinator.run()
-                        .navigationDestination(
-                            for: Route.self,
-                            destination: appCoordinator.productsCoordinator.buildDestination
-                        )
-                    }
+                    ProductsNavigationView.build(with: appCoordinator.productsCoordinator)
                 }
 
                 Tab(ApplicationTab.feedback.rawValue, systemImage: "tray.and.arrow.down.fill", value: ApplicationTab.feedback) {
-                    NavigationStack(path: $feedbackRouter.path) {
-                        appCoordinator.feedbackCoordinator.run()
-                        .navigationDestination(
-                            for: Route.self,
-                            destination: appCoordinator.feedbackCoordinator.buildDestination
-                        )
-                    }
+                    FeedbackNavigationView.build(with: appCoordinator.feedbackCoordinator)
                 }
             }
         }

+ 1 - 1
CoordinatorSUIExamples/CoordinatorSUIExamples/Flows/ModalProductsCoordinator.swift

@@ -49,7 +49,7 @@ final class ModalProductsCoordinator: BaseCoordinator {
     }
 }
 
-// MARK: - View
+// MARK: - Navigation View
 
 struct ModalProductsNavigationView: View {
 

+ 23 - 0
CoordinatorSUIExamples/CoordinatorSUIExamples/Flows/Tabs/FeedbackCoordinator.swift

@@ -25,3 +25,26 @@ final class FeedbackCoordinator: BaseCoordinator {
         FeedbackBuilder().build(with: .init())
     }
 }
+
+// MARK: - Navigation View
+
+struct FeedbackNavigationView: View {
+
+    @StateObject private var coordinator: FeedbackCoordinator
+    @StateObject private var router: Router
+
+    var body: some View {
+        NavigationStack(path: $router.path) {
+            coordinator.run()
+            .navigationDestination(
+                for: Route.self,
+                destination: coordinator.buildDestination
+            )
+        }
+    }
+
+    static func build(with coordinator: FeedbackCoordinator) -> some View {
+        FeedbackNavigationView(coordinator: coordinator, router: coordinator.currentRouter)
+    }
+}
+

+ 27 - 1
CoordinatorSUIExamples/CoordinatorSUIExamples/Flows/Tabs/MainCoordinator.swift

@@ -8,7 +8,7 @@
 import CoordinatorSUI
 import SwiftUI
 
-final class MainCoordinator: BaseCoordinator, ObservableObject {
+final class MainCoordinator: BaseCoordinator {
 
     @Published
     var presentation: Route?
@@ -122,3 +122,29 @@ final class MainCoordinator: BaseCoordinator, ObservableObject {
         FeedbackBuilder().build(with: .init())
     }
 }
+
+// MARK: - Navigation View
+
+struct MainNavigationView: View {
+
+    @StateObject private var coordinator: MainCoordinator
+    @StateObject private var router: Router
+    
+    var body: some View {
+        NavigationStack(path: $router.path) {
+            coordinator.run()
+                .navigationDestination(
+                    for: Route.self,
+                    destination: coordinator.buildDestination
+                )
+        }.sheet(
+            item: $coordinator.presentation,
+            onDismiss: coordinator.onDismissPresentation,
+            content: coordinator.buildPresentation
+        )
+    }
+
+    static func build(with coordinator: MainCoordinator) -> some View {
+        MainNavigationView(coordinator: coordinator, router: coordinator.currentRouter)
+    }
+}

+ 22 - 0
CoordinatorSUIExamples/CoordinatorSUIExamples/Flows/Tabs/ProductsCoordinator.swift

@@ -72,3 +72,25 @@ final class ProductsCoordinator: BaseCoordinator {
         )
     }
 }
+
+// MARK: - Navigation View
+
+struct ProductsNavigationView: View {
+
+    @StateObject private var coordinator: ProductsCoordinator
+    @StateObject private var router: Router
+
+    var body: some View {
+        NavigationStack(path: $router.path) {
+            coordinator.run()
+            .navigationDestination(
+                for: Route.self,
+                destination: coordinator.buildDestination
+            )
+        }
+    }
+
+    static func build(with coordinator: ProductsCoordinator) -> some View {
+        ProductsNavigationView(coordinator: coordinator, router: coordinator.currentRouter)
+    }
+}