diff --git a/Signal/src/Loki/FriendRequestView.swift b/Signal/src/Loki/FriendRequestView.swift index fe3953927..491dfcf49 100644 --- a/Signal/src/Loki/FriendRequestView.swift +++ b/Signal/src/Loki/FriendRequestView.swift @@ -66,10 +66,21 @@ } addSubview(mainStackView) mainStackView.autoPin(toEdgesOf: self) + NotificationCenter.default.addObserver(self, selector: #selector(handleFriendRequestStatusChangedNotification), name: .messageFriendRequestStatusChanged, object: nil) + } + + deinit { + NotificationCenter.default.removeObserver(self) } // MARK: Updating - @objc func handleMessageChanged() { + @objc private func handleFriendRequestStatusChangedNotification(_ notification: Notification) { + guard let messageID = notification.object as? String, messageID == message?.uniqueId else { return } + message.reload() + handleMessageChanged() + } + + @objc private func handleMessageChanged() { precondition(message != nil) switch kind { case .incoming: @@ -108,7 +119,6 @@ guard let message = message as? TSIncomingMessage else { preconditionFailure() } message.saveFriendRequestStatus(.declined, with: nil) delegate?.declineFriendRequest(message) - handleMessageChanged() // Update UI } // MARK: Measuring diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 379b1728c..37a7d595c 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -480,16 +480,9 @@ typedef enum : NSUInteger { // Ensure thread instance is up to date [self.thread reload]; // Update UI - id lastItem = self.viewItems.lastObject; - [lastItem clearCachedLayoutState]; - UICollectionViewCell *cell = self.collectionView.visibleCells.lastObject; - OWSMessageCell *messageCell = (OWSMessageCell *)[cell as:OWSMessageCell.class]; - if (messageCell != nil) { - [messageCell.friendRequestView.message reload]; - [messageCell.friendRequestView handleMessageChanged]; - } - [self resetContentAndLayout]; + [self.viewItems.lastObject clearCachedLayoutState]; [self updateInputToolbar]; + [self resetContentAndLayout]; } - (void)peekSetup diff --git a/SignalServiceKit/src/Loki/Extensions/Notification.swift b/SignalServiceKit/src/Loki/Extensions/Notification.swift index 35fffae9e..e9ad704fd 100644 --- a/SignalServiceKit/src/Loki/Extensions/Notification.swift +++ b/SignalServiceKit/src/Loki/Extensions/Notification.swift @@ -1,8 +1,12 @@ public extension Notification.Name { public static let threadFriendRequestStatusChanged = Notification.Name("threadFriendRequestStatusChanged") + public static let messageFriendRequestStatusChanged = Notification.Name("messageFriendRequestStatusChanged") } +// MARK: - Obj-C + @objc public extension NSNotification { - @objc public static let threadFriendRequestStatusChanged = Notification.Name.threadFriendRequestStatusChanged.rawValue as NSString // Obj-C + @objc public static let threadFriendRequestStatusChanged = Notification.Name.threadFriendRequestStatusChanged.rawValue as NSString + @objc public static let messageFriendRequestStatusChanged = Notification.Name.messageFriendRequestStatusChanged.rawValue as NSString } diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index cff0efe8d..4df337e48 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -444,10 +444,15 @@ static const NSUInteger OWSMessageSchemaVersion = 4; - (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { self.friendRequestStatus = friendRequestStatus; + void (^postNotification)() = ^() { + [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.messageFriendRequestStatusChanged object:self.uniqueId]; + }; if (transaction == nil) { [self save]; + [self.dbReadWriteConnection flushTransactionsWithCompletionQueue:dispatch_get_main_queue() completionBlock:^{ postNotification(); }]; } else { [self saveWithTransaction:transaction]; + [transaction.connection flushTransactionsWithCompletionQueue:dispatch_get_main_queue() completionBlock:^{ postNotification(); }]; } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index a44c22780..e8106c007 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1122,7 +1122,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction]; [message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil]; + [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction]; // Set the expiration date NSTimeInterval expirationInterval = 72 * kHourInterval; NSDate *expireDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval];