From b8bb0dc8050744099a3a89b7f98dfd78cbbe0c9c Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Wed, 21 Dec 2022 23:35:25 +0100 Subject: [PATCH] Add button for signup-speed-filter (#690) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Filtering should work, too, but: no menu yet, so: it's a bit useless 😅 --- .../PickServer/CategoryPickerItem.swift | 30 ++++++++++++++++++- .../PickServer/CategoryPickerSection.swift | 6 ++-- .../MastodonPickServerViewController.swift | 6 ++-- .../MastodonPickServerViewModel.swift | 12 ++++++-- 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift index 45e33d6ff..9b9e6f6bd 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerItem.swift @@ -14,6 +14,7 @@ import MastodonLocalization enum CategoryPickerItem { case all case language(language: String?) + case signupSpeed(manuallyReviewed: Bool?) case category(category: Mastodon.Entity.Category) } @@ -29,6 +30,16 @@ extension CategoryPickerItem { } else { return L10n.Scene.ServerPicker.Button.language } + case .signupSpeed(let manuallyReviewed): + if let manuallyReviewed { + if manuallyReviewed { + return L10n.Scene.ServerPicker.SignupSpeed.manuallyReviewed + } else { + return L10n.Scene.ServerPicker.SignupSpeed.instant + } + } else { + return L10n.Scene.ServerPicker.Button.signupSpeed + } case .category(let category): switch category.category { case .academia: @@ -71,7 +82,16 @@ extension CategoryPickerItem { } else { return L10n.Scene.ServerPicker.Button.language } - + case .signupSpeed(let manuallyReviewed): + if let manuallyReviewed { + if manuallyReviewed { + return L10n.Scene.ServerPicker.SignupSpeed.manuallyReviewed + } else { + return L10n.Scene.ServerPicker.SignupSpeed.instant + } + } else { + return L10n.Scene.ServerPicker.Button.signupSpeed + } case .category(let category): switch category.category { case .academia: @@ -114,6 +134,8 @@ extension CategoryPickerItem: Equatable { return categoryLeft.category.rawValue == categoryRight.category.rawValue case (.language(let languageLeft), .language(let languageRight)): return languageLeft == languageRight + case (.signupSpeed(let leftManualReview), .signupSpeed(let rightManualReview)): + return leftManualReview == rightManualReview default: return false } @@ -133,6 +155,12 @@ extension CategoryPickerItem: Hashable { } case .category(let category): hasher.combine(category.category.rawValue) + case .signupSpeed(let manuallyReviewed): + if let manuallyReviewed { + return hasher.combine(manuallyReviewed) + } else { + return hasher.combine("no_signup_speed_selected") + } } } } diff --git a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift index 84e73d98e..4f9acd08e 100644 --- a/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift +++ b/Mastodon/Scene/Onboarding/PickServer/CategoryPickerSection.swift @@ -27,13 +27,15 @@ extension CategoryPickerSection { cell.delegate = buttonDelegate let isLanguage = (item == .language(language: nil)) - if isLanguage { + let isSignupSpeed = (item == .signupSpeed(manuallyReviewed: nil)) + if isLanguage || isSignupSpeed { cell.chevron.isHidden = false cell.menuButton.isUserInteractionEnabled = true - + cell.menuButton.isHidden = false } else { cell.chevron.isHidden = true cell.menuButton.isUserInteractionEnabled = false + cell.menuButton.isHidden = true } cell.observe(\.isSelected, options: [.initial, .new]) { cell, _ in diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift index 3b7d9d0c7..e55e01476 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewController.swift @@ -391,10 +391,10 @@ extension MastodonPickServerViewController: PickServerServerSectionTableHeaderVi func pickServerServerSectionTableHeaderView(_ headerView: PickServerServerSectionTableHeaderView, collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { guard let diffableDataSource = headerView.diffableDataSource else { return } let item = diffableDataSource.itemIdentifier(for: indexPath) - //TODO: @zeitschlag Consider language etc. also: show menu - if case let .language(_) = item { - + // is handled by the button + } else if case let .signupSpeed(_) = item { + // gets also handled by button } else { viewModel.selectCategoryItem.value = item ?? .all } diff --git a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift index 7330da252..915247c98 100644 --- a/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift +++ b/Mastodon/Scene/Onboarding/PickServer/MastodonPickServerViewModel.swift @@ -35,12 +35,14 @@ class MastodonPickServerViewModel: NSObject { var items: [CategoryPickerItem] = [] items.append(.all) items.append(.language(language: nil)) + items.append(.signupSpeed(manuallyReviewed: nil)) items.append(contentsOf: APIService.stubCategories().map { CategoryPickerItem.category(category: $0) }) return items }() let selectCategoryItem = CurrentValueSubject(.all) let searchText = CurrentValueSubject("") let selectedLanguage = CurrentValueSubject(nil) + let manualApprovalRequired = CurrentValueSubject(nil) let allLanguages = CurrentValueSubject<[Mastodon.Entity.Language], Never>([]) let indexedServers = CurrentValueSubject<[Mastodon.Entity.Server], Never>([]) let unindexedServers = CurrentValueSubject<[Mastodon.Entity.Server]?, Never>([]) // set nil when loading @@ -169,7 +171,7 @@ extension MastodonPickServerViewModel { switch selectCategoryItem { case .all: return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: nil, searchText: searchText) - case .language(_): + case .language(_), .signupSpeed(_): return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: nil, searchText: searchText) case .category(let category): return MastodonPickServerViewModel.filterServers(servers: indexedServers, language: selectedLanguage, category: category.category.rawValue, searchText: searchText) @@ -227,7 +229,7 @@ extension MastodonPickServerViewModel { } extension MastodonPickServerViewModel { - private static func filterServers(servers: [Mastodon.Entity.Server], language: String? = nil, category: String?, searchText: String) -> [Mastodon.Entity.Server] { + private static func filterServers(servers: [Mastodon.Entity.Server], language: String? = nil, manualApprovalRequired: Bool? = nil, category: String?, searchText: String) -> [Mastodon.Entity.Server] { let filteredServers = servers // 1. Filter the category .filter { @@ -244,8 +246,14 @@ extension MastodonPickServerViewModel { } .filter { guard let language else { return true } + return $0.language.lowercased() == language.lowercased() } + .filter { + guard let manualApprovalRequired else { return true } + + return $0.approvalRequired == manualApprovalRequired + } return filteredServers } }