lolgear
(Dmitry Lobanov)
1
For example, I have a main view with a lot of subviews. Each subview has ViewState and Action.
enum Actions {
enum Privacy {
case allowToGatherCrashDiagnostics(Bool)
}
enum Support {
case callSupport
}
case privacy(Privacy), support(Support)
}
enum States {
struct Privacy {
let termsOfUse: String
let canGatherCrashDiagnostics: Bool
}
struct Support {
let supportURL: String
}
}
struct MainState {
let privacy: States.Privacy
let support: States.Support
}
protocol MainViewModelProtocol {
func apply(_ state: MainState)
var actionPublisher: AnyPublisher<Actions, Never>
}
MainViewModel exposes only two channels: input and output, right?
But how can I apply a partial state?
In examples of TCA you have
- ready-to-use state.
- reducer that applies partial states.
Yes, it is easy, but what if I want to change only one thing in state? What if external system ( push notification or any other interaction that system initiates ) wants to change a state of a view. ( I would like to change a support URL, for example. It comes from a nearby bluetooth device. )
eimantas
(Eimantas)
2
Very vague and not very clear, but I'll try to answer:
-
TCA doesn't have an opinion on how you structure (keep) your states, actions, environments and reducers. You can have 4 top level identifiers (state, action, env, reducer) or you can have them pseudo-namespaced under a single enum SomeFeature
-
You're probably looking for a store scoping. This way you can tell a certain view to observe only one part of a parent view's state. Should you happen to be subscribed to PFC's video series, you can see that in more action in episode #151.