mastodon-ios/Mastodon/Scene/Onboarding/Privacy/PrivacyTableViewController....

158 lines
5.3 KiB
Swift

//
// PrivacyTableViewController.swift
// Mastodon
//
// Created by Nathan Mattes on 15.12.22.
//
import UIKit
import MastodonCore
import MastodonSDK
import MastodonLocalization
import MastodonAsset
enum PrivacyRow {
case iOSApp
case server(domain: String)
var url: URL? {
switch self {
case .iOSApp:
return URL(string: "https://joinmastodon.org/ios/privacy")
case .server(let domain):
return URL(string: "https://\(domain)/privacy-policy")
}
}
var title: String {
switch self {
case .iOSApp:
return L10n.Scene.Privacy.Policy.ios
case .server(let domain):
return L10n.Scene.Privacy.Policy.server(domain)
}
}
}
class PrivacyTableViewController: UIViewController, NeedsDependency {
var context: AppContext!
var coordinator: SceneCoordinator!
private let tableView: UITableView
let viewModel: PrivacyViewModel
init(context: AppContext, coordinator: SceneCoordinator, viewModel: PrivacyViewModel) {
self.context = context
self.coordinator = coordinator
self.viewModel = viewModel
tableView = UITableView(frame: .zero, style: .insetGrouped)
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.register(PrivacyTableViewCell.self, forCellReuseIdentifier: PrivacyTableViewCell.reuseIdentifier)
super.init(nibName: nil, bundle: nil)
tableView.delegate = self
tableView.dataSource = self
view.addSubview(tableView)
setupConstraints()
navigationItem.rightBarButtonItem = UIBarButtonItem(title: L10n.Scene.Privacy.Button.confirm, style: .done, target: self, action: #selector(PrivacyTableViewController.nextButtonPressed(_:)))
title = L10n.Scene.Privacy.title
}
required init?(coder: NSCoder) { fatalError("init(coder:) won't been implemented, please don't use Storyboards.") }
private func setupConstraints() {
let constraints = [
tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
view.trailingAnchor.constraint(equalTo: tableView.trailingAnchor),
view.bottomAnchor.constraint(equalTo: tableView.bottomAnchor)
]
NSLayoutConstraint.activate(constraints)
}
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.largeTitleDisplayMode = .always
setupOnboardingAppearance()
}
//MARK: - Actions
@objc private func backButtonPressed(_ sender: UIButton) {
navigationController?.popViewController(animated: true)
}
@objc private func nextButtonPressed(_ sender: UIButton) {
let viewModel = MastodonRegisterViewModel(
context: context,
domain: viewModel.domain,
authenticateInfo: viewModel.authenticateInfo,
instance: viewModel.instance,
applicationToken: viewModel.applicationToken
)
_ = coordinator.present(scene: .mastodonRegister(viewModel: viewModel), from: self, transition: .show)
}
}
extension PrivacyTableViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.rows.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: PrivacyTableViewCell.reuseIdentifier, for: indexPath) as? PrivacyTableViewCell else { fatalError("Wrong cell?") }
let row = viewModel.rows[indexPath.row]
var contentConfiguration = cell.defaultContentConfiguration()
contentConfiguration.textProperties.color = Asset.Colors.Brand.blurple.color
contentConfiguration.text = row.title
cell.accessibilityTraits = [.button, .link]
cell.contentConfiguration = contentConfiguration
return cell
}
}
extension PrivacyTableViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let row = viewModel.rows[indexPath.row]
guard let url = row.url else { return }
_ = coordinator.present(scene: .safari(url: url), from: self, transition: .safariPresent(animated: true))
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let wrapper = UIView()
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.numberOfLines = 0
label.text = L10n.Scene.Privacy.description
label.textColor = Asset.Colors.Label.primary.color
wrapper.addSubview(label)
NSLayoutConstraint.activate([
label.topAnchor.constraint(equalTo: wrapper.topAnchor, constant: 16),
label.leadingAnchor.constraint(equalTo: wrapper.leadingAnchor),
wrapper.trailingAnchor.constraint(equalTo: label.trailingAnchor),
wrapper.bottomAnchor.constraint(equalTo: label.bottomAnchor, constant: 16),
])
return wrapper
}
}
extension PrivacyTableViewController: OnboardingViewControllerAppearance { }