diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 7076c5723..c2fcc1d07 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -1115,7 +1115,26 @@ extension ConversationVC { // Hide the 'messageRequestView' since the request has been approved and force a config // sync to propagate the contact approval state (both must run on the main thread) DispatchQueue.main.async { [weak self] in - self?.messageRequestView.isHidden = true + let messageRequestViewWasVisible: Bool = (self?.messageRequestView.isHidden == false) + + UIView.animate(withDuration: 0.3) { + self?.messageRequestView.isHidden = true + self?.scrollButtonMessageRequestsBottomConstraint?.isActive = false + self?.scrollButtonBottomConstraint?.isActive = true + + // Update the table content inset and offset to account for the dissapearance of + // the messageRequestsView + if messageRequestViewWasVisible { + let messageRequestsOffset: CGFloat = ((self?.messageRequestView.bounds.height ?? 0) + 16) + let oldContentInset: UIEdgeInsets = (self?.messagesTableView.contentInset ?? UIEdgeInsets.zero) + self?.messagesTableView.contentInset = UIEdgeInsets( + top: 0, + leading: 0, + bottom: max(oldContentInset.bottom - messageRequestsOffset, 0), + trailing: 0 + ) + } + } // Send a sync message with the details of the contact if let appDelegate = UIApplication.shared.delegate as? AppDelegate { diff --git a/Session/Conversations/ConversationVC.swift b/Session/Conversations/ConversationVC.swift index 332a00e7d..932f2c434 100644 --- a/Session/Conversations/ConversationVC.swift +++ b/Session/Conversations/ConversationVC.swift @@ -1,4 +1,5 @@ import SessionUIKit +import SessionMessagingKit // TODO: // • Slight paging glitch when scrolling up and loading more content @@ -12,8 +13,9 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, OWSConversat let focusedMessageID: String? // This is used for global search var focusedMessageIndexPath: IndexPath? var unreadViewItems: [ConversationViewItem] = [] - var scrollButtonConstraint: NSLayoutConstraint? - var footerControlsStackViewBottomConstraint: NSLayoutConstraint? + var scrollButtonBottomConstraint: NSLayoutConstraint? + var scrollButtonMessageRequestsBottomConstraint: NSLayoutConstraint? + var messageRequestsViewBotomConstraint: NSLayoutConstraint? // Search var isShowingSearchUI = false var lastSearchedText: String? @@ -303,21 +305,22 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, OWSConversat addOrRemoveBlockedBanner() // Message requests view & scroll to bottom - view.addSubview(footerControlsStackView) - - footerControlsStackView.addArrangedSubview(scrollButton) - footerControlsStackView.addArrangedSubview(messageRequestView) + view.addSubview(scrollButton) + view.addSubview(messageRequestView) messageRequestView.addSubview(messageRequestDescriptionLabel) messageRequestView.addSubview(messageRequestAcceptButton) messageRequestView.addSubview(messageRequestDeleteButton) - scrollButton.pin(.right, to: .right, of: footerControlsStackView, withInset: -20) - messageRequestView.pin(.left, to: .left, of: footerControlsStackView) - messageRequestView.pin(.right, to: .right, of: footerControlsStackView) - footerControlsStackView.pin(.left, to: .left, of: view) - footerControlsStackView.pin(.right, to: .right, of: view) - self.footerControlsStackViewBottomConstraint = footerControlsStackView.pin(.bottom, to: .bottom, of: view, withInset: -16) + scrollButton.pin(.right, to: .right, of: view, withInset: -20) + messageRequestView.pin(.left, to: .left, of: view) + messageRequestView.pin(.right, to: .right, of: view) + self.messageRequestsViewBotomConstraint = messageRequestView.pin(.bottom, to: .bottom, of: view, withInset: -16) + self.scrollButtonBottomConstraint = scrollButton.pin(.bottom, to: .bottom, of: view, withInset: -16) + self.scrollButtonBottomConstraint?.isActive = false // Note: Need to disable this to avoid a conflict with the other bottom constraint + self.scrollButtonMessageRequestsBottomConstraint = scrollButton.pin(.bottom, to: .top, of: messageRequestView, withInset: -16) + self.scrollButtonMessageRequestsBottomConstraint?.isActive = thread.isMessageRequest() + self.scrollButtonBottomConstraint?.isActive = !thread.isMessageRequest() messageRequestDescriptionLabel.pin(.top, to: .top, of: messageRequestView, withInset: 10) messageRequestDescriptionLabel.pin(.left, to: .left, of: messageRequestView, withInset: 40) @@ -529,7 +532,8 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, OWSConversat ) let newContentOffsetY: CGFloat = (messagesTableView.contentOffset.y + (newContentInset.bottom - oldContentInset.bottom)) let changes = { [weak self] in - self?.footerControlsStackViewBottomConstraint?.constant = -(keyboardTop + 16) + self?.scrollButtonBottomConstraint?.constant = -(keyboardTop + 16) + self?.messageRequestsViewBotomConstraint?.constant = -(keyboardTop + 16) self?.messagesTableView.contentInset = newContentInset self?.messagesTableView.contentOffset.y = newContentOffsetY @@ -574,7 +578,8 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, OWSConversat delay: 0, options: options, animations: { [weak self] in - self?.footerControlsStackViewBottomConstraint?.constant = -(keyboardTop + 16) + self?.scrollButtonBottomConstraint?.constant = -(keyboardTop + 16) + self?.messageRequestsViewBotomConstraint?.constant = -(keyboardTop + 16) let scrollButtonOpacity: CGFloat = (self?.getScrollButtonOpacity() ?? 0) self?.scrollButton.alpha = scrollButtonOpacity