Hi community!
I would be grateful if someone could point me: why in this case .map doesn't work. I mean: finish
function is never called, despite that fact incrementButtonTapped
is called, then testAction
is called and finally, unfortunatelly finish
action is not called :(
struct CounterState: Equatable {
var count = 0
}
enum CounterAction: Equatable {
case decrementButtonTapped
case incrementButtonTapped
case finish(Result<String, Never>)
}
struct CounterEnvironment {
var mainQueue: AnySchedulerOf<DispatchQueue>
static let live = CounterEnvironment(
mainQueue: DispatchQueue.main.eraseToAnyScheduler()
)
func testAction() -> Effect<Void, Never> {
Effect<Void, Never>.fireAndForget {
print("testAction")
}
}
}
let counterReducer = Reducer<CounterState, CounterAction, CounterEnvironment> { state, action, environment in
switch action {
case .decrementButtonTapped:
state.count -= 1
return .none
case .incrementButtonTapped:
state.count += 1
return environment.testAction()
.receive(on: environment.mainQueue)
.catchToEffect()
.map { reslt -> CounterAction in
return CounterAction.finish(.success("success"))
}
case let .finish(.success(response)):
print("finish")
return .none
case .finish(.failure):
print("failure")
return .none
}
}
.signpost()
struct CounterView: View {
let store: Store<CounterState, CounterAction>
var body: some View {
WithViewStore(self.store) { viewStore in
HStack {
Button("−") { viewStore.send(.decrementButtonTapped) }
Text("\(viewStore.count)")
.font(Font.body.monospacedDigit())
Button("+") { viewStore.send(.incrementButtonTapped) }
}
}
}
}