diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 5b7d4dbc3..33dfce0fb 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -338,83 +338,77 @@ extension ConversationVC: let linkPreviewDraft: LinkPreviewDraft? = snInputView.linkPreviewInfo?.draft let quoteModel: QuotedReplyModel? = snInputView.quoteDraftInfo?.model + // If this was a message request then approve it approveMessageRequestIfNeeded( for: threadId, threadVariant: self.viewModel.threadData.threadVariant, isNewThread: !oldThreadShouldBeVisible, timestampMs: (sentTimestampMs - 1) // Set 1ms earlier as this is used for sorting ) - .done { [weak self] _ in - Storage.shared.writeAsync( - updates: { db in - guard let thread: SessionThread = try SessionThread.fetchOne(db, id: threadId) else { - return - } - - // Let the viewModel know we are about to send a message - self?.viewModel.sentMessageBeforeUpdate = true - - // Update the thread to be visible - _ = try SessionThread - .filter(id: threadId) - .updateAll(db, SessionThread.Columns.shouldBeVisible.set(to: true)) - - // Create the interaction - let interaction: Interaction = try Interaction( - threadId: threadId, - authorId: getUserHexEncodedPublicKey(db), - variant: .standardOutgoing, - body: text, - timestampMs: sentTimestampMs, - hasMention: Interaction.isUserMentioned(db, threadId: threadId, body: text), - linkPreviewUrl: linkPreviewDraft?.urlString - ).inserted(db) - - // If there is a LinkPreview and it doesn't match an existing one then add it now - if - let linkPreviewDraft: LinkPreviewDraft = linkPreviewDraft, - (try? interaction.linkPreview.isEmpty(db)) == true - { - try LinkPreview( - url: linkPreviewDraft.urlString, - title: linkPreviewDraft.title, - attachmentId: LinkPreview.saveAttachmentIfPossible( - db, - imageData: linkPreviewDraft.jpegImageData, - mimeType: OWSMimeTypeImageJpeg - ) - ).insert(db) - } - - // If there is a Quote the insert it now - if let interactionId: Int64 = interaction.id, let quoteModel: QuotedReplyModel = quoteModel { - try Quote( - interactionId: interactionId, - authorId: quoteModel.authorId, - timestampMs: quoteModel.timestampMs, - body: quoteModel.body, - attachmentId: quoteModel.generateAttachmentThumbnailIfNeeded(db) - ).insert(db) - } - - try MessageSender.send( - db, - interaction: interaction, - in: thread - ) - }, - completion: { [weak self] _, _ in - self?.handleMessageSent() + + // Send the message + Storage.shared.writeAsync( + updates: { [weak self] db in + guard let thread: SessionThread = try SessionThread.fetchOne(db, id: threadId) else { + return } - ) - } - .catch(on: DispatchQueue.main) { [weak self] _ in - // Show an error indicating that approving the thread failed - let alert = UIAlertController(title: "Session", message: "An error occurred when trying to accept this message request", preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) - self?.present(alert, animated: true, completion: nil) - } - .retainUntilComplete() + + // Let the viewModel know we are about to send a message + self?.viewModel.sentMessageBeforeUpdate = true + + // Update the thread to be visible + _ = try SessionThread + .filter(id: threadId) + .updateAll(db, SessionThread.Columns.shouldBeVisible.set(to: true)) + + // Create the interaction + let interaction: Interaction = try Interaction( + threadId: threadId, + authorId: getUserHexEncodedPublicKey(db), + variant: .standardOutgoing, + body: text, + timestampMs: sentTimestampMs, + hasMention: Interaction.isUserMentioned(db, threadId: threadId, body: text), + linkPreviewUrl: linkPreviewDraft?.urlString + ).inserted(db) + + // If there is a LinkPreview and it doesn't match an existing one then add it now + if + let linkPreviewDraft: LinkPreviewDraft = linkPreviewDraft, + (try? interaction.linkPreview.isEmpty(db)) == true + { + try LinkPreview( + url: linkPreviewDraft.urlString, + title: linkPreviewDraft.title, + attachmentId: LinkPreview.saveAttachmentIfPossible( + db, + imageData: linkPreviewDraft.jpegImageData, + mimeType: OWSMimeTypeImageJpeg + ) + ).insert(db) + } + + // If there is a Quote the insert it now + if let interactionId: Int64 = interaction.id, let quoteModel: QuotedReplyModel = quoteModel { + try Quote( + interactionId: interactionId, + authorId: quoteModel.authorId, + timestampMs: quoteModel.timestampMs, + body: quoteModel.body, + attachmentId: quoteModel.generateAttachmentThumbnailIfNeeded(db) + ).insert(db) + } + + try MessageSender.send( + db, + interaction: interaction, + in: thread + ) + }, + completion: { [weak self] _, _ in + self?.handleMessageSent() + } + ) } func sendAttachments(_ attachments: [SignalAttachment], with text: String, onComplete: (() -> ())? = nil) { @@ -435,61 +429,55 @@ extension ConversationVC: let oldThreadShouldBeVisible: Bool = (self.viewModel.threadData.threadShouldBeVisible == true) let sentTimestampMs: Int64 = Int64(floor((Date().timeIntervalSince1970 * 1000))) + // If this was a message request then approve it approveMessageRequestIfNeeded( for: threadId, threadVariant: self.viewModel.threadData.threadVariant, isNewThread: !oldThreadShouldBeVisible, timestampMs: (sentTimestampMs - 1) // Set 1ms earlier as this is used for sorting ) - .done { [weak self] _ in - Storage.shared.writeAsync( - updates: { db in - guard let thread: SessionThread = try SessionThread.fetchOne(db, id: threadId) else { - return - } - - // Let the viewModel know we are about to send a message - self?.viewModel.sentMessageBeforeUpdate = true - - // Update the thread to be visible - _ = try SessionThread - .filter(id: threadId) - .updateAll(db, SessionThread.Columns.shouldBeVisible.set(to: true)) - - // Create the interaction - let interaction: Interaction = try Interaction( - threadId: threadId, - authorId: getUserHexEncodedPublicKey(db), - variant: .standardOutgoing, - body: text, - timestampMs: sentTimestampMs, - hasMention: Interaction.isUserMentioned(db, threadId: threadId, body: text) - ).inserted(db) + + // Send the message + Storage.shared.writeAsync( + updates: { [weak self] db in + guard let thread: SessionThread = try SessionThread.fetchOne(db, id: threadId) else { + return + } + + // Let the viewModel know we are about to send a message + self?.viewModel.sentMessageBeforeUpdate = true + + // Update the thread to be visible + _ = try SessionThread + .filter(id: threadId) + .updateAll(db, SessionThread.Columns.shouldBeVisible.set(to: true)) + + // Create the interaction + let interaction: Interaction = try Interaction( + threadId: threadId, + authorId: getUserHexEncodedPublicKey(db), + variant: .standardOutgoing, + body: text, + timestampMs: sentTimestampMs, + hasMention: Interaction.isUserMentioned(db, threadId: threadId, body: text) + ).inserted(db) - try MessageSender.send( - db, - interaction: interaction, - with: attachments, - in: thread - ) - }, - completion: { [weak self] _, _ in - self?.handleMessageSent() - - // Attachment successfully sent - dismiss the screen - DispatchQueue.main.async { - onComplete?() - } + try MessageSender.send( + db, + interaction: interaction, + with: attachments, + in: thread + ) + }, + completion: { [weak self] _, _ in + self?.handleMessageSent() + + // Attachment successfully sent - dismiss the screen + DispatchQueue.main.async { + onComplete?() } - ) - } - .catch(on: DispatchQueue.main) { [weak self] _ in - // Show an error indicating that approving the thread failed - let alert = UIAlertController(title: "Session", message: "An error occurred when trying to accept this message request", preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) - self?.present(alert, animated: true, completion: nil) - } - .retainUntilComplete() + } + ) } func handleMessageSent() { @@ -1635,8 +1623,8 @@ extension ConversationVC { threadVariant: SessionThread.Variant, isNewThread: Bool, timestampMs: Int64 - ) -> Promise { - guard threadVariant == .contact else { return Promise.value(()) } + ) { + guard threadVariant == .contact else { return } // If the contact doesn't exist then we should create it so we can store the 'isApproved' state // (it'll be updated with correct profile info if they accept the message request so this @@ -1651,97 +1639,54 @@ extension ConversationVC { let thread: SessionThread = approvalData.thread, !approvalData.contact.isApproved else { - return Promise.value(()) + return } - - return Promise.value(()) - .then { [weak self] _ -> Promise in - guard !isNewThread else { return Promise.value(()) } - guard let strongSelf = self else { return Promise(error: MessageSenderError.noThread) } - + + Storage.shared.writeAsync( + updates: { db in // If we aren't creating a new thread (ie. sending a message request) then send a // messageRequestResponse back to the sender (this allows the sender to know that // they have been approved and can now use this contact in closed groups) - let (promise, seal) = Promise.pending() - let messageRequestResponse: MessageRequestResponse = MessageRequestResponse( - isApproved: true, - sentTimestampMs: UInt64(timestampMs) - ) - - // Show a loading indicator - ModalActivityIndicatorViewController.present(fromViewController: strongSelf, canCancel: false) { _ in - seal.fulfill(()) + if !isNewThread { + try MessageSender.send( + db, + message: MessageRequestResponse( + isApproved: true, + sentTimestampMs: UInt64(timestampMs) + ), + interactionId: nil, + in: thread + ) } - - return promise - .then { _ -> Promise in - Storage.shared.writeAsync { db in - try MessageSender.sendNonDurably( - db, - message: messageRequestResponse, - interactionId: nil, - in: thread - ) - } - } - .map { _ in - if self?.presentedViewController is ModalActivityIndicatorViewController { - self?.dismiss(animated: true, completion: nil) // Dismiss the loader - } - } - } - .map { _ in + // Default 'didApproveMe' to true for the person approving the message request - Storage.shared.writeAsync( - updates: { db in - try approvalData.contact - .with( - isApproved: true, - didApproveMe: .update(approvalData.contact.didApproveMe || !isNewThread) - ) - .save(db) - - // Send a sync message with the details of the contact - try MessageSender.syncConfiguration(db, forceSyncNow: true).retainUntilComplete() - }, - completion: { db, _ in - // Hide the 'messageRequestView' since the request has been approved - DispatchQueue.main.async { [weak self] in - 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?.tableView.contentInset ?? UIEdgeInsets.zero) - self?.tableView.contentInset = UIEdgeInsets( - top: 0, - leading: 0, - bottom: max(oldContentInset.bottom - messageRequestsOffset, 0), - trailing: 0 - ) - } - } - - // Remove the 'MessageRequestsViewController' from the nav hierarchy if present - if - let viewControllers: [UIViewController] = self?.navigationController?.viewControllers, - let messageRequestsIndex = viewControllers.firstIndex(where: { $0 is MessageRequestsViewController }), - messageRequestsIndex > 0 - { - var newViewControllers = viewControllers - newViewControllers.remove(at: messageRequestsIndex) - self?.navigationController?.viewControllers = newViewControllers - } - } + try approvalData.contact + .with( + isApproved: true, + didApproveMe: .update(approvalData.contact.didApproveMe || !isNewThread) + ) + .save(db) + + // Send a sync message with the details of the contact + try MessageSender + .syncConfiguration(db, forceSyncNow: true) + .retainUntilComplete() + }, + completion: { _, _ in + // Remove the 'MessageRequestsViewController' from the nav hierarchy if present + DispatchQueue.main.async { [weak self] in + if + let viewControllers: [UIViewController] = self?.navigationController?.viewControllers, + let messageRequestsIndex = viewControllers.firstIndex(where: { $0 is MessageRequestsViewController }), + messageRequestsIndex > 0 + { + var newViewControllers = viewControllers + newViewControllers.remove(at: messageRequestsIndex) + self?.navigationController?.viewControllers = newViewControllers } - ) + } } + ) } @objc func acceptMessageRequest() { @@ -1751,17 +1696,6 @@ extension ConversationVC { isNewThread: false, timestampMs: Int64(floor(Date().timeIntervalSince1970 * 1000)) ) - .catch(on: DispatchQueue.main) { [weak self] _ in - // Show an error indicating that approving the thread failed - let alert = UIAlertController( - title: "Session", - message: "MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE".localized(), - preferredStyle: .alert - ) - alert.addAction(UIAlertAction(title: "BUTTON_OK".localized(), style: .default, handler: nil)) - self?.present(alert, animated: true, completion: nil) - } - .retainUntilComplete() } @objc func deleteMessageRequest() { @@ -1795,7 +1729,9 @@ extension ConversationVC { .filter(id: threadId) .deleteAll(db) - try MessageSender.syncConfiguration(db, forceSyncNow: true).retainUntilComplete() + try MessageSender + .syncConfiguration(db, forceSyncNow: true) + .retainUntilComplete() }, completion: { db, _ in DispatchQueue.main.async { [weak self] in diff --git a/Session/Conversations/ConversationVC.swift b/Session/Conversations/ConversationVC.swift index 0ee0ddb1c..31a7c770a 100644 --- a/Session/Conversations/ConversationVC.swift +++ b/Session/Conversations/ConversationVC.swift @@ -556,12 +556,32 @@ final class ConversationVC: BaseVC, OWSConversationSettingsViewDelegate, Convers { updateNavBarButtons(threadData: updatedThreadData, initialVariant: viewModel.initialThreadVariant) - messageRequestView.isHidden = ( - updatedThreadData.threadIsMessageRequest == false || - updatedThreadData.threadRequiresApproval == true - ) - scrollButtonMessageRequestsBottomConstraint?.isActive = (updatedThreadData.threadIsMessageRequest == true) - scrollButtonBottomConstraint?.isActive = (updatedThreadData.threadIsMessageRequest == false) + let messageRequestsViewWasVisible: Bool = (messageRequestView.isHidden == false) + + UIView.animate(withDuration: 0.3) { [weak self] in + self?.messageRequestView.isHidden = ( + updatedThreadData.threadIsMessageRequest == false || + updatedThreadData.threadRequiresApproval == true + ) + + self?.scrollButtonMessageRequestsBottomConstraint?.isActive = ( + updatedThreadData.threadIsMessageRequest == true + ) + self?.scrollButtonBottomConstraint?.isActive = (updatedThreadData.threadIsMessageRequest == false) + + // Update the table content inset and offset to account for + // the dissapearance of the messageRequestsView + if messageRequestsViewWasVisible { + let messageRequestsOffset: CGFloat = ((self?.messageRequestView.bounds.height ?? 0) + 16) + let oldContentInset: UIEdgeInsets = (self?.tableView.contentInset ?? UIEdgeInsets.zero) + self?.tableView.contentInset = UIEdgeInsets( + top: 0, + leading: 0, + bottom: max(oldContentInset.bottom - messageRequestsOffset, 0), + trailing: 0 + ) + } + } } if initialLoad || viewModel.threadData.threadIsBlocked != updatedThreadData.threadIsBlocked { diff --git a/Session/Home/HomeVC.swift b/Session/Home/HomeVC.swift index 66be8ff71..ec2ab0c32 100644 --- a/Session/Home/HomeVC.swift +++ b/Session/Home/HomeVC.swift @@ -16,6 +16,7 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, NewConve private var hasLoadedInitialThreadData: Bool = false private var isLoadingMore: Bool = false private var isAutoLoadingNextPage: Bool = false + private var viewHasAppeared: Bool = false // MARK: - Intialization @@ -224,6 +225,13 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, NewConve startObservingChanges() } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + self.viewHasAppeared = true + self.autoLoadNextPageIfNeeded() + } + override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) @@ -487,7 +495,7 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, NewConve } func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { - guard self.hasLoadedInitialThreadData && !self.isLoadingMore else { return } + guard self.hasLoadedInitialThreadData && self.viewHasAppeared && !self.isLoadingMore else { return } let section: HomeViewModel.SectionModel = self.viewModel.threadData[section] diff --git a/Session/Home/Message Requests/MessageRequestsViewController.swift b/Session/Home/Message Requests/MessageRequestsViewController.swift index 401240ff3..afcbf8000 100644 --- a/Session/Home/Message Requests/MessageRequestsViewController.swift +++ b/Session/Home/Message Requests/MessageRequestsViewController.swift @@ -14,6 +14,8 @@ class MessageRequestsViewController: BaseVC, UITableViewDelegate, UITableViewDat private var dataChangeObservable: DatabaseCancellable? private var hasLoadedInitialThreadData: Bool = false private var isLoadingMore: Bool = false + private var isAutoLoadingNextPage: Bool = false + private var viewHasAppeared: Bool = false // MARK: - Intialization @@ -130,6 +132,13 @@ class MessageRequestsViewController: BaseVC, UITableViewDelegate, UITableViewDat startObservingChanges() } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + self.viewHasAppeared = true + self.autoLoadNextPageIfNeeded() + } + override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) @@ -196,6 +205,13 @@ class MessageRequestsViewController: BaseVC, UITableViewDelegate, UITableViewDat clearAllButton.isHidden = updatedData.isEmpty emptyStateLabel.isHidden = !updatedData.isEmpty + CATransaction.begin() + CATransaction.setCompletionBlock { [weak self] in + // Complete page loading + self?.isLoadingMore = false + self?.autoLoadNextPageIfNeeded() + } + // Reload the table content (animate changes after the first load) tableView.reload( using: StagedChangeset(source: viewModel.threadData, target: updatedData), @@ -209,6 +225,38 @@ class MessageRequestsViewController: BaseVC, UITableViewDelegate, UITableViewDat ) { [weak self] updatedData in self?.viewModel.updateThreadData(updatedData) } + + CATransaction.commit() + } + + private func autoLoadNextPageIfNeeded() { + guard !self.isAutoLoadingNextPage && !self.isLoadingMore else { return } + + self.isAutoLoadingNextPage = true + + DispatchQueue.main.asyncAfter(deadline: .now() + PagedData.autoLoadNextPageDelay) { [weak self] in + self?.isAutoLoadingNextPage = false + + // Note: We sort the headers as we want to prioritise loading newer pages over older ones + let sections: [(MessageRequestsViewModel.Section, CGRect)] = (self?.viewModel.threadData + .enumerated() + .map { index, section in (section.model, (self?.tableView.rectForHeader(inSection: index) ?? .zero)) }) + .defaulting(to: []) + let shouldLoadMore: Bool = sections + .contains { section, headerRect in + section == .loadMore && + headerRect != .zero && + (self?.tableView.bounds.contains(headerRect) == true) + } + + guard shouldLoadMore else { return } + + self?.isLoadingMore = true + + DispatchQueue.global(qos: .default).async { [weak self] in + self?.viewModel.pagedDataObserver?.load(.pageAfter) + } + } } @objc override internal func handleAppModeChangedNotification(_ notification: Notification) { @@ -277,7 +325,7 @@ class MessageRequestsViewController: BaseVC, UITableViewDelegate, UITableViewDat } func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { - guard self.hasLoadedInitialThreadData && !self.isLoadingMore else { return } + guard self.hasLoadedInitialThreadData && self.viewHasAppeared && !self.isLoadingMore else { return } let section: MessageRequestsViewModel.SectionModel = self.viewModel.threadData[section] @@ -338,7 +386,9 @@ class MessageRequestsViewController: BaseVC, UITableViewDelegate, UITableViewDat // MARK: - Interaction @objc private func clearAllTapped() { - guard viewModel.threadData.first { $0.model == .threads }?.elements.isEmpty == false else { return } + guard viewModel.threadData.first(where: { $0.model == .threads })?.elements.isEmpty == false else { + return + } let threadIds: [String] = (viewModel.threadData .first { $0.model == .threads }? diff --git a/Session/Meta/Translations/de.lproj/Localizable.strings b/Session/Meta/Translations/de.lproj/Localizable.strings index 0138af276..60196d5df 100644 --- a/Session/Meta/Translations/de.lproj/Localizable.strings +++ b/Session/Meta/Translations/de.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Möchten Sie wirklich alle Nachrichten löschen?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/en.lproj/Localizable.strings b/Session/Meta/Translations/en.lproj/Localizable.strings index 18d73b302..70292f244 100644 --- a/Session/Meta/Translations/en.lproj/Localizable.strings +++ b/Session/Meta/Translations/en.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/es.lproj/Localizable.strings b/Session/Meta/Translations/es.lproj/Localizable.strings index 76abb2b87..eda8d36e6 100644 --- a/Session/Meta/Translations/es.lproj/Localizable.strings +++ b/Session/Meta/Translations/es.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/fa.lproj/Localizable.strings b/Session/Meta/Translations/fa.lproj/Localizable.strings index 60d6d71ee..1177dd54e 100644 --- a/Session/Meta/Translations/fa.lproj/Localizable.strings +++ b/Session/Meta/Translations/fa.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/fi.lproj/Localizable.strings b/Session/Meta/Translations/fi.lproj/Localizable.strings index 47b43d082..0ccbf8630 100644 --- a/Session/Meta/Translations/fi.lproj/Localizable.strings +++ b/Session/Meta/Translations/fi.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Oletko varma että haluat poistaa kaikki viestipyynnöt?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Poista"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Oletko varma että haluat poistaa tämän viestipyynnön?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "Viestipyyntöä hyväksyttäessä ilmeni virhe"; "MESSAGE_REQUESTS_INFO" = "Viestin lähettäminen tälle henkilölle hyväksyy automaattisesti viestipyynnön."; "MESSAGE_REQUESTS_ACCEPTED" = "Viestipyyntösi hyväksyttiin."; "MESSAGE_REQUESTS_NOTIFICATION" = "Sinulla on uusi viestipyyntö"; diff --git a/Session/Meta/Translations/fr.lproj/Localizable.strings b/Session/Meta/Translations/fr.lproj/Localizable.strings index ee7ccbf84..71bba7d52 100644 --- a/Session/Meta/Translations/fr.lproj/Localizable.strings +++ b/Session/Meta/Translations/fr.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Êtes-vous sûr de vouloir supprimer toutes les demandes de messages ?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Effacer"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Êtes-vous sûr de vouloir supprimer cette demande de message ?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "Une erreur s'est produite en acceptant cette demande de message"; "MESSAGE_REQUESTS_INFO" = "Envoyer un message à cet utilisateur acceptera automatiquement sa demande de message."; "MESSAGE_REQUESTS_ACCEPTED" = "Votre demande de message a été réceptionnée."; "MESSAGE_REQUESTS_NOTIFICATION" = "Vous avez une nouvelle demande de message"; diff --git a/Session/Meta/Translations/hi.lproj/Localizable.strings b/Session/Meta/Translations/hi.lproj/Localizable.strings index 86a98157a..e74664705 100644 --- a/Session/Meta/Translations/hi.lproj/Localizable.strings +++ b/Session/Meta/Translations/hi.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/hr.lproj/Localizable.strings b/Session/Meta/Translations/hr.lproj/Localizable.strings index 4b4b3f6ca..f8a01cf6a 100644 --- a/Session/Meta/Translations/hr.lproj/Localizable.strings +++ b/Session/Meta/Translations/hr.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/id-ID.lproj/Localizable.strings b/Session/Meta/Translations/id-ID.lproj/Localizable.strings index b1376c4db..65e9f6828 100644 --- a/Session/Meta/Translations/id-ID.lproj/Localizable.strings +++ b/Session/Meta/Translations/id-ID.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/it.lproj/Localizable.strings b/Session/Meta/Translations/it.lproj/Localizable.strings index 007cac231..6ca09139f 100644 --- a/Session/Meta/Translations/it.lproj/Localizable.strings +++ b/Session/Meta/Translations/it.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Eliminare veramente tutte le richieste di messaggio?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Cancella"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Sei sicuro di voler eliminare questa richiesta di messaggio?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "Si è verificato un errore durante il tentativo di accettare questa richiesta di messaggio"; "MESSAGE_REQUESTS_INFO" = "L'invio di un messaggio a questo utente accetterà automaticamente la richiesta di messaggio."; "MESSAGE_REQUESTS_ACCEPTED" = "La tua richiesta di messaggio è stata accettata."; "MESSAGE_REQUESTS_NOTIFICATION" = "Hai una nuova richiesta di messaggio"; diff --git a/Session/Meta/Translations/ja.lproj/Localizable.strings b/Session/Meta/Translations/ja.lproj/Localizable.strings index f554a0bcb..7467457c3 100644 --- a/Session/Meta/Translations/ja.lproj/Localizable.strings +++ b/Session/Meta/Translations/ja.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "本当に全てのリクエストを消去しますか?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "消去"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "本当にこのリクエストを削除しますか?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "リクエスト承認時にエラーが発生しました"; "MESSAGE_REQUESTS_INFO" = "このユーザーにメッセージを送信すると、自動的にリクエストが承認されます。"; "MESSAGE_REQUESTS_ACCEPTED" = "リクエストが承認されました"; "MESSAGE_REQUESTS_NOTIFICATION" = "新しいリクエストがあります"; diff --git a/Session/Meta/Translations/nl.lproj/Localizable.strings b/Session/Meta/Translations/nl.lproj/Localizable.strings index d2280bc06..41354fa3c 100644 --- a/Session/Meta/Translations/nl.lproj/Localizable.strings +++ b/Session/Meta/Translations/nl.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/pl.lproj/Localizable.strings b/Session/Meta/Translations/pl.lproj/Localizable.strings index 7d53e7b81..b480bbe12 100644 --- a/Session/Meta/Translations/pl.lproj/Localizable.strings +++ b/Session/Meta/Translations/pl.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Czy na pewno chcesz wyczyścić wszystkie żądania wiadomości?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Wyczyść"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Czy na pewno chcesz usunąć to żądanie wiadomości?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "Wystąpił błąd podczas próby zaakceptowania tego żądania wiadomości"; "MESSAGE_REQUESTS_INFO" = "Wysyłanie wiadomości do tego użytkownika automatycznie zaakceptuje ich żądanie wiadomości."; "MESSAGE_REQUESTS_ACCEPTED" = "Twoje żądanie wiadomości zostało zaakceptowane."; "MESSAGE_REQUESTS_NOTIFICATION" = "Masz nowe żądanie wiadomości"; diff --git a/Session/Meta/Translations/pt_BR.lproj/Localizable.strings b/Session/Meta/Translations/pt_BR.lproj/Localizable.strings index 8e5856689..d785a31be 100644 --- a/Session/Meta/Translations/pt_BR.lproj/Localizable.strings +++ b/Session/Meta/Translations/pt_BR.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/ru.lproj/Localizable.strings b/Session/Meta/Translations/ru.lproj/Localizable.strings index 8e0c3f534..07a7951f2 100644 --- a/Session/Meta/Translations/ru.lproj/Localizable.strings +++ b/Session/Meta/Translations/ru.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Вы уверены, что хотите очистить все запросы сообщений?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Очистить"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Вы уверены, что хотите удалить это сообщение?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/si.lproj/Localizable.strings b/Session/Meta/Translations/si.lproj/Localizable.strings index bd1d4fd91..6c6d14467 100644 --- a/Session/Meta/Translations/si.lproj/Localizable.strings +++ b/Session/Meta/Translations/si.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/sk.lproj/Localizable.strings b/Session/Meta/Translations/sk.lproj/Localizable.strings index 6632f0943..76e709953 100644 --- a/Session/Meta/Translations/sk.lproj/Localizable.strings +++ b/Session/Meta/Translations/sk.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Naozaj chcete vymazať všetky žiadosti o správu?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Vymazať"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Naozaj chcete vymazať túto žiadosť o správu?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "Nastala chyba pri akceptovaní žiadosti o túto správu"; "MESSAGE_REQUESTS_INFO" = "Poslanie správy tomuto používateľovi automaticky príjme ich žiadosť o správu."; "MESSAGE_REQUESTS_ACCEPTED" = "Vaša žiadosť o správu bola prijatá."; "MESSAGE_REQUESTS_NOTIFICATION" = "Máte novú žiadosť o správu"; diff --git a/Session/Meta/Translations/sv.lproj/Localizable.strings b/Session/Meta/Translations/sv.lproj/Localizable.strings index afee13e19..eb846d574 100644 --- a/Session/Meta/Translations/sv.lproj/Localizable.strings +++ b/Session/Meta/Translations/sv.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/th.lproj/Localizable.strings b/Session/Meta/Translations/th.lproj/Localizable.strings index 6b9f85dec..bbc550448 100644 --- a/Session/Meta/Translations/th.lproj/Localizable.strings +++ b/Session/Meta/Translations/th.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/vi-VN.lproj/Localizable.strings b/Session/Meta/Translations/vi-VN.lproj/Localizable.strings index 6b5e5594b..f7be858a2 100644 --- a/Session/Meta/Translations/vi-VN.lproj/Localizable.strings +++ b/Session/Meta/Translations/vi-VN.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/zh-Hant.lproj/Localizable.strings b/Session/Meta/Translations/zh-Hant.lproj/Localizable.strings index c389b1514..ecf86aca8 100644 --- a/Session/Meta/Translations/zh-Hant.lproj/Localizable.strings +++ b/Session/Meta/Translations/zh-Hant.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "Are you sure you want to clear all message requests?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "Clear"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "Are you sure you want to delete this message request?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "An error occurred when trying to accept this message request"; "MESSAGE_REQUESTS_INFO" = "Sending a message to this user will automatically accept their message request."; "MESSAGE_REQUESTS_ACCEPTED" = "Your message request has been accepted."; "MESSAGE_REQUESTS_NOTIFICATION" = "You have a new message request"; diff --git a/Session/Meta/Translations/zh_CN.lproj/Localizable.strings b/Session/Meta/Translations/zh_CN.lproj/Localizable.strings index 68bdf9b6b..44a6ea8d4 100644 --- a/Session/Meta/Translations/zh_CN.lproj/Localizable.strings +++ b/Session/Meta/Translations/zh_CN.lproj/Localizable.strings @@ -638,7 +638,6 @@ "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_TITLE" = "您确定要清除所有消息请求吗?"; "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON" = "清除"; "MESSAGE_REQUESTS_DELETE_CONFIRMATION_ACTON" = "您确定要删除此消息请求吗?"; -"MESSAGE_REQUESTS_APPROVAL_ERROR_MESSAGE" = "尝试接受此消息请求时发生错误"; "MESSAGE_REQUESTS_INFO" = "发送消息给此用户将自动接受他们的消息请求。"; "MESSAGE_REQUESTS_ACCEPTED" = "您的消息请求已被接受。"; "MESSAGE_REQUESTS_NOTIFICATION" = "您有一个新的消息请求";