This diff demonstrates the complete transformation of a coordinator and its view from the 0.8 pattern to the 0.9+ pattern, including state/action changes, reducer logic updates, and view scoping.
struct IndexedCoordinatorView: View {
let store: StoreOf<IndexedCoordinator>
var body: some View {
- TCARouter(store) { screen in
+ TCARouter(store.scope(state: \.routes, action: \.router)) { screen in
SwitchStore(screen) { screen in
switch screen {
case .home:
CaseLet(
\Screen.State.home,
action: Screen.Action.home,
then: HomeView.init
)
case .numbersList:
CaseLet(
\Screen.State.numbersList,
action: Screen.Action.numbersList,
then: NumbersListView.init
)
case .numberDetail:
CaseLet(
\Screen.State.numberDetail,
action: Screen.Action.numberDetail,
then: NumberDetailView.init
)
}
}
}
}
}
+@Reducer
struct IndexedCoordinator {
- struct State: Equatable, IndexedRouterState {
+ struct State: Equatable {
var routes: [Route<Screen.State>]
}
- enum Action: IndexedRouterAction {
+ enum Action {
- case routeAction(Int, action: Screen.Action)
- case updateRoutes([Route<Screen.State>])
+ case router(IndexedRouterActionOf<Screen>)
}
var body: some ReducerOf<Self> {
Reduce<State, Action> {
switch action {
- case .routeAction(_, .home(.startTapped)):
+ case .router(.routeAction(_, .home(.startTapped))):
state.routes.presentSheet(.numbersList(.init(numbers: Array(0 ..< 4))), embedInNavigationView: true)
- case let .routeAction(_, .numbersList(.numberSelected(number))):
+ case let .router(.routeAction(_, .numbersList(.numberSelected(number)))):
state.routes.push(.numberDetail(.init(number: number)))
- case .routeAction(_, .numberDetail(.goBackTapped)):
+ case .router(.routeAction(_, .numberDetail(.goBackTapped))):
state.routes.goBack()
- case .routeAction(_, .numberDetail(.goBackToRootTapped)):
- return .routeWithDelaysIfUnsupported(state.routes) {
+ case .router(.routeAction(_, .numberDetail(.goBackToRootTapped))):
+ return .routeWithDelaysIfUnsupported(state.routes, action: \.router) {
$0.goBackToRoot()
}
default:
break
}
return .none
}
- .forEachRoute {
+ .forEachRoute(\.routes, action: \.router) {
Screen()
}
}
}