Skip to content
Snippets Groups Projects
Commit dc24e4a4 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Migrate ResetAuthFeature to ReducerProtocol

parent a8031c07
No related branches found
No related tags found
2 merge requests!126Migrate example app to ComposableArchitecture's ReducerProtocol,!102Release 1.0.0
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
}
}
}
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
)
}
#endif
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
}
}
......@@ -3,14 +3,14 @@ import ComposableArchitecture
import SwiftUI
public struct ResetAuthView: View {
public init(store: Store<ResetAuthState, ResetAuthAction>) {
public init(store: StoreOf<ResetAuthComponent>) {
self.store = store
}
let store: Store<ResetAuthState, ResetAuthAction>
let store: StoreOf<ResetAuthComponent>
struct ViewState: Equatable {
init(state: ResetAuthState) {
init(state: ResetAuthComponent.State) {
contactID = try? state.partner.getId()
isResetting = state.isResetting
failure = state.failure
......@@ -68,11 +68,10 @@ public struct ResetAuthView_Previews: PreviewProvider {
public static var previews: some View {
NavigationView {
ResetAuthView(store: Store(
initialState: ResetAuthState(
initialState: ResetAuthComponent.State(
partner: .unimplemented(Data())
),
reducer: .empty,
environment: ()
reducer: EmptyReducer()
))
}
}
......
......@@ -4,7 +4,7 @@ import XCTest
import XXClient
@testable import ResetAuthFeature
final class ResetAuthFeatureTests: XCTestCase {
final class ResetAuthComponentTests: XCTestCase {
func testReset() {
let partnerData = "contact-data".data(using: .utf8)!
let partner = Contact.unimplemented(partnerData)
......@@ -12,15 +12,14 @@ final class ResetAuthFeatureTests: XCTestCase {
var didResetAuthChannel: [Contact] = []
let store = TestStore(
initialState: ResetAuthState(
initialState: ResetAuthComponent.State(
partner: partner
),
reducer: resetAuthReducer,
environment: .unimplemented
reducer: ResetAuthComponent()
)
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.e2e.get = {
store.dependencies.app.mainQueue = .immediate
store.dependencies.app.bgQueue = .immediate
store.dependencies.app.messenger.e2e.get = {
var e2e: E2E = .unimplemented
e2e.resetAuthenticatedChannel.run = { contact in
didResetAuthChannel.append(contact)
......@@ -46,15 +45,14 @@ final class ResetAuthFeatureTests: XCTestCase {
let failure = Failure()
let store = TestStore(
initialState: ResetAuthState(
initialState: ResetAuthComponent.State(
partner: .unimplemented(Data())
),
reducer: resetAuthReducer,
environment: .unimplemented
reducer: ResetAuthComponent()
)
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
store.environment.messenger.e2e.get = {
store.dependencies.app.mainQueue = .immediate
store.dependencies.app.bgQueue = .immediate
store.dependencies.app.messenger.e2e.get = {
var e2e: E2E = .unimplemented
e2e.resetAuthenticatedChannel.run = { _ in throw failure }
return e2e
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment