Select Git revision
ClientStorage.swift
AppFeature.swift 3.35 KiB
import AppCore
import Combine
import ComposableArchitecture
import ComposablePresentation
import Foundation
import HomeFeature
import RestoreFeature
import WelcomeFeature
import XXMessengerClient
struct AppState: Equatable {
enum Screen: Equatable {
case loading
case welcome(WelcomeState)
case restore(RestoreState)
case home(HomeState)
case failure(String)
}
@BindableState var screen: Screen = .loading
}
extension AppState.Screen {
var asWelcome: WelcomeState? {
get { (/AppState.Screen.welcome).extract(from: self) }
set { if let newValue = newValue { self = .welcome(newValue) } }
}
var asRestore: RestoreState? {
get { (/AppState.Screen.restore).extract(from: self) }
set { if let state = newValue { self = .restore(state) } }
}
var asHome: HomeState? {
get { (/AppState.Screen.home).extract(from: self) }
set { if let newValue = newValue { self = .home(newValue) } }
}
}
enum AppAction: Equatable, BindableAction {
case start
case binding(BindingAction<AppState>)
case welcome(WelcomeAction)
case restore(RestoreAction)
case home(HomeAction)
}
struct AppEnvironment {
var dbManager: DBManager
var messenger: Messenger
var mainQueue: AnySchedulerOf<DispatchQueue>
var bgQueue: AnySchedulerOf<DispatchQueue>
var welcome: () -> WelcomeEnvironment
var restore: () -> RestoreEnvironment
var home: () -> HomeEnvironment
}
extension AppEnvironment {
static let unimplemented = AppEnvironment(
dbManager: .unimplemented,
messenger: .unimplemented,
mainQueue: .unimplemented,
bgQueue: .unimplemented,
welcome: { .unimplemented },
restore: { .unimplemented },
home: { .unimplemented }
)
}
let appReducer = Reducer<AppState, AppAction, AppEnvironment>
{ state, action, env in
switch action {