From cb97e21cd2cc0f03fa65e8e8160f087b2d61ef90 Mon Sep 17 00:00:00 2001 From: Justin Mazzocchi <2831158+jzzocc@users.noreply.github.com> Date: Sun, 9 May 2021 21:39:36 -0700 Subject: [PATCH] Show announcement count --- DB/Sources/DB/Content/ContentDatabase.swift | 2 +- View Controllers/TableViewController.swift | 2 ++ View Controllers/TimelinesViewController.swift | 15 ++++++++++++++- .../View Models/AnnouncementViewModel.swift | 4 +++- Views/UIKit/Content Views/AnnouncementView.swift | 8 ++++---- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/DB/Sources/DB/Content/ContentDatabase.swift b/DB/Sources/DB/Content/ContentDatabase.swift index 3b56e3e..5ca2372 100644 --- a/DB/Sources/DB/Content/ContentDatabase.swift +++ b/DB/Sources/DB/Content/ContentDatabase.swift @@ -609,7 +609,7 @@ public extension ContentDatabase { ValueObservation.tracking(Announcement.fetchCount) .removeDuplicates() .publisher(in: databaseWriter) - .combineLatest(ValueObservation.tracking(Announcement.fetchCount) + .combineLatest(ValueObservation.tracking(Announcement.filter(Announcement.Columns.read == false).fetchCount) .removeDuplicates() .publisher(in: databaseWriter)) .map { (total: $0, unread: $1) } diff --git a/View Controllers/TableViewController.swift b/View Controllers/TableViewController.swift index e704905..5b09c67 100644 --- a/View Controllers/TableViewController.swift +++ b/View Controllers/TableViewController.swift @@ -141,6 +141,8 @@ class TableViewController: UITableViewController { if let loadMoreView = cell.contentView as? LoadMoreView { visibleLoadMoreViews.insert(loadMoreView) } + + (cell.contentView as? AnnouncementView)?.dismissIfUnread() } override func tableView(_ tableView: UITableView, diff --git a/View Controllers/TimelinesViewController.swift b/View Controllers/TimelinesViewController.swift index 678dcb2..6cfc4b9 100644 --- a/View Controllers/TimelinesViewController.swift +++ b/View Controllers/TimelinesViewController.swift @@ -41,7 +41,7 @@ final class TimelinesViewController: UIPageViewController { image: UIImage(systemName: "newspaper"), selectedImage: nil) - announcementsButton.primaryAction = UIAction( + let announcementsAction = UIAction( title: NSLocalizedString("main-navigation.announcements", comment: ""), image: UIImage(systemName: "megaphone")) { [weak self] _ in guard let self = self else { return } @@ -52,8 +52,21 @@ final class TimelinesViewController: UIPageViewController { self.navigationController?.pushViewController(announcementsViewController, animated: true) } + announcementsButton.primaryAction = announcementsAction + viewModel.$announcementCount .sink { [weak self] in + if $0.unread > 0 { + announcementsAction.image = UIImage(systemName: "\($0.unread).circle.fill") + ?? UIImage(systemName: "megaphone.fill") + self?.announcementsButton.primaryAction = announcementsAction + self?.announcementsButton.tintColor = .systemRed + } else { + announcementsAction.image = UIImage(systemName: "megaphone") + self?.announcementsButton.primaryAction = announcementsAction + self?.announcementsButton.tintColor = nil + } + self?.navigationItem.rightBarButtonItem = $0.total > 0 ? self?.announcementsButton : nil } .store(in: &cancellables) diff --git a/ViewModels/Sources/ViewModels/View Models/AnnouncementViewModel.swift b/ViewModels/Sources/ViewModels/View Models/AnnouncementViewModel.swift index 40f8876..44406ff 100644 --- a/ViewModels/Sources/ViewModels/View Models/AnnouncementViewModel.swift +++ b/ViewModels/Sources/ViewModels/View Models/AnnouncementViewModel.swift @@ -33,7 +33,9 @@ public extension AnnouncementViewModel { .eraseToAnyPublisher()) } - func dismiss() { + func dismissIfUnread() { + guard !announcement.read else { return } + eventsSubject.send( announcementService.dismiss() .map { _ in .ignorableOutput } diff --git a/Views/UIKit/Content Views/AnnouncementView.swift b/Views/UIKit/Content Views/AnnouncementView.swift index 9669867..a074acd 100644 --- a/Views/UIKit/Content Views/AnnouncementView.swift +++ b/Views/UIKit/Content Views/AnnouncementView.swift @@ -47,6 +47,10 @@ extension AnnouncementView { static func estimatedHeight(width: CGFloat, announcement: Announcement) -> CGFloat { UITableView.automaticDimension } + + func dismissIfUnread() { + announcementConfiguration.viewModel.dismissIfUnread() + } } extension AnnouncementView: UIContentView { @@ -167,9 +171,5 @@ private extension AnnouncementView { if snapshot.itemIdentifiers != dataSource.snapshot().itemIdentifiers { dataSource.apply(snapshot, animatingDifferences: false) { viewModel.reload() } } - - if !viewModel.announcement.read { - viewModel.dismiss() - } } }