Skip to content
Snippets Groups Projects
ConfirmRequestView.swift 2.46 KiB
Newer Older
import ComposableArchitecture
import SwiftUI

public struct ConfirmRequestView: View {
  public init(store: Store<ConfirmRequestState, ConfirmRequestAction>) {
    self.store = store
  }

  let store: Store<ConfirmRequestState, ConfirmRequestAction>

  struct ViewState: Equatable {
    var username: String?
    var email: String?
    var phone: String?
    var isConfirming: Bool
    var result: ConfirmRequestState.Result?

    init(state: ConfirmRequestState) {
      username = try? state.contact.getFact(.username)?.value
      email = try? state.contact.getFact(.email)?.value
      phone = try? state.contact.getFact(.phone)?.value
      isConfirming = state.isConfirming
      result = state.result
    }
  }

  public var body: some View {
    WithViewStore(store, observe: ViewState.init) { viewStore in
      Form {
        Section {
          Label(viewStore.username ?? "", systemImage: "person")
          Label(viewStore.email ?? "", systemImage: "envelope")
          Label(viewStore.phone ?? "", systemImage: "phone")
        } header: {
          Text("Facts")
        }

        Section {
          Button {
            viewStore.send(.confirmTapped)
          } label: {
            HStack {
              Text("Confirm")
              Spacer()
              if viewStore.isConfirming {
                ProgressView()
              } else {
                Image(systemName: "checkmark")
              }
            }
          }
          .disabled(viewStore.isConfirming)
        }

        if let result = viewStore.result {
          Section {
            HStack {
              switch result {
              case .success:
                Text("Request confirmed")
                Spacer()
                Image(systemName: "person.fill.checkmark")

              case .failure(_):
                Text("Confirming request failed")
                Spacer()
                Image(systemName: "xmark")
              }
            }
            if case .failure(let failure) = result {
              Text(failure)
            }
          } header: {
            Text("Result")
          }
        }
      }
      .navigationTitle("Confirm request")
    }
  }
}

#if DEBUG
public struct ConfirmRequestView_Previews: PreviewProvider {
  public static var previews: some View {
    ConfirmRequestView(store: Store(
      initialState: ConfirmRequestState(
        contact: .unimplemented("contact-data".data(using: .utf8)!)
      ),
      reducer: .empty,
      environment: ()
    ))
  }
}
#endif