66// Copyright © 2021 WWT and Tyler Thompson. All rights reserved.
77//
88
9+ import Combine
910import SwiftUI
1011import SwiftCurrent
1112
@@ -15,6 +16,7 @@ public struct WorkflowLauncher<Content: _WorkflowItemProtocol>: View {
1516 public typealias WorkflowInput = Content . FlowRepresentableType . WorkflowInput
1617
1718 @WorkflowBuilder private var content : Content
19+ @State private var abandonOnPublisher : AnyPublisher < Void , Never > = Empty ( completeImmediately: false ) . eraseToAnyPublisher ( )
1820 @State private var onFinish = [ ( AnyWorkflow . PassedArgs ) -> Void ] ( )
1921 @State private var onAbandon = [ ( ) -> Void ] ( )
2022 @State private var shouldEmbedInNavView = false
@@ -38,6 +40,7 @@ public struct WorkflowLauncher<Content: _WorkflowItemProtocol>: View {
3840 }
3941 }
4042 . onChange ( of: isLaunched) { if $0 == false { resetWorkflow ( ) } }
43+ . onReceive ( abandonOnPublisher) { launcher. workflow. abandon ( ) }
4144 }
4245
4346 private var workflowContent : some View {
@@ -61,14 +64,19 @@ public struct WorkflowLauncher<Content: _WorkflowItemProtocol>: View {
6164 self . content = content ( )
6265 }
6366
64- private init ( current: Self , shouldEmbedInNavView: Bool , onFinish: [ ( AnyWorkflow . PassedArgs ) -> Void ] , onAbandon: [ ( ) -> Void ] ) {
67+ private init ( current: Self ,
68+ abandonOnPublisher: AnyPublisher < Void , Never > = Empty ( completeImmediately: false ) . eraseToAnyPublisher ( ) ,
69+ shouldEmbedInNavView: Bool ,
70+ onFinish: [ ( AnyWorkflow . PassedArgs ) -> Void ] ,
71+ onAbandon: [ ( ) -> Void ] ) {
6572 _model = current. _model
6673 _launcher = current. _launcher
6774 content = current. content
6875 _isLaunched = current. _isLaunched
69- _shouldEmbedInNavView = State ( initialValue: shouldEmbedInNavView)
70- _onFinish = State ( initialValue: onFinish)
71- _onAbandon = State ( initialValue: onAbandon)
76+ _shouldEmbedInNavView = State ( wrappedValue: shouldEmbedInNavView)
77+ _onFinish = State ( wrappedValue: onFinish)
78+ _onAbandon = State ( wrappedValue: onAbandon)
79+ _abandonOnPublisher = State ( wrappedValue: abandonOnPublisher)
7280 }
7381
7482 private func resetWorkflow( ) {
@@ -92,6 +100,14 @@ public struct WorkflowLauncher<Content: _WorkflowItemProtocol>: View {
92100 return Self ( current: self , shouldEmbedInNavView: shouldEmbedInNavView, onFinish: onFinish, onAbandon: onAbandon)
93101 }
94102
103+ func abandonOn< P: Publisher > ( _ publisher: P ) -> Self where P. Failure == Never {
104+ Self ( current: self ,
105+ abandonOnPublisher: publisher. map { _ in ( ) } . eraseToAnyPublisher ( ) ,
106+ shouldEmbedInNavView: shouldEmbedInNavView,
107+ onFinish: onFinish,
108+ onAbandon: onAbandon)
109+ }
110+
95111 func embedInNavigationView( ) -> Self {
96112 Self ( current: self , shouldEmbedInNavView: true , onFinish: onFinish, onAbandon: onAbandon)
97113 }
0 commit comments