diff --git a/Session/Conversations/ConversationVC.swift b/Session/Conversations/ConversationVC.swift index bddae7992..70546c16f 100644 --- a/Session/Conversations/ConversationVC.swift +++ b/Session/Conversations/ConversationVC.swift @@ -209,7 +209,10 @@ final class ConversationVC: BaseVC, OWSConversationSettingsViewDelegate, Convers lazy var messageRequestView: UIView = { let result: UIView = UIView() result.translatesAutoresizingMaskIntoConstraints = false - result.isHidden = (self.viewModel.threadData.threadIsMessageRequest == false) + result.isHidden = ( + self.viewModel.threadData.threadIsMessageRequest == false || + self.viewModel.threadData.threadRequiresApproval == true + ) result.setGradient(Gradients.defaultBackground) return result @@ -558,11 +561,21 @@ final class ConversationVC: BaseVC, OWSConversationSettingsViewDelegate, Convers } if initialLoad || viewModel.threadData.threadIsMessageRequest != updatedThreadData.threadIsMessageRequest { - messageRequestView.isHidden = (updatedThreadData.threadIsMessageRequest == false) scrollButtonMessageRequestsBottomConstraint?.isActive = (updatedThreadData.threadIsMessageRequest == true) scrollButtonBottomConstraint?.isActive = (updatedThreadData.threadIsMessageRequest == false) } + if + initialLoad || + viewModel.threadData.threadRequiresApproval != updatedThreadData.threadRequiresApproval || + viewModel.threadData.threadIsMessageRequest != updatedThreadData.threadIsMessageRequest + { + messageRequestView.isHidden = ( + updatedThreadData.threadIsMessageRequest == false || + updatedThreadData.threadRequiresApproval == true + ) + } + if initialLoad || viewModel.threadData.threadUnreadCount != updatedThreadData.threadUnreadCount { updateUnreadCountView(unreadCount: updatedThreadData.threadUnreadCount) } @@ -871,7 +884,13 @@ final class ConversationVC: BaseVC, OWSConversationSettingsViewDelegate, Convers navigationItem.rightBarButtonItems = [] } else { - guard let threadData: SessionThreadViewModel = threadData, threadData.threadRequiresApproval == false else { + guard + let threadData: SessionThreadViewModel = threadData, + ( + threadData.threadRequiresApproval == false && + threadData.threadIsMessageRequest == false + ) + else { // Note: Adding empty buttons because without it the title alignment is busted (Note: The size was // taken from the layout inspector for the back button in Xcode navigationItem.rightBarButtonItems = [ @@ -914,7 +933,7 @@ final class ConversationVC: BaseVC, OWSConversationSettingsViewDelegate, Convers settingsButtonItem.accessibilityLabel = "Settings button" settingsButtonItem.isAccessibilityElement = true - if SessionCall.isEnabled && !threadData.threadIsNoteToSelf && threadData.threadIsMessageRequest == false { + if SessionCall.isEnabled && !threadData.threadIsNoteToSelf { let callButton = UIBarButtonItem( image: UIImage(named: "Phone"), style: .plain, diff --git a/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift b/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift index 5b51a6cb7..fc099a5cb 100644 --- a/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift +++ b/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift @@ -579,10 +579,8 @@ public extension SessionThreadViewModel { IFNULL(\(contact[.isApproved]), false) = false ) AS \(ViewModel.threadIsMessageRequestKey), ( - \(SQL("\(thread[.variant]) = \(SessionThread.Variant.contact)")) AND ( - IFNULL(\(contact[.isApproved]), false) = false OR - IFNULL(\(contact[.didApproveMe]), false) = false - ) + \(SQL("\(thread[.variant]) = \(SessionThread.Variant.contact)")) AND + IFNULL(\(contact[.didApproveMe]), false) = false ) AS \(ViewModel.threadRequiresApprovalKey), \(thread[.shouldBeVisible]) AS \(ViewModel.threadShouldBeVisibleKey), diff --git a/SessionUtilitiesKit/JobRunner/JobRunner.swift b/SessionUtilitiesKit/JobRunner/JobRunner.swift index 96278ad7b..6104b5680 100644 --- a/SessionUtilitiesKit/JobRunner/JobRunner.swift +++ b/SessionUtilitiesKit/JobRunner/JobRunner.swift @@ -772,6 +772,19 @@ private final class JobQueue { .with(nextRunTimestamp: (Date().timeIntervalSince1970 + 1)) .saved(db) } + + // For `recurringOnLaunch/Active` jobs which have already run, we want to clear their + // `failureCount` and `nextRunTimestamp` to prevent them from endlessly running over + // and over and reset their retry backoff in case they fail next time + case .recurringOnLaunch, .recurringOnActive: + Storage.shared.write { db in + _ = try job + .with( + failureCount: 0, + nextRunTimestamp: 0 + ) + .saved(db) + } default: break }