Skip to content
Snippets Groups Projects
Select Git revision
  • 19e3f04cad4bbfee9c07c010af42014a74ee4cbb
  • release default
  • master protected
  • XX-4441
  • Jakub/rootless-CI
  • Anne/CI-Test
  • waitingRoundsRewrite
  • quantumSecure
  • fullRateLimit
  • XX-3564/TlsCipherSuite
  • hotfix/groupNotification
  • Josh/RateLimiting
  • debug/sourceOfErrors
  • XX-3540/TestCert
  • f76/error
  • notls
  • url-repo-rename
  • feature/dynamicAuthRemoval
  • jono/yaml
  • version-2_5_3
  • hotfix/signing
  • v3.13.0
  • v3.11.0
  • v3.10.0
  • v3.9.0
  • v3.7.0
  • v3.6.0
  • v3.5.0
  • v3.1.0
  • v2.2.8
  • v2.2.7
  • v2.1.0
  • v2.0.0
  • v1.7.0
  • v1.6.0
  • v1.5.0
  • v1.4.2
  • v1.4.1
  • v1.4.0
  • v1.3.2
  • v1.3.1
41 results

metrics_test.go

Blame
  • AppView.swift 3.58 KiB
    import ComposableArchitecture
    import HomeFeature
    import RestoreFeature
    import SwiftUI
    import WelcomeFeature
    
    struct AppView: View {
      let store: Store<AppState, AppAction>
    
      enum ViewState: Equatable {
        case loading
        case welcome
        case restore
        case home
        case failure(String)
    
        init(_ state: AppState) {
          switch state.screen {
          case .loading: self = .loading
          case .welcome(_): self = .welcome
          case .restore(_): self = .restore
          case .home(_): self = .home
          case .failure(let failure): self = .failure(failure)
          }
        }
      }
    
      var body: some View {
        WithViewStore(store.scope(state: ViewState.init)) { viewStore in
          ZStack {
            switch viewStore.state {
            case .loading:
              ProgressView {
                Text("Loading")
              }
              .controlSize(.large)
              .frame(maxWidth: .infinity, maxHeight: .infinity)
              .transition(.opacity)
    
            case .welcome:
              IfLetStore(
                store.scope(
                  state: { (/AppState.Screen.welcome).extract(from: $0.screen) },
                  action: AppAction.welcome
                ),
                then: { store in
                  WelcomeView(store: store)
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .transition(.asymmetric(
                      insertion: .move(edge: .trailing),
                      removal: .opacity
                    ))
                }
              )
    
            case .restore:
              IfLetStore(
                store.scope(
                  state: { (/AppState.Screen.restore).extract(from: $0.screen) },
                  action: AppAction.restore
                ),
                then: { store in
                  RestoreView(store: store)
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .transition(.asymmetric(
                      insertion: .move(edge: .trailing),
                      removal: .opacity
                    ))
                }
              )
    
            case .home:
              IfLetStore(
                store.scope(
                  state: { (/AppState.Screen.home).extract(from: $0.screen) },
                  action: AppAction.home
                ),
                then: { store in
                  HomeView(store: store)
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
                    .transition(.asymmetric(
                      insertion: .move(edge: .trailing),
                      removal: .opacity
                    ))
                }
              )
    
            case .failure(let failure):
              NavigationView {
                VStack(spacing: 0) {
                  ScrollView {
                    Text(failure)
                      .frame(maxWidth: .infinity, alignment: .leading)
                      .padding()
                  }
    
                  Divider()
    
                  Button {
                    viewStore.send(.start)
                  } label: {
                    Text("Retry")
                      .frame(maxWidth: .infinity)
                  }
                  .buttonStyle(.borderedProminent)
                  .controlSize(.large)
                  .padding()
                }
                .navigationTitle("Error")
              }
              .navigationViewStyle(.stack)
              .frame(maxWidth: .infinity, maxHeight: .infinity)
              .transition(.asymmetric(
                insertion: .move(edge: .trailing),
                removal: .opacity
              ))
            }
          }
          .animation(.default, value: viewStore.state)
          .task { viewStore.send(.start) }
        }
      }
    }
    
    #if DEBUG
    struct AppView_Previews: PreviewProvider {
      static var previews: some View {
        AppView(store: Store(
          initialState: AppState(),
          reducer: .empty,
          environment: ()
        ))
      }
    }
    #endif