291 lines
10 KiB
Swift
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
|
|
}
|
|
}
|
|
}
|