diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 5f2286c3a..357c7d269 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -168,8 +168,6 @@ 7BFD1A972747689000FB91B9 /* Session-Turn-Server in Resources */ = {isa = PBXBuildFile; fileRef = 7BFD1A962747689000FB91B9 /* Session-Turn-Server */; }; 9422EE2B2B8C3A97004C740D /* String+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9422EE2A2B8C3A97004C740D /* String+Utilities.swift */; }; 943C6D822B75E061004ACE64 /* Message+DisappearingMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943C6D812B75E061004ACE64 /* Message+DisappearingMessages.swift */; }; - 9593A1E796C9E6BE2352EA6F /* Pods_GlobalDependencies_FrameworkAndExtensionDependencies_SessionSnodeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8B0BA5257C58DC6FF797278 /* Pods_GlobalDependencies_FrameworkAndExtensionDependencies_SessionSnodeKit.framework */; }; - 99978E3F7A80275823CA9014 /* Pods_GlobalDependencies_FrameworkAndExtensionDependencies_SessionNotificationServiceExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29E827FDF6C1032BB985740C /* Pods_GlobalDependencies_FrameworkAndExtensionDependencies_SessionNotificationServiceExtension.framework */; }; A11CD70D17FA230600A2D1B1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A11CD70C17FA230600A2D1B1 /* QuartzCore.framework */; }; A163E8AB16F3F6AA0094D68B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A163E8AA16F3F6A90094D68B /* Security.framework */; }; A1C32D5017A06538000A904E /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1C32D4F17A06537000A904E /* AddressBookUI.framework */; }; @@ -1407,16 +1405,9 @@ 8987AF66FCCD593D38330F7F /* Pods_GlobalDependencies_FrameworkAndExtensionDependencies_ExtendedDependencies_SessionMessagingKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GlobalDependencies_FrameworkAndExtensionDependencies_ExtendedDependencies_SessionMessagingKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8F514E455DFEA2D1DE663AD0 /* Pods_GlobalDependencies_SessionUIKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GlobalDependencies_SessionUIKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8FF6E201CDC2C275F9AD4E5F /* Pods-GlobalDependencies-Session-SessionTests.app_store_release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GlobalDependencies-Session-SessionTests.app_store_release.xcconfig"; path = "Target Support Files/Pods-GlobalDependencies-Session-SessionTests/Pods-GlobalDependencies-Session-SessionTests.app_store_release.xcconfig"; sourceTree = ""; }; - 9D7B6CC77991D7A398580039 /* Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionNotificationServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionNotificationServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionNotificationServiceExtension/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionNotificationServiceExtension.debug.xcconfig"; sourceTree = ""; }; - 8448EFF76CD3CA5B2283B8A0 /* Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionUtilitiesKit-SessionUtilitiesKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionUtilitiesKit-SessionUtilitiesKitTests.debug.xcconfig"; path = "Target Support Files/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionUtilitiesKit-SessionUtilitiesKitTests/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionUtilitiesKit-SessionUtilitiesKitTests.debug.xcconfig"; sourceTree = ""; }; - 847091A12D82E41B1EBB8FB3 /* Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionSnodeKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionSnodeKit.debug.xcconfig"; path = "Target Support Files/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionSnodeKit/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionSnodeKit.debug.xcconfig"; sourceTree = ""; }; - 8603226ED1C6F61F1F2D3734 /* Pods-GlobalDependencies-Session.app store release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GlobalDependencies-Session.app store release.xcconfig"; path = "Target Support Files/Pods-GlobalDependencies-Session/Pods-GlobalDependencies-Session.app store release.xcconfig"; sourceTree = ""; }; - 8727C47348B6EFA767EE583A /* Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionMessagingKit-SessionMessagingKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionMessagingKit-SessionMessagingKitTests.debug.xcconfig"; path = "Target Support Files/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionMessagingKit-SessionMessagingKitTests/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionMessagingKit-SessionMessagingKitTests.debug.xcconfig"; sourceTree = ""; }; - 8E946CB54A221018E23599DE /* Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionUtilitiesKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionUtilitiesKit.debug.xcconfig"; path = "Target Support Files/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionUtilitiesKit/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-ExtendedDependencies-SessionUtilitiesKit.debug.xcconfig"; sourceTree = ""; }; - 92E8569C96285EE3CDB5960D /* Pods_GlobalDependencies_FrameworkAndExtensionDependencies_ExtendedDependencies_SignalUtilitiesKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GlobalDependencies_FrameworkAndExtensionDependencies_ExtendedDependencies_SignalUtilitiesKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 93359C81CF2660040B7CD106 /* Pods_GlobalDependencies_FrameworkAndExtensionDependencies_ExtendedDependencies_SessionUtilitiesKit_SessionUtilitiesKitTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GlobalDependencies_FrameworkAndExtensionDependencies_ExtendedDependencies_SessionUtilitiesKit_SessionUtilitiesKitTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9422EE2A2B8C3A97004C740D /* String+Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Utilities.swift"; sourceTree = ""; }; 943C6D812B75E061004ACE64 /* Message+DisappearingMessages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Message+DisappearingMessages.swift"; sourceTree = ""; }; + 9D7B6CC77991D7A398580039 /* Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionNotificationServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionNotificationServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionNotificationServiceExtension/Pods-GlobalDependencies-FrameworkAndExtensionDependencies-SessionNotificationServiceExtension.debug.xcconfig"; sourceTree = ""; }; A11CD70C17FA230600A2D1B1 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; A13597801E7E865C4B5C4188 /* Pods_GlobalDependencies_FrameworkAndExtensionDependencies_ExtendedDependencies_SessionUtilitiesKit_SessionUtilitiesKitTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GlobalDependencies_FrameworkAndExtensionDependencies_ExtendedDependencies_SessionUtilitiesKit_SessionUtilitiesKitTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A163E8AA16F3F6A90094D68B /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; diff --git a/Session/Closed Groups/EditGroupViewModel.swift b/Session/Closed Groups/EditGroupViewModel.swift index c5ea30d57..c199b94c4 100644 --- a/Session/Closed Groups/EditGroupViewModel.swift +++ b/Session/Closed Groups/EditGroupViewModel.swift @@ -12,6 +12,15 @@ import SessionUtilitiesKit import SignalUtilitiesKit class EditGroupViewModel: SessionTableViewModel, NavigatableStateHolder, EditableStateHolder, ObservableTableSource { + private static let minVersionBannerInfo: InfoBanner.Info = InfoBanner.Info( + font: .systemFont(ofSize: Values.verySmallFontSize), + message: "GROUP_MEMBERS_MIN_VERSION".localized(), + icon: .none, + tintColor: .black, + backgroundColor: .warning, + accessibility: Accessibility(identifier: "Version warning banner") + ) + public let dependencies: Dependencies public let navigatableState: NavigatableState = NavigatableState() public let editableState: EditableState = EditableState() @@ -94,6 +103,8 @@ class EditGroupViewModel: SessionTableViewModel, NavigatableStateHolder, Editabl let title: String = "EDIT_GROUP_ACTION".localized() + var bannerInfo: AnyPublisher { Just(EditGroupViewModel.minVersionBannerInfo).eraseToAnyPublisher() } + lazy var observation: TargetObservation = ObservationBuilder .databaseObservation(self) { [dependencies, threadId, userSessionId] db -> State in guard let group: ClosedGroup = try ClosedGroup.fetchOne(db, id: threadId) else { @@ -343,7 +354,7 @@ class EditGroupViewModel: SessionTableViewModel, NavigatableStateHolder, Editabl memberInfo.value.statusDescription, font: .subtitle, accessibility: Accessibility( - identifier: "Status" + identifier: "Contact status" ) )), trailingAccessory: { @@ -354,8 +365,12 @@ class EditGroupViewModel: SessionTableViewModel, NavigatableStateHolder, Editabl title: "context_menu_resend".localized(), isSelected: selectedIdsSubject.value.contains(memberInfo.profileId), labelAccessibility: Accessibility( - identifier: "Resend invite", - label: "Resend invite" + identifier: "Resend invite button", + label: "Resend invite button" + ), + radioAccessibility: Accessibility( + identifier: "Select contact", + label: "Select contact" ) ) @@ -738,6 +753,7 @@ class EditGroupViewModel: SessionTableViewModel, NavigatableStateHolder, Editabl SessionTableViewController( viewModel: UserListViewModel( title: "GROUP_ACTION_INVITE_CONTACTS".localized(), + infoBanner: EditGroupViewModel.minVersionBannerInfo, emptyState: "GROUP_ACTION_INVITE_EMPTY_STATE".localized(), showProfileIcons: true, request: SQLRequest(""" diff --git a/Session/Conversations/ConversationVC.swift b/Session/Conversations/ConversationVC.swift index 1635c7a29..5d7543dbf 100644 --- a/Session/Conversations/ConversationVC.swift +++ b/Session/Conversations/ConversationVC.swift @@ -289,7 +289,7 @@ final class ConversationVC: BaseVC, SessionUtilRespondingViewController, Convers let text: String = viewModel.threadData.emptyStateText let result: UILabel = UILabel() result.isAccessibilityElement = true - result.accessibilityIdentifier = "Empty conversation" + result.accessibilityIdentifier = "Control message" result.translatesAutoresizingMaskIntoConstraints = false result.font = .systemFont(ofSize: Values.verySmallFontSize) result.attributedText = NSAttributedString(string: text) @@ -420,6 +420,7 @@ final class ConversationVC: BaseVC, SessionUtilRespondingViewController, Convers private lazy var messageRequestBlockButton: UIButton = { let result: UIButton = UIButton() + result.accessibilityIdentifier = "Block" result.accessibilityLabel = "Block message request" result.translatesAutoresizingMaskIntoConstraints = false result.clipsToBounds = true diff --git a/Session/Conversations/Views & Modals/InfoBanner.swift b/Session/Conversations/Views & Modals/InfoBanner.swift index 6e642dfe1..c56050fb8 100644 --- a/Session/Conversations/Views & Modals/InfoBanner.swift +++ b/Session/Conversations/Views & Modals/InfoBanner.swift @@ -35,6 +35,30 @@ final class InfoBanner: UIView { let height: CGFloat? let onTap: (() -> Void)? + static var empty: Info = Info(font: .systemFont(ofSize: Values.smallFontSize), message: "") + + public init( + font: UIFont, + message: String, + icon: Icon = .none, + tintColor: ThemeValue = .black, + backgroundColor: ThemeValue = .primary, + accessibility: Accessibility? = nil, + labelAccessibility: Accessibility? = nil, + height: CGFloat? = nil, + onTap: (() -> Void)? = nil + ) { + self.font = font + self.message = message + self.icon = icon + self.tintColor = tintColor + self.backgroundColor = backgroundColor + self.accessibility = accessibility + self.labelAccessibility = labelAccessibility + self.height = height + self.onTap = onTap + } + func with( font: UIFont? = nil, message: String? = nil, @@ -94,8 +118,8 @@ final class InfoBanner: UIView { return result }() - private lazy var leftIconImageView: UIImageView = { - let result: UIImageView = UIImageView() + private lazy var leftIconPadding: UIView = { + let result: UIView = UIView() result.set(.width, to: 18) result.set(.height, to: 18) result.isHidden = true @@ -134,7 +158,7 @@ final class InfoBanner: UIView { addSubview(stackView) - stackView.addArrangedSubview(leftIconImageView) + stackView.addArrangedSubview(leftIconPadding) stackView.addArrangedSubview(label) stackView.addArrangedSubview(rightIconImageView) @@ -143,12 +167,7 @@ final class InfoBanner: UIView { stackView.pin(.leading, to: .leading, of: self, withInset: Values.mediumSpacing) stackView.pin(.trailing, to: .trailing, of: self, withInset: -Values.mediumSpacing) - switch info.height { - case .some(let fixedHeight): self.heightConstraint = self.set(.height, to: fixedHeight) - case .none: self.heightConstraint?.isActive = false - } - - self.update(info) + self.update(with: info) let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(bannerTapped)) self.addGestureRecognizer(tapGestureRecognizer) @@ -170,26 +189,6 @@ final class InfoBanner: UIView { // MARK: - Update - private func update(_ info: InfoBanner.Info) { - self.info = info - - themeBackgroundColor = info.backgroundColor - isAccessibilityElement = (info.accessibility != nil) - accessibilityIdentifier = info.accessibility?.identifier - accessibilityLabel = info.accessibility?.label - - label.font = info.font - label.text = info.message - label.themeTextColor = info.tintColor - label.accessibilityIdentifier = info.labelAccessibility?.identifier - label.accessibilityLabel = info.labelAccessibility?.label - leftIconImageView.image = info.icon.image - leftIconImageView.isHidden = (info.icon != .none) - leftIconImageView.themeTintColor = info.tintColor - rightIconImageView.isHidden = (info.icon != .none) - rightIconImageView.themeTintColor = info.tintColor - } - public func update( font: UIFont? = nil, message: String? = nil, @@ -204,7 +203,7 @@ final class InfoBanner: UIView { guard let currentInfo: Info = self.info else { return } self.update( - currentInfo.with( + with: currentInfo.with( font: font, message: message, icon: icon, @@ -217,4 +216,28 @@ final class InfoBanner: UIView { ) ) } + + public func update(with info: InfoBanner.Info) { + self.info = info + self.heightConstraint?.isActive = false // Calling 'set' below will enable it + + switch info.height { + case .some(let fixedHeight): self.heightConstraint = self.set(.height, to: fixedHeight) + case .none: break + } + + themeBackgroundColor = info.backgroundColor + isAccessibilityElement = (info.accessibility != nil) + accessibilityIdentifier = info.accessibility?.identifier + accessibilityLabel = info.accessibility?.label + + label.font = info.font + label.text = info.message + label.themeTextColor = info.tintColor + label.accessibilityIdentifier = info.labelAccessibility?.identifier + label.accessibilityLabel = info.labelAccessibility?.label + rightIconImageView.image = info.icon.image + rightIconImageView.isHidden = (info.icon == .none) + rightIconImageView.themeTintColor = info.tintColor + } } diff --git a/Session/Home/Message Requests/MessageRequestsViewModel.swift b/Session/Home/Message Requests/MessageRequestsViewModel.swift index 391ec6156..da35e588d 100644 --- a/Session/Home/Message Requests/MessageRequestsViewModel.swift +++ b/Session/Home/Message Requests/MessageRequestsViewModel.swift @@ -212,7 +212,7 @@ class MessageRequestsViewModel: SessionTableViewModel, NavigatableStateHolder, O ), confirmTitle: "MESSAGE_REQUESTS_CLEAR_ALL_CONFIRMATION_ACTON".localized(), confirmAccessibility: Accessibility( - identifier: "Clear all" + identifier: "Confirm clear" ), confirmStyle: .danger, cancelStyle: .alert_text, diff --git a/Session/Meta/Translations/ar.lproj/Localizable.strings b/Session/Meta/Translations/ar.lproj/Localizable.strings index d7a8aa7e5..72ea59556 100644 --- a/Session/Meta/Translations/ar.lproj/Localizable.strings +++ b/Session/Meta/Translations/ar.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/be.lproj/Localizable.strings b/Session/Meta/Translations/be.lproj/Localizable.strings index 1c6cb193d..00e33530a 100644 --- a/Session/Meta/Translations/be.lproj/Localizable.strings +++ b/Session/Meta/Translations/be.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/bg.lproj/Localizable.strings b/Session/Meta/Translations/bg.lproj/Localizable.strings index 6801378d8..067136627 100644 --- a/Session/Meta/Translations/bg.lproj/Localizable.strings +++ b/Session/Meta/Translations/bg.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/bn.lproj/Localizable.strings b/Session/Meta/Translations/bn.lproj/Localizable.strings index c431f6c40..96de60edd 100644 --- a/Session/Meta/Translations/bn.lproj/Localizable.strings +++ b/Session/Meta/Translations/bn.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/cs.lproj/Localizable.strings b/Session/Meta/Translations/cs.lproj/Localizable.strings index b8ad420a1..dd8a78aca 100644 --- a/Session/Meta/Translations/cs.lproj/Localizable.strings +++ b/Session/Meta/Translations/cs.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/da.lproj/Localizable.strings b/Session/Meta/Translations/da.lproj/Localizable.strings index 272339000..93d20e501 100644 --- a/Session/Meta/Translations/da.lproj/Localizable.strings +++ b/Session/Meta/Translations/da.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/de.lproj/Localizable.strings b/Session/Meta/Translations/de.lproj/Localizable.strings index c8809f7af..5b8950b3a 100644 --- a/Session/Meta/Translations/de.lproj/Localizable.strings +++ b/Session/Meta/Translations/de.lproj/Localizable.strings @@ -1054,3 +1054,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/el.lproj/Localizable.strings b/Session/Meta/Translations/el.lproj/Localizable.strings index 128eb2421..4ec1b86aa 100644 --- a/Session/Meta/Translations/el.lproj/Localizable.strings +++ b/Session/Meta/Translations/el.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/en.lproj/Localizable.strings b/Session/Meta/Translations/en.lproj/Localizable.strings index 21f0cd6d8..bd84450e9 100644 --- a/Session/Meta/Translations/en.lproj/Localizable.strings +++ b/Session/Meta/Translations/en.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/eo.lproj/Localizable.strings b/Session/Meta/Translations/eo.lproj/Localizable.strings index 8d3a4b5b8..0c6b0963a 100644 --- a/Session/Meta/Translations/eo.lproj/Localizable.strings +++ b/Session/Meta/Translations/eo.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/es-ES.lproj/Localizable.strings b/Session/Meta/Translations/es-ES.lproj/Localizable.strings index 046618473..a73fdb3b5 100644 --- a/Session/Meta/Translations/es-ES.lproj/Localizable.strings +++ b/Session/Meta/Translations/es-ES.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/fa.lproj/Localizable.strings b/Session/Meta/Translations/fa.lproj/Localizable.strings index febc6aa66..fdea1a0e8 100644 --- a/Session/Meta/Translations/fa.lproj/Localizable.strings +++ b/Session/Meta/Translations/fa.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/fi.lproj/Localizable.strings b/Session/Meta/Translations/fi.lproj/Localizable.strings index 89a85c3d2..8d2d8db74 100644 --- a/Session/Meta/Translations/fi.lproj/Localizable.strings +++ b/Session/Meta/Translations/fi.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/fil.lproj/Localizable.strings b/Session/Meta/Translations/fil.lproj/Localizable.strings index 213044334..3464dbe60 100644 --- a/Session/Meta/Translations/fil.lproj/Localizable.strings +++ b/Session/Meta/Translations/fil.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/fr.lproj/Localizable.strings b/Session/Meta/Translations/fr.lproj/Localizable.strings index e83fea11d..4e853e11a 100644 --- a/Session/Meta/Translations/fr.lproj/Localizable.strings +++ b/Session/Meta/Translations/fr.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/hi.lproj/Localizable.strings b/Session/Meta/Translations/hi.lproj/Localizable.strings index 132645b0c..acef6ad45 100644 --- a/Session/Meta/Translations/hi.lproj/Localizable.strings +++ b/Session/Meta/Translations/hi.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/hr.lproj/Localizable.strings b/Session/Meta/Translations/hr.lproj/Localizable.strings index 63c3e4943..1247e9d6a 100644 --- a/Session/Meta/Translations/hr.lproj/Localizable.strings +++ b/Session/Meta/Translations/hr.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/hu.lproj/Localizable.strings b/Session/Meta/Translations/hu.lproj/Localizable.strings index a42f810ac..e3eec7582 100644 --- a/Session/Meta/Translations/hu.lproj/Localizable.strings +++ b/Session/Meta/Translations/hu.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/id.lproj/Localizable.strings b/Session/Meta/Translations/id.lproj/Localizable.strings index 177515d2d..41d4464c1 100644 --- a/Session/Meta/Translations/id.lproj/Localizable.strings +++ b/Session/Meta/Translations/id.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/it.lproj/Localizable.strings b/Session/Meta/Translations/it.lproj/Localizable.strings index d814a9bb0..3618da93e 100644 --- a/Session/Meta/Translations/it.lproj/Localizable.strings +++ b/Session/Meta/Translations/it.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/ja.lproj/Localizable.strings b/Session/Meta/Translations/ja.lproj/Localizable.strings index c2e3c4e58..4ffb76f6b 100644 --- a/Session/Meta/Translations/ja.lproj/Localizable.strings +++ b/Session/Meta/Translations/ja.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/ko.lproj/Localizable.strings b/Session/Meta/Translations/ko.lproj/Localizable.strings index ab9ae5000..cf9f17963 100644 --- a/Session/Meta/Translations/ko.lproj/Localizable.strings +++ b/Session/Meta/Translations/ko.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/ku.lproj/Localizable.strings b/Session/Meta/Translations/ku.lproj/Localizable.strings index 3b0e0134d..5697603b8 100644 --- a/Session/Meta/Translations/ku.lproj/Localizable.strings +++ b/Session/Meta/Translations/ku.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/lt.lproj/Localizable.strings b/Session/Meta/Translations/lt.lproj/Localizable.strings index b7b7dc935..8cce51d8e 100644 --- a/Session/Meta/Translations/lt.lproj/Localizable.strings +++ b/Session/Meta/Translations/lt.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/lv.lproj/Localizable.strings b/Session/Meta/Translations/lv.lproj/Localizable.strings index 521e37fe0..ae569fc5e 100644 --- a/Session/Meta/Translations/lv.lproj/Localizable.strings +++ b/Session/Meta/Translations/lv.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/ne-NP.lproj/Localizable.strings b/Session/Meta/Translations/ne-NP.lproj/Localizable.strings index 7be9832b6..1eb6b7073 100644 --- a/Session/Meta/Translations/ne-NP.lproj/Localizable.strings +++ b/Session/Meta/Translations/ne-NP.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/nl.lproj/Localizable.strings b/Session/Meta/Translations/nl.lproj/Localizable.strings index b3db93a52..221eee0b7 100644 --- a/Session/Meta/Translations/nl.lproj/Localizable.strings +++ b/Session/Meta/Translations/nl.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/no.lproj/Localizable.strings b/Session/Meta/Translations/no.lproj/Localizable.strings index 481158d85..c92e668a3 100644 --- a/Session/Meta/Translations/no.lproj/Localizable.strings +++ b/Session/Meta/Translations/no.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/pl.lproj/Localizable.strings b/Session/Meta/Translations/pl.lproj/Localizable.strings index 7393ee1ff..97c306bc2 100644 --- a/Session/Meta/Translations/pl.lproj/Localizable.strings +++ b/Session/Meta/Translations/pl.lproj/Localizable.strings @@ -1054,3 +1054,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/pt-BR.lproj/Localizable.strings b/Session/Meta/Translations/pt-BR.lproj/Localizable.strings index 34bc31e82..7e21bf984 100644 --- a/Session/Meta/Translations/pt-BR.lproj/Localizable.strings +++ b/Session/Meta/Translations/pt-BR.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/pt-PT.lproj/Localizable.strings b/Session/Meta/Translations/pt-PT.lproj/Localizable.strings index 94ade7901..947b28d83 100644 --- a/Session/Meta/Translations/pt-PT.lproj/Localizable.strings +++ b/Session/Meta/Translations/pt-PT.lproj/Localizable.strings @@ -1059,3 +1059,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/ro.lproj/Localizable.strings b/Session/Meta/Translations/ro.lproj/Localizable.strings index d6172d5af..acfc498b1 100644 --- a/Session/Meta/Translations/ro.lproj/Localizable.strings +++ b/Session/Meta/Translations/ro.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/ru.lproj/Localizable.strings b/Session/Meta/Translations/ru.lproj/Localizable.strings index 5b4c20cec..090c5a550 100644 --- a/Session/Meta/Translations/ru.lproj/Localizable.strings +++ b/Session/Meta/Translations/ru.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/si-LK.lproj/Localizable.strings b/Session/Meta/Translations/si-LK.lproj/Localizable.strings index b783568cc..43f9dad93 100644 --- a/Session/Meta/Translations/si-LK.lproj/Localizable.strings +++ b/Session/Meta/Translations/si-LK.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/sk.lproj/Localizable.strings b/Session/Meta/Translations/sk.lproj/Localizable.strings index 90d70c07a..d054047d4 100644 --- a/Session/Meta/Translations/sk.lproj/Localizable.strings +++ b/Session/Meta/Translations/sk.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/sl.lproj/Localizable.strings b/Session/Meta/Translations/sl.lproj/Localizable.strings index 10bded509..f55f72275 100644 --- a/Session/Meta/Translations/sl.lproj/Localizable.strings +++ b/Session/Meta/Translations/sl.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/sv-SE.lproj/Localizable.strings b/Session/Meta/Translations/sv-SE.lproj/Localizable.strings index b06f0e169..42bda2dc8 100644 --- a/Session/Meta/Translations/sv-SE.lproj/Localizable.strings +++ b/Session/Meta/Translations/sv-SE.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/th.lproj/Localizable.strings b/Session/Meta/Translations/th.lproj/Localizable.strings index d6890be6b..c6c9d91ab 100644 --- a/Session/Meta/Translations/th.lproj/Localizable.strings +++ b/Session/Meta/Translations/th.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/tr.lproj/Localizable.strings b/Session/Meta/Translations/tr.lproj/Localizable.strings index 544172ca1..9d681c1d3 100644 --- a/Session/Meta/Translations/tr.lproj/Localizable.strings +++ b/Session/Meta/Translations/tr.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/uk.lproj/Localizable.strings b/Session/Meta/Translations/uk.lproj/Localizable.strings index 3f87d5cdc..dbaf87312 100644 --- a/Session/Meta/Translations/uk.lproj/Localizable.strings +++ b/Session/Meta/Translations/uk.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/vi.lproj/Localizable.strings b/Session/Meta/Translations/vi.lproj/Localizable.strings index 9e7d1b419..a7dc35ee8 100644 --- a/Session/Meta/Translations/vi.lproj/Localizable.strings +++ b/Session/Meta/Translations/vi.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/zh-CN.lproj/Localizable.strings b/Session/Meta/Translations/zh-CN.lproj/Localizable.strings index f4ed299b6..871e2feb6 100644 --- a/Session/Meta/Translations/zh-CN.lproj/Localizable.strings +++ b/Session/Meta/Translations/zh-CN.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Meta/Translations/zh-TW.lproj/Localizable.strings b/Session/Meta/Translations/zh-TW.lproj/Localizable.strings index c15c09f52..37981c4cb 100644 --- a/Session/Meta/Translations/zh-TW.lproj/Localizable.strings +++ b/Session/Meta/Translations/zh-TW.lproj/Localizable.strings @@ -1053,3 +1053,5 @@ The point that a message will disappear in a disappearing message update message /* A message indicating how the disappearing messages setting applies in a one-to-one conversation for legacy mode */ "DISAPPERING_MESSAGES_SUBTITLE_LEGACY" = "This setting applies to everyone in this conversation."; + +"GROUP_MEMBERS_MIN_VERSION" = "Users must have at least Session version {version} to see invites"; diff --git a/Session/Settings/SettingsViewModel.swift b/Session/Settings/SettingsViewModel.swift index f816f2faa..1b86d71a2 100644 --- a/Session/Settings/SettingsViewModel.swift +++ b/Session/Settings/SettingsViewModel.swift @@ -526,19 +526,19 @@ class SettingsViewModel: SessionTableViewModel, NavigationItemSource, Navigatabl icon: .rightPlus, style: .circular, accessibility: Accessibility( - identifier: "Upload image", - label: "Upload image" + identifier: "Upload", + label: "Upload" ), onClick: { [weak self] in self?.showPhotoLibraryForAvatar() } ), confirmTitle: "update_profile_modal_save".localized(), confirmAccessibility: Accessibility( - identifier: "Save" + identifier: "Save button" ), confirmEnabled: false, cancelTitle: "update_profile_modal_remove".localized(), cancelAccessibility: Accessibility( - identifier: "Remove" + identifier: "Remove button" ), cancelEnabled: (existingImageData != nil), hasCloseButton: true, diff --git a/Session/Shared/SessionTableViewController.swift b/Session/Shared/SessionTableViewController.swift index 64f683d88..5e24849e1 100644 --- a/Session/Shared/SessionTableViewController.swift +++ b/Session/Shared/SessionTableViewController.swift @@ -33,6 +33,25 @@ class SessionTableViewController: BaseVC, UITableViewDataSource, UITa private lazy var titleView: SessionTableViewTitleView = SessionTableViewTitleView() + private lazy var contentStackView: UIStackView = { + let result: UIStackView = UIStackView(arrangedSubviews: [ + infoBanner, + tableView + ]) + result.axis = .vertical + result.alignment = .fill + result.distribution = .fill + + return result + }() + + private lazy var infoBanner: InfoBanner = { + let result: InfoBanner = InfoBanner(info: .empty) + result.isHidden = true + + return result + }() + private lazy var tableView: UITableView = { let result: UITableView = UITableView() result.translatesAutoresizingMaskIntoConstraints = false @@ -132,7 +151,7 @@ class SessionTableViewController: BaseVC, UITableViewDataSource, UITa titleView.update(title: self.viewModel.title, subtitle: self.viewModel.subtitle) view.themeBackgroundColor = .backgroundPrimary - view.addSubview(tableView) + view.addSubview(contentStackView) view.addSubview(initialLoadLabel) view.addSubview(emptyStateLabel) view.addSubview(fadeView) @@ -186,7 +205,7 @@ class SessionTableViewController: BaseVC, UITableViewDataSource, UITa } private func setupLayout() { - tableView.pin(to: view) + contentStackView.pin(to: view) initialLoadLabel.pin(.top, to: .top, of: self.view, withInset: Values.massiveSpacing) initialLoadLabel.pin(.leading, to: .leading, of: self.view, withInset: Values.mediumSpacing) @@ -373,6 +392,19 @@ class SessionTableViewController: BaseVC, UITableViewDataSource, UITa } .store(in: &disposables) + viewModel.bannerInfo + .receive(on: DispatchQueue.main) + .sink { [weak self] info in + switch info { + case .some(let info): + self?.infoBanner.update(with: info) + self?.infoBanner.isHidden = false + + case .none: self?.infoBanner.isHidden = true + } + } + .store(in: &disposables) + viewModel.emptyStateTextPublisher .receive(on: DispatchQueue.main) .sink { [weak self] text in diff --git a/Session/Shared/SessionTableViewModel.swift b/Session/Shared/SessionTableViewModel.swift index 4273d5819..8a411a336 100644 --- a/Session/Shared/SessionTableViewModel.swift +++ b/Session/Shared/SessionTableViewModel.swift @@ -15,6 +15,7 @@ protocol SessionTableViewModel: AnyObject, SectionedTableData { var subtitle: String? { get } var initialLoadMessage: String? { get } var cellType: SessionTableViewCellType { get } + var bannerInfo: AnyPublisher { get } var emptyStateTextPublisher: AnyPublisher { get } var state: TableDataState { get } var footerView: AnyPublisher { get } @@ -31,6 +32,7 @@ extension SessionTableViewModel { var subtitle: String? { nil } var initialLoadMessage: String? { nil } var cellType: SessionTableViewCellType { .general } + var bannerInfo: AnyPublisher { Just(nil).eraseToAnyPublisher() } var emptyStateTextPublisher: AnyPublisher { Just(nil).eraseToAnyPublisher() } var tableData: [SectionModel] { state.tableData } var footerView: AnyPublisher { Just(nil).eraseToAnyPublisher() } diff --git a/Session/Shared/Types/SessionCell+Accessory.swift b/Session/Shared/Types/SessionCell+Accessory.swift index 25f67e40b..280637bc7 100644 --- a/Session/Shared/Types/SessionCell+Accessory.swift +++ b/Session/Shared/Types/SessionCell+Accessory.swift @@ -116,8 +116,8 @@ public extension SessionCell.Accessory { isSelected: Bool? = nil, liveIsSelected: (() -> Bool)? = nil, wasSavedSelection: Bool = false, - accessibility: Accessibility? = nil, - labelAccessibility: Accessibility? = nil + labelAccessibility: Accessibility? = nil, + radioAccessibility: Accessibility? = nil ) -> SessionCell.Accessory { return SessionCell.AccessoryConfig.HighlightingBackgroundLabelAndRadio( title: title, @@ -125,8 +125,8 @@ public extension SessionCell.Accessory { initialIsSelected: ((isSelected ?? liveIsSelected?()) ?? false), liveIsSelected: (liveIsSelected ?? { (isSelected ?? false) }), wasSavedSelection: wasSavedSelection, - accessibility: accessibility, - labelAccessibility: labelAccessibility + labelAccessibility: labelAccessibility, + radioAccessibility: radioAccessibility ) } @@ -494,8 +494,8 @@ public extension SessionCell.AccessoryConfig { initialIsSelected: Bool, liveIsSelected: @escaping () -> Bool, wasSavedSelection: Bool, - accessibility: Accessibility?, - labelAccessibility: Accessibility? + labelAccessibility: Accessibility?, + radioAccessibility: Accessibility? ) { self.title = title self.size = radioSize @@ -504,7 +504,7 @@ public extension SessionCell.AccessoryConfig { self.wasSavedSelection = wasSavedSelection self.labelAccessibility = labelAccessibility - super.init(accessibility: accessibility) + super.init(accessibility: radioAccessibility) } // MARK: - Conformance diff --git a/Session/Shared/UserListViewModel.swift b/Session/Shared/UserListViewModel.swift index 554d22b6c..ef63c07be 100644 --- a/Session/Shared/UserListViewModel.swift +++ b/Session/Shared/UserListViewModel.swift @@ -18,6 +18,7 @@ class UserListViewModel: SessionTableVie private let selectedUsersSubject: CurrentValueSubject>, Never> = CurrentValueSubject([]) public let title: String + public let infoBanner: InfoBanner.Info? public let emptyState: String? private let showProfileIcons: Bool private let request: (any FetchRequest) @@ -29,6 +30,7 @@ class UserListViewModel: SessionTableVie init( title: String, + infoBanner: InfoBanner.Info? = nil, emptyState: String? = nil, showProfileIcons: Bool, request: (any FetchRequest), @@ -39,6 +41,7 @@ class UserListViewModel: SessionTableVie ) { self.dependencies = dependencies self.title = title + self.infoBanner = infoBanner self.emptyState = emptyState self.showProfileIcons = showProfileIcons self.request = request @@ -79,6 +82,7 @@ class UserListViewModel: SessionTableVie } } + var bannerInfo: AnyPublisher { Just(infoBanner).eraseToAnyPublisher() } var emptyStateTextPublisher: AnyPublisher { Just(emptyState).eraseToAnyPublisher() } lazy var observation: TargetObservation = ObservationBuilder diff --git a/Session/Utilities/UIContextualAction+Utilities.swift b/Session/Utilities/UIContextualAction+Utilities.swift index 03c91d3ba..a6ef3511d 100644 --- a/Session/Utilities/UIContextualAction+Utilities.swift +++ b/Session/Utilities/UIContextualAction+Utilities.swift @@ -95,6 +95,7 @@ public extension UIContextualAction { ), themeTintColor: .white, themeBackgroundColor: .conversationButton_swipeRead, // Always Custom + accessibility: Accessibility(identifier: (isUnread ? "Mark Read button" : "Mark Unread button")), side: side, actionIndex: targetIndex, indexPath: indexPath, @@ -123,6 +124,7 @@ public extension UIContextualAction { icon: UIImage(systemName: "eye.slash"), themeTintColor: .white, themeBackgroundColor: themeBackgroundColor, + accessibility: Accessibility(identifier: "Hide button"), side: side, actionIndex: targetIndex, indexPath: indexPath, @@ -198,6 +200,9 @@ public extension UIContextualAction { ), themeTintColor: .white, themeBackgroundColor: .conversationButton_swipeTertiary, // Always Tertiary + accessibility: Accessibility( + identifier: (threadViewModel.threadPinnedPriority > 0 ? "Pin button" : "Unpin button") + ), side: side, actionIndex: targetIndex, indexPath: indexPath, @@ -239,6 +244,9 @@ public extension UIContextualAction { iconHeight: Values.mediumFontSize, themeTintColor: .white, themeBackgroundColor: themeBackgroundColor, + accessibility: Accessibility( + identifier: (threadViewModel.threadMutedUntilTimestamp == nil ? "Mute button" : "Unmute button") + ), side: side, actionIndex: targetIndex, indexPath: indexPath, @@ -286,6 +294,7 @@ public extension UIContextualAction { iconHeight: Values.mediumFontSize, themeTintColor: .white, themeBackgroundColor: themeBackgroundColor, + accessibility: Accessibility(identifier: "Block button"), side: side, actionIndex: targetIndex, indexPath: indexPath, @@ -403,7 +412,7 @@ public extension UIContextualAction { body: .text(bodyText), confirmTitle: "BLOCK_LIST_BLOCK_BUTTON".localized(), confirmAccessibility: Accessibility( - identifier: "Block" + identifier: "Confirm block" ), confirmStyle: .danger, cancelStyle: .alert_text, @@ -428,6 +437,7 @@ public extension UIContextualAction { iconHeight: Values.mediumFontSize, themeTintColor: .white, themeBackgroundColor: themeBackgroundColor, + accessibility: Accessibility(identifier: "Leave button"), side: side, actionIndex: targetIndex, indexPath: indexPath, @@ -502,6 +512,7 @@ public extension UIContextualAction { iconHeight: Values.mediumFontSize, themeTintColor: .white, themeBackgroundColor: themeBackgroundColor, + accessibility: Accessibility(identifier: "Delete button"), side: side, actionIndex: targetIndex, indexPath: indexPath, @@ -573,7 +584,7 @@ public extension UIContextualAction { body: .attributedText(confirmationModalExplanation), confirmTitle: "TXT_DELETE_TITLE".localized(), confirmAccessibility: Accessibility( - identifier: "Delete" + identifier: "Confirm delete" ), confirmStyle: .danger, cancelStyle: .alert_text, diff --git a/SessionUIKit/Components/ConfirmationModal.swift b/SessionUIKit/Components/ConfirmationModal.swift index 1c7d7453c..82a8aecda 100644 --- a/SessionUIKit/Components/ConfirmationModal.swift +++ b/SessionUIKit/Components/ConfirmationModal.swift @@ -457,7 +457,7 @@ public extension ConfirmationModal { confirmEnabled: Bool = true, cancelTitle: String = "TXT_CANCEL_TITLE".localized(), cancelAccessibility: Accessibility? = Accessibility( - identifier: "Cancel" + identifier: "Cancel button" ), cancelStyle: ThemeValue = .danger, cancelEnabled: Bool = true, diff --git a/SessionUIKit/Utilities/UIContextualAction+Theming.swift b/SessionUIKit/Utilities/UIContextualAction+Theming.swift index ab5bff7ee..f880ebe01 100644 --- a/SessionUIKit/Utilities/UIContextualAction+Theming.swift +++ b/SessionUIKit/Utilities/UIContextualAction+Theming.swift @@ -4,7 +4,12 @@ import UIKit import SessionUtilitiesKit public extension UIContextualAction { - private static var lookupMap: Atomic<[Int: [String: [Int: ThemeValue]]]> = Atomic([:]) + private static var lookupMap: Atomic<[Int: [String: [Int: ActionInfo]]]> = Atomic([:]) + + private struct ActionInfo { + let themeTintColor: ThemeValue + let accessibility: Accessibility? + } enum Side: Int { case leading @@ -30,6 +35,7 @@ public extension UIContextualAction { iconHeight: CGFloat = Values.mediumFontSize, themeTintColor: ThemeValue = .white, themeBackgroundColor: ThemeValue, + accessibility: Accessibility? = nil, side: Side, actionIndex: Int, indexPath: IndexPath, @@ -46,13 +52,20 @@ public extension UIContextualAction { )? .withRenderingMode(.alwaysTemplate) self.themeBackgroundColor = themeBackgroundColor + self.accessibilityLabel = accessibility?.label UIContextualAction.lookupMap.mutate { $0[tableView.hashValue] = ($0[tableView.hashValue] ?? [:]) .setting( side.key(for: indexPath), (($0[tableView.hashValue] ?? [:])[side.key(for: indexPath)] ?? [:]) - .setting(actionIndex, themeTintColor) + .setting( + actionIndex, + ActionInfo( + themeTintColor: themeTintColor, + accessibility: accessibility + ) + ) ) } } @@ -139,7 +152,7 @@ public extension UIContextualAction { .filter({ $0 != targetCell }) .first, let side: Side = Side(for: targetSuperview), - let themeMap: [Int: ThemeValue] = UIContextualAction.lookupMap.wrappedValue + let themeMap: [Int: ActionInfo] = UIContextualAction.lookupMap.wrappedValue .getting(tableView.hashValue)? .getting(side.key(for: indexPath)), targetSuperview.subviews.count == themeMap.count @@ -152,9 +165,10 @@ public extension UIContextualAction { // Set the imageView and background colours (so they change correctly when the theme changes) targetViews.enumerated().forEach { index, targetView in - guard let themeTintColor: ThemeValue = themeMap[index] else { return } + guard let actionInfo: ActionInfo = themeMap[index] else { return } - targetView.themeTintColor = themeTintColor + targetView.themeTintColor = actionInfo.themeTintColor + targetView.accessibilityIdentifier = actionInfo.accessibility?.identifier } }