Prechádzať zdrojové kódy

Refactor main state modal and root view for modal presentation to avoid nil-crash

Deniz Cengiz 1 rok pred
rodič
commit
fafa425cae

+ 5 - 0
Trio/Sources/Modules/Main/MainDataFlow.swift

@@ -9,6 +9,11 @@ enum Main {
 
         var id: Int { screen.id }
     }
+
+    struct SecondaryModalWrapper: Identifiable {
+        let id = UUID()
+        let view: AnyView
+    }
 }
 
 protocol MainProvider: Provider {}

+ 10 - 16
Trio/Sources/Modules/Main/MainStateModel.swift

@@ -9,10 +9,8 @@ extension Main {
         @Injected() private var apsManager: APSManager!
         @Injected() var alertPermissionsChecker: AlertPermissionsChecker!
         @Injected() var broadcaster: Broadcaster!
-        private(set) var modal: Modal?
-        @Published var isModalPresented = false
-        @Published var isSecondaryModalPresented = false
-        @Published var secondaryModalView: AnyView? = nil
+        @Published var modal: Modal?
+        @Published var secondaryModal: SecondaryModalWrapper?
 
         @Persisted(key: "UserNotificationsManager.snoozeUntilDate") private var snoozeUntilDate: Date = .distantPast
         private var timers: [TimeInterval: Timer] = [:]
@@ -250,14 +248,11 @@ extension Main {
                 .map { $0?.modal(resolver: self.resolver!) }
                 .removeDuplicates { $0?.id == $1?.id }
                 .receive(on: DispatchQueue.main)
-                .sink { modal in
-                    self.modal = modal
-                    self.isModalPresented = modal != nil
-                }
-                .store(in: &lifetime)
+                .assign(to: &$modal)
 
-            $isModalPresented
-                .filter { !$0 }
+            $modal
+                .removeDuplicates { $0?.id == $1?.id }
+                .filter { $0 == nil }
                 .sink { _ in
                     self.router.mainModalScreen.send(nil)
                 }
@@ -277,14 +272,13 @@ extension Main {
             router.mainSecondaryModalView
                 .receive(on: DispatchQueue.main)
                 .sink { view in
-                    self.secondaryModalView = view
-                    self.isSecondaryModalPresented = view != nil
+                    self.secondaryModal = view.map { SecondaryModalWrapper(view: $0) }
                 }
                 .store(in: &lifetime)
 
-            $isSecondaryModalPresented
-                .removeDuplicates()
-                .filter { !$0 }
+            $secondaryModal
+                .removeDuplicates { $0?.id == $1?.id }
+                .filter { $0 == nil }
                 .sink { _ in
                     self.router.mainSecondaryModalView.send(nil)
                 }

+ 5 - 4
Trio/Sources/Modules/Main/View/MainRootView.swift

@@ -11,13 +11,14 @@ extension Main {
 
         var body: some View {
             router.view(for: .home)
-                .sheet(isPresented: $state.isModalPresented) {
-                    NavigationView { self.state.modal!.view }
+                .sheet(item: $state.modal) { modal in
+                    NavigationView { modal.view }
                         .navigationViewStyle(StackNavigationViewStyle())
                 }
-                .sheet(isPresented: $state.isSecondaryModalPresented) {
-                    state.secondaryModalView ?? EmptyView().asAny()
+                .sheet(item: $state.secondaryModal) { wrapper in
+                    wrapper.view
                 }
+
                 .onAppear(perform: configureView)
                 .scrollContentBackground(.hidden).background(appState.trioBackgroundColor(for: colorScheme))
         }