Add a filtering-button that is only visible if there's a policy (IOS-241)

This commit is contained in:
Nathan Mattes 2024-06-25 10:05:32 +02:00
parent cf39ad6d68
commit 3118861984
4 changed files with 54 additions and 7 deletions

View File

@ -137,6 +137,7 @@
D8099078294BC8A30050219F /* PrivacyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099077294BC8A30050219F /* PrivacyTableViewController.swift */; };
D809907A294BC9390050219F /* PrivacyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8099079294BC9390050219F /* PrivacyTableViewCell.swift */; };
D809907C294D25510050219F /* PrivacyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D809907B294D25510050219F /* PrivacyViewModel.swift */; };
D80EC2632C2978EE009724A5 /* NotificationPolicyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D80EC2622C2978EE009724A5 /* NotificationPolicyViewController.swift */; };
D80F627C2B5C32C500877059 /* NotificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D80F627A2B5C32C500877059 /* NotificationView.swift */; };
D81439862AD415DE0071A88F /* AboutInstance.swift in Sources */ = {isa = PBXBuildFile; fileRef = D81439852AD415DE0071A88F /* AboutInstance.swift */; };
D81439882AD450A40071A88F /* AboutInstanceTableViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D81439872AD450A40071A88F /* AboutInstanceTableViewDataSource.swift */; };
@ -761,6 +762,7 @@
D8099077294BC8A30050219F /* PrivacyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewController.swift; sourceTree = "<group>"; };
D8099079294BC9390050219F /* PrivacyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewCell.swift; sourceTree = "<group>"; };
D809907B294D25510050219F /* PrivacyViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyViewModel.swift; sourceTree = "<group>"; };
D80EC2622C2978EE009724A5 /* NotificationPolicyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPolicyViewController.swift; sourceTree = "<group>"; };
D80F627A2B5C32C500877059 /* NotificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationView.swift; sourceTree = "<group>"; };
D81439852AD415DE0071A88F /* AboutInstance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutInstance.swift; sourceTree = "<group>"; };
D81439872AD450A40071A88F /* AboutInstanceTableViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutInstanceTableViewDataSource.swift; sourceTree = "<group>"; };
@ -1758,6 +1760,14 @@
path = Privacy;
sourceTree = "<group>";
};
D80EC2602C2978CB009724A5 /* Notification Filtering */ = {
isa = PBXGroup;
children = (
D80EC2622C2978EE009724A5 /* NotificationPolicyViewController.swift */,
);
path = "Notification Filtering";
sourceTree = "<group>";
};
D80F627E2B5C32E400877059 /* NotificationView */ = {
isa = PBXGroup;
children = (
@ -2667,6 +2677,7 @@
DB9D6BFD25E4F57B0051B173 /* Notification */ = {
isa = PBXGroup;
children = (
D80EC2602C2978CB009724A5 /* Notification Filtering */,
DB63F765279A5E5600455B82 /* NotificationTimeline */,
2D35237F26256F470031AF25 /* Cell */,
D80F627E2B5C32E400877059 /* NotificationView */,
@ -3808,6 +3819,7 @@
DB9F58EC26EF435000E7BBE9 /* AccountViewController.swift in Sources */,
D8318A802A4466D300C0FB73 /* SettingsCoordinator.swift in Sources */,
DB3E6FF12806D96900B035AE /* DiscoveryNewsViewModel+Diffable.swift in Sources */,
D80EC2632C2978EE009724A5 /* NotificationPolicyViewController.swift in Sources */,
DB3E6FF82807C45300B035AE /* DiscoveryForYouViewModel.swift in Sources */,
DB0F9D56283EB46200379AF8 /* ProfileHeaderView+Configuration.swift in Sources */,
DB6746F0278F463B008A6B94 /* AutoGenerateProtocolDelegate.swift in Sources */,

View File

@ -0,0 +1,13 @@
// Copyright © 2024 Mastodon gGmbH. All rights reserved.
import UIKit
class NotificationPolicyViewController: UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
view.backgroundColor = .systemGreen
}
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}

View File

@ -86,13 +86,10 @@ extension NotificationViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// aspectViewWillAppear(animated)
// fetch latest notification when scroll position is within half screen height to prevent list reload
// if tableView.contentOffset.y < view.frame.height * 0.5 {
// viewModel.loadLatestStateMachine.enter(NotificationViewModel.LoadLatestState.Loading.self)
// }
// https://github.com/mastodon/documentation/pull/1447#issuecomment-2149225659
if let viewModel, viewModel.notificationPolicy != nil {
navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(systemName: "line.3.horizontal.decrease"), style: .plain, target: self, action: #selector(NotificationViewController.showNotificationPolicySettings(_:)))
}
// needs trigger manually after onboarding dismiss
setNeedsStatusBarAppearanceUpdate()
@ -117,6 +114,20 @@ extension NotificationViewController {
// aspectViewDidDisappear(animated)
}
//MARK: - Actions
@objc private func showNotificationPolicySettings(_ sender: Any) {
//TODO: Move to SceneCoordinator
let notificationPolicyViewController = NotificationPolicyViewController()
notificationPolicyViewController.modalPresentationStyle = .formSheet
if let sheet = notificationPolicyViewController.sheetPresentationController {
sheet.detents = [.medium(), .large()]
}
present(UINavigationController(rootViewController: notificationPolicyViewController), animated: true)
}
}
extension NotificationViewController {

View File

@ -11,6 +11,7 @@ import Pageboy
import MastodonAsset
import MastodonCore
import MastodonLocalization
import MastodonSDK
final class NotificationViewModel {
@ -19,6 +20,7 @@ final class NotificationViewModel {
// input
let context: AppContext
let authContext: AuthContext
var notificationPolicy: Mastodon.Entity.NotificationPolicy?
let viewDidLoad = PassthroughSubject<Void, Never>()
// output
@ -50,7 +52,16 @@ final class NotificationViewModel {
init(context: AppContext, authContext: AuthContext) {
self.context = context
self.authContext = authContext
// end init
Task {
do {
let policy = try await context.apiService.notificationPolicy(authenticationBox: authContext.mastodonAuthenticationBox)
self.notificationPolicy = policy.value
} catch {
// we won't show the filtering-options.
}
}
}
}