[WIP] Add Entries for SettingsViewController (IOS-14)
This commit is contained in:
parent
fb6116d4a6
commit
1461a2a082
|
@ -138,7 +138,7 @@
|
||||||
D82BD7522ABC42D6009A374A /* Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82BD7512ABC42D6009A374A /* Coordinator.swift */; };
|
D82BD7522ABC42D6009A374A /* Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82BD7512ABC42D6009A374A /* Coordinator.swift */; };
|
||||||
D8318A802A4466D300C0FB73 /* SettingsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A7F2A4466D300C0FB73 /* SettingsCoordinator.swift */; };
|
D8318A802A4466D300C0FB73 /* SettingsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A7F2A4466D300C0FB73 /* SettingsCoordinator.swift */; };
|
||||||
D8318A842A4468A800C0FB73 /* GeneralSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A832A4468A800C0FB73 /* GeneralSettingsViewController.swift */; };
|
D8318A842A4468A800C0FB73 /* GeneralSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A832A4468A800C0FB73 /* GeneralSettingsViewController.swift */; };
|
||||||
D8318A862A4468C700C0FB73 /* SettingsOverviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A852A4468C700C0FB73 /* SettingsOverviewViewController.swift */; };
|
D8318A862A4468C700C0FB73 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A852A4468C700C0FB73 /* SettingsViewController.swift */; };
|
||||||
D8318A882A4468D300C0FB73 /* NotificationSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A872A4468D300C0FB73 /* NotificationSettingsViewController.swift */; };
|
D8318A882A4468D300C0FB73 /* NotificationSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A872A4468D300C0FB73 /* NotificationSettingsViewController.swift */; };
|
||||||
D8318A8A2A4468DC00C0FB73 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A892A4468DC00C0FB73 /* AboutViewController.swift */; };
|
D8318A8A2A4468DC00C0FB73 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A892A4468DC00C0FB73 /* AboutViewController.swift */; };
|
||||||
D8318A8C2A4468E600C0FB73 /* SupportMastodonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A8B2A4468E600C0FB73 /* SupportMastodonViewController.swift */; };
|
D8318A8C2A4468E600C0FB73 /* SupportMastodonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8318A8B2A4468E600C0FB73 /* SupportMastodonViewController.swift */; };
|
||||||
|
@ -779,7 +779,7 @@
|
||||||
D82BD7512ABC42D6009A374A /* Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coordinator.swift; sourceTree = "<group>"; };
|
D82BD7512ABC42D6009A374A /* Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coordinator.swift; sourceTree = "<group>"; };
|
||||||
D8318A7F2A4466D300C0FB73 /* SettingsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsCoordinator.swift; sourceTree = "<group>"; };
|
D8318A7F2A4466D300C0FB73 /* SettingsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsCoordinator.swift; sourceTree = "<group>"; };
|
||||||
D8318A832A4468A800C0FB73 /* GeneralSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsViewController.swift; sourceTree = "<group>"; };
|
D8318A832A4468A800C0FB73 /* GeneralSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsViewController.swift; sourceTree = "<group>"; };
|
||||||
D8318A852A4468C700C0FB73 /* SettingsOverviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsOverviewViewController.swift; sourceTree = "<group>"; };
|
D8318A852A4468C700C0FB73 /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = "<group>"; };
|
||||||
D8318A872A4468D300C0FB73 /* NotificationSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsViewController.swift; sourceTree = "<group>"; };
|
D8318A872A4468D300C0FB73 /* NotificationSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSettingsViewController.swift; sourceTree = "<group>"; };
|
||||||
D8318A892A4468DC00C0FB73 /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = "<group>"; };
|
D8318A892A4468DC00C0FB73 /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = "<group>"; };
|
||||||
D8318A8B2A4468E600C0FB73 /* SupportMastodonViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportMastodonViewController.swift; sourceTree = "<group>"; };
|
D8318A8B2A4468E600C0FB73 /* SupportMastodonViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportMastodonViewController.swift; sourceTree = "<group>"; };
|
||||||
|
@ -1735,7 +1735,7 @@
|
||||||
D8318A7E2A4466C900C0FB73 /* Legacy */,
|
D8318A7E2A4466C900C0FB73 /* Legacy */,
|
||||||
D8318A7F2A4466D300C0FB73 /* SettingsCoordinator.swift */,
|
D8318A7F2A4466D300C0FB73 /* SettingsCoordinator.swift */,
|
||||||
D8318A832A4468A800C0FB73 /* GeneralSettingsViewController.swift */,
|
D8318A832A4468A800C0FB73 /* GeneralSettingsViewController.swift */,
|
||||||
D8318A852A4468C700C0FB73 /* SettingsOverviewViewController.swift */,
|
D8318A852A4468C700C0FB73 /* SettingsViewController.swift */,
|
||||||
D8318A872A4468D300C0FB73 /* NotificationSettingsViewController.swift */,
|
D8318A872A4468D300C0FB73 /* NotificationSettingsViewController.swift */,
|
||||||
D8318A892A4468DC00C0FB73 /* AboutViewController.swift */,
|
D8318A892A4468DC00C0FB73 /* AboutViewController.swift */,
|
||||||
D8318A8B2A4468E600C0FB73 /* SupportMastodonViewController.swift */,
|
D8318A8B2A4468E600C0FB73 /* SupportMastodonViewController.swift */,
|
||||||
|
@ -3828,7 +3828,7 @@
|
||||||
DB4F097D26A03A5B00D62E92 /* SearchHistoryItem.swift in Sources */,
|
DB4F097D26A03A5B00D62E92 /* SearchHistoryItem.swift in Sources */,
|
||||||
DBD5B1FA27BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift in Sources */,
|
DBD5B1FA27BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift in Sources */,
|
||||||
D809907C294D25510050219F /* PrivacyViewModel.swift in Sources */,
|
D809907C294D25510050219F /* PrivacyViewModel.swift in Sources */,
|
||||||
D8318A862A4468C700C0FB73 /* SettingsOverviewViewController.swift in Sources */,
|
D8318A862A4468C700C0FB73 /* SettingsViewController.swift in Sources */,
|
||||||
DB5B549A2833A60400DEF8B2 /* FamiliarFollowersViewController.swift in Sources */,
|
DB5B549A2833A60400DEF8B2 /* FamiliarFollowersViewController.swift in Sources */,
|
||||||
DB3E6FE22806A50100B035AE /* DiscoveryHashtagsViewModel+Diffable.swift in Sources */,
|
DB3E6FE22806A50100B035AE /* DiscoveryHashtagsViewModel+Diffable.swift in Sources */,
|
||||||
DB427DD625BAA00100D1B89D /* AppDelegate.swift in Sources */,
|
DB427DD625BAA00100D1B89D /* AppDelegate.swift in Sources */,
|
||||||
|
|
|
@ -23,7 +23,7 @@ class GeneralSettingsViewController: UIViewController {
|
||||||
|
|
||||||
view.backgroundColor = .systemBackground
|
view.backgroundColor = .systemBackground
|
||||||
|
|
||||||
title = "Settings"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
|
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
|
||||||
|
|
|
@ -7,23 +7,46 @@ class SettingsCoordinator: Coordinator {
|
||||||
let navigationController: UINavigationController
|
let navigationController: UINavigationController
|
||||||
let presentedOn: UIViewController
|
let presentedOn: UIViewController
|
||||||
|
|
||||||
private let generalSettingsViewController: GeneralSettingsViewController
|
private let settingsViewController: SettingsViewController
|
||||||
|
|
||||||
init(presentedOn: UIViewController) {
|
init(presentedOn: UIViewController) {
|
||||||
self.presentedOn = presentedOn
|
self.presentedOn = presentedOn
|
||||||
navigationController = UINavigationController()
|
navigationController = UINavigationController()
|
||||||
|
|
||||||
generalSettingsViewController = GeneralSettingsViewController()
|
settingsViewController = SettingsViewController(accountName: "born2jort")
|
||||||
}
|
}
|
||||||
|
|
||||||
func start() {
|
func start() {
|
||||||
generalSettingsViewController.delegate = self
|
settingsViewController.delegate = self
|
||||||
|
|
||||||
navigationController.pushViewController(generalSettingsViewController, animated: false)
|
navigationController.pushViewController(settingsViewController, animated: false)
|
||||||
presentedOn.present(navigationController, animated: true)
|
presentedOn.present(navigationController, animated: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension SettingsCoordinator: GeneralSettingsViewControllerDelegate {
|
extension SettingsCoordinator: SettingsViewControllerDelegate {
|
||||||
|
func done(_ viewController: UIViewController) {
|
||||||
|
viewController.dismiss(animated: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func didSelect(_ viewController: UIViewController, entry: SettingsEntry) {
|
||||||
|
switch entry {
|
||||||
|
case .general:
|
||||||
|
break
|
||||||
|
// show general
|
||||||
|
case .notifications:
|
||||||
|
break
|
||||||
|
// show notifications
|
||||||
|
case .aboutMastodon:
|
||||||
|
break
|
||||||
|
// show about
|
||||||
|
case .supportMastodon:
|
||||||
|
break
|
||||||
|
// present support-screen
|
||||||
|
case .logout(let accountName):
|
||||||
|
break
|
||||||
|
// show logout-sheet
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
// Copyright © 2023 Mastodon gGmbH. All rights reserved.
|
|
||||||
|
|
||||||
import Foundation
|
|
|
@ -0,0 +1,194 @@
|
||||||
|
// Copyright © 2023 Mastodon gGmbH. All rights reserved.
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
struct SettingsSection: Hashable {
|
||||||
|
let entries: [SettingsEntry]
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SettingsEntry: Hashable {
|
||||||
|
case general
|
||||||
|
case notifications
|
||||||
|
case aboutMastodon
|
||||||
|
case supportMastodon
|
||||||
|
case logout(accountName: String)
|
||||||
|
|
||||||
|
//TODO: @zeitschlag Add Localization
|
||||||
|
var title: String {
|
||||||
|
switch self {
|
||||||
|
case .general:
|
||||||
|
return "General"
|
||||||
|
case .notifications:
|
||||||
|
return "Notifications"
|
||||||
|
case .aboutMastodon:
|
||||||
|
return "About Mastodon"
|
||||||
|
case .supportMastodon:
|
||||||
|
return "Suppoprt Mastodon"
|
||||||
|
case .logout(let accountName):
|
||||||
|
return "Logout @\(accountName)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var accessoryType: UITableViewCell.AccessoryType {
|
||||||
|
switch self {
|
||||||
|
case .general, .notifications, .aboutMastodon, .logout(_):
|
||||||
|
return .disclosureIndicator
|
||||||
|
case .supportMastodon:
|
||||||
|
return .none
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var icon: UIImage? {
|
||||||
|
switch self {
|
||||||
|
case .general:
|
||||||
|
return UIImage(systemName: "gear")
|
||||||
|
case .notifications:
|
||||||
|
return UIImage(systemName: "bell.badge")
|
||||||
|
case .aboutMastodon:
|
||||||
|
return UIImage(systemName: "info.circle.fill")
|
||||||
|
case .supportMastodon:
|
||||||
|
return UIImage(systemName: "heart.fill")
|
||||||
|
case .logout(_):
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var iconBackgroundColor: UIColor? {
|
||||||
|
switch self {
|
||||||
|
case .general:
|
||||||
|
return .systemGray
|
||||||
|
case .notifications:
|
||||||
|
return .systemRed
|
||||||
|
case .aboutMastodon:
|
||||||
|
return .systemPurple
|
||||||
|
case .supportMastodon:
|
||||||
|
return .systemGreen
|
||||||
|
case .logout(_):
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var textColor: UIColor {
|
||||||
|
switch self {
|
||||||
|
case .general, .notifications, .aboutMastodon, .supportMastodon:
|
||||||
|
return .label
|
||||||
|
case .logout(_):
|
||||||
|
return .red
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SettingsTableViewCell: UITableViewCell {
|
||||||
|
static let reuseIdentifier = "SettingsTableViewCell"
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol SettingsViewControllerDelegate: AnyObject {
|
||||||
|
func done(_ viewController: UIViewController)
|
||||||
|
func didSelect(_ viewController: UIViewController, entry: SettingsEntry)
|
||||||
|
}
|
||||||
|
|
||||||
|
class SettingsViewController: UIViewController {
|
||||||
|
|
||||||
|
let sections: [SettingsSection]
|
||||||
|
|
||||||
|
weak var delegate: SettingsViewControllerDelegate?
|
||||||
|
var tableViewDataSource: UITableViewDiffableDataSource<SettingsSection, SettingsEntry>?
|
||||||
|
let tableView: UITableView
|
||||||
|
|
||||||
|
init(accountName: String) {
|
||||||
|
|
||||||
|
sections = [
|
||||||
|
.init(entries: [.general, .notifications]),
|
||||||
|
.init(entries: [.supportMastodon, .aboutMastodon]),
|
||||||
|
.init(entries: [.logout(accountName: accountName)])
|
||||||
|
]
|
||||||
|
|
||||||
|
tableView = UITableView(frame: .zero, style: .insetGrouped)
|
||||||
|
tableView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
tableView.register(SettingsTableViewCell.self, forCellReuseIdentifier: SettingsTableViewCell.reuseIdentifier)
|
||||||
|
|
||||||
|
super.init(nibName: nil, bundle: nil)
|
||||||
|
|
||||||
|
let tableViewDataSource = UITableViewDiffableDataSource<SettingsSection, SettingsEntry>(tableView: tableView) { [weak self] tableView, indexPath, itemIdentifier in
|
||||||
|
guard let self,
|
||||||
|
let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCell.reuseIdentifier, for: indexPath) as? SettingsTableViewCell
|
||||||
|
else { fatalError("Wrong cell WTF??") }
|
||||||
|
|
||||||
|
let entry = self.sections[indexPath.section].entries[indexPath.row]
|
||||||
|
|
||||||
|
var content = cell.defaultContentConfiguration()
|
||||||
|
content.attributedText = NSAttributedString(string: entry.title, attributes: [
|
||||||
|
.foregroundColor: entry.textColor
|
||||||
|
])
|
||||||
|
content.image = entry.icon
|
||||||
|
content.imageProperties.cornerRadius = 5
|
||||||
|
// content.imageProperties.back
|
||||||
|
// imageproperties
|
||||||
|
// content.ima
|
||||||
|
|
||||||
|
cell.contentConfiguration = content
|
||||||
|
cell.accessoryType = entry.accessoryType
|
||||||
|
|
||||||
|
return cell
|
||||||
|
}
|
||||||
|
|
||||||
|
tableView.dataSource = tableViewDataSource
|
||||||
|
tableView.delegate = self
|
||||||
|
self.tableViewDataSource = tableViewDataSource
|
||||||
|
|
||||||
|
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(SettingsViewController.done(_:)))
|
||||||
|
|
||||||
|
view.backgroundColor = .systemGroupedBackground
|
||||||
|
view.addSubview(tableView)
|
||||||
|
|
||||||
|
title = "Settings"
|
||||||
|
|
||||||
|
setupConstraints()
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
var snapshot = NSDiffableDataSourceSnapshot<SettingsSection, SettingsEntry>()
|
||||||
|
|
||||||
|
for section in sections {
|
||||||
|
snapshot.appendSections([section])
|
||||||
|
snapshot.appendItems(section.entries)
|
||||||
|
}
|
||||||
|
|
||||||
|
tableViewDataSource?.apply(snapshot)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setupConstraints() {
|
||||||
|
let constraints = [
|
||||||
|
tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
|
||||||
|
tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
|
||||||
|
view.trailingAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.trailingAnchor),
|
||||||
|
view.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor),
|
||||||
|
]
|
||||||
|
|
||||||
|
NSLayoutConstraint.activate(constraints)
|
||||||
|
}
|
||||||
|
|
||||||
|
//MARK: Actions
|
||||||
|
|
||||||
|
@objc
|
||||||
|
func done(_ sender: Any) {
|
||||||
|
delegate?.done(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//MARK: UITableViewDelegate
|
||||||
|
extension SettingsViewController: UITableViewDelegate {
|
||||||
|
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||||
|
let entry = sections[indexPath.section].entries[indexPath.row]
|
||||||
|
|
||||||
|
delegate?.didSelect(self, entry: entry)
|
||||||
|
|
||||||
|
tableView.deselectRow(at: indexPath, animated: true)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue