From 461c473443e95b26ca0135353a82cc99a14b6bce Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Fri, 21 Oct 2022 10:41:03 +0200
Subject: [PATCH] Add AppDependencies to AppCore library

---
 Examples/xx-messenger/Package.swift           |  1 +
 .../Sources/AppCore/AppDependecies.swift      | 96 +++++++++++++++++++
 2 files changed, 97 insertions(+)
 create mode 100644 Examples/xx-messenger/Sources/AppCore/AppDependecies.swift

diff --git a/Examples/xx-messenger/Package.swift b/Examples/xx-messenger/Package.swift
index 69578afe..411e8e2d 100644
--- a/Examples/xx-messenger/Package.swift
+++ b/Examples/xx-messenger/Package.swift
@@ -82,6 +82,7 @@ let package = Package(
       name: "AppCoreTests",
       dependencies: [
         .target(name: "AppCore"),
+        .product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
         .product(name: "CustomDump", package: "swift-custom-dump"),
       ],
       swiftSettings: swiftSettings
diff --git a/Examples/xx-messenger/Sources/AppCore/AppDependecies.swift b/Examples/xx-messenger/Sources/AppCore/AppDependecies.swift
new file mode 100644
index 00000000..d5a173cb
--- /dev/null
+++ b/Examples/xx-messenger/Sources/AppCore/AppDependecies.swift
@@ -0,0 +1,96 @@
+import ComposableArchitecture
+import Foundation
+import XCTestDynamicOverlay
+import XXMessengerClient
+
+public struct AppDependencies {
+  public var dbManager: DBManager
+  public var messenger: Messenger
+  public var authHandler: AuthCallbackHandler
+  public var backupStorage: BackupStorage
+  public var mainQueue: AnySchedulerOf<DispatchQueue>
+  public var bgQueue: AnySchedulerOf<DispatchQueue>
+  public var now: () -> Date
+  public var sendMessage: SendMessage
+  public var sendImage: SendImage
+  public var messageListener: MessageListenerHandler
+  public var receiveFileHandler: ReceiveFileHandler
+  public var log: Logger
+  public var loadData: URLDataLoader
+}
+
+extension AppDependencies {
+  public static func live() -> AppDependencies {
+    let dbManager = DBManager.live()
+    let messengerEnv = MessengerEnvironment.live()
+    let messenger = Messenger.live(messengerEnv)
+    let now: () -> Date = Date.init
+
+    return AppDependencies(
+      dbManager: dbManager,
+      messenger: messenger,
+      authHandler: .live(
+        messenger: messenger,
+        handleRequest: .live(db: dbManager.getDB, now: now),
+        handleConfirm: .live(db: dbManager.getDB),
+        handleReset: .live(db: dbManager.getDB)
+      ),
+      backupStorage: .onDisk(),
+      mainQueue: DispatchQueue.main.eraseToAnyScheduler(),
+      bgQueue: DispatchQueue.global(qos: .background).eraseToAnyScheduler(),
+      now: now,
+      sendMessage: .live(
+        messenger: messenger,
+        db: dbManager.getDB,
+        now: now
+      ),
+      sendImage: .live(
+        messenger: messenger,
+        db: dbManager.getDB,
+        now: now
+      ),
+      messageListener: .live(
+        messenger: messenger,
+        db: dbManager.getDB
+      ),
+      receiveFileHandler: .live(
+        messenger: messenger,
+        db: dbManager.getDB,
+        now: now
+      ),
+      log: .live(),
+      loadData: .live
+    )
+  }
+
+  public static let unimplemented = AppDependencies(
+    dbManager: .unimplemented,
+    messenger: .unimplemented,
+    authHandler: .unimplemented,
+    backupStorage: .unimplemented,
+    mainQueue: .unimplemented,
+    bgQueue: .unimplemented,
+    now: XCTestDynamicOverlay.unimplemented(
+      "\(Self.self)",
+      placeholder: Date(timeIntervalSince1970: 0)
+    ),
+    sendMessage: .unimplemented,
+    sendImage: .unimplemented,
+    messageListener: .unimplemented,
+    receiveFileHandler: .unimplemented,
+    log: .unimplemented,
+    loadData: .unimplemented
+  )
+}
+
+private enum AppDependenciesKey: DependencyKey {
+  static let liveValue: AppDependencies = .live()
+  static let testValue: AppDependencies = .unimplemented
+}
+
+extension DependencyValues {
+  public var appDependencies: AppDependencies {
+    get { self[AppDependenciesKey.self] }
+    set { self[AppDependenciesKey.self] = newValue }
+  }
+}
-- 
GitLab