Skip to content
Snippets Groups Projects
ResetAuthFeature.swift 2.07 KiB
Newer Older
import ComposableArchitecture
import Foundation
import XCTestDynamicOverlay
import XXClient
import XXMessengerClient

public struct ResetAuthState: Equatable {
  public init(
    partner: Contact,
    isResetting: Bool = false,
    failure: String? = nil,
    didReset: Bool = false
  ) {
    self.partner = partner
    self.isResetting = isResetting
    self.failure = failure
    self.didReset = didReset
  public var partner: Contact
  public var isResetting: Bool
  public var failure: String?
  public var didReset: Bool
public enum ResetAuthAction: Equatable {
  case resetTapped
  case didReset
  case didFail(String)
}

public struct ResetAuthEnvironment {
  public init(
    messenger: Messenger,
    mainQueue: AnySchedulerOf<DispatchQueue>,
    bgQueue: AnySchedulerOf<DispatchQueue>
  ) {
    self.messenger = messenger
    self.mainQueue = mainQueue
    self.bgQueue = bgQueue
  }

  public var messenger: Messenger
  public var mainQueue: AnySchedulerOf<DispatchQueue>
  public var bgQueue: AnySchedulerOf<DispatchQueue>
}

#if DEBUG
extension ResetAuthEnvironment {
  public static let unimplemented = ResetAuthEnvironment(
    messenger: .unimplemented,
    mainQueue: .unimplemented,
    bgQueue: .unimplemented
  )
public let resetAuthReducer = Reducer<ResetAuthState, ResetAuthAction, ResetAuthEnvironment>
{ state, action, env in
  switch action {
  case .resetTapped:
    state.isResetting = true
    state.didReset = false
    state.failure = nil
    return Effect.result { [state] in
      do {
        let e2e = try env.messenger.e2e.tryGet()
        _ = try e2e.resetAuthenticatedChannel(partner: state.partner)
        return .success(.didReset)
      } catch {
        return .success(.didFail(error.localizedDescription))
      }
    }
    .subscribe(on: env.bgQueue)
    .receive(on: env.mainQueue)
    .eraseToEffect()

  case .didReset:
    state.isResetting = false
    state.didReset = true
    state.failure = nil
    return .none

  case .didFail(let failure):
    state.isResetting = false
    state.didReset = false
    state.failure = failure
    return .none
  }
}