11import Combine
2+ import Dispatch
23import SwiftUI
34
45public struct OnAppearDispatchActionViewModifier : ViewModifier {
5- @MappedDispatch ( ) private var dispatch
6-
7- var action : Action
8-
6+ @Environment ( \. actionDispatcher) private var dispatch
97 @State private var cancellable : Cancellable ? = nil
8+ private var action : Action
109
1110 @usableFromInline internal init ( action: Action ) {
1211 self . action = action
1312 }
1413
1514 public func body( content: Content ) -> some View {
16- content. onAppear { [ action , dispatch ] in dispatch ( action) }
15+ content. onAppear { dispatch ( action) }
1716 }
1817}
1918
20- public struct OnAppearDispatchActionPlanViewModifier < T > : ViewModifier {
21- @MappedDispatch ( ) private var dispatch
19+ public struct OnAppearDispatchActionPlanViewModifier : ViewModifier {
20+ @Environment ( \ . actionDispatcher ) private var dispatch
2221
23- var actionPlan : ActionPlan < T >
24- var cancelOnDisappear : Bool
22+ private var action : RunnableAction
23+ private var cancelOnDisappear : Bool
2524
2625 @State private var cancellable : Cancellable ? = nil
2726
28- @usableFromInline internal init ( actionPlan : ActionPlan < T > , cancelOnDisappear: Bool ) {
29- self . actionPlan = actionPlan
27+ @usableFromInline internal init ( action : RunnableAction , cancelOnDisappear: Bool ) {
28+ self . action = action
3029 self . cancelOnDisappear = cancelOnDisappear
3130 }
3231
3332 public func body( content: Content ) -> some View {
3433 content
35- . onAppear { [ actionPlan , dispatch ] in
36- guard self . cancellable == nil else { return }
37- self . cancellable = actionPlan . sendAsCancellable ( dispatch)
34+ . onAppear {
35+ guard cancellable == nil else { return }
36+ self . cancellable = action . sendAsCancellable ( dispatch)
3837 }
39- . onDisappear { [ cancelOnDisappear ] in
38+ . onDisappear {
4039 if cancelOnDisappear {
4140 self . cancellable? . cancel ( )
4241 self . cancellable = nil
@@ -52,7 +51,12 @@ extension View {
5251 /// - Parameter action: An action to dispatch every time the view appears.
5352 /// - Returns: The modified view.
5453 @inlinable public func onAppear( dispatch action: Action ) -> some View {
55- modifier ( OnAppearDispatchActionViewModifier ( action: action) )
54+ Group {
55+ if let action = action as? RunnableAction {
56+ modifier ( OnAppearDispatchActionPlanViewModifier ( action: action, cancelOnDisappear: true ) )
57+ }
58+ modifier ( OnAppearDispatchActionViewModifier ( action: action) )
59+ }
5660 }
5761
5862 /// Sends the provided action plan when the view appears.
@@ -99,11 +103,11 @@ extension View {
99103 /// ```
100104 ///
101105 /// - Parameters:
102- /// - actionPlan : An action to dispatch every time the view appears.
106+ /// - action : An action to dispatch every time the view appears.
103107 /// - cancelOnDisappear: It will cancel any subscription from the action when the view disappears. If false, it keeps
104108 /// the subscription alive and reppearances of the view will not re-call the action.
105109 /// - Returns: The modified view.
106- @inlinable public func onAppear< T> ( dispatch actionPlan : ActionPlan < T > , cancelOnDisappear: Bool = true ) -> some View {
107- modifier ( OnAppearDispatchActionPlanViewModifier ( actionPlan : actionPlan , cancelOnDisappear: cancelOnDisappear) )
110+ @inlinable public func onAppear< T> ( dispatch action : RunnableAction , cancelOnDisappear: Bool ) -> some View {
111+ modifier ( OnAppearDispatchActionPlanViewModifier ( action : action , cancelOnDisappear: cancelOnDisappear) )
108112 }
109113}
0 commit comments