diff --git a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthComponent.swift b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthComponent.swift new file mode 100644 index 0000000000000000000000000000000000000000..629c150dc271792e1b1b88bc9733a364955a8985 --- /dev/null +++ b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthComponent.swift @@ -0,0 +1,71 @@ +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 + } + } +} diff --git a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthFeature.swift b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthFeature.swift deleted file mode 100644 index d4acb74002902f9b9a82da2981f78cd3312deb9e..0000000000000000000000000000000000000000 --- a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthFeature.swift +++ /dev/null @@ -1,90 +0,0 @@ -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 - } -} diff --git a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthView.swift b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthView.swift index 7b384efb74d841b4edf04a61cf55aa02a7c0d725..cc15b34a75c475c41c5cedacf0bd11181877791d 100644 --- a/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthView.swift +++ b/Examples/xx-messenger/Sources/ResetAuthFeature/ResetAuthView.swift @@ -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() )) } } diff --git a/Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthFeatureTests.swift b/Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthComponentTests.swift similarity index 71% rename from Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthFeatureTests.swift rename to Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthComponentTests.swift index 46b5dc9e402d5c2cb71a796790b205732876a658..03ec62686846d64a50ede08c39bc25255cc64558 100644 --- a/Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthFeatureTests.swift +++ b/Examples/xx-messenger/Tests/ResetAuthFeatureTests/ResetAuthComponentTests.swift @@ -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