Skip to content
Snippets Groups Projects
AppDependecies.swift 2.73 KiB
Newer Older
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 app: AppDependencies {
    get { self[AppDependenciesKey.self] }
    set { self[AppDependenciesKey.self] = newValue }
  }
}