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

Migrate ResetAuthFeature to ReducerProtocol

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