Announcement-only groups.

This commit is contained in:
Matthew Chen 2021-07-12 16:22:15 -03:00
parent 6d1a7fd500
commit 262e856320
4 changed files with 77 additions and 53 deletions

View File

@ -611,20 +611,17 @@ extension ConversationSettingsViewController {
self?.showMemberRequestsAndInvitesView()
}))
if canEditConversationAccess {
let itemTitle = NSLocalizedString(
section.add(OWSTableItem.disclosureItem(
icon: .settingsPrivacy,
name: NSLocalizedString(
"CONVERSATION_SETTINGS_PERMISSIONS",
comment: "Label for 'permissions' action in conversation settings view."
)
section.add(OWSTableItem.disclosureItem(
icon: .settingsPrivacy,
name: itemTitle,
accessibilityIdentifier: "conversation_settings_permissions",
actionBlock: { [weak self] in
self?.showPermissionsSettingsView()
}
))
}
),
accessibilityIdentifier: "conversation_settings_permissions",
actionBlock: { [weak self] in
self?.showPermissionsSettingsView()
}
))
contents.addSection(section)
}

View File

@ -104,32 +104,32 @@ class ConversationSettingsViewController: OWSTableViewController2 {
// MARK: - Accessors
var isBlockedByMigration: Bool {
return groupViewHelper.isBlockedByMigration
groupViewHelper.isBlockedByMigration
}
var canEditConversationAttributes: Bool {
return groupViewHelper.canEditConversationAttributes
groupViewHelper.canEditConversationAttributes
}
var canEditConversationMembership: Bool {
return groupViewHelper.canEditConversationMembership
groupViewHelper.canEditConversationMembership
}
// Can local user edit group access.
var canEditConversationAccess: Bool {
return groupViewHelper.canEditConversationAccess
var canEditPermissions: Bool {
groupViewHelper.canEditPermissions
}
var isLocalUserFullMember: Bool {
return groupViewHelper.isLocalUserFullMember
groupViewHelper.isLocalUserFullMember
}
var isLocalUserFullOrInvitedMember: Bool {
return groupViewHelper.isLocalUserFullOrInvitedMember
groupViewHelper.isLocalUserFullOrInvitedMember
}
var isGroupThread: Bool {
return thread.isGroupThread
thread.isGroupThread
}
// MARK: - View Lifecycle

View File

@ -52,6 +52,10 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
self.groupViewHelper.delegate = self
// We only show the "announcement-only" UI if all members of the
// group support this capability. If some members don't, fetch their
// profiles; perhaps they have the capability and we just don't know
// it yet.
switch announcementOnlyMode {
case .enabled:
break
@ -108,9 +112,13 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
}
private var hasUnsavedChanges: Bool {
currentAccessMembers != accessMembers ||
guard groupViewHelper.canEditPermissions else {
return false
}
return (currentAccessMembers != accessMembers ||
currentAccessAttributes != accessAttributes ||
currentIsAnnouncementsOnly != isAnnouncementsOnly
currentIsAnnouncementsOnly != isAnnouncementsOnly)
}
// Don't allow interactive dismiss when there are unsaved changes.
@ -144,10 +152,6 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
let contents = OWSTableContents()
defer { self.contents = contents }
guard groupViewHelper.canEditConversationAccess else {
return owsFailDebug("!canEditConversationAccess")
}
let accessMembersSection = OWSTableSection()
accessMembersSection.headerTitle = NSLocalizedString(
"CONVERSATION_SETTINGS_EDIT_MEMBERSHIP_ACCESS",
@ -164,10 +168,7 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
comment: "Label for button that sets 'group attributes access' to 'members-only'."
),
actionBlock: { [weak self] in
guard let self = self else { return }
self.accessMembers = .member
self.updateTableContents()
self.updateNavigation()
self?.tryToSetAccessMembers(.member)
},
accessoryType: accessMembers == .member ? .checkmark : .none
))
@ -177,10 +178,7 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
comment: "Label for button that sets 'group attributes access' to 'administrators-only'."
),
actionBlock: { [weak self] in
guard let self = self else { return }
self.accessMembers = .administrator
self.updateTableContents()
self.updateNavigation()
self?.tryToSetAccessMembers(.administrator)
},
accessoryType: accessMembers == .administrator ? .checkmark : .none
))
@ -203,10 +201,7 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
comment: "Label for button that sets 'group attributes access' to 'members-only'."
),
actionBlock: { [weak self] in
guard let self = self else { return }
self.accessAttributes = .member
self.updateTableContents()
self.updateNavigation()
self?.tryToSetAccessAttributes(.member)
},
accessoryType: accessAttributes == .member ? .checkmark : .none
))
@ -216,17 +211,18 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
comment: "Label for button that sets 'group attributes access' to 'administrators-only'."
),
actionBlock: { [weak self] in
guard let self = self else { return }
self.accessAttributes = .administrator
self.updateTableContents()
self.updateNavigation()
self?.tryToSetAccessAttributes(.administrator)
},
accessoryType: accessAttributes == .administrator ? .checkmark : .none
))
contents.addSection(accessAttributesSection)
let canShowAnnouncementOnlyMode = announcementOnlyMode == .enabled
// Always show the announcements-only UI if that option is
// already enabled. If not, only show that UI if all group
// members support that capability.
let canShowAnnouncementOnlyMode = (announcementOnlyMode == .enabled ||
isAnnouncementsOnly)
if RemoteConfig.announcementOnlyGroups,
canShowAnnouncementOnlyMode {
let isAnnouncementsOnly = self.isAnnouncementsOnly
@ -247,10 +243,7 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
comment: "Label for button that sets 'send messages permission' for a group to 'all members'."
),
actionBlock: { [weak self] in
guard let self = self else { return }
self.isAnnouncementsOnly = false
self.updateTableContents()
self.updateNavigation()
self?.tryToSetIsAnnouncementsOnly(false)
},
accessoryType: !isAnnouncementsOnly ? .checkmark : .none
))
@ -260,10 +253,7 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
comment: "Label for button that sets 'send messages permission' for a group to 'administrators only'."
),
actionBlock: { [weak self] in
guard let self = self else { return }
self.isAnnouncementsOnly = true
self.updateTableContents()
self.updateNavigation()
self?.tryToSetIsAnnouncementsOnly(true)
},
accessoryType: isAnnouncementsOnly ? .checkmark : .none
))
@ -272,6 +262,43 @@ class GroupPermissionsSettingsViewController: OWSTableViewController2 {
}
}
private func tryToSetAccessMembers(_ value: GroupV2Access) {
guard groupViewHelper.canEditPermissions else {
showAdminOnlyWarningAlert()
return
}
self.accessMembers = value
self.updateTableContents()
self.updateNavigation()
}
private func tryToSetAccessAttributes(_ value: GroupV2Access) {
guard groupViewHelper.canEditPermissions else {
showAdminOnlyWarningAlert()
return
}
self.accessAttributes = value
self.updateTableContents()
self.updateNavigation()
}
private func tryToSetIsAnnouncementsOnly(_ value: Bool) {
guard groupViewHelper.canEditPermissions else {
showAdminOnlyWarningAlert()
return
}
isAnnouncementsOnly = value
updateTableContents()
updateNavigation()
}
private func showAdminOnlyWarningAlert() {
let message = NSLocalizedString("GROUP_ADMIN_ONLY_WARNING",
comment: "Message indicating that a feature can only be used by group admins.")
presentToast(text: message)
updateTableContents()
}
private func reloadThreadAndUpdateContent() {
let didUpdate = self.databaseStorage.read { transaction -> Bool in
guard let newThread = TSThread.anyFetch(

View File

@ -106,8 +106,8 @@ class GroupViewHelper: NSObject {
}
}
// Can local user edit group access.
var canEditConversationAccess: Bool {
// Can local user edit group access and message send permission.
var canEditPermissions: Bool {
guard let groupThread = thread as? TSGroupThread else {
return false
}