summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadVPN/SettingsViewController.swift
blob: 5d66a46f0eac5b392e0000da11573523fa2c750f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//
//  SettingsViewController.swift
//  MullvadVPN
//
//  Created by pronebird on 20/03/2019.
//  Copyright © 2019 Mullvad VPN AB. All rights reserved.
//

import Combine
import Foundation
import UIKit

enum SettingsNavigationRoute {
    case account
}

class SettingsViewController: UITableViewController {

    @IBOutlet var staticDataSource: SettingsTableViewDataSource!

    private enum CellIdentifier: String {
        case account = "Account"
        case appVersion = "AppVersion"
        case basicDisclosure = "BasicDisclosure"
    }

    private weak var accountRow: StaticTableViewRow?
    private var accountExpirySubscriber: AnyCancellable?

    override func viewDidLoad() {
        super.viewDidLoad()

        accountExpirySubscriber = NotificationCenter.default
            .publisher(for: Account.didUpdateAccountExpiryNotification, object: Account.shared)
            .receive(on: DispatchQueue.main)
            .sink { [weak self] (notification) in
                guard let accountRow = self?.accountRow else { return }

                self?.staticDataSource.reloadRows([accountRow], with: .automatic)
        }

        setupDataSource()
    }

    // MARK: - IBActions

    @IBAction func handleDismiss() {
        dismiss(animated: true)
    }

    // MARK: - Navigation

    func navigate(to route: SettingsNavigationRoute) {
        switch route {
        case .account:
            self.performSegue(
                withIdentifier: SegueIdentifier.Settings.showAccount.rawValue,
                sender: nil)
        }
    }

    // MARK: - Private

    private func setupDataSource() {
        if Account.shared.isLoggedIn {
            let topSection = StaticTableViewSection()
            let accountRow = StaticTableViewRow(reuseIdentifier: CellIdentifier.account.rawValue) { (_, cell) in
                let cell = cell as! SettingsAccountCell

                cell.accountExpiryDate = Account.shared.expiry
            }

            let wireguardKeyRow = StaticTableViewRow(reuseIdentifier: CellIdentifier.basicDisclosure.rawValue) { (_, cell) in
                let cell = cell as! SettingsBasicCell

                cell.titleLabel.text = NSLocalizedString("WireGuard key", comment: "")
                cell.accessibilityIdentifier = "WireGuardKeyCell"
            }

            wireguardKeyRow.actionBlock = { [weak self] (indexPath) in
                self?.performSegue(
                    withIdentifier: SegueIdentifier.Settings.showWireguardKeys.rawValue,
                    sender: nil)
            }

            self.accountRow = accountRow

            topSection.addRows([accountRow, wireguardKeyRow])
            staticDataSource.addSections([topSection])
        }

        let middleSection = StaticTableViewSection()
        let versionRow = StaticTableViewRow(reuseIdentifier: CellIdentifier.appVersion.rawValue) { (_, cell) in
            let cell = cell as! SettingsAppVersionCell

            cell.versionLabel.text = Bundle.main.mullvadVersion
        }
        versionRow.isSelectable = false

        middleSection.addRows([versionRow])
        staticDataSource.addSections([middleSection])
    }

}

class SettingsTableViewDataSource: StaticTableViewDataSource {

    // MARK: - UITableViewDelegate

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 24
    }

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 0.01
    }

}