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