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 ...@@ -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.
Finish editing this message first!
Please register or to comment