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

public struct ResetAuthComponent: ReducerProtocol {
  public struct State: 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 Action: Equatable {
    case resetTapped
    case didReset
    case didFail(String)
  }

  public init() {}

  @Dependency(\.app.messenger) var messenger: Messenger
  @Dependency(\.app.mainQueue) var mainQueue: AnySchedulerOf<DispatchQueue>
  @Dependency(\.app.bgQueue) var bgQueue: AnySchedulerOf<DispatchQueue>

  public func reduce(into state: inout State, action: Action) -> EffectTask<Action> {
    switch action {
    case .resetTapped:
      state.isResetting = true
      state.didReset = false
      state.failure = nil
      return Effect.result { [state] in
        do {
          let e2e = try messenger.e2e.tryGet()
          _ = try e2e.resetAuthenticatedChannel(partner: state.partner)
          return .success(.didReset)
        } catch {
          return .success(.didFail(error.localizedDescription))
        }
      }
      .subscribe(on: bgQueue)
      .receive(on: 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
    }
  }
}