From b47e5accd63a6c3ebb02fa8acaeb08635aa866aa Mon Sep 17 00:00:00 2001 From: Morgan Pretty Date: Wed, 31 Aug 2022 17:44:44 +1000 Subject: [PATCH] Updated some more message types and modals Added a disabled state to the OutlineButton Finished of the last bits for the BlockedContacts screen Applied theming to the LinkPreview Applied theming to the Call info message (and it's prompt) Fixed a minor issue where showing the ContextMenu (via long press) could look odd due to the input field being dismissed Swapped the LinkPreviewModal to use the standard ConfirmationModal Removed a redundant closure from the ConfirmationModal --- Session.xcodeproj/project.pbxproj | 13 +-- .../Views & Modals/CallMissedTipsModal.swift | 103 ++++++++++++------ .../ConversationVC+Interaction.swift | 71 ++++++++---- .../Message Cells/CallMessageCell.swift | 22 ++-- .../Content Views/LinkPreviewView.swift | 28 +++-- .../OpenGroupInvitationView.swift | 4 +- .../Content Views/QuoteView.swift | 7 +- .../Content Views/VoiceMessageView.swift | 39 ++++--- .../Message Cells/InfoMessageCell.swift | 8 +- .../Views & Modals/LinkPreviewModal.swift | 87 --------------- .../MessageRequestsViewController.swift | 6 +- Session/Home/NewConversationButtonSet.swift | 14 +-- .../Translations/de.lproj/Localizable.strings | 7 +- .../Translations/en.lproj/Localizable.strings | 7 +- .../Translations/es.lproj/Localizable.strings | 7 +- .../Translations/fa.lproj/Localizable.strings | 7 +- .../Translations/fi.lproj/Localizable.strings | 7 +- .../Translations/fr.lproj/Localizable.strings | 7 +- .../Translations/hi.lproj/Localizable.strings | 7 +- .../Translations/hr.lproj/Localizable.strings | 7 +- .../id-ID.lproj/Localizable.strings | 7 +- .../Translations/it.lproj/Localizable.strings | 7 +- .../Translations/ja.lproj/Localizable.strings | 7 +- .../Translations/nl.lproj/Localizable.strings | 7 +- .../Translations/pl.lproj/Localizable.strings | 7 +- .../pt_BR.lproj/Localizable.strings | 7 +- .../Translations/ru.lproj/Localizable.strings | 7 +- .../Translations/si.lproj/Localizable.strings | 7 +- .../Translations/sk.lproj/Localizable.strings | 7 +- .../Translations/sv.lproj/Localizable.strings | 7 +- .../Translations/th.lproj/Localizable.strings | 7 +- .../vi-VN.lproj/Localizable.strings | 7 +- .../zh-Hant.lproj/Localizable.strings | 7 +- .../zh_CN.lproj/Localizable.strings | 7 +- Session/Onboarding/RegisterVC.swift | 1 + Session/Onboarding/RestoreVC.swift | 1 + .../BlockedContactsViewController.swift | 95 ++++++++++++---- Session/Settings/NukeDataModal.swift | 11 +- .../Settings/PrivacySettingsViewModel.swift | 2 +- .../SettingsTableViewController.swift | 13 ++- Session/Settings/SettingsVC.swift | 19 ---- .../Sheets & Modals/ConfirmationModal.swift | 46 ++++++-- SessionUIKit/Components/OutlineButton.swift | 83 ++++++++++---- .../Themes/Theme+ClassicDark.swift | 2 + .../Themes/Theme+ClassicLight.swift | 2 + .../Style Guide/Themes/Theme+Colors.swift | 3 + .../Style Guide/Themes/Theme+OceanDark.swift | 2 + .../Style Guide/Themes/Theme+OceanLight.swift | 2 + SessionUIKit/Style Guide/Themes/Theme.swift | 2 + 49 files changed, 527 insertions(+), 313 deletions(-) delete mode 100644 Session/Conversations/Views & Modals/LinkPreviewModal.swift diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 037513cd2..27e66b64d 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -385,7 +385,6 @@ C354E75A23FE2A7600CE22E3 /* BaseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C354E75923FE2A7600CE22E3 /* BaseVC.swift */; }; C35D0DB525AE5F1200B6BF49 /* UIEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35D0DB425AE5F1200B6BF49 /* UIEdgeInsets.swift */; }; C35E8AAE2485E51D00ACB629 /* IP2Country.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35E8AAD2485E51D00ACB629 /* IP2Country.swift */; }; - C374EEE225DA26740073A857 /* LinkPreviewModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = C374EEE125DA26740073A857 /* LinkPreviewModal.swift */; }; C374EEEB25DA3CA70073A857 /* ConversationTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C374EEEA25DA3CA70073A857 /* ConversationTitleView.swift */; }; C374EEF425DB31D40073A857 /* VoiceMessageRecordingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C374EEF325DB31D40073A857 /* VoiceMessageRecordingView.swift */; }; C379DCF4256735770002D4EB /* VisibleMessage+Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C379DCF3256735770002D4EB /* VisibleMessage+Attachment.swift */; }; @@ -751,11 +750,11 @@ FD859EFA27C2F5C500510D0C /* MockGenericHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD859EF927C2F5C500510D0C /* MockGenericHash.swift */; }; FD859EFC27C2F60700510D0C /* MockEd25519.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD859EFB27C2F60700510D0C /* MockEd25519.swift */; }; FD86585828507B24008B6CF9 /* NSData+messagePadding.m in Sources */ = {isa = PBXBuildFile; fileRef = C3A71D4825589FF20043A11F /* NSData+messagePadding.m */; }; - FD87DD0428B8727D00AF0F98 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD87DD0328B8727D00AF0F98 /* Configuration.swift */; }; FD87DCFA28B74DB300AF0F98 /* ConversationSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD87DCF928B74DB300AF0F98 /* ConversationSettingsViewModel.swift */; }; FD87DCFC28B755B800AF0F98 /* BlockedContactsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD87DCFB28B755B800AF0F98 /* BlockedContactsViewController.swift */; }; FD87DCFE28B7582C00AF0F98 /* BlockedContactsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD87DCFD28B7582C00AF0F98 /* BlockedContactsViewModel.swift */; }; FD87DD0028B820F200AF0F98 /* BlockedContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD87DCFF28B820F200AF0F98 /* BlockedContactCell.swift */; }; + FD87DD0428B8727D00AF0F98 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD87DD0328B8727D00AF0F98 /* Configuration.swift */; }; FD90040F2818AB6D00ABAAF6 /* GetSnodePoolJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD90040E2818AB6D00ABAAF6 /* GetSnodePoolJob.swift */; }; FD9004122818ABDC00ABAAF6 /* Job.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDF0B73F280402C4004C14C5 /* Job.swift */; }; FD9004142818AD0B00ABAAF6 /* _002_SetupStandardJobs.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9004132818AD0B00ABAAF6 /* _002_SetupStandardJobs.swift */; }; @@ -824,8 +823,6 @@ FDD2506E283711D600198BDA /* DifferenceKit+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD2506D283711D600198BDA /* DifferenceKit+Utilities.swift */; }; FDD250702837199200198BDA /* GarbageCollectionJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD2506F2837199200198BDA /* GarbageCollectionJob.swift */; }; FDD250722837234B00198BDA /* MediaGalleryNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD250712837234B00198BDA /* MediaGalleryNavigationController.swift */; }; - FDE72118286C156E0093DF33 /* ConversationSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDE72117286C156E0093DF33 /* ConversationSettingsViewController.swift */; }; - FDE72154287FE4470093DF33 /* HighlightMentionBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDE72153287FE4470093DF33 /* HighlightMentionBackgroundView.swift */; }; FDE77F6B280FEB28002CFC5D /* ControlMessageProcessRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDE77F6A280FEB28002CFC5D /* ControlMessageProcessRecord.swift */; }; FDED2E3C282E1B5D00B2CD2A /* UICollectionView+ReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDED2E3B282E1B5D00B2CD2A /* UICollectionView+ReusableView.swift */; }; FDF0B73C27FFD3D6004C14C5 /* LinkPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDF0B73B27FFD3D6004C14C5 /* LinkPreview.swift */; }; @@ -1474,7 +1471,6 @@ C35D0DB425AE5F1200B6BF49 /* UIEdgeInsets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIEdgeInsets.swift; sourceTree = ""; }; C35E8AA22485C72300ACB629 /* SwiftCSV.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftCSV.framework; path = ThirdParty/Carthage/Build/iOS/SwiftCSV.framework; sourceTree = ""; }; C35E8AAD2485E51D00ACB629 /* IP2Country.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IP2Country.swift; sourceTree = ""; }; - C374EEE125DA26740073A857 /* LinkPreviewModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkPreviewModal.swift; sourceTree = ""; }; C374EEEA25DA3CA70073A857 /* ConversationTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationTitleView.swift; sourceTree = ""; }; C374EEF325DB31D40073A857 /* VoiceMessageRecordingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceMessageRecordingView.swift; sourceTree = ""; }; C379DCF3256735770002D4EB /* VisibleMessage+Attachment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "VisibleMessage+Attachment.swift"; sourceTree = ""; }; @@ -1837,11 +1833,11 @@ FD859EF727C2F58900510D0C /* MockAeadXChaCha20Poly1305Ietf.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAeadXChaCha20Poly1305Ietf.swift; sourceTree = ""; }; FD859EF927C2F5C500510D0C /* MockGenericHash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockGenericHash.swift; sourceTree = ""; }; FD859EFB27C2F60700510D0C /* MockEd25519.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockEd25519.swift; sourceTree = ""; }; - FD87DD0328B8727D00AF0F98 /* Configuration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = ""; }; FD87DCF928B74DB300AF0F98 /* ConversationSettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationSettingsViewModel.swift; sourceTree = ""; }; FD87DCFB28B755B800AF0F98 /* BlockedContactsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedContactsViewController.swift; sourceTree = ""; }; FD87DCFD28B7582C00AF0F98 /* BlockedContactsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedContactsViewModel.swift; sourceTree = ""; }; FD87DCFF28B820F200AF0F98 /* BlockedContactCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedContactCell.swift; sourceTree = ""; }; + FD87DD0328B8727D00AF0F98 /* Configuration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = ""; }; FD90040E2818AB6D00ABAAF6 /* GetSnodePoolJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetSnodePoolJob.swift; sourceTree = ""; }; FD9004132818AD0B00ABAAF6 /* _002_SetupStandardJobs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _002_SetupStandardJobs.swift; sourceTree = ""; }; FDA8EAFD280E8B78002B68E5 /* FailedMessageSendsJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FailedMessageSendsJob.swift; sourceTree = ""; }; @@ -2369,7 +2365,6 @@ B8AF4BB326A5204600583500 /* SendSeedModal.swift */, B8758859264503A6000E60D0 /* JoinOpenGroupModal.swift */, B82149B725D60393009C0F2A /* BlockedModal.swift */, - C374EEE125DA26740073A857 /* LinkPreviewModal.swift */, B82149C025D605C6009C0F2A /* InfoBanner.swift */, C374EEEA25DA3CA70073A857 /* ConversationTitleView.swift */, B848A4C4269EAAA200617031 /* UserDetailsSheet.swift */, @@ -5489,9 +5484,7 @@ EF764C351DB67CC5000D9A87 /* UIViewController+Permissions.m in Sources */, 45CD81EF1DC030E7004C9430 /* SyncPushTokensJob.swift in Sources */, B83524A525C3BA4B0089A44F /* InfoMessageCell.swift in Sources */, - FDE72118286C156E0093DF33 /* ConversationSettingsViewController.swift in Sources */, 7B9F71D82853100A006DFE7B /* EmojiWithSkinTones.swift in Sources */, - FDE72118286C156E0093DF33 /* ConversationSettingsViewController.swift in Sources */, B84A89BC25DE328A0040017D /* ProfilePictureVC.swift in Sources */, 34386A54207D271D009F5D9C /* NeverClearView.swift in Sources */, FDCDB8E02811007F00352A0C /* HomeViewModel.swift in Sources */, @@ -5500,7 +5493,6 @@ 7B1581E6271FD2A100848B49 /* VideoPreviewVC.swift in Sources */, B83F2B88240CB75A000A54AB /* UIImage+Scaling.swift in Sources */, 3430FE181F7751D4000EC51B /* GiphyAPI.swift in Sources */, - FDE72154287FE4470093DF33 /* (null) in Sources */, 4C090A1B210FD9C7001FD7F9 /* HapticFeedback.swift in Sources */, 7B9F71D12852EEE2006DFE7B /* EmojiWithSkinTones+String.swift in Sources */, 34F308A21ECB469700BB7697 /* OWSBezierPathView.m in Sources */, @@ -5661,7 +5653,6 @@ 3427C64320F500E000EEC730 /* OWSMessageTimerView.m in Sources */, C33100092558FF6D00070591 /* UserCell.swift in Sources */, B8269D2925C7A4B400488AB4 /* InputView.swift in Sources */, - C374EEE225DA26740073A857 /* LinkPreviewModal.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Session/Calls/Views & Modals/CallMissedTipsModal.swift b/Session/Calls/Views & Modals/CallMissedTipsModal.swift index 01da57ac9..77f50642b 100644 --- a/Session/Calls/Views & Modals/CallMissedTipsModal.swift +++ b/Session/Calls/Views & Modals/CallMissedTipsModal.swift @@ -6,11 +6,73 @@ import SessionUIKit final class CallMissedTipsModal: Modal { private let caller: String + // MARK: - UI + + private lazy var tipsIconContainerView: UIView = UIView() + + private lazy var tipsIconImageView: UIImageView = { + let result: UIImageView = UIImageView( + image: UIImage(named: "Tips")?.withRenderingMode(.alwaysTemplate) + ) + result.themeTintColor = .textPrimary + result.set(.width, to: 19) + result.set(.height, to: 28) + + return result + }() + + private lazy var titleLabel: UILabel = { + let result: UILabel = UILabel() + result.font = .boldSystemFont(ofSize: Values.mediumFontSize) + result.text = "modal_call_missed_tips_title".localized() + result.themeTextColor = .textPrimary + result.textAlignment = .center + + return result + }() + + private lazy var messageLabel: UILabel = { + let result: UILabel = UILabel() + result.font = .systemFont(ofSize: Values.smallFontSize) + result.text = String(format: "modal_call_missed_tips_explanation".localized(), caller) + result.themeTextColor = .textPrimary + result.textAlignment = .natural + result.lineBreakMode = .byWordWrapping + result.numberOfLines = 0 + + return result + }() + + private lazy var contentStackView: UIStackView = { + let result = UIStackView(arrangedSubviews: [ tipsIconContainerView, titleLabel, messageLabel ]) + result.axis = .vertical + result.spacing = Values.smallSpacing + result.isLayoutMarginsRelativeArrangement = true + result.layoutMargins = UIEdgeInsets( + top: Values.largeSpacing, + leading: Values.largeSpacing, + bottom: Values.verySmallSpacing, + trailing: Values.largeSpacing + ) + + return result + }() + + private lazy var mainStackView: UIStackView = { + let result = UIStackView(arrangedSubviews: [ contentStackView, cancelButton ]) + result.axis = .vertical + result.spacing = Values.largeSpacing - Values.smallFontSize / 2 + + return result + }() + // MARK: - Lifecycle init(caller: String) { self.caller = caller + super.init(nibName: nil, bundle: nil) + self.modalPresentationStyle = .overFullScreen self.modalTransitionStyle = .crossDissolve } @@ -24,46 +86,15 @@ final class CallMissedTipsModal: Modal { } override func populateContentView() { - // Tips icon - let tipsIconImageView = UIImageView(image: UIImage(named: "Tips")?.withTint(Colors.text)) - tipsIconImageView.set(.width, to: 19) - tipsIconImageView.set(.height, to: 28) + cancelButton.setTitle("BUTTON_OK".localized(), for: .normal) - // Tips icon container view - let tipsIconContainerView = UIView() + contentView.addSubview(mainStackView) tipsIconContainerView.addSubview(tipsIconImageView) + + mainStackView.pin(to: contentView) + tipsIconImageView.pin(.top, to: .top, of: tipsIconContainerView) tipsIconImageView.pin(.bottom, to: .bottom, of: tipsIconContainerView) tipsIconImageView.center(in: tipsIconContainerView) - - // Title - let titleLabel = UILabel() - titleLabel.textColor = Colors.text - titleLabel.font = .boldSystemFont(ofSize: Values.mediumFontSize) - titleLabel.text = "modal_call_missed_tips_title".localized() - titleLabel.textAlignment = .center - - // Message - let messageLabel = UILabel() - messageLabel.textColor = Colors.text - messageLabel.font = .systemFont(ofSize: Values.smallFontSize) - messageLabel.text = String(format: "modal_call_missed_tips_explanation".localized(), caller) - messageLabel.numberOfLines = 0 - messageLabel.lineBreakMode = .byWordWrapping - messageLabel.textAlignment = .natural - - // Cancel Button - cancelButton.setTitle("BUTTON_OK".localized(), for: .normal) - - // Main stack view - let mainStackView = UIStackView(arrangedSubviews: [ tipsIconContainerView, titleLabel, messageLabel, cancelButton ]) - mainStackView.axis = .vertical - mainStackView.alignment = .fill - mainStackView.spacing = Values.largeSpacing - contentView.addSubview(mainStackView) - mainStackView.pin(.leading, to: .leading, of: contentView, withInset: Values.largeSpacing) - mainStackView.pin(.top, to: .top, of: contentView, withInset: Values.largeSpacing) - contentView.pin(.trailing, to: .trailing, of: mainStackView, withInset: Values.largeSpacing) - contentView.pin(.bottom, to: .bottom, of: mainStackView, withInset: Values.largeSpacing) } } diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 1801cfce9..2dfcb7c25 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -59,20 +59,22 @@ extension ConversationVC: info: ConfirmationModal.Info( title: "modal_call_permission_request_title".localized(), explanation: "modal_call_permission_request_explanation".localized(), - confirmTitle: "vc_settings_title".localized() - ) - ) { [weak self] _ in - self?.dismiss(animated: true) { - let navController: OWSNavigationController = OWSNavigationController( - rootViewController: SettingsTableViewController( - viewModel: PrivacySettingsViewModel(), - shouldShowCloseButton: true + confirmTitle: "vc_settings_title".localized(), + dismissOnConfirm: false // Custom dismissal logic + ) { [weak self] _ in + self?.dismiss(animated: true) { + let navController: OWSNavigationController = OWSNavigationController( + rootViewController: SettingsTableViewController( + viewModel: PrivacySettingsViewModel(), + shouldShowCloseButton: true + ) ) - ) - navController.modalPresentationStyle = .fullScreen - self?.present(navController, animated: true, completion: nil) + navController.modalPresentationStyle = .fullScreen + self?.present(navController, animated: true, completion: nil) + } } - } + ) + self.navigationController?.present(confirmationModal, animated: true, completion: nil) return } @@ -528,12 +530,21 @@ extension ConversationVC: } func showLinkPreviewSuggestionModal() { - let linkPreviewModel = LinkPreviewModal() { [weak self] in - self?.snInputView.autoGenerateLinkPreview() - } - linkPreviewModel.modalPresentationStyle = .overFullScreen - linkPreviewModel.modalTransitionStyle = .crossDissolve - present(linkPreviewModel, animated: true, completion: nil) + let linkPreviewModal: ConfirmationModal = ConfirmationModal( + info: ConfirmationModal.Info( + title: "modal_link_previews_title".localized(), + explanation: "modal_link_previews_explanation".localized(), + confirmTitle: "modal_link_previews_button_title".localized() + ) { [weak self] _ in + Storage.shared.writeAsync { db in + db[.areLinkPreviewsEnabled] = true + } + + self?.snInputView.autoGenerateLinkPreview() + } + ) + + present(linkPreviewModal, animated: true, completion: nil) } func inputTextViewDidChangeContent(_ inputTextView: InputTextView) { @@ -694,6 +705,9 @@ extension ConversationVC: ) else { return } + /// Lock the contentOffset of the tableView so the transition doesn't look buggy + self.tableView.lockContentOffset = true + UIImpactFeedbackGenerator(style: .heavy).impactOccurred() self.contextMenuWindow = ContextMenuWindow() self.contextMenuVC = ContextMenuVC( @@ -707,10 +721,21 @@ extension ConversationVC: self?.contextMenuWindow = nil self?.scrollButton.alpha = 0 - UIView.animate(withDuration: 0.25) { - self?.scrollButton.alpha = (self?.getScrollButtonOpacity() ?? 0) - self?.unreadCountView.alpha = (self?.scrollButton.alpha ?? 0) - } + UIView.animate( + withDuration: 0.25, + animations: { + self?.scrollButton.alpha = (self?.getScrollButtonOpacity() ?? 0) + self?.unreadCountView.alpha = (self?.scrollButton.alpha ?? 0) + }, + completion: { _ in + guard let contentOffset: CGPoint = self?.tableView.contentOffset else { return } + + // Unlock the contentOffset so everything will be in the right + // place when we return + self?.tableView.lockContentOffset = false + self?.tableView.setContentOffset(contentOffset, animated: false) + } + ) } self.contextMenuWindow?.backgroundColor = .clear @@ -1098,7 +1123,7 @@ extension ConversationVC: // Perform the sending logic Storage.shared.writeAsync( - updates: { [weak self] db in + updates: { db in guard let thread: SessionThread = try SessionThread.fetchOne(db, id: cellViewModel.threadId) else { return } diff --git a/Session/Conversations/Message Cells/CallMessageCell.swift b/Session/Conversations/Message Cells/CallMessageCell.swift index 36e0ced6e..8793db91a 100644 --- a/Session/Conversations/Message Cells/CallMessageCell.swift +++ b/Session/Conversations/Message Cells/CallMessageCell.swift @@ -19,8 +19,10 @@ final class CallMessageCell: MessageCell { private lazy var iconImageView: UIImageView = UIImageView() private lazy var infoImageView: UIImageView = { - let result: UIImageView = UIImageView(image: UIImage(named: "ic_info")?.withRenderingMode(.alwaysTemplate)) - result.tintColor = Colors.text + let result: UIImageView = UIImageView( + image: UIImage(named: "ic_info")?.withRenderingMode(.alwaysTemplate) + ) + result.themeTintColor = .textPrimary return result }() @@ -28,7 +30,7 @@ final class CallMessageCell: MessageCell { private lazy var timestampLabel: UILabel = { let result: UILabel = UILabel() result.font = .boldSystemFont(ofSize: Values.verySmallFontSize) - result.textColor = Colors.text + result.themeTextColor = .textPrimary result.textAlignment = .center return result @@ -36,20 +38,20 @@ final class CallMessageCell: MessageCell { private lazy var label: UILabel = { let result: UILabel = UILabel() - result.numberOfLines = 0 - result.lineBreakMode = .byWordWrapping result.font = .boldSystemFont(ofSize: Values.smallFontSize) - result.textColor = Colors.text + result.themeTextColor = .textPrimary result.textAlignment = .center + result.lineBreakMode = .byWordWrapping + result.numberOfLines = 0 return result }() private lazy var container: UIView = { let result: UIView = UIView() + result.themeBackgroundColor = .backgroundSecondary result.set(.height, to: 50) result.layer.cornerRadius = 18 - result.backgroundColor = Colors.callMessageBackground result.addSubview(label) label.autoCenterInSuperview() @@ -124,10 +126,10 @@ final class CallMessageCell: MessageCell { default: return nil } }() - iconImageView.tintColor = { + iconImageView.themeTintColor = { switch messageInfo.state { - case .outgoing, .incoming: return Colors.text - case .missed, .permissionDenied: return Colors.destructive + case .outgoing, .incoming: return .textPrimary + case .missed, .permissionDenied: return .danger default: return nil } }() diff --git a/Session/Conversations/Message Cells/Content Views/LinkPreviewView.swift b/Session/Conversations/Message Cells/Content Views/LinkPreviewView.swift index 330b9133e..6c0d22802 100644 --- a/Session/Conversations/Message Cells/Content Views/LinkPreviewView.swift +++ b/Session/Conversations/Message Cells/Content Views/LinkPreviewView.swift @@ -158,15 +158,11 @@ final class LinkPreviewView: UIView { imageViewContainerHeightConstraint.constant = imageViewContainerSize imageViewContainer.layer.cornerRadius = (state is LinkPreview.SentState ? 0 : 8) - if state is LinkPreview.LoadingState { - imageViewContainer.backgroundColor = .clear - } - else { - imageViewContainer.backgroundColor = isDarkMode ? .black : UIColor.black.withAlphaComponent(0.06) - } - imageView.image = image - imageView.themeTintColor = .textPrimary + imageView.themeTintColor = (isOutgoing ? + .messageBubble_outgoingText : + .messageBubble_incomingText + ) imageView.contentMode = (stateHasImage ? .scaleAspectFill : .center) // Loader @@ -175,16 +171,24 @@ final class LinkPreviewView: UIView { // Title titleLabel.text = state.title - titleLabel.themeTextColor = .textPrimary + titleLabel.themeTextColor = (isOutgoing ? + .messageBubble_outgoingText : + .messageBubble_incomingText + ) // Horizontal stack view switch state { + case is LinkPreview.LoadingState: + imageViewContainer.themeBackgroundColor = .clear + hStackViewContainer.themeBackgroundColor = nil + case is LinkPreview.SentState: - // FIXME: This will have issues with theme transitions - hStackViewContainer.backgroundColor = (isDarkMode ? .black : UIColor.black.withAlphaComponent(0.06)) + imageViewContainer.themeBackgroundColor = .messageBubble_overlay + hStackViewContainer.themeBackgroundColor = .messageBubble_overlay default: - hStackViewContainer.backgroundColor = nil + imageViewContainer.themeBackgroundColor = .messageBubble_overlay + hStackViewContainer.themeBackgroundColor = nil } // Body text view diff --git a/Session/Conversations/Message Cells/Content Views/OpenGroupInvitationView.swift b/Session/Conversations/Message Cells/Content Views/OpenGroupInvitationView.swift index 6a706e83b..eff19659c 100644 --- a/Session/Conversations/Message Cells/Content Views/OpenGroupInvitationView.swift +++ b/Session/Conversations/Message Cells/Content Views/OpenGroupInvitationView.swift @@ -71,11 +71,11 @@ final class OpenGroupInvitationView: UIView { .resizedImage(to: CGSize(width: iconSize, height: iconSize))? .withRenderingMode(.alwaysTemplate) ) - iconImageView.themeTintColor = .textPrimary + iconImageView.themeTintColor = (isOutgoing ? .messageBubble_outgoingText : .textPrimary) iconImageView.contentMode = .center iconImageView.layer.cornerRadius = iconImageViewSize / 2 iconImageView.layer.masksToBounds = true - iconImageView.themeBackgroundColor = .primary + iconImageView.themeBackgroundColor = (isOutgoing ? .messageBubble_overlay : .primary) iconImageView.set(.width, to: iconImageViewSize) iconImageView.set(.height, to: iconImageViewSize) diff --git a/Session/Conversations/Message Cells/Content Views/QuoteView.swift b/Session/Conversations/Message Cells/Content Views/QuoteView.swift index 56f6e4b01..09ab4ff1b 100644 --- a/Session/Conversations/Message Cells/Content Views/QuoteView.swift +++ b/Session/Conversations/Message Cells/Content Views/QuoteView.swift @@ -140,12 +140,15 @@ final class QuoteView: UIView { imageView.themeTintColor = { switch mode { - case .regular: return (direction == .outgoing ? .white : .messageBubble_outgoingText) + case .regular: return (direction == .outgoing ? + .messageBubble_outgoingText : + .messageBubble_incomingText + ) case .draft: return .messageBubble_outgoingText } }() imageView.contentMode = .center - imageView.themeBackgroundColor = lineColor + imageView.themeBackgroundColor = .messageBubble_overlay imageView.layer.cornerRadius = VisibleMessageCell.smallCornerRadius imageView.layer.masksToBounds = true imageView.set(.width, to: thumbnailSize) diff --git a/Session/Conversations/Message Cells/Content Views/VoiceMessageView.swift b/Session/Conversations/Message Cells/Content Views/VoiceMessageView.swift index 03468f17d..ccc41ff2a 100644 --- a/Session/Conversations/Message Cells/Content Views/VoiceMessageView.swift +++ b/Session/Conversations/Message Cells/Content Views/VoiceMessageView.swift @@ -16,14 +16,28 @@ public final class VoiceMessageView: UIView { private lazy var progressView: UIView = { let result: UIView = UIView() - result.backgroundColor = UIColor.black.withAlphaComponent(0.2) + result.themeBackgroundColor = .messageBubble_overlay + + return result + }() + + private lazy var toggleContainer: UIView = { + let result: UIView = UIView() + result.themeBackgroundColor = .backgroundSecondary + result.set(.width, to: VoiceMessageView.toggleContainerSize) + result.set(.height, to: VoiceMessageView.toggleContainerSize) + result.layer.masksToBounds = true + result.layer.cornerRadius = (VoiceMessageView.toggleContainerSize / 2) return result }() private lazy var toggleImageView: UIImageView = { - let result: UIImageView = UIImageView(image: UIImage(named: "Play")) + let result: UIImageView = UIImageView( + image: UIImage(named: "Play")?.withRenderingMode(.alwaysTemplate) + ) result.contentMode = .scaleAspectFit + result.themeTintColor = .textPrimary result.set(.width, to: 8) result.set(.height, to: 8) @@ -51,8 +65,8 @@ public final class VoiceMessageView: UIView { private lazy var countdownLabelContainer: UIView = { let result: UIView = UIView() - result.backgroundColor = .white - result.layer.masksToBounds = true + result.clipsToBounds = true + result.themeBackgroundColor = .backgroundSecondary result.set(.height, to: VoiceMessageView.toggleContainerSize) result.set(.width, to: 44) @@ -61,20 +75,20 @@ public final class VoiceMessageView: UIView { private lazy var countdownLabel: UILabel = { let result: UILabel = UILabel() - result.textColor = .black result.font = .systemFont(ofSize: Values.smallFontSize) result.text = "0:00" + result.themeTextColor = .textPrimary return result }() private lazy var speedUpLabel: UILabel = { let result: UILabel = UILabel() - result.textColor = .black result.font = .systemFont(ofSize: Values.smallFontSize) - result.alpha = 0 result.text = "1.5x" + result.themeTextColor = .textPrimary result.textAlignment = .center + result.alpha = 0 return result }() @@ -103,18 +117,12 @@ public final class VoiceMessageView: UIView { set(.width, to: VoiceMessageView.width) // Toggle - let toggleContainer: UIView = UIView() - toggleContainer.backgroundColor = .white - toggleContainer.set(.width, to: toggleContainerSize) - toggleContainer.set(.height, to: toggleContainerSize) toggleContainer.addSubview(toggleImageView) toggleImageView.center(in: toggleContainer) - toggleContainer.layer.cornerRadius = (toggleContainerSize / 2) - toggleContainer.layer.masksToBounds = true // Line let lineView = UIView() - lineView.backgroundColor = .white + lineView.themeBackgroundColor = .backgroundSecondary lineView.set(.height, to: 1) // Countdown label @@ -170,7 +178,8 @@ public final class VoiceMessageView: UIView { loader.isHidden = true loader.stopAnimating() - toggleImageView.image = (isPlaying ? UIImage(named: "Pause") : UIImage(named: "Play")) + toggleImageView.image = (isPlaying ? UIImage(named: "Pause") : UIImage(named: "Play"))? + .withRenderingMode(.alwaysTemplate) countdownLabel.text = OWSFormat.formatDurationSeconds(max(0, Int(floor(attachment.duration.defaulting(to: 0) - progress)))) guard let duration: TimeInterval = attachment.duration, duration > 0, progress > 0 else { diff --git a/Session/Conversations/Message Cells/InfoMessageCell.swift b/Session/Conversations/Message Cells/InfoMessageCell.swift index b7b56a079..3294b9056 100644 --- a/Session/Conversations/Message Cells/InfoMessageCell.swift +++ b/Session/Conversations/Message Cells/InfoMessageCell.swift @@ -17,11 +17,11 @@ final class InfoMessageCell: MessageCell { private lazy var label: UILabel = { let result: UILabel = UILabel() - result.numberOfLines = 0 - result.lineBreakMode = .byWordWrapping result.font = .boldSystemFont(ofSize: Values.verySmallFontSize) - result.textColor = Colors.text + result.themeTextColor = .textPrimary result.textAlignment = .center + result.lineBreakMode = .byWordWrapping + result.numberOfLines = 0 return result }() @@ -79,7 +79,7 @@ final class InfoMessageCell: MessageCell { if let icon = icon { iconImageView.image = icon.withRenderingMode(.alwaysTemplate) - iconImageView.tintColor = Colors.text + iconImageView.themeTintColor = .textPrimary } iconImageViewWidthConstraint.constant = (icon != nil) ? InfoMessageCell.iconSize : 0 diff --git a/Session/Conversations/Views & Modals/LinkPreviewModal.swift b/Session/Conversations/Views & Modals/LinkPreviewModal.swift deleted file mode 100644 index ec6da49ea..000000000 --- a/Session/Conversations/Views & Modals/LinkPreviewModal.swift +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. - -import UIKit -import GRDB -import SessionUIKit -import SessionMessagingKit - -final class LinkPreviewModal: Modal { - private let onLinkPreviewsEnabled: () -> Void - - // MARK: - Lifecycle - - init(onLinkPreviewsEnabled: @escaping () -> Void) { - self.onLinkPreviewsEnabled = onLinkPreviewsEnabled - super.init(nibName: nil, bundle: nil) - } - - required init?(coder: NSCoder) { - preconditionFailure("Use init(onLinkPreviewsEnabled:) instead.") - } - - override init(nibName: String?, bundle: Bundle?) { - preconditionFailure("Use init(onLinkPreviewsEnabled:) instead.") - } - - override func populateContentView() { - // Title - let titleLabel: UILabel = UILabel() - titleLabel.textColor = Colors.text - titleLabel.font = .boldSystemFont(ofSize: Values.mediumFontSize) - titleLabel.text = "modal_link_previews_title".localized() - titleLabel.textAlignment = .center - - // Message - let messageLabel: UILabel = UILabel() - messageLabel.textColor = Colors.text - messageLabel.font = .systemFont(ofSize: Values.smallFontSize) - messageLabel.text = "modal_link_previews_explanation".localized() - messageLabel.numberOfLines = 0 - messageLabel.lineBreakMode = .byWordWrapping - messageLabel.textAlignment = .center - - // Enable button - let enableButton: UIButton = UIButton() - enableButton.set(.height, to: Values.mediumButtonHeight) - enableButton.layer.cornerRadius = Modal.buttonCornerRadius - enableButton.backgroundColor = Colors.buttonBackground - enableButton.titleLabel!.font = .systemFont(ofSize: Values.smallFontSize) - enableButton.setTitleColor(Colors.text, for: UIControl.State.normal) - enableButton.setTitle(NSLocalizedString("modal_link_previews_button_title", comment: ""), for: UIControl.State.normal) - enableButton.addTarget(self, action: #selector(enable), for: UIControl.Event.touchUpInside) - - // Button stack view - let buttonStackView: UIStackView = UIStackView(arrangedSubviews: [ cancelButton, enableButton ]) - buttonStackView.axis = .horizontal - buttonStackView.spacing = Values.mediumSpacing - buttonStackView.distribution = .fillEqually - - // Content stack view - let contentStackView = UIStackView(arrangedSubviews: [ titleLabel, messageLabel ]) - contentStackView.axis = .vertical - contentStackView.spacing = Values.largeSpacing - - // Main stack view - let spacing = Values.largeSpacing - Values.smallFontSize / 2 - let mainStackView = UIStackView(arrangedSubviews: [ contentStackView, buttonStackView ]) - - mainStackView.axis = .vertical - mainStackView.spacing = spacing - contentView.addSubview(mainStackView) - mainStackView.pin(.leading, to: .leading, of: contentView, withInset: Values.largeSpacing) - mainStackView.pin(.top, to: .top, of: contentView, withInset: Values.largeSpacing) - contentView.pin(.trailing, to: .trailing, of: mainStackView, withInset: Values.largeSpacing) - contentView.pin(.bottom, to: .bottom, of: mainStackView, withInset: spacing) - } - - // MARK: - Interaction - - @objc private func enable() { - Storage.shared.writeAsync { db in - db[.areLinkPreviewsEnabled] = true - } - - presentingViewController?.dismiss(animated: true, completion: nil) - onLinkPreviewsEnabled() - } -} diff --git a/Session/Home/Message Requests/MessageRequestsViewController.swift b/Session/Home/Message Requests/MessageRequestsViewController.swift index 810bb3e17..48d15e2bd 100644 --- a/Session/Home/Message Requests/MessageRequestsViewController.swift +++ b/Session/Home/Message Requests/MessageRequestsViewController.swift @@ -59,9 +59,9 @@ class MessageRequestsViewController: BaseVC, UITableViewDelegate, UITableViewDat let result: UILabel = UILabel() result.translatesAutoresizingMaskIntoConstraints = false result.isUserInteractionEnabled = false - result.font = UIFont.systemFont(ofSize: Values.smallFontSize) - result.text = NSLocalizedString("MESSAGE_REQUESTS_EMPTY_TEXT", comment: "") - result.textColor = Colors.text + result.font = .systemFont(ofSize: Values.smallFontSize) + result.text = "MESSAGE_REQUESTS_EMPTY_TEXT".localized() + result.themeTextColor = .textSecondary result.textAlignment = .center result.numberOfLines = 0 result.isHidden = true diff --git a/Session/Home/NewConversationButtonSet.swift b/Session/Home/NewConversationButtonSet.swift index 5c5f18f5f..1283fb61e 100644 --- a/Session/Home/NewConversationButtonSet.swift +++ b/Session/Home/NewConversationButtonSet.swift @@ -11,11 +11,11 @@ final class NewConversationButtonSet : UIView { // MARK: - Settings private let spacing = Values.veryLargeSpacing - private let iconSize = CGFloat(24) - private let maxDragDistance = CGFloat(56) - private let dragMargin = CGFloat(16) - static let collapsedButtonSize = CGFloat(60) - static let expandedButtonSize = CGFloat(72) + private let iconSize: CGFloat = 24 + private let maxDragDistance: CGFloat = 56 + private let dragMargin: CGFloat = 16 + static let collapsedButtonSize: CGFloat = 60 + static let expandedButtonSize: CGFloat = 72 // MARK: - Components @@ -411,10 +411,6 @@ private final class NewConversationButton: UIImageView { heightConstraint = set(.height, to: NewConversationButtonSet.collapsedButtonSize) } } - - @objc private func handleAppModeChangedNotification(_ notification: Notification) { - setUpViewHierarchy(isUpdate: true) - } } // MARK: Convenience diff --git a/Session/Meta/Translations/de.lproj/Localizable.strings b/Session/Meta/Translations/de.lproj/Localizable.strings index 82682c427..df232776a 100644 --- a/Session/Meta/Translations/de.lproj/Localizable.strings +++ b/Session/Meta/Translations/de.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/en.lproj/Localizable.strings b/Session/Meta/Translations/en.lproj/Localizable.strings index f98719890..a653e5759 100644 --- a/Session/Meta/Translations/en.lproj/Localizable.strings +++ b/Session/Meta/Translations/en.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/es.lproj/Localizable.strings b/Session/Meta/Translations/es.lproj/Localizable.strings index 63ba8d002..ce2fe3cb9 100644 --- a/Session/Meta/Translations/es.lproj/Localizable.strings +++ b/Session/Meta/Translations/es.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/fa.lproj/Localizable.strings b/Session/Meta/Translations/fa.lproj/Localizable.strings index 3cdf7839d..9093213b1 100644 --- a/Session/Meta/Translations/fa.lproj/Localizable.strings +++ b/Session/Meta/Translations/fa.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/fi.lproj/Localizable.strings b/Session/Meta/Translations/fi.lproj/Localizable.strings index 0981de09d..d5dae2bbb 100644 --- a/Session/Meta/Translations/fi.lproj/Localizable.strings +++ b/Session/Meta/Translations/fi.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/fr.lproj/Localizable.strings b/Session/Meta/Translations/fr.lproj/Localizable.strings index 8548d55a1..f1bff7f16 100644 --- a/Session/Meta/Translations/fr.lproj/Localizable.strings +++ b/Session/Meta/Translations/fr.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/hi.lproj/Localizable.strings b/Session/Meta/Translations/hi.lproj/Localizable.strings index a0e33c8da..ace5e8aca 100644 --- a/Session/Meta/Translations/hi.lproj/Localizable.strings +++ b/Session/Meta/Translations/hi.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/hr.lproj/Localizable.strings b/Session/Meta/Translations/hr.lproj/Localizable.strings index 51d94a828..fd04f459d 100644 --- a/Session/Meta/Translations/hr.lproj/Localizable.strings +++ b/Session/Meta/Translations/hr.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/id-ID.lproj/Localizable.strings b/Session/Meta/Translations/id-ID.lproj/Localizable.strings index dce5e4ce1..2ebe122cd 100644 --- a/Session/Meta/Translations/id-ID.lproj/Localizable.strings +++ b/Session/Meta/Translations/id-ID.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/it.lproj/Localizable.strings b/Session/Meta/Translations/it.lproj/Localizable.strings index c2d69d79c..78487b8ea 100644 --- a/Session/Meta/Translations/it.lproj/Localizable.strings +++ b/Session/Meta/Translations/it.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/ja.lproj/Localizable.strings b/Session/Meta/Translations/ja.lproj/Localizable.strings index cd57cf0e8..0e80de4ad 100644 --- a/Session/Meta/Translations/ja.lproj/Localizable.strings +++ b/Session/Meta/Translations/ja.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/nl.lproj/Localizable.strings b/Session/Meta/Translations/nl.lproj/Localizable.strings index f2b2c2934..4610589de 100644 --- a/Session/Meta/Translations/nl.lproj/Localizable.strings +++ b/Session/Meta/Translations/nl.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/pl.lproj/Localizable.strings b/Session/Meta/Translations/pl.lproj/Localizable.strings index 761ed611b..d8725b5be 100644 --- a/Session/Meta/Translations/pl.lproj/Localizable.strings +++ b/Session/Meta/Translations/pl.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/pt_BR.lproj/Localizable.strings b/Session/Meta/Translations/pt_BR.lproj/Localizable.strings index 43ff27e71..177d5cd4e 100644 --- a/Session/Meta/Translations/pt_BR.lproj/Localizable.strings +++ b/Session/Meta/Translations/pt_BR.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/ru.lproj/Localizable.strings b/Session/Meta/Translations/ru.lproj/Localizable.strings index 2319faa9b..9e32da4e0 100644 --- a/Session/Meta/Translations/ru.lproj/Localizable.strings +++ b/Session/Meta/Translations/ru.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/si.lproj/Localizable.strings b/Session/Meta/Translations/si.lproj/Localizable.strings index 74ba28c5d..082d63c8a 100644 --- a/Session/Meta/Translations/si.lproj/Localizable.strings +++ b/Session/Meta/Translations/si.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/sk.lproj/Localizable.strings b/Session/Meta/Translations/sk.lproj/Localizable.strings index 48542b715..0d7895179 100644 --- a/Session/Meta/Translations/sk.lproj/Localizable.strings +++ b/Session/Meta/Translations/sk.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/sv.lproj/Localizable.strings b/Session/Meta/Translations/sv.lproj/Localizable.strings index 9b9a5d0bf..9490d63ba 100644 --- a/Session/Meta/Translations/sv.lproj/Localizable.strings +++ b/Session/Meta/Translations/sv.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/th.lproj/Localizable.strings b/Session/Meta/Translations/th.lproj/Localizable.strings index f2ef7fe84..022d1f10f 100644 --- a/Session/Meta/Translations/th.lproj/Localizable.strings +++ b/Session/Meta/Translations/th.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/vi-VN.lproj/Localizable.strings b/Session/Meta/Translations/vi-VN.lproj/Localizable.strings index 7c48d62ba..4499da07b 100644 --- a/Session/Meta/Translations/vi-VN.lproj/Localizable.strings +++ b/Session/Meta/Translations/vi-VN.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/zh-Hant.lproj/Localizable.strings b/Session/Meta/Translations/zh-Hant.lproj/Localizable.strings index 40eb20452..8dd828684 100644 --- a/Session/Meta/Translations/zh-Hant.lproj/Localizable.strings +++ b/Session/Meta/Translations/zh-Hant.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Meta/Translations/zh_CN.lproj/Localizable.strings b/Session/Meta/Translations/zh_CN.lproj/Localizable.strings index 1ed375c64..46b1ebe74 100644 --- a/Session/Meta/Translations/zh_CN.lproj/Localizable.strings +++ b/Session/Meta/Translations/zh_CN.lproj/Localizable.strings @@ -738,7 +738,12 @@ "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_TITLE" = "Blocked Contacts"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE" = "You have no blocked contacts."; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK" = "Unblock"; -"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE" = "Are you sure you want to unblock these contacts?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE" = "Are you sure you want to unblock %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK" = "this contact"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1" = "Are you sure you want to unblock %@"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE" = "and %@?"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_MULTIPLE" = "and %d"; +"CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3" = "and %d others?"; "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON" = "Unblock"; "APPEARANCE_TITLE" = "Appearance"; "APPEARANCE_THEMES_TITLE" = "Themes"; diff --git a/Session/Onboarding/RegisterVC.swift b/Session/Onboarding/RegisterVC.swift index ccebac5c2..024cb50aa 100644 --- a/Session/Onboarding/RegisterVC.swift +++ b/Session/Onboarding/RegisterVC.swift @@ -50,6 +50,7 @@ final class RegisterVC : BaseVC { // MARK: Lifecycle override func viewDidLoad() { super.viewDidLoad() + setUpNavBarSessionIcon() // Set up title label diff --git a/Session/Onboarding/RestoreVC.swift b/Session/Onboarding/RestoreVC.swift index 1df0eff35..144376784 100644 --- a/Session/Onboarding/RestoreVC.swift +++ b/Session/Onboarding/RestoreVC.swift @@ -47,6 +47,7 @@ final class RestoreVC: BaseVC { override func viewDidLoad() { super.viewDidLoad() + setUpNavBarSessionIcon() // Set up title label diff --git a/Session/Settings/BlockedContactsViewController.swift b/Session/Settings/BlockedContactsViewController.swift index 452a1e2bc..240f71ed0 100644 --- a/Session/Settings/BlockedContactsViewController.swift +++ b/Session/Settings/BlockedContactsViewController.swift @@ -59,9 +59,9 @@ class BlockedContactsViewController: BaseVC, UITableViewDelegate, UITableViewDat let result: UILabel = UILabel() result.translatesAutoresizingMaskIntoConstraints = false result.isUserInteractionEnabled = false - result.font = UIFont.systemFont(ofSize: Values.smallFontSize) - result.text = NSLocalizedString("CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE", comment: "") - result.textColor = Colors.text + result.font = .systemFont(ofSize: Values.smallFontSize) + result.text = "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_EMPTY_STATE".localized() + result.themeTextColor = .textSecondary result.textAlignment = .center result.numberOfLines = 0 result.isHidden = true @@ -188,9 +188,13 @@ class BlockedContactsViewController: BaseVC, UITableViewDelegate, UITableViewDat } // Show the empty state if there is no data + let hasContactsData: Bool = (updatedData + .first(where: { $0.model == .contacts })? + .elements + .isEmpty == false) unblockButton.isEnabled = !viewModel.selectedContactIds.isEmpty - unblockButton.isHidden = updatedData.isEmpty - emptyStateLabel.isHidden = !updatedData.isEmpty + unblockButton.isHidden = !hasContactsData + emptyStateLabel.isHidden = hasContactsData CATransaction.begin() CATransaction.setCompletionBlock { [weak self] in @@ -357,26 +361,79 @@ class BlockedContactsViewController: BaseVC, UITableViewDelegate, UITableViewDat guard !viewModel.selectedContactIds.isEmpty else { return } let contactIds: Set = viewModel.selectedContactIds + let contactNames: [String] = contactIds + .map { contactId in + guard + let section: BlockedContactsViewModel.SectionModel = self.viewModel.contactData + .first(where: { section in section.model == .contacts }), + let viewModel: BlockedContactsViewModel.DataModel = section.elements + .first(where: { model in model.id == contactId }) + else { return contactId } + + return viewModel.profile.displayName() + } + let confirmationTitle: String = { + guard contactNames.count > 1 else { + // Show a single users name + return String( + format: "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_SINGLE".localized(), + ( + contactNames.first ?? + "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_FALLBACK".localized() + ) + ) + } + guard contactNames.count > 3 else { + // Show up to three users names + let initialNames: [String] = Array(contactNames.prefix(upTo: (contactNames.count - 1))) + let lastName: String = contactNames[contactNames.count - 1] + + return [ + String( + format: "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1".localized(), + initialNames.joined(separator: ", ") + ), + String( + format: "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_2_SINGLE".localized(), + lastName + ), + ].joined(separator: " ") + } + + // If we have exactly 4 users, show the first two names followed by 'and X others', for + // more than 4 users, show the first 3 names followed by 'and X others' + let numNamesToShow: Int = (contactNames.count == 4 ? 2 : 3) + let initialNames: [String] = Array(contactNames.prefix(upTo: numNamesToShow)) + + return [ + String( + format: "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_1".localized(), + initialNames.joined(separator: ", ") + ), + String( + format: "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE_MULTIPLE_3".localized(), + (contactNames.count - numNamesToShow) + ), + ].joined(separator: " ") + }() let confirmationModal: ConfirmationModal = ConfirmationModal( info: ConfirmationModal.Info( - title: "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_TITLE".localized(), + title: confirmationTitle, confirmTitle: "CONVERSATION_SETTINGS_BLOCKED_CONTACTS_UNBLOCK_CONFIRMATION_ACTON".localized(), confirmStyle: .danger, cancelStyle: .textPrimary - ) - ) { [weak self] _ in - // Unblock the contacts - Storage.shared.write { db in - _ = try Contact - .filter(ids: contactIds) - .updateAll(db, Contact.Columns.isBlocked.set(to: false)) - - // Force a config sync - try MessageSender.syncConfiguration(db, forceSyncNow: true).retainUntilComplete() + ) { [weak self] _ in + // Unblock the contacts + Storage.shared.write { db in + _ = try Contact + .filter(ids: contactIds) + .updateAll(db, Contact.Columns.isBlocked.set(to: false)) + + // Force a config sync + try MessageSender.syncConfiguration(db, forceSyncNow: true).retainUntilComplete() + } } - - self?.dismiss(animated: true, completion: nil) - } + ) self.present(confirmationModal, animated: true, completion: nil) } } diff --git a/Session/Settings/NukeDataModal.swift b/Session/Settings/NukeDataModal.swift index 0f26d2f4f..323478aa6 100644 --- a/Session/Settings/NukeDataModal.swift +++ b/Session/Settings/NukeDataModal.swift @@ -125,11 +125,12 @@ final class NukeDataModal: Modal { explanation: "modal_clear_all_data_explanation_2".localized(), confirmTitle: "modal_clear_all_data_confirm".localized(), confirmStyle: .danger, - cancelStyle: .textPrimary - ) - ) { [weak self] confirmationModal in - self?.clearEntireAccount(presentedViewController: confirmationModal) - } + cancelStyle: .textPrimary, + dismissOnConfirm: false + ) { [weak self] confirmationModal in + self?.clearEntireAccount(presentedViewController: confirmationModal) + } + ) present(confirmationModal, animated: true, completion: nil) } diff --git a/Session/Settings/PrivacySettingsViewModel.swift b/Session/Settings/PrivacySettingsViewModel.swift index f9b8af3a4..2ca365702 100644 --- a/Session/Settings/PrivacySettingsViewModel.swift +++ b/Session/Settings/PrivacySettingsViewModel.swift @@ -145,7 +145,7 @@ class PrivacySettingsViewModel: SettingsTableViewModel ())? + let dismissOnConfirm: Bool + let onConfirm: ((UIViewController) -> ())? + + // MARK: - Initialization init( title: String, @@ -36,7 +39,8 @@ public class ConfirmationModal: Modal { confirmStyle: ThemeValue = .textPrimary, cancelTitle: String = "TXT_CANCEL_TITLE".localized(), cancelStyle: ThemeValue = .danger, - onConfirm: (() -> ())? = nil + dismissOnConfirm: Bool = true, + onConfirm: ((UIViewController) -> ())? = nil ) { self.title = title self.explanation = explanation @@ -45,9 +49,28 @@ public class ConfirmationModal: Modal { self.confirmStyle = confirmStyle self.cancelTitle = cancelTitle self.cancelStyle = cancelStyle + self.dismissOnConfirm = dismissOnConfirm self.onConfirm = onConfirm } + // MARK: - Mutation + + public func with(onConfirm: ((UIViewController) -> ())? = nil) -> Info { + return Info( + title: self.title, + explanation: self.explanation, + stateToShow: self.stateToShow, + confirmTitle: self.confirmTitle, + confirmStyle: self.confirmStyle, + cancelTitle: self.cancelTitle, + cancelStyle: self.cancelStyle, + dismissOnConfirm: self.dismissOnConfirm, + onConfirm: (onConfirm ?? self.onConfirm) + ) + } + + // MARK: - Confirmance + public static func == (lhs: ConfirmationModal.Info, rhs: ConfirmationModal.Info) -> Bool { return ( lhs.title == rhs.title && @@ -56,7 +79,8 @@ public class ConfirmationModal: Modal { lhs.confirmTitle == rhs.confirmTitle && lhs.confirmStyle == rhs.confirmStyle && lhs.cancelTitle == rhs.cancelTitle && - lhs.cancelStyle == rhs.cancelStyle + lhs.cancelStyle == rhs.cancelStyle && + lhs.dismissOnConfirm == rhs.dismissOnConfirm ) } @@ -68,10 +92,11 @@ public class ConfirmationModal: Modal { confirmStyle.hash(into: &hasher) cancelTitle.hash(into: &hasher) cancelStyle.hash(into: &hasher) + dismissOnConfirm.hash(into: &hasher) } } - private let onConfirm: (UIViewController) -> () + private let internalOnConfirm: (UIViewController) -> () // MARK: - Components @@ -140,10 +165,13 @@ public class ConfirmationModal: Modal { // MARK: - Lifecycle - init(info: Info, onConfirm: ((UIViewController) -> ())? = nil) { - self.onConfirm = { viewController in - onConfirm?(viewController) - info.onConfirm?() + init(info: Info) { + self.internalOnConfirm = { viewController in + info.onConfirm?(viewController) + + guard info.dismissOnConfirm else { return } + + viewController.dismiss(animated: true) } super.init(nibName: nil, bundle: nil) @@ -175,6 +203,6 @@ public class ConfirmationModal: Modal { // MARK: - Interaction @objc private func confirmationPressed() { - onConfirm(self) + internalOnConfirm(self) } } diff --git a/SessionUIKit/Components/OutlineButton.swift b/SessionUIKit/Components/OutlineButton.swift index e2b088c1d..698373e91 100644 --- a/SessionUIKit/Components/OutlineButton.swift +++ b/SessionUIKit/Components/OutlineButton.swift @@ -17,18 +17,60 @@ public final class OutlineButton: UIButton { case large } + private let style: Style + public override var isEnabled: Bool { didSet { - self.alpha = (isEnabled ? 1 : 0.5) + guard isEnabled else { + setThemeTitleColor( + { + switch style { + case .regular, .borderless, .destructive, + .destructiveBorderless: + return .disabled + + case .filled: return .white + } + }(), + for: .normal + ) + setThemeBackgroundColor( + { + switch style { + case .regular, .borderless, .destructive, + .destructiveBorderless: + return .clear + + case .filled: return .disabled + } + }(), + for: .normal + ) + setThemeBackgroundColor(nil, for: .highlighted) + + themeBorderColor = { + switch style { + case .regular, .destructive: return .disabled + case .filled, .borderless, .destructiveBorderless: return nil + } + }() + return + } + + // If we enable the button they just re-apply the existing style + setup(style: style) } } // MARK: - Initialization public init(style: Style, size: Size) { + self.style = style + super.init(frame: .zero) - setUpStyle(style: style, size: size) + setup(size: size) + setup(style: style) } override init(frame: CGRect) { @@ -38,8 +80,8 @@ public final class OutlineButton: UIButton { required init?(coder: NSCoder) { preconditionFailure("Use init(style:) instead.") } - - private func setUpStyle(style: Style, size: Size) { + + private func setup(size: Size) { clipsToBounds = true contentEdgeInsets = UIEdgeInsets( top: 0, @@ -51,6 +93,24 @@ public final class OutlineButton: UIButton { Values.smallFontSize : Values.mediumFontSize )) + + let height: CGFloat = { + switch size { + case .small: return Values.smallButtonHeight + case .medium: return Values.mediumButtonHeight + case .large: return Values.largeButtonHeight + } + }() + set(.height, to: height) + layer.cornerRadius = { + switch style { + case .borderless, .destructiveBorderless: return 5 + default: return (height / 2) + } + }() + } + + private func setup(style: Style) { setThemeTitleColor( { switch style { @@ -96,20 +156,5 @@ public final class OutlineButton: UIButton { case .filled, .borderless, .destructiveBorderless: return nil } }() - - let height: CGFloat = { - switch size { - case .small: return Values.smallButtonHeight - case .medium: return Values.mediumButtonHeight - case .large: return Values.largeButtonHeight - } - }() - set(.height, to: height) - layer.cornerRadius = { - switch style { - case .borderless, .destructiveBorderless: return 5 - default: return (height / 2) - } - }() } } diff --git a/SessionUIKit/Style Guide/Themes/Theme+ClassicDark.swift b/SessionUIKit/Style Guide/Themes/Theme+ClassicDark.swift index 35e8b2740..272943671 100644 --- a/SessionUIKit/Style Guide/Themes/Theme+ClassicDark.swift +++ b/SessionUIKit/Style Guide/Themes/Theme+ClassicDark.swift @@ -11,6 +11,7 @@ internal enum Theme_ClassicDark: ThemeColors { .primary: .primary, .defaultPrimary: Theme.PrimaryColor.green.color, .danger: .dangerDark, + .disabled: .disabledDark, .backgroundPrimary: .classicDark0, .backgroundSecondary: .classicDark1, .textPrimary: .classicDark6, @@ -32,6 +33,7 @@ internal enum Theme_ClassicDark: ThemeColors { .messageBubble_incomingBackground: .classicDark2, .messageBubble_outgoingText: .classicDark0, .messageBubble_incomingText: .classicDark6, + .messageBubble_overlay: .black_06, // MenuButton .menuButton_background: .primary, diff --git a/SessionUIKit/Style Guide/Themes/Theme+ClassicLight.swift b/SessionUIKit/Style Guide/Themes/Theme+ClassicLight.swift index cb7eddd46..26da2b614 100644 --- a/SessionUIKit/Style Guide/Themes/Theme+ClassicLight.swift +++ b/SessionUIKit/Style Guide/Themes/Theme+ClassicLight.swift @@ -11,6 +11,7 @@ internal enum Theme_ClassicLight: ThemeColors { .primary: .primary, .defaultPrimary: Theme.PrimaryColor.green.color, .danger: .dangerLight, + .disabled: .disabledLight, .backgroundPrimary: .classicLight6, .backgroundSecondary: .classicLight5, .textPrimary: .classicLight0, @@ -32,6 +33,7 @@ internal enum Theme_ClassicLight: ThemeColors { .messageBubble_incomingBackground: .classicLight4, .messageBubble_outgoingText: .classicLight0, .messageBubble_incomingText: .classicLight0, + .messageBubble_overlay: .black_06, // MenuButton .menuButton_background: .primary, diff --git a/SessionUIKit/Style Guide/Themes/Theme+Colors.swift b/SessionUIKit/Style Guide/Themes/Theme+Colors.swift index 0933ba76b..33b9ec3d1 100644 --- a/SessionUIKit/Style Guide/Themes/Theme+Colors.swift +++ b/SessionUIKit/Style Guide/Themes/Theme+Colors.swift @@ -43,6 +43,9 @@ public extension Theme { internal extension UIColor { static let dangerDark: UIColor = #colorLiteral(red: 1, green: 0.2274509804, blue: 0.2274509804, alpha: 1) // #FF3A3A static let dangerLight: UIColor = #colorLiteral(red: 0.8823529412, green: 0.1764705882, blue: 0.09803921569, alpha: 1) // #E12D19 + static let disabledDark: UIColor = #colorLiteral(red: 0.631372549, green: 0.6352941176, blue: 0.631372549, alpha: 1) // #A1A2A1 + static let disabledLight: UIColor = #colorLiteral(red: 0.4274509804, green: 0.4274509804, blue: 0.4274509804, alpha: 1) // #6D6D6D + static let black_06: UIColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.06) // #000000 static let pathConnected: UIColor = #colorLiteral(red: 0.1921568627, green: 0.9450980392, blue: 0.5882352941, alpha: 1) // #31F196 static let pathConnecting: UIColor = #colorLiteral(red: 0.9882352941, green: 0.6941176471, blue: 0.3490196078, alpha: 1) // #FCB159 diff --git a/SessionUIKit/Style Guide/Themes/Theme+OceanDark.swift b/SessionUIKit/Style Guide/Themes/Theme+OceanDark.swift index 28540d187..0580c252e 100644 --- a/SessionUIKit/Style Guide/Themes/Theme+OceanDark.swift +++ b/SessionUIKit/Style Guide/Themes/Theme+OceanDark.swift @@ -11,6 +11,7 @@ internal enum Theme_OceanDark: ThemeColors { .primary: .primary, .defaultPrimary: Theme.PrimaryColor.blue.color, .danger: .dangerDark, + .disabled: .disabledDark, .backgroundPrimary: .oceanDark2, .backgroundSecondary: .oceanDark1, .textPrimary: .oceanDark6, @@ -32,6 +33,7 @@ internal enum Theme_OceanDark: ThemeColors { .messageBubble_incomingBackground: .oceanDark4, .messageBubble_outgoingText: .oceanDark0, .messageBubble_incomingText: .oceanDark6, + .messageBubble_overlay: .black_06, // MenuButton .menuButton_background: .primary, diff --git a/SessionUIKit/Style Guide/Themes/Theme+OceanLight.swift b/SessionUIKit/Style Guide/Themes/Theme+OceanLight.swift index 40e2c8196..cb419c011 100644 --- a/SessionUIKit/Style Guide/Themes/Theme+OceanLight.swift +++ b/SessionUIKit/Style Guide/Themes/Theme+OceanLight.swift @@ -11,6 +11,7 @@ internal enum Theme_OceanLight: ThemeColors { .primary: .primary, .defaultPrimary: Theme.PrimaryColor.blue.color, .danger: .dangerLight, + .disabled: .disabledLight, .backgroundPrimary: .oceanLight6, .backgroundSecondary: .oceanLight5, .textPrimary: .oceanLight0, @@ -32,6 +33,7 @@ internal enum Theme_OceanLight: ThemeColors { .messageBubble_incomingBackground: .oceanLight3, .messageBubble_outgoingText: .oceanLight0, .messageBubble_incomingText: .oceanLight0, + .messageBubble_overlay: .black_06, // MenuButton .menuButton_background: .primary, diff --git a/SessionUIKit/Style Guide/Themes/Theme.swift b/SessionUIKit/Style Guide/Themes/Theme.swift index 92303b889..e1a3b21b8 100644 --- a/SessionUIKit/Style Guide/Themes/Theme.swift +++ b/SessionUIKit/Style Guide/Themes/Theme.swift @@ -62,6 +62,7 @@ public enum ThemeValue { case primary case defaultPrimary case danger + case disabled case backgroundPrimary case backgroundSecondary case textPrimary @@ -83,6 +84,7 @@ public enum ThemeValue { case messageBubble_incomingBackground case messageBubble_outgoingText case messageBubble_incomingText + case messageBubble_overlay // MenuButton case menuButton_background