From 7cd5be14543fa448ccf7da603ea9595a16ddc7a4 Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 4 Oct 2023 18:20:42 +0200 Subject: [PATCH] Show Rules (IOS-20) --- .../Cell/ServerRulesTableViewCell.swift | 2 +- ...astodonServerRulesViewModel+Diffable.swift | 5 +-- .../ServerRules/ServerRuleItem.swift | 9 +---- .../ServerRules/ServerRuleSection.swift | 6 +-- .../InstanceRulesViewController.swift | 40 +++++++++++++++++-- .../ServerDetailsViewController.swift | 6 +++ 6 files changed, 49 insertions(+), 19 deletions(-) diff --git a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift index 7eeec22e5..6bf513878 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/Cell/ServerRulesTableViewCell.swift @@ -10,7 +10,7 @@ import MastodonAsset import MastodonLocalization final class ServerRulesTableViewCell: UITableViewCell { - + static let reuseIdentifier = "ServerRulesTableViewCell" static let margin: CGFloat = 23 let indexImageView: UIImageView = { diff --git a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel+Diffable.swift b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel+Diffable.swift index 1f8d55c76..bbae5c324 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel+Diffable.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/MastodonServerRulesViewModel+Diffable.swift @@ -15,10 +15,7 @@ extension MastodonServerRulesViewModel { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([.rules]) - let ruleItems: [ServerRuleItem] = rules.enumerated().map { i, rule in - let ruleContext = ServerRuleItem.RuleContext(index: i, rule: rule) - return ServerRuleItem.rule(ruleContext) - } + let ruleItems: [ServerRuleItem] = rules.enumerated().map { index, rule in return ServerRuleItem.rule(index: index, rule: rule) } snapshot.appendItems(ruleItems, toSection: .rules) diffableDataSource?.apply(snapshot, animatingDifferences: false) } diff --git a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift index f82b1e5e4..dd6695386 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleItem.swift @@ -9,12 +9,5 @@ import Foundation import MastodonSDK enum ServerRuleItem: Hashable { - case rule(RuleContext) -} - -extension ServerRuleItem { - struct RuleContext: Hashable { - let index: Int - let rule: Mastodon.Entity.Instance.Rule - } + case rule(index: Int, rule: Mastodon.Entity.Instance.Rule) } diff --git a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift index ca4cd9c13..0f121baf5 100644 --- a/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift +++ b/Mastodon/Scene/Onboarding/ServerRules/ServerRuleSection.swift @@ -19,11 +19,11 @@ extension ServerRuleSection { ) -> UITableViewDiffableDataSource { return UITableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, item in switch item { - case .rule(let ruleContext): + case .rule(let index, let rule): let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ServerRulesTableViewCell.self), for: indexPath) as! ServerRulesTableViewCell - cell.indexImageView.image = UIImage(systemName: "\(ruleContext.index + 1).circle") ?? UIImage(systemName: "questionmark.circle") + cell.indexImageView.image = UIImage(systemName: "\(index + 1).circle") ?? UIImage(systemName: "questionmark.circle") cell.indexImageView.tintColor = Asset.Colors.Brand.lightBlurple.color - cell.ruleLabel.text = ruleContext.rule.text + cell.ruleLabel.text = rule.text return cell } } diff --git a/Mastodon/Scene/Settings/Server Details/InstanceRulesViewController.swift b/Mastodon/Scene/Settings/Server Details/InstanceRulesViewController.swift index 4e09097ac..b4d934214 100644 --- a/Mastodon/Scene/Settings/Server Details/InstanceRulesViewController.swift +++ b/Mastodon/Scene/Settings/Server Details/InstanceRulesViewController.swift @@ -8,17 +8,51 @@ protocol InstanceRulesViewControllerDelegate: AnyObject { } class InstanceRulesViewController: UIViewController { + weak var delegate: InstanceRulesViewControllerDelegate? + let tableView: UITableView + var dataSource: UITableViewDiffableDataSource? + + var sections: [ServerRuleSection] = [] init() { - super.init(nibName: nil, bundle: nil) + tableView = UITableView(frame: .zero, style: .insetGrouped) + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.register(ServerRulesTableViewCell.self, forCellReuseIdentifier: ServerRulesTableViewCell.reuseIdentifier) - view.backgroundColor = .blue + super.init(nibName: nil, bundle: nil) + view.addSubview(tableView) + + let dataSource = ServerRuleSection.tableViewDiffableDataSource(tableView: tableView) + + tableView.dataSource = dataSource + self.dataSource = dataSource + + setupConstraints() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + private func setupConstraints() { + let constraints = [ + tableView.topAnchor.constraint(equalTo: view.topAnchor), + tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: tableView.trailingAnchor), + view.bottomAnchor.constraint(equalTo: tableView.bottomAnchor), + ] + + NSLayoutConstraint.activate(constraints) + } + func update(with instance: Mastodon.Entity.V2.Instance) { - //TODO: Implement + guard let dataSource, let rules = instance.rules, rules.isNotEmpty else { return } + + var snapshot = NSDiffableDataSourceSnapshot() + + snapshot.appendSections([.rules]) + let ruleItems = rules.enumerated().compactMap { index, rule in ServerRuleItem.rule(index: index, rule: rule) } + snapshot.appendItems(ruleItems, toSection: .rules) + + dataSource.apply(snapshot) } } diff --git a/Mastodon/Scene/Settings/Server Details/ServerDetailsViewController.swift b/Mastodon/Scene/Settings/Server Details/ServerDetailsViewController.swift index 84357ea1c..cf86ee34b 100644 --- a/Mastodon/Scene/Settings/Server Details/ServerDetailsViewController.swift +++ b/Mastodon/Scene/Settings/Server Details/ServerDetailsViewController.swift @@ -52,6 +52,7 @@ class ServerDetailsViewController: UIViewController { pageController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal) pageController.setViewControllers([aboutInstanceViewController], direction: .forward, animated: false) + pageController.view.translatesAutoresizingMaskIntoConstraints = false super.init(nibName: nil, bundle: nil) @@ -93,6 +94,11 @@ class ServerDetailsViewController: UIViewController { segmentedControl.leadingAnchor.constraint(equalTo: segmentedControlWrapper.leadingAnchor, constant: 16), segmentedControlWrapper.trailingAnchor.constraint(equalTo: segmentedControl.trailingAnchor, constant: 16), segmentedControlWrapper.bottomAnchor.constraint(equalTo: segmentedControl.bottomAnchor, constant: 8), + + pageController.view.topAnchor.constraint(equalTo: containerView.topAnchor), + pageController.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), + containerView.trailingAnchor.constraint(equalTo: pageController.view.trailingAnchor), + containerView.bottomAnchor.constraint(equalTo: pageController.view.bottomAnchor), ] NSLayoutConstraint.activate(constraints)