Hi,
thanks for TCA I was struggling with some SwiftUI related things, but TCA make it more easier ! I just have question about reducer.
I want to use SwitchLet
to define if is user logged in or logged out. I'm observing some UseCase which returns PassthrougSubject<User?, Never>
. But I don't know how to make it properly and I'm getting Member 'loggedOut' expects argument of type 'RootLoggedOutAction'
.
What I tried:
Reducer { state, action, env in
env.observeUserChanges.invoke()
.flatMap { user -> AnyPublisher<AppAction, Never> in
guard let user = user else {
return Just(.loggedOut).eraseToAnyPublisher()
}
return Just(.loggedIn).eraseToAnyPublisher()
}
.eraseToEffect()
}
Where AppState
:
enum AppState: Equatable {
case loggedIn(RootLoggedInState)
case loggedOut(RootLoggedOutState)
public init() { self = .loggedOut(.init()) }
}
AppAction
:
enum AppAction: Equatable {
case loggedIn(RootLoggedInAction)
case loggedOut(RootLoggedOutAction)
}
Full appReducer
:
let appReducer = Reducer<AppState, AppAction, AppEnvironment>.combine(
rootLoggedInReducer.pullback(
state: /AppState.loggedIn,
action: /AppAction.loggedIn,
environment: { env in env }
),
rootLoggedOutReducer.pullback(
state: /AppState.loggedOut,
action: /AppAction.loggedOut,
environment: { env in env }
),
Reducer { state, action, env in
env.observeUserChanges.invoke()
.flatMap { user -> AnyPublisher<AppAction, Never> in
guard let user = user else {
return Just(.loggedOut).eraseToAnyPublisher()
}
return Just(.loggedIn).eraseToAnyPublisher()
}
.eraseToEffect()
}
)
Can I reduce it to Effect just from environment, or do I need to do it in some other way?
I'm sorry, if it is smaller Swift problem, but I am Android developer and I am trying to learn Swift :D
Thanks,
Vlado