Skip to content
Snippets Groups Projects
DependencyRegistrator.swift 11.5 KiB
Newer Older
Bruno Muniz's avatar
Bruno Muniz committed
// MARK: SDK

import UIKit
Bruno Muniz's avatar
Bruno Muniz committed
import Network
import QuickLook
import MobileCoreServices
Bruno Muniz's avatar
Bruno Muniz committed

// MARK: Isolated features

import HUD
import Theme
import Bindings
import XXLogger
import Keychain
import Defaults
import Countries
import Voxophone
Bruno Muniz's avatar
Bruno Muniz committed
import Integration
import Permissions
Ahmed Shehata's avatar
Ahmed Shehata committed
import PushFeature
Bruno Muniz's avatar
Bruno Muniz committed
import SFTPFeature
Bruno Muniz's avatar
Bruno Muniz committed
import CrashService
import ToastFeature
import iCloudFeature
Bruno Muniz's avatar
Bruno Muniz committed
import CrashReporting
import NetworkMonitor
import DropboxFeature
Bruno Muniz's avatar
Bruno Muniz committed
import VersionChecking
import GoogleDriveFeature
Bruno Muniz's avatar
Bruno Muniz committed
import DependencyInjection

// MARK: UI Features

import ScanFeature
import ChatFeature
import MenuFeature
import BackupFeature
Bruno Muniz's avatar
Bruno Muniz committed
import SearchFeature
Ahmed Shehata's avatar
Ahmed Shehata committed
import LaunchFeature
import RestoreFeature
Bruno Muniz's avatar
Bruno Muniz committed
import ContactFeature
import ProfileFeature
import ChatListFeature
import SettingsFeature
import RequestsFeature
import OnboardingFeature
import ContactListFeature

struct DependencyRegistrator {
    static private let container = DependencyInjection.Container.shared

    // MARK: MOCK

    static func registerForMock() {
        container.register(XXLogger.noop)
        container.register(CrashReporter.noop)
        container.register(VersionChecker.mock)
        container.register(XXNetwork<BindingsMock>() as XXNetworking)
        container.register(MockNetworkMonitor() as NetworkMonitoring)
        container.register(KeyObjectStore.userDefaults)
        container.register(MockPushHandler() as PushHandling)
        container.register(MockKeychainHandler() as KeychainHandling)
        container.register(MockPermissionHandler() as PermissionHandling)

        /// Restore / Backup

        container.register(SFTPService.mock)
        container.register(iCloudServiceMock() as iCloudInterface)
        container.register(DropboxServiceMock() as DropboxInterface)
        container.register(GoogleDriveServiceMock() as GoogleDriveInterface)

Bruno Muniz's avatar
Bruno Muniz committed
        registerCommonDependencies()
    }

    // MARK: LIVE

    static func registerForLive() {
        container.register(KeyObjectStore.userDefaults)
Bruno Muniz's avatar
Bruno Muniz committed
        container.register(XXLogger.live())
        container.register(CrashReporter.live)
        container.register(VersionChecker.live())
Bruno Muniz's avatar
Bruno Muniz committed
        container.register(XXNetwork<BindingsClient>() as XXNetworking)
        container.register(NetworkMonitor() as NetworkMonitoring)
        container.register(PushHandler() as PushHandling)
        container.register(KeychainHandler() as KeychainHandling)
        container.register(PermissionHandler() as PermissionHandling)

        /// Restore / Backup

Bruno Muniz's avatar
Bruno Muniz committed
        container.register(SFTPService.live)
        container.register(iCloudService() as iCloudInterface)
        container.register(DropboxService() as DropboxInterface)
        container.register(GoogleDriveService() as GoogleDriveInterface)

Bruno Muniz's avatar
Bruno Muniz committed
        registerCommonDependencies()
    }

    // MARK: COMMON

    static private func registerCommonDependencies() {
        container.register(Voxophone())
        container.register(BackupService())
Bruno Muniz's avatar
Bruno Muniz committed

        // MARK: Isolated

Bruno Muniz's avatar
Bruno Muniz committed
        container.register(HUD())
Bruno Muniz's avatar
Bruno Muniz committed
        container.register(ThemeController() as ThemeControlling)
        container.register(ToastController())
Bruno Muniz's avatar
Bruno Muniz committed
        container.register(StatusBarController() as StatusBarStyleControlling)

        // MARK: Coordinators

Ahmed Shehata's avatar
Ahmed Shehata committed
        container.register(
            LaunchCoordinator(
                searchFactory: SearchContainerController.init,
Ahmed Shehata's avatar
Ahmed Shehata committed
                requestsFactory: RequestsContainerController.init,
                chatListFactory: ChatListController.init,
                onboardingFactory: OnboardingStartController.init(_:),
                singleChatFactory: SingleChatController.init(_:),
                groupChatFactory: GroupChatController.init(_:)
            ) as LaunchCoordinating)

        container.register(
            BackupCoordinator(
                passphraseFactory: BackupPassphraseController.init(_:_:)
            ) as BackupCoordinating)

        container.register(
            MenuCoordinator(
                scanFactory: ScanContainerController.init,
                chatsFactory: ChatListController.init,
                profileFactory: ProfileController.init,
                settingsFactory: SettingsController.init,
                contactsFactory: ContactListController.init,
                requestsFactory: RequestsContainerController.init
            ) as MenuCoordinating)

        container.register(
            SearchCoordinator(
                contactsFactory: ContactListController.init,
                requestsFactory: RequestsContainerController.init,
                contactFactory: ContactController.init(_:),
                countriesFactory: CountryListController.init(_:)
            ) as SearchCoordinating)

        container.register(
            ProfileCoordinator(
                emailFactory: ProfileEmailController.init,
                phoneFactory: ProfilePhoneController.init,
                imagePickerFactory: UIImagePickerController.init,
                permissionFactory: RequestPermissionController.init,
                sideMenuFactory: MenuController.init(_:_:),
                countriesFactory: CountryListController.init(_:),
                codeFactory: ProfileCodeController.init(_:_:)
            ) as ProfileCoordinating)

        container.register(
            SettingsCoordinator(
                backupFactory: BackupController.init,
                advancedFactory: SettingsAdvancedController.init,
                accountDeleteFactory: AccountDeleteController.init,
                sideMenuFactory: MenuController.init(_:_:)
            ) as SettingsCoordinating)

        container.register(
            RestoreCoordinator(
                successFactory: RestoreSuccessController.init,
                chatListFactory: ChatListController.init,
Ahmed Shehata's avatar
Ahmed Shehata committed
                restoreFactory: RestoreController.init(_:_:),
                passphraseFactory: RestorePassphraseController.init(_:)
            ) as RestoreCoordinating)
Bruno Muniz's avatar
Bruno Muniz committed

        container.register(
            ChatCoordinator(
                retryFactory: RetrySheetController.init,
                webFactory: WebScreen.init(url:),
                previewFactory: QLPreviewController.init,
                contactFactory: ContactController.init(_:),
                imagePickerFactory: UIImagePickerController.init,
                permissionFactory: RequestPermissionController.init
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ChatCoordinating)

        container.register(
            ContactCoordinator(
                requestsFactory: RequestsContainerController.init,
                singleChatFactory: SingleChatController.init(_:),
                imagePickerFactory: UIImagePickerController.init,
                nicknameFactory: NicknameController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ContactCoordinating)

        container.register(
            RequestsCoordinator(
                searchFactory: SearchContainerController.init,
                contactFactory: ContactController.init(_:),
                singleChatFactory: SingleChatController.init(_:),
                groupChatFactory: GroupChatController.init(_:),
                sideMenuFactory: MenuController.init(_:_:),
                nicknameFactory: NicknameController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as RequestsCoordinating)

        container.register(
            OnboardingCoordinator(
                emailFactory: OnboardingEmailController.init,
                phoneFactory: OnboardingPhoneController.init,
                searchFactory: SearchContainerController.init,
                welcomeFactory: OnboardingWelcomeController.init,
                chatListFactory: ChatListController.init,
                usernameFactory: OnboardingUsernameController.init(_:),
                restoreListFactory: RestoreListController.init(_:),
                successFactory: OnboardingSuccessController.init(_:),
                countriesFactory: CountryListController.init(_:),
                phoneConfirmationFactory: OnboardingPhoneConfirmationController.init(_:_:),
                emailConfirmationFactory: OnboardingEmailConfirmationController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as OnboardingCoordinating)

        container.register(
            ContactListCoordinator(
                scanFactory: ScanContainerController.init,
                searchFactory: SearchContainerController.init,
Bruno Muniz's avatar
Bruno Muniz committed
                newGroupFactory: CreateGroupController.init,
                requestsFactory: RequestsContainerController.init,
                contactFactory: ContactController.init(_:),
                singleChatFactory: SingleChatController.init(_:),
                groupChatFactory: GroupChatController.init(_:),
                sideMenuFactory: MenuController.init(_:_:),
                groupDrawerFactory: CreateDrawerController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ContactListCoordinating)

        container.register(
            ScanCoordinator(
Ahmed Shehata's avatar
Ahmed Shehata committed
                emailFactory: ProfileEmailController.init,
                phoneFactory: ProfilePhoneController.init,
Bruno Muniz's avatar
Bruno Muniz committed
                contactsFactory: ContactListController.init,
                requestsFactory: RequestsContainerController.init,
                contactFactory: ContactController.init(_:),
                sideMenuFactory: MenuController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ScanCoordinating)

Ahmed Shehata's avatar
Ahmed Shehata committed

Bruno Muniz's avatar
Bruno Muniz committed
        container.register(
            ChatListCoordinator(
                scanFactory: ScanContainerController.init,
                searchFactory: SearchContainerController.init,
Ahmed Shehata's avatar
Ahmed Shehata committed
                newGroupFactory: CreateGroupController.init,
Bruno Muniz's avatar
Bruno Muniz committed
                contactsFactory: ContactListController.init,
Ahmed Shehata's avatar
Ahmed Shehata committed
                contactFactory: ContactController.init(_:),
                singleChatFactory: SingleChatController.init(_:),
                groupChatFactory: GroupChatController.init(_:),
                sideMenuFactory: MenuController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ChatListCoordinating)
    }
}
Ahmed Shehata's avatar
Ahmed Shehata committed

extension PushRouter {
    static func live(navigationController: UINavigationController) -> PushRouter {
        PushRouter { route, completion in
            if let launchController = navigationController.viewControllers.last as? LaunchController {
                launchController.pendingPushRoute = route
            } else {
                switch route {
                case .search:
                    if (navigationController.viewControllers.last as? SearchContainerController) == nil {
                        navigationController.setViewControllers([SearchContainerController()], animated: true)
                    }

Ahmed Shehata's avatar
Ahmed Shehata committed
                case .requests:
                    if (navigationController.viewControllers.last as? RequestsContainerController) == nil {
                        navigationController.setViewControllers([RequestsContainerController()], animated: true)
                    }
                case .contactChat(id: let id):
                    if let session = try? DependencyInjection.Container.shared.resolve() as SessionType,
                       let contact = try? session.dbManager.fetchContacts(.init(id: [id])).first {
Ahmed Shehata's avatar
Ahmed Shehata committed
                        navigationController.setViewControllers([
                            ChatListController(),
                            SingleChatController(contact)
                        ], animated: true)
                    }
                case .groupChat(id: let id):
                    if let session = try? DependencyInjection.Container.shared.resolve() as SessionType,
                       let info = try? session.dbManager.fetchGroupInfos(.init(groupId: id)).first {
Ahmed Shehata's avatar
Ahmed Shehata committed
                        navigationController.setViewControllers([
                            ChatListController(),
                            GroupChatController(info)
                        ], animated: true)
                    }
                }
            }

            completion()
        }
    }
}