meow/Meow/Sources/Root/RootFeature.swift

48 lines
1.3 KiB
Swift

//
// RootFeature.swift
// Root
//
import Foundation
import Facts
import CatFactsKit
import ComposableArchitecture
/// Handles interaction logic for the root of the application. Doesn't otherwise do much itself but it does respond to
/// a `viewAppeared` action so that it can show how one might change the state that drives _another_ feature (in this
/// example, `FactsFeature`).
@Reducer
public struct RootFeature {
@ObservableState
public struct State {
var facts: FactsFeature.State = .init(baseURL: URL(string: "https://invalid.barf")!)
public var baseURL: URL?
public init() { }
}
public enum Action {
case viewAppeared
case facts(FactsFeature.Action)
}
public init() { }
public var body: some ReducerOf<Self> {
// This fun DSL lets me provide a concrete Feature reducer when the Root feature is asked for a scoped store
Scope(state: \.facts, action: \.facts) {
FactsFeature()
}
// And then this is everything that's provided by the root.
Reduce { state, action in
switch action {
case .viewAppeared:
state.facts = .init(baseURL: URL(string: "https://meowfacts.herokuapp.com/")!)
return .none
case .facts:
return .none
}
}
}
}