Files
2022-04-13 14:19:55 +00:00

291 lines
10 KiB
Swift

//
// PreferencePresenterIPAD.swift
// OpenVPN
//
// Created by Lizaveta Malinouskaya on 26.07.21.
// Copyright © 2021 Privado LLC. All rights reserved.
//
import UIKit
protocol PreferenceViewInputIPAD {
@discardableResult
func showContent(for builder: ViewModuleBuilderClosure?, output: PreferenceControllerViewOutput, route: Route.iOSPreference?) -> Bool
@discardableResult
func showExistContent(view: UIView, route: Route.iOSPreference?) -> Bool
}
class PreferencePresenterIPAD: OptionsModuleOutputIPAD,
SettingsModuleOutput,
PreferenceControllerViewOutput,
PreferenceControllerOutputIPAD,
SettingsProtocolViewModuleOutput,
PreferenceMenuNBViewModuleOutput,
AccountPreferenceModuleOutput,
PreferenceModuleInputIPAD {
public var viewInput: PreferenceViewInputIPAD?
private var output: PreferenceModuleOutputIPAD
private var customerPlan: Customer.Plan?
private var isPremiumSuspendedCustomer: Bool = false
private let session: Session
private var viewStack: [(UIView, Route.iOSPreference?)] = []
private var settingsState: SaveSettingsModel?
init(customerRepo: CustomerRepo, session: Session, output: PreferenceModuleOutputIPAD) {
self.output = output
self.session = session
self.customerPlan = customerRepo.currentCustomer?.plan
customerRepo.customerEmitter.addReaction { [weak self] customer in
guard let customer = customer else { return false }
self?.customerPlan = customer.plan
self?.isPremiumSuspendedCustomer = customer.isPremium && !(customer.isVPNActive ?? true) ? true : false
return self.isExist
}
if let currentCustomer = customerRepo.currentCustomer {
self.isPremiumSuspendedCustomer = currentCustomer.isPremium && !(currentCustomer.isVPNActive ?? true) ? true : false
self.customerPlan = currentCustomer.plan
}
}
// very first controller
func openPreference() {
let preferenceViewBuilder = PreferenceViewModuleBuilder.build(
data: Self.getPreferenceRoutes(for: self.customerPlan, isPremiumSuspended: self.isPremiumSuspendedCustomer),
output: self
)
self.viewInput?.showContent(for: preferenceViewBuilder, output: self, route: nil)
}
// MARK: - SubmodulesOutput
func openCrashReports() {
let crashViewBuilder = CrashReportsBuilder.build()
self.viewInput?.showContent(for: crashViewBuilder, output: self, route: .crashReports)
}
func openAccount() {
let accountViewBuilder = AccountPreferenceBuilderIPAD.build(output: self)
self.viewInput?.showContent(for: accountViewBuilder, output: self, route: .account)
}
func openPrivacyPolicy() {
let privacyViewBuilder = PreferenceTextModuleBuilder.build(with: .privacyPolicy)
self.viewInput?.showContent(for: privacyViewBuilder, output: self, route: .privacyPolicy)
}
func openTermsOfService() {
let termsViewBuilder = PreferenceTextModuleBuilder.build(with: .termsOfService)
self.viewInput?.showContent(for: termsViewBuilder, output: self, route: .termsOfService)
}
func openSettings() {
let settingsViewBuilder = SettingsModuleBuilder.build(output: self)
self.viewInput?.showContent(for: settingsViewBuilder, output: self, route: .settings)
}
func openContactUs() {
guard let url = URL(string: PrivadoConstants.Link.contactUs) else {
return
}
self.output.navigate(to: .navigate(url: url))
}
func openUpgrade() {
let purchaseViewBuilder = PurchaseViewModuleBuilder.build(session: self.session, output: self)
self.viewInput?.showContent(for: purchaseViewBuilder, output: self, route: .upgrade)
}
func openAutoConnect() {
let autoConnectViewBuilder = AutoConnectViewModuleBuilder.build(output: self)
self.viewInput?.showContent(for: autoConnectViewBuilder, output: self, route: .autoconnect)
}
func openOpenVPN() {
let openVPNViewBuilder = OpenVPNPreferenceBuilder.build(output: self)
self.viewInput?.showContent(for: openVPNViewBuilder, output: self, route: .openVPN)
}
func openDiagnostic() {
let diagnosticViewBuilder = LogsModuleBuilder.build()
self.viewInput?.showContent(for: diagnosticViewBuilder, output: self, route: .diagnostics)
}
func openOpenVPNPort() {
let portView = OVPNPortPreferenceBuilder.build(output: self)
self.viewInput?.showContent(for: portView, output: self, route: .openVPNPort)
}
func openOpenVPNProtocol() {
let protocolViewBuilder = OVPNProtocolPreferenceBuilder.build(output: self)
self.viewInput?.showContent(for: protocolViewBuilder, output: self, route: .openVPNProtocol)
}
func openMainScreen() {
openApplicationRoute(.servers)
}
func doSignOut() {
self.signOut()
}
func signOut() {
openApplicationRoute(.login(type: .signout(isPassreset: false)))
}
func appendToStack(view: UIView, title route: Route.iOSPreference?) {
self.viewStack.append((view, route))
}
func getSettings() -> SaveSettingsModel {
let killswitch = UserSettings.shared.killSwitchEnabled
var autoconnect: Bool {
if UserSettings.shared.preferredServer == .none {
return false
}
return true
}
let autoconnectvalue = UserSettings.shared.preferredServer.description
let crashreporting = UserSettings.shared.isCrashReportsEnabled
var proto: ProtocolsDescription {
switch UserSettings.shared.vpnType {
case .ikev2:
return ProtocolsDescription.ikev
case .openVPN:
return ProtocolsDescription.openvpn
case .wireGuard:
return ProtocolsDescription.wireguard
case .none:
return ProtocolsDescription.automatic
}
}
return SaveSettingsModel(killswitch: killswitch, autoconnect: autoconnect, autoconnectvalue: autoconnectvalue, crashreporting: crashreporting, proto: proto.description)
}
func didEnterSettings() {
self.settingsState = self.getSettings()
}
func didExitSettings() {
let settingsStateObject = self.getSettings()
guard let settingsState = self.settingsState else { return }
let extradata = settingsStateObject.jsonString
var attributes = [PrivadoConstants.Event.Attributes.extradata: extradata]
if settingsState == settingsStateObject {
attributes[PrivadoConstants.Event.Attributes.value] = PrivadoConstants.Event.Attributes.canceled
} else {
attributes[PrivadoConstants.Event.Attributes.value] = PrivadoConstants.Event.Attributes.success
}
CometLogger.shared.event(name: PrivadoConstants.Event.Statistic.Application.settings, attributes: attributes, secured: nil)
}
func openPreviousScreen() {
if self.viewStack.count > 1 {
self.viewStack.remove(at: self.viewStack.count-1)
guard let (view, route) = self.viewStack.last else {
return
}
self.viewInput?.showExistContent(view: view, route: route)
}
}
func popAllContent() {
while self.viewStack.count > 1 {
openPreviousScreen()
}
}
func handleRightNavItemClick() {
guard let (currentView, _) = self.viewStack.last else {
return
}
guard let handlableView = currentView as? PreferenceNavigationBar else {
return
}
handlableView.rightItemClick()
}
func handleTrashNavItemClick() {
guard let (currentView, _) = self.viewStack.last else {
return
}
guard let handlableView = currentView as? PreferenceNavigationBar else {
return
}
handlableView.trashItemClick()
}
// MARK: - Private
private static func getPreferenceRoutes(for plan: Customer.Plan?, isPremiumSuspended: Bool) -> [Route.iOSPreference] {
var preferenceRoutes: [Route.iOSPreference] = [.account, .settings, .contactus]
guard let plan = plan else {
return preferenceRoutes
}
if case .premium = plan,
!isPremiumSuspended {
return preferenceRoutes
}
preferenceRoutes.append(.upgrade)
return preferenceRoutes
}
// MARK: - OptionsModuleOutput & AccountPreferenceModuleOutput
func navigate(to route: Route.iOSPreference) {
switch route {
case .base:
self.popAllContent()
output.navigate(to: .preference(tab: nil))
case .account:
self.popAllContent()
self.openAccount()
case .contactus:
self.popAllContent()
self.openContactUs()
case .settings:
self.popAllContent()
self.openSettings()
case .upgrade:
self.popAllContent()
let extradata = CTAClick(screenType: CTAScreenType.menu).jsonString
CometLogger.shared.event(name: PrivadoConstants.Event.Statistic.Application.CTAClick, attributes: [PrivadoConstants.Event.Attributes.extradata: extradata], secured: nil)
self.openUpgrade()
case .termsOfService:
self.openTermsOfService()
case .privacyPolicy:
self.openPrivacyPolicy()
default:
break
}
}
// MARK: - SettingsModuleOutput
func didTapSettingsCell(of type: SettingsCellType) {
switch type {
case .openVPN:
self.openOpenVPN()
case .crashReports:
self.openCrashReports()
case .diagnostics:
self.openDiagnostic()
default:
break
}
}
}