diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index ab6ac2940..3d6f6970f 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -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 = ""; }; D8099079294BC9390050219F /* PrivacyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyTableViewCell.swift; sourceTree = ""; }; D809907B294D25510050219F /* PrivacyViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyViewModel.swift; sourceTree = ""; }; + D80EC2622C2978EE009724A5 /* NotificationPolicyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPolicyViewController.swift; sourceTree = ""; }; D80F627A2B5C32C500877059 /* NotificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationView.swift; sourceTree = ""; }; D81439852AD415DE0071A88F /* AboutInstance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutInstance.swift; sourceTree = ""; }; D81439872AD450A40071A88F /* AboutInstanceTableViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutInstanceTableViewDataSource.swift; sourceTree = ""; }; @@ -1758,6 +1760,14 @@ path = Privacy; sourceTree = ""; }; + D80EC2602C2978CB009724A5 /* Notification Filtering */ = { + isa = PBXGroup; + children = ( + D80EC2622C2978EE009724A5 /* NotificationPolicyViewController.swift */, + ); + path = "Notification Filtering"; + sourceTree = ""; + }; 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 */, diff --git a/Mastodon/Scene/Notification/Notification Filtering/NotificationPolicyViewController.swift b/Mastodon/Scene/Notification/Notification Filtering/NotificationPolicyViewController.swift new file mode 100644 index 000000000..0aff29b49 --- /dev/null +++ b/Mastodon/Scene/Notification/Notification Filtering/NotificationPolicyViewController.swift @@ -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") } +} diff --git a/Mastodon/Scene/Notification/NotificationViewController.swift b/Mastodon/Scene/Notification/NotificationViewController.swift index df0b7d0fa..6376fc5a1 100644 --- a/Mastodon/Scene/Notification/NotificationViewController.swift +++ b/Mastodon/Scene/Notification/NotificationViewController.swift @@ -86,14 +86,11 @@ 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 { diff --git a/Mastodon/Scene/Notification/NotificationViewModel.swift b/Mastodon/Scene/Notification/NotificationViewModel.swift index b3a3316fd..9626bcaa6 100644 --- a/Mastodon/Scene/Notification/NotificationViewModel.swift +++ b/Mastodon/Scene/Notification/NotificationViewModel.swift @@ -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() // 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. + } + } } }