From 304eb8b7ff156b6326843b91786961d3fa240f8f Mon Sep 17 00:00:00 2001 From: Nathan Mattes Date: Sat, 20 Jan 2024 21:51:04 +0100 Subject: [PATCH] Move notification-timestamp away from viewmodel (IOS-192) --- .../NotificationView+Configuration.swift | 14 +++++--- .../NotificationView+ViewModel.swift | 36 +++++-------------- .../NotificationView/NotificationView.swift | 7 +++- .../Sources/MastodonUI/Extension/Date.swift | 4 +-- 4 files changed, 25 insertions(+), 36 deletions(-) diff --git a/Mastodon/Scene/Notification/NotificationView/NotificationView+Configuration.swift b/Mastodon/Scene/Notification/NotificationView/NotificationView+Configuration.swift index 0cb9da883..e1c4b6d6d 100644 --- a/Mastodon/Scene/Notification/NotificationView/NotificationView+Configuration.swift +++ b/Mastodon/Scene/Notification/NotificationView/NotificationView+Configuration.swift @@ -83,8 +83,6 @@ extension NotificationView { let metaUsername = PlaintextMetaContent(string: "@\(author.acct)") authorUsernameLabel.configure(content: metaUsername) - viewModel.timestamp = notification.entity.createdAt - let visibility = notification.entity.status?.mastodonVisibility ?? ._other("") visibilityIconImageView.image = visibility.image @@ -174,9 +172,15 @@ extension NotificationView { } + timestampUpdatePublisher + .prepend(Date()) + .eraseToAnyPublisher() + .sink { [weak self] now in + guard let self else { return } - - viewModel.followRequestState = notification.followRequestState - viewModel.transientFollowRequestState = notification.transientFollowRequestState + let timestamp = now.localizedTimeAgo(since: notification.entity.createdAt) + dateLabel.configure(content: PlaintextMetaContent(string: timestamp)) + } + .store(in: &disposeBag) } } diff --git a/Mastodon/Scene/Notification/NotificationView/NotificationView+ViewModel.swift b/Mastodon/Scene/Notification/NotificationView/NotificationView+ViewModel.swift index 0117395a5..7c64d217e 100644 --- a/Mastodon/Scene/Notification/NotificationView/NotificationView+ViewModel.swift +++ b/Mastodon/Scene/Notification/NotificationView/NotificationView+ViewModel.swift @@ -33,19 +33,11 @@ extension NotificationView { @Published public var followRequestState = MastodonFollowRequestState(state: .none) @Published public var transientFollowRequestState = MastodonFollowRequestState(state: .none) - - let timestampUpdatePublisher = Timer.publish(every: 1.0, on: .main, in: .common) - .autoconnect() - .share() - .eraseToAnyPublisher() } } extension NotificationView.ViewModel { func bind(notificationView: NotificationView) { - bindAuthor(notificationView: notificationView) - bindFollowRequest(notificationView: notificationView) - $authContext .assign(to: \.authContext, on: notificationView.statusView.viewModel) .store(in: &disposeBag) @@ -56,32 +48,19 @@ extension NotificationView.ViewModel { private func bindAuthor(notificationView: NotificationView) { // timestamp - let formattedTimestamp = Publishers.CombineLatest( - $timestamp, - timestampUpdatePublisher.prepend(Date()).eraseToAnyPublisher() - ) - .map { timestamp, _ in - timestamp?.localizedTimeAgoSinceNow ?? "" - } - .removeDuplicates() - - formattedTimestamp - .sink { timestamp in - notificationView.dateLabel.configure(content: PlaintextMetaContent(string: timestamp)) - } - .store(in: &disposeBag) - Publishers.CombineLatest4( $authorName, $authorUsername, $notificationIndicatorText, - formattedTimestamp + $timestamp ) .sink { name, username, type, timestamp in + + let formattedTimestamp = timestamp?.localizedSlowedTimeAgoSinceNow ?? "" notificationView.accessibilityLabel = [ "\(name?.string ?? "") \(type?.string ?? "")", username.map { "@\($0)" } ?? "", - timestamp + formattedTimestamp ].joined(separator: ", ") if !notificationView.statusView.isHidden { notificationView.accessibilityLabel! += ", " + (notificationView.statusView.accessibilityLabel ?? "") @@ -138,7 +117,7 @@ extension NotificationView.ViewModel { } .store(in: &disposeBag) } - + private func bindFollowRequest(notificationView: NotificationView) { Publishers.CombineLatest( $followRequestState, @@ -159,7 +138,7 @@ extension NotificationView.ViewModel { default: break } - + let state = transientFollowRequestState.state if state == .isAccepting { notificationView.acceptFollowRequestActivityIndicatorView.startAnimating() @@ -179,7 +158,7 @@ extension NotificationView.ViewModel { notificationView.rejectFollowRequestButton.tintColor = .black notificationView.rejectFollowRequestButton.setTitleColor(.black, for: .normal) } - + UIView.animate(withDuration: 0.3) { if state == .isAccept { notificationView.rejectFollowRequestButtonShadowBackgroundContainer.isHidden = true @@ -193,3 +172,4 @@ extension NotificationView.ViewModel { } } + diff --git a/Mastodon/Scene/Notification/NotificationView/NotificationView.swift b/Mastodon/Scene/Notification/NotificationView/NotificationView.swift index 3ba5c2bd1..349fc80b0 100644 --- a/Mastodon/Scene/Notification/NotificationView/NotificationView.swift +++ b/Mastodon/Scene/Notification/NotificationView/NotificationView.swift @@ -176,7 +176,12 @@ public final class NotificationView: UIView { public let quoteStatusViewContainerView = UIView() public let quoteBackgroundView = UIView() public let quoteStatusView = StatusView() - + + let timestampUpdatePublisher = Timer.publish(every: 1.0, on: .main, in: .common) + .autoconnect() + .share() + .eraseToAnyPublisher() + public func prepareForReuse() { disposeBag.removeAll() diff --git a/MastodonSDK/Sources/MastodonUI/Extension/Date.swift b/MastodonSDK/Sources/MastodonUI/Extension/Date.swift index 2b0cb9098..771d4c11a 100644 --- a/MastodonSDK/Sources/MastodonUI/Extension/Date.swift +++ b/MastodonSDK/Sources/MastodonUI/Extension/Date.swift @@ -32,10 +32,10 @@ extension Date { } public var localizedTimeAgoSinceNow: String { - return self.localizedTimeAgo(since: Date(), isSlowed: false, isAbbreviated: false) + return self.localizedTimeAgo(since: Date()) } - public func localizedTimeAgo(since date: Date, isSlowed: Bool, isAbbreviated: Bool) -> String { + public func localizedTimeAgo(since date: Date, isSlowed: Bool = false, isAbbreviated: Bool = false) -> String { let earlierDate = date < self ? date : self let latestDate = earlierDate == date ? self : date