From 4f378901dfa92a0eca8fccd327e671504933c3f9 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Wed, 7 Sep 2022 13:42:33 +0200 Subject: [PATCH] Extract SendRequestFeature to separate library --- .../xcschemes/SendRequestFeature.xcscheme | 78 +++++++++++++++++++ Examples/xx-messenger/Package.swift | 17 ++++ .../xcschemes/XXMessenger.xcscheme | 10 +++ .../AppFeature/AppEnvironment+Live.swift | 2 +- .../ContactFeature/ContactFeature.swift | 15 ++-- .../ContactSendRequestFeature.swift | 28 ------- .../Sources/ContactFeature/ContactView.swift | 3 +- .../SendRequestFeature.swift | 28 +++++++ .../SendRequestView.swift} | 14 ++-- .../ContactFeatureTests.swift | 3 +- .../ContactSendRequestFeatureTests.swift | 15 ---- .../SendRequestFeatureTests.swift | 15 ++++ 12 files changed, 168 insertions(+), 60 deletions(-) create mode 100644 Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/SendRequestFeature.xcscheme delete mode 100644 Examples/xx-messenger/Sources/ContactFeature/ContactSendRequestFeature.swift create mode 100644 Examples/xx-messenger/Sources/SendRequestFeature/SendRequestFeature.swift rename Examples/xx-messenger/Sources/{ContactFeature/ContactSendRequestView.swift => SendRequestFeature/SendRequestView.swift} (52%) delete mode 100644 Examples/xx-messenger/Tests/ContactFeatureTests/ContactSendRequestFeatureTests.swift create mode 100644 Examples/xx-messenger/Tests/SendRequestFeatureTests/SendRequestFeatureTests.swift diff --git a/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/SendRequestFeature.xcscheme b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/SendRequestFeature.xcscheme new file mode 100644 index 00000000..2f70b385 --- /dev/null +++ b/Examples/xx-messenger/.swiftpm/xcode/xcshareddata/xcschemes/SendRequestFeature.xcscheme @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1340" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "SendRequestFeature" + BuildableName = "SendRequestFeature" + BlueprintName = "SendRequestFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> + <Testables> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "SendRequestFeatureTests" + BuildableName = "SendRequestFeatureTests" + BlueprintName = "SendRequestFeatureTests" + ReferencedContainer = "container:"> + </BuildableReference> + </TestableReference> + </Testables> + </TestAction> + <LaunchAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + debugServiceExtension = "internal" + allowLocationSimulation = "YES"> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "SendRequestFeature" + BuildableName = "SendRequestFeature" + BlueprintName = "SendRequestFeature" + ReferencedContainer = "container:"> + </BuildableReference> + </MacroExpansion> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift index 79123e05..bbd8afa7 100644 --- a/Examples/xx-messenger/Package.swift +++ b/Examples/xx-messenger/Package.swift @@ -24,6 +24,7 @@ let package = Package( .library(name: "HomeFeature", targets: ["HomeFeature"]), .library(name: "RegisterFeature", targets: ["RegisterFeature"]), .library(name: "RestoreFeature", targets: ["RestoreFeature"]), + .library(name: "SendRequestFeature", targets: ["SendRequestFeature"]), .library(name: "UserSearchFeature", targets: ["UserSearchFeature"]), .library(name: "WelcomeFeature", targets: ["WelcomeFeature"]), ], @@ -74,6 +75,7 @@ let package = Package( .target(name: "HomeFeature"), .target(name: "RegisterFeature"), .target(name: "RestoreFeature"), + .target(name: "SendRequestFeature"), .target(name: "UserSearchFeature"), .target(name: "WelcomeFeature"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), @@ -94,6 +96,7 @@ let package = Package( name: "ContactFeature", dependencies: [ .target(name: "AppCore"), + .target(name: "SendRequestFeature"), .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), .product(name: "ComposablePresentation", package: "swift-composable-presentation"), .product(name: "XXMessengerClient", package: "elixxir-dapps-sdk-swift"), @@ -158,6 +161,20 @@ let package = Package( ], swiftSettings: swiftSettings ), + .target( + name: "SendRequestFeature", + dependencies: [ + .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + ], + swiftSettings: swiftSettings + ), + .testTarget( + name: "SendRequestFeatureTests", + dependencies: [ + .target(name: "SendRequestFeature"), + ], + swiftSettings: swiftSettings + ), .target( name: "UserSearchFeature", dependencies: [ diff --git a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme index 0bf8b441..0d7cb106 100644 --- a/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme +++ b/Examples/xx-messenger/Project/XXMessenger.xcodeproj/xcshareddata/xcschemes/XXMessenger.xcscheme @@ -89,6 +89,16 @@ ReferencedContainer = "container:.."> </BuildableReference> </TestableReference> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "SendRequestFeatureTests" + BuildableName = "SendRequestFeatureTests" + BlueprintName = "SendRequestFeatureTests" + ReferencedContainer = "container:.."> + </BuildableReference> + </TestableReference> <TestableReference skipped = "NO"> <BuildableReference diff --git a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift index 514f56bd..a060ad48 100644 --- a/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift +++ b/Examples/xx-messenger/Sources/AppFeature/AppEnvironment+Live.swift @@ -62,7 +62,7 @@ extension AppEnvironment { mainQueue: mainQueue, bgQueue: bgQueue, sendRequest: { - ContactSendRequestEnvironment() + SendRequestEnvironment() } ) } diff --git a/Examples/xx-messenger/Sources/ContactFeature/ContactFeature.swift b/Examples/xx-messenger/Sources/ContactFeature/ContactFeature.swift index 76715592..99b7b2bc 100644 --- a/Examples/xx-messenger/Sources/ContactFeature/ContactFeature.swift +++ b/Examples/xx-messenger/Sources/ContactFeature/ContactFeature.swift @@ -2,6 +2,7 @@ import AppCore import ComposableArchitecture import ComposablePresentation import Foundation +import SendRequestFeature import XCTestDynamicOverlay import XXClient import XXMessengerClient @@ -12,7 +13,7 @@ public struct ContactState: Equatable { id: Data, dbContact: XXModels.Contact? = nil, xxContact: XXClient.Contact? = nil, - sendRequest: ContactSendRequestState? = nil + sendRequest: SendRequestState? = nil ) { self.id = id self.dbContact = dbContact @@ -23,7 +24,7 @@ public struct ContactState: Equatable { public var id: Data public var dbContact: XXModels.Contact? public var xxContact: XXClient.Contact? - public var sendRequest: ContactSendRequestState? + public var sendRequest: SendRequestState? } public enum ContactAction: Equatable { @@ -32,7 +33,7 @@ public enum ContactAction: Equatable { case saveFactsTapped case sendRequestTapped case sendRequestDismissed - case sendRequest(ContactSendRequestAction) + case sendRequest(SendRequestAction) } public struct ContactEnvironment { @@ -41,7 +42,7 @@ public struct ContactEnvironment { db: DBManagerGetDB, mainQueue: AnySchedulerOf<DispatchQueue>, bgQueue: AnySchedulerOf<DispatchQueue>, - sendRequest: @escaping () -> ContactSendRequestEnvironment + sendRequest: @escaping () -> SendRequestEnvironment ) { self.messenger = messenger self.db = db @@ -54,7 +55,7 @@ public struct ContactEnvironment { public var db: DBManagerGetDB public var mainQueue: AnySchedulerOf<DispatchQueue> public var bgQueue: AnySchedulerOf<DispatchQueue> - public var sendRequest: () -> ContactSendRequestEnvironment + public var sendRequest: () -> SendRequestEnvironment } #if DEBUG @@ -103,7 +104,7 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm .eraseToEffect() case .sendRequestTapped: - state.sendRequest = ContactSendRequestState() + state.sendRequest = SendRequestState() return .none case .sendRequestDismissed: @@ -115,7 +116,7 @@ public let contactReducer = Reducer<ContactState, ContactAction, ContactEnvironm } } .presenting( - contactSendRequestReducer, + sendRequestReducer, state: .keyPath(\.sendRequest), id: .notNil(), action: /ContactAction.sendRequest, diff --git a/Examples/xx-messenger/Sources/ContactFeature/ContactSendRequestFeature.swift b/Examples/xx-messenger/Sources/ContactFeature/ContactSendRequestFeature.swift deleted file mode 100644 index a0a474e5..00000000 --- a/Examples/xx-messenger/Sources/ContactFeature/ContactSendRequestFeature.swift +++ /dev/null @@ -1,28 +0,0 @@ -import ComposableArchitecture -import XCTestDynamicOverlay - -public struct ContactSendRequestState: Equatable { - public init() {} -} - -public enum ContactSendRequestAction: Equatable { - case start -} - -public struct ContactSendRequestEnvironment { - public init() {} -} - -#if DEBUG -extension ContactSendRequestEnvironment { - public static let unimplemented = ContactSendRequestEnvironment() -} -#endif - -public let contactSendRequestReducer = Reducer<ContactSendRequestState, ContactSendRequestAction, ContactSendRequestEnvironment> -{ state, action, env in - switch action { - case .start: - return .none - } -} diff --git a/Examples/xx-messenger/Sources/ContactFeature/ContactView.swift b/Examples/xx-messenger/Sources/ContactFeature/ContactView.swift index 44a46c56..02f12d62 100644 --- a/Examples/xx-messenger/Sources/ContactFeature/ContactView.swift +++ b/Examples/xx-messenger/Sources/ContactFeature/ContactView.swift @@ -1,6 +1,7 @@ import AppCore import ComposableArchitecture import ComposablePresentation +import SendRequestFeature import SwiftUI import XXClient import XXModels @@ -167,7 +168,7 @@ public struct ContactView: View { action: ContactAction.sendRequest ), onDeactivate: { viewStore.send(.sendRequestDismissed) }, - destination: ContactSendRequestView.init(store:) + destination: SendRequestView.init(store:) )) } } diff --git a/Examples/xx-messenger/Sources/SendRequestFeature/SendRequestFeature.swift b/Examples/xx-messenger/Sources/SendRequestFeature/SendRequestFeature.swift new file mode 100644 index 00000000..a6683c29 --- /dev/null +++ b/Examples/xx-messenger/Sources/SendRequestFeature/SendRequestFeature.swift @@ -0,0 +1,28 @@ +import ComposableArchitecture +import XCTestDynamicOverlay + +public struct SendRequestState: Equatable { + public init() {} +} + +public enum SendRequestAction: Equatable { + case start +} + +public struct SendRequestEnvironment { + public init() {} +} + +#if DEBUG +extension SendRequestEnvironment { + public static let unimplemented = SendRequestEnvironment() +} +#endif + +public let sendRequestReducer = Reducer<SendRequestState, SendRequestAction, SendRequestEnvironment> +{ state, action, env in + switch action { + case .start: + return .none + } +} diff --git a/Examples/xx-messenger/Sources/ContactFeature/ContactSendRequestView.swift b/Examples/xx-messenger/Sources/SendRequestFeature/SendRequestView.swift similarity index 52% rename from Examples/xx-messenger/Sources/ContactFeature/ContactSendRequestView.swift rename to Examples/xx-messenger/Sources/SendRequestFeature/SendRequestView.swift index 4f5048d3..40042466 100644 --- a/Examples/xx-messenger/Sources/ContactFeature/ContactSendRequestView.swift +++ b/Examples/xx-messenger/Sources/SendRequestFeature/SendRequestView.swift @@ -1,15 +1,15 @@ import ComposableArchitecture import SwiftUI -public struct ContactSendRequestView: View { - public init(store: Store<ContactSendRequestState, ContactSendRequestAction>) { +public struct SendRequestView: View { + public init(store: Store<SendRequestState, SendRequestAction>) { self.store = store } - let store: Store<ContactSendRequestState, ContactSendRequestAction> + let store: Store<SendRequestState, SendRequestAction> struct ViewState: Equatable { - init(state: ContactSendRequestState) {} + init(state: SendRequestState) {} } public var body: some View { @@ -24,10 +24,10 @@ public struct ContactSendRequestView: View { } #if DEBUG -public struct ContactSendRequestView_Previews: PreviewProvider { +public struct SendRequestView_Previews: PreviewProvider { public static var previews: some View { - ContactSendRequestView(store: Store( - initialState: ContactSendRequestState(), + SendRequestView(store: Store( + initialState: SendRequestState(), reducer: .empty, environment: () )) diff --git a/Examples/xx-messenger/Tests/ContactFeatureTests/ContactFeatureTests.swift b/Examples/xx-messenger/Tests/ContactFeatureTests/ContactFeatureTests.swift index 64d0d72a..9f323870 100644 --- a/Examples/xx-messenger/Tests/ContactFeatureTests/ContactFeatureTests.swift +++ b/Examples/xx-messenger/Tests/ContactFeatureTests/ContactFeatureTests.swift @@ -1,6 +1,7 @@ import Combine import ComposableArchitecture import CustomDump +import SendRequestFeature import XCTest import XXClient import XXModels @@ -104,7 +105,7 @@ final class ContactFeatureTests: XCTestCase { ) store.send(.sendRequestTapped) { - $0.sendRequest = ContactSendRequestState() + $0.sendRequest = SendRequestState() } store.send(.sendRequestDismissed) { diff --git a/Examples/xx-messenger/Tests/ContactFeatureTests/ContactSendRequestFeatureTests.swift b/Examples/xx-messenger/Tests/ContactFeatureTests/ContactSendRequestFeatureTests.swift deleted file mode 100644 index 8d4eb040..00000000 --- a/Examples/xx-messenger/Tests/ContactFeatureTests/ContactSendRequestFeatureTests.swift +++ /dev/null @@ -1,15 +0,0 @@ -import ComposableArchitecture -import XCTest -@testable import ContactFeature - -final class ContactSendRequestFeatureTests: XCTestCase { - func testStart() { - let store = TestStore( - initialState: ContactSendRequestState(), - reducer: contactSendRequestReducer, - environment: .unimplemented - ) - - store.send(.start) - } -} diff --git a/Examples/xx-messenger/Tests/SendRequestFeatureTests/SendRequestFeatureTests.swift b/Examples/xx-messenger/Tests/SendRequestFeatureTests/SendRequestFeatureTests.swift new file mode 100644 index 00000000..c64665d2 --- /dev/null +++ b/Examples/xx-messenger/Tests/SendRequestFeatureTests/SendRequestFeatureTests.swift @@ -0,0 +1,15 @@ +import ComposableArchitecture +import XCTest +@testable import SendRequestFeature + +final class SendRequestFeatureTests: XCTestCase { + func testStart() { + let store = TestStore( + initialState: SendRequestState(), + reducer: sendRequestReducer, + environment: .unimplemented + ) + + store.send(.start) + } +} -- GitLab