From 3039076a2d4da616b6db5cf43f212d25fc0a1180 Mon Sep 17 00:00:00 2001 From: Tom Brow Date: Tue, 30 May 2023 09:48:41 -0500 Subject: [PATCH] add sugar for passing Action as View callback --- .../Sources/Authentication/LoginScreen.swift | 4 ++-- WorkflowSwiftUI/Sources/ObservableValue.swift | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Samples/TicTacToe/Sources/Authentication/LoginScreen.swift b/Samples/TicTacToe/Sources/Authentication/LoginScreen.swift index 04b3ac121..1e5efab5f 100644 --- a/Samples/TicTacToe/Sources/Authentication/LoginScreen.swift +++ b/Samples/TicTacToe/Sources/Authentication/LoginScreen.swift @@ -44,10 +44,10 @@ struct LoginScreen: SwiftUIScreen, Equatable { get: \.password, set: Action.passwordUpdated ), - onCommit: { model.value.actionSink.send(.login) } + onCommit: model.action(.login) ) - Button("Login", action: { model.value.actionSink.send(.login) }) + Button("Login", action: model.action(.login)) } .frame(maxWidth: 400) } diff --git a/WorkflowSwiftUI/Sources/ObservableValue.swift b/WorkflowSwiftUI/Sources/ObservableValue.swift index 03c80e2ee..e38a4c396 100644 --- a/WorkflowSwiftUI/Sources/ObservableValue.swift +++ b/WorkflowSwiftUI/Sources/ObservableValue.swift @@ -104,3 +104,14 @@ public final class ObservableValue: ObservableObject { return subject.removeDuplicates(by: isDuplicate).eraseToAnyPublisher() } } + +#if canImport(UIKit) + +public extension ObservableValue where Value: SwiftUIScreen { + func action(_ action: Value.Action) -> () -> Void { + // TODO: Should this closure capture the current `actionSink` instead? + { [weak self] in self?.value.actionSink.send(action) } + } +} + +#endif