From 3e77c72d32e27dec37715403960a7e108c546f61 Mon Sep 17 00:00:00 2001 From: CMK Date: Tue, 3 Aug 2021 17:33:24 +0800 Subject: [PATCH] feat: set setting footer to app version and add GitHub entry --- Mastodon/Diffiable/Item/SettingsItem.swift | 3 + Mastodon/Extension/MetaLabel.swift | 2 +- .../Settings/SettingsViewController.swift | 76 +++++++++++-------- .../Scene/Settings/SettingsViewModel.swift | 1 + 4 files changed, 50 insertions(+), 32 deletions(-) diff --git a/Mastodon/Diffiable/Item/SettingsItem.swift b/Mastodon/Diffiable/Item/SettingsItem.swift index e82d0e1f9..ed472808a 100644 --- a/Mastodon/Diffiable/Item/SettingsItem.swift +++ b/Mastodon/Diffiable/Item/SettingsItem.swift @@ -58,6 +58,7 @@ extension SettingsItem { enum Link: CaseIterable, Hashable { case accountSettings + case github case termsOfService case privacyPolicy case clearMediaCache @@ -66,6 +67,7 @@ extension SettingsItem { var title: String { switch self { case .accountSettings: return L10n.Scene.Settings.Section.BoringZone.accountSettings + case .github: return "GitHub" case .termsOfService: return L10n.Scene.Settings.Section.BoringZone.terms case .privacyPolicy: return L10n.Scene.Settings.Section.BoringZone.privacy case .clearMediaCache: return L10n.Scene.Settings.Section.SpicyZone.clear @@ -76,6 +78,7 @@ extension SettingsItem { var textColor: UIColor { switch self { case .accountSettings: return Asset.Colors.brandBlue.color + case .github: return Asset.Colors.brandBlue.color case .termsOfService: return Asset.Colors.brandBlue.color case .privacyPolicy: return Asset.Colors.brandBlue.color case .clearMediaCache: return .systemRed diff --git a/Mastodon/Extension/MetaLabel.swift b/Mastodon/Extension/MetaLabel.swift index e5a588e15..e1ea32731 100644 --- a/Mastodon/Extension/MetaLabel.swift +++ b/Mastodon/Extension/MetaLabel.swift @@ -66,7 +66,7 @@ extension MetaLabel { case .settingTableFooter: font = .preferredFont(forTextStyle: .body) - textColor = Asset.Colors.Label.primary.color + textColor = Asset.Colors.Label.secondary.color numberOfLines = 0 textContainer.maximumNumberOfLines = 0 paragraphStyle.alignment = .center diff --git a/Mastodon/Scene/Settings/SettingsViewController.swift b/Mastodon/Scene/Settings/SettingsViewController.swift index 9a240daaf..c6e41e624 100644 --- a/Mastodon/Scene/Settings/SettingsViewController.swift +++ b/Mastodon/Scene/Settings/SettingsViewController.swift @@ -105,18 +105,18 @@ class SettingsViewController: UIViewController, NeedsDependency { }() let tableFooterLabel = MetaLabel(style: .settingTableFooter) -// lazy var tableFooterView: UIView = { -// // init with a frame to fix a conflict ('UIView-Encapsulated-Layout-Height' UIStackView:0x7ffe41e47da0.height == 0) -// let view = UIStackView(frame: CGRect(x: 0, y: 0, width: 320, height: 320)) -// view.isLayoutMarginsRelativeArrangement = true -// view.layoutMargins = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20) -// view.axis = .vertical -// view.alignment = .center -// -// tableFooterLabel.linkDelegate = self -// view.addArrangedSubview(tableFooterLabel) -// return view -// }() + lazy var tableFooterView: UIView = { + // init with a frame to fix a conflict ('UIView-Encapsulated-Layout-Height' UIStackView:0x7ffe41e47da0.height == 0) + let view = UIStackView(frame: CGRect(x: 0, y: 0, width: 320, height: 320)) + view.isLayoutMarginsRelativeArrangement = true + view.layoutMargins = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20) + view.axis = .vertical + view.alignment = .center + + // tableFooterLabel.linkDelegate = self + view.addArrangedSubview(tableFooterLabel) + return view + }() override func viewDidLoad() { super.viewDidLoad() @@ -188,24 +188,31 @@ class SettingsViewController: UIViewController, NeedsDependency { } .store(in: &disposeBag) - viewModel.currentInstance - .receive(on: RunLoop.main) - .sink { [weak self] instance in - guard let self = self else { return } - let version = instance?.version ?? "-" - let link = #"mastodon/mastodon"# - let content = L10n.Scene.Settings.Footer.mastodonDescription(link, version) - let mastodonContent = MastodonContent(content: content, emojis: [:]) - do { - let metaContent = try MastodonMetaContent.convert(document: mastodonContent) - self.tableFooterLabel.configure(content: metaContent) - } catch { - let metaContent = PlaintextMetaContent(string: "") - self.tableFooterLabel.configure(content: metaContent) - assertionFailure() - } - } - .store(in: &disposeBag) + + let footer = "Mastodon v\(UIApplication.appVersion()) (\(UIApplication.appBuild()))" + let metaContent = PlaintextMetaContent(string: footer) + tableFooterLabel.configure(content: metaContent) + + // FIXME: + // needs a workaround for GitHub link +// viewModel.currentInstance +// .receive(on: RunLoop.main) +// .sink { [weak self] instance in +// guard let self = self else { return } +// let version = instance?.version ?? "-" +// let link = #"mastodon/mastodon"# +// let content = L10n.Scene.Settings.Footer.mastodonDescription(link, version) +// let mastodonContent = MastodonContent(content: content, emojis: [:]) +// do { +// let metaContent = try MastodonMetaContent.convert(document: mastodonContent) +// self.tableFooterLabel.configure(content: metaContent) +// } catch { +// let metaContent = PlaintextMetaContent(string: "") +// self.tableFooterLabel.configure(content: metaContent) +// assertionFailure() +// } +// } +// .store(in: &disposeBag) } private func setupView() { @@ -259,7 +266,7 @@ class SettingsViewController: UIViewController, NeedsDependency { settingsAppearanceTableViewCellDelegate: self, settingsToggleCellDelegate: self ) - // tableView.tableFooterView = tableFooterView + tableView.tableFooterView = tableFooterView } func alertToSignout() { @@ -376,6 +383,13 @@ extension SettingsViewController: UITableViewDelegate { guard let box = context.authenticationService.activeMastodonAuthenticationBox.value, let url = URL(string: "https://\(box.domain)/auth/edit") else { return } viewModel.openAuthenticationPage(authenticateURL: url, presentationContextProvider: self) + case .github: + guard let url = URL(string: "https://github.com/mastodon/mastodon-ios") else { break } + coordinator.present( + scene: .safari(url: url), + from: self, + transition: .safariPresent(animated: true, completion: nil) + ) case .termsOfService, .privacyPolicy: // same URL guard let url = viewModel.privacyURL else { break } diff --git a/Mastodon/Scene/Settings/SettingsViewModel.swift b/Mastodon/Scene/Settings/SettingsViewModel.swift index 9bc0adce2..9158e8169 100644 --- a/Mastodon/Scene/Settings/SettingsViewModel.swift +++ b/Mastodon/Scene/Settings/SettingsViewModel.swift @@ -130,6 +130,7 @@ extension SettingsViewModel { let boringZoneSettingsItems: [SettingsItem] = { let links: [SettingsItem.Link] = [ .accountSettings, + .github, .termsOfService, .privacyPolicy ]