103 lines
4.5 KiB
Swift
103 lines
4.5 KiB
Swift
//
|
|
// ServersModuleBuilder.swift
|
|
// Privado
|
|
//
|
|
// Created by Jura on 10/10/19.
|
|
// Copyright © 2019 Omicronmedia. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
|
|
typealias ServersModuleCompoundOutput = ServersModuleOutput
|
|
& UpgradeModuleOutput
|
|
& TrafficCounterModuleOutput
|
|
& UpgradeWarningModuleOutput
|
|
& PreferenceModuleOutputIPAD
|
|
& NotificationsModuleOutput
|
|
& AppTutorialModuleOutput
|
|
|
|
protocol ServersModuleOutput: AnyObject {
|
|
func navigate(to route: Route)
|
|
}
|
|
|
|
final class ServersModuleBuilder {
|
|
|
|
static func build(output: ServersModuleCompoundOutput) -> (UIViewController, ServersPresenterInput) {
|
|
|
|
let presenter = ServersPresenter(output: output)
|
|
|
|
let controller: (UIViewController & ServersControllerInput) = DeviceInfoProvider.isIPad
|
|
? ServersControllerIPAD(output: presenter,
|
|
componentCreation: self.createComponentIPAD(with: presenter, and: output),
|
|
modalCreation: self.createModalIPAD(output: output))
|
|
: ServersController(output: presenter,
|
|
componentCreation: self.createComponent(with: presenter, and: output),
|
|
modalCreation: self.createModal(output: output))
|
|
|
|
presenter.viewInput = controller
|
|
|
|
let settingsBuilder = PreferenceModuleBuilderIPAD.build(output: output)
|
|
presenter.settingsInput = settingsBuilder.presenter
|
|
if let controller = controller as? ServersControllerIPAD {
|
|
controller.preferenceViewController = settingsBuilder.view
|
|
}
|
|
|
|
return (controller, presenter)
|
|
}
|
|
|
|
private static func createModalIPAD(output: ServersModuleCompoundOutput) -> ServersControllerIPAD.ModalCreationClosure {
|
|
return { (component: ServersControllerModalComponentIPAD) -> (UIViewController) in
|
|
|
|
switch component {
|
|
case .notifications:
|
|
return NotificationsModuleBuilder.build(output: output)
|
|
case .upgrade:
|
|
return UpgradeModuleBuilder.build(output: output)
|
|
}
|
|
}
|
|
}
|
|
|
|
private static func createModal(output: ServersModuleCompoundOutput) -> ServersController.ModalCreationClosure {
|
|
return { (component: ServersControllerModalComponent) -> (UIViewController) in
|
|
|
|
switch component {
|
|
case .upgrade:
|
|
return UpgradeModuleBuilder.build(output: output)
|
|
case .tutorial:
|
|
return AppTutorialModuleBuilder.build(output: output)
|
|
}
|
|
}
|
|
}
|
|
|
|
private static func createComponent(with presenter: ServersPresenter, and output: ServersModuleCompoundOutput) -> ServersController.ComponentCreationClosure {
|
|
return { (component: ServersControllerComponent) -> UIView in
|
|
switch component {
|
|
case .serverList: return ServerListModuleBuilder.build(output: presenter)
|
|
case .connection: return ConnectionModuleBuilder.build(output: presenter)
|
|
case .location: return LocationModuleBuilder.build(output: presenter)
|
|
case .menu: return MenuServerModuleBuilder.build(output: output)
|
|
case .message: return MessageModuleBuilder.build(output: presenter)
|
|
case .notifications: return NotificationsBellModuleBuilder.build(output: output)
|
|
case .traffic: return TrafficCounterModuleBuilder.build(output: output)
|
|
case .upgradeWarning: return UpgradeWarningModuleBuilder.build(output: output)
|
|
}
|
|
}
|
|
}
|
|
|
|
private static func createComponentIPAD(with presenter: ServersPresenter, and output: ServersModuleCompoundOutput) -> ServersControllerIPAD.ComponentCreationClosure {
|
|
return { (component: ServersControllerComponentIPAD) -> UIView in
|
|
switch component {
|
|
case .serverList: return ServerListModuleBuilder.build(output: presenter)
|
|
case .connection: return ConnectionModuleBuilder.build(output: presenter)
|
|
case .connectionStatus: return ConnectionStatusModuleBuilder.build()
|
|
case .menu: return MenuServerModuleBuilder.build(output: output)
|
|
case .notificationsBell: return NotificationsBellModuleBuilder.build(output: output)
|
|
case .trafficCounter: return TrafficCounterModuleBuilder.build(output: output)
|
|
case .location: return LocationModuleBuilder.build(output: presenter)
|
|
case .message: return MessageModuleBuilder.build(output: presenter)
|
|
}
|
|
}
|
|
}
|
|
}
|