diff --git a/Riot/Modules/Home/AllChats/AllChatsViewController.swift b/Riot/Modules/Home/AllChats/AllChatsViewController.swift index fed2030d9c..9d36f74d4a 100644 --- a/Riot/Modules/Home/AllChats/AllChatsViewController.swift +++ b/Riot/Modules/Home/AllChats/AllChatsViewController.swift @@ -72,6 +72,10 @@ class AllChatsViewController: HomeViewController { private var isOnboardingCoordinatorPreparing: Bool = false private var allChatsOnboardingCoordinatorBridgePresenter: AllChatsOnboardingCoordinatorBridgePresenter? + + private var theme: Theme { + ThemeService.shared().theme + } @IBOutlet private var toolbar: UIToolbar! private var isToolbarHidden: Bool = false { @@ -137,12 +141,13 @@ class AllChatsViewController: HomeViewController { searchController.delegate = self NotificationCenter.default.addObserver(self, selector: #selector(self.setupEditOptions), name: AllChatsLayoutSettingsManager.didUpdateSettings, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(self.updateBadgeButton), name: MXSpaceNotificationCounter.didUpdateNotificationCount, object: nil) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - self.toolbar.tintColor = ThemeService.shared().theme.colors.accent + self.toolbar.tintColor = theme.colors.accent if self.navigationItem.searchController == nil { self.navigationItem.searchController = searchController } @@ -460,7 +465,7 @@ class AllChatsViewController: HomeViewController { return } - self.update(with: ThemeService.shared().theme) + self.update(with: theme) } private func update(with theme: Theme) { @@ -500,22 +505,42 @@ class AllChatsViewController: HomeViewController { self?.updateToolbar(with: menu) })) updateEmptyView() + updateBadgeButton() } private func updateRightNavigationItem(with menu: UIMenu) { self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(systemName: "ellipsis.circle"), menu: menu) } + private lazy var spacesButton: BadgedBarButtonItem = { + let innerButton = UIButton(type: .system) + innerButton.accessibilityLabel = VectorL10n.spaceSelectorTitle + innerButton.addTarget(self, action: #selector(self.showSpaceSelectorAction(sender:)), for: .touchUpInside) + innerButton.setImage(Asset.Images.allChatsSpacesIcon.image, for: .normal) + return BadgedBarButtonItem(withBaseButton: innerButton, theme: theme) + }() + + @objc private func updateBadgeButton() { + guard isViewLoaded, let session = mainSession else { + return + } + + let notificationCount = session.spaceService.missedNotificationsCount + let hasSpaceInvite = session.spaceService.hasSpaceInvite + let isBadgeHighlighed = session.spaceService.hasHighlightNotification || hasSpaceInvite + let badgeValue = (notificationCount == 0 && hasSpaceInvite) ? "!" : String(notificationCount) + + spacesButton.badgeText = badgeValue + spacesButton.badgeBackgroundColor = isBadgeHighlighed ? theme.noticeColor : theme.noticeSecondaryColor + } + private func updateToolbar(with menu: UIMenu) { guard isViewLoaded else { return } self.isToolbarHidden = false - self.update(with: ThemeService.shared().theme) - - let spacesButton = UIBarButtonItem(image: Asset.Images.allChatsSpacesIcon.image, style: .done, target: self, action: #selector(self.showSpaceSelectorAction(sender: ))) - spacesButton.accessibilityLabel = VectorL10n.spaceSelectorTitle + self.update(with: theme) self.toolbar.items = [ spacesButton, @@ -1076,3 +1101,22 @@ extension AllChatsViewController: SplitViewMasterViewControllerProtocol { self.refreshCurrentSelectedCell(false) } } + +private extension MXSpaceService { + var hasSpaceInvite: Bool { + spaceSummaries.contains(where: { $0.isJoined == false }) + } + + var missedNotificationsCount: UInt { + let notificationState = notificationCounter.homeNotificationState + let groupNotifications = notificationState.groupMissedDiscussionsCount + let directNotifications = notificationState.directMissedDiscussionsCount + + // `notificationState.allCount` returns twice the messages for favourite rooms. Fixing it here. + return groupNotifications + directNotifications + } + + var hasHighlightNotification: Bool { + notificationCounter.homeNotificationState.allHighlightCount > 0 + } +} diff --git a/changelog.d/pr-7088.change b/changelog.d/pr-7088.change new file mode 100644 index 0000000000..5a09145fb3 --- /dev/null +++ b/changelog.d/pr-7088.change @@ -0,0 +1 @@ +Add badge for messages in spaces button.