Files
2021-12-06 10:53:47 +00:00

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)
}
}
}
}