Quellcode durchsuchen

Implement support to present screens modally from coordinators

Pavel Yurchenko vor 1 Jahr
Ursprung
Commit
35b8c549d5

+ 3 - 0
CoordinatorSUI/Sources/CoordinatorSUI/Router.swift

@@ -12,6 +12,9 @@ public final class Router: ObservableObject {
     @Published
     public var path = NavigationPath()
 
+    @Published
+    public var presenting: (any Hashable)?
+
     public init() {
 
     }

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

@@ -13,9 +13,11 @@ struct SUIExamplesApp: App {
 
     static let applicationCoordinator = ApplicationCoordinator()
 
-    @StateObject private var mainRouter: Router = applicationCoordinator.mainCoordinator.currentRouter
-    @StateObject private var productsRouter: Router = applicationCoordinator.productsCoordinator.currentRouter
-    @StateObject private var feedbackRouter: Router = applicationCoordinator.feedbackCoordinator.currentRouter
+    @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
 
     var body: some Scene {
@@ -29,6 +31,7 @@ struct SUIExamplesApp: App {
                             destination: appCoordinator.mainCoordinator.buildDestination
                         )
                     }
+                    .sheet(item: $mainCoordinator.presenting, content: mainCoordinator.buildDestination)
                 }
 
                 Tab(ApplicationTab.products.rawValue, systemImage: "tray.and.arrow.down.fill", value: ApplicationTab.products) {

+ 6 - 0
CoordinatorSUIExamples/CoordinatorSUIExamples/Flows/Route.swift

@@ -15,3 +15,9 @@ enum Route: Hashable {
     case cart
     case feedback
 }
+
+extension Route: Identifiable {
+    var id: ObjectIdentifier {
+        .init(Route.self)
+    }
+}

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

@@ -8,7 +8,10 @@
 import CoordinatorSUI
 import SwiftUI
 
-final class MainCoordinator: BaseCoordinator {
+final class MainCoordinator: BaseCoordinator, ObservableObject {
+
+    @Published
+    var presenting: Route?
 
     func run() -> some View {
         showMainModule()
@@ -46,6 +49,12 @@ final class MainCoordinator: BaseCoordinator {
                 },
                 onFeedback: { [weak self] in
                     self?.currentRouter.push(Route.feedback)
+                },
+                onModalProducts: { [weak self] in
+                    self?.presenting = .products
+                },
+                onModalCart: { [weak self] in
+                    self?.presenting = .cart
                 }
             )
         )

+ 2 - 0
CoordinatorSUIExamples/CoordinatorSUIExamples/Modules/Main/MainVM.swift

@@ -18,6 +18,8 @@ final class MainVM {
         var onProduct: IntAction?
         var onCart: Action?
         var onFeedback: Action?
+        var onModalProducts: Action?
+        var onModalCart: Action?
     }
 
     let output: Output

+ 6 - 0
CoordinatorSUIExamples/CoordinatorSUIExamples/Modules/Main/MainView.swift

@@ -24,6 +24,12 @@ struct MainView: View {
             Button("Feedback") {
                 vm.output.onFeedback?()
             }
+            Button("Modal Products") {
+                vm.output.onModalProducts?()
+            }
+            Button("Modal Cart") {
+                vm.output.onModalCart?()
+            }
         }
         .padding()
     }