implemented the ask to join restricted rule join UI, and added tests and previews for it.

This commit is contained in:
Mauro Romito
2025-12-03 17:16:10 +01:00
committed by Mauro
parent fe6b74d59a
commit d9d9606765
15 changed files with 296 additions and 42 deletions
@@ -74,6 +74,14 @@ struct SecurityAndPrivacyScreenViewState: BindableState {
isSpaceSettingsEnabled && selectableSpacesCount > 0
}
var isAskToJoinWithSpaceMembersOptionAvailable: Bool {
currentSettings.accessType.isAskToJoinWithSpaceUsers || isAskToJoinWithSpaceMembersOptionSelectable
}
var isAskToJoinWithSpaceMembersOptionSelectable: Bool {
isSpaceMembersOptionSelectable && isKnockingEnabled
}
var spaceMembersDescription: String {
if isSpaceMembersOptionSelectable {
switch spaceSelection {
@@ -89,10 +97,27 @@ struct SecurityAndPrivacyScreenViewState: BindableState {
}
}
var askToJoinWithSpaceMembersDescription: String {
if isAskToJoinWithSpaceMembersOptionSelectable {
switch spaceSelection {
case .singleJoined(let joinedParentSpace):
L10n.screenSecurityAndPrivacyAskToJoinSingleSpaceMembersOptionDescription(joinedParentSpace.name)
case .singleUnknown(let id):
L10n.screenSecurityAndPrivacyAskToJoinSingleSpaceMembersOptionDescription(id)
case .multiple, .empty:
L10n.screenSecurityAndPrivacyAskToJoinMultipleSpacesMembersOptionDescription
}
} else {
L10n.screenSecurityAndPrivacyRoomAccessSpaceMembersOptionUnavailableDescription
}
}
var accessSectionFooter: AttributedString? {
if bindings.desiredSettings.accessType.isSpaceUsers,
isSpaceMembersOptionSelectable,
case .multiple = spaceSelection {
if (bindings.desiredSettings.accessType.isSpaceUsers &&
isSpaceMembersOptionSelectable) ||
(bindings.desiredSettings.accessType.isAskToJoinWithSpaceUsers &&
isAskToJoinWithSpaceMembersOptionSelectable),
case .multiple = spaceSelection {
Self.accessSectionFooterAttributedString
} else {
nil
@@ -116,8 +141,8 @@ struct SecurityAndPrivacyScreenViewState: BindableState {
} else if selectableSpacesCount > 1 {
.multiple
} else if let joinedParent = joinedParentSpaces.first {
if case let .spaceUsers(ids) = currentSettings.accessType {
if ids.isEmpty {
if currentSettings.accessType.isSpaceUsers || currentSettings.accessType.isAskToJoinWithSpaceUsers {
if currentSettings.accessType.spaceIDs.isEmpty {
// Edge case where the access type is already space members, but it does not contain any id
// So if the user wants to add their own parent they need to do it from the selection menu
.multiple
@@ -185,6 +210,15 @@ enum SecurityAndPrivacyRoomAccessType: Equatable {
}
}
var isAskToJoinWithSpaceUsers: Bool {
switch self {
case .askToJoinWithSpaceUsers:
true
default:
false
}
}
var isAddressRequired: Bool {
switch self {
case .inviteOnly, .spaceUsers:
@@ -215,6 +249,7 @@ enum SecurityAndPrivacyScreenViewAction {
case tryUpdatingEncryption(Bool)
case editAddress
case selectedSpaceMembersAccess
case selectedAskToJoinWithSpaceMembersAccess
case manageSpaces
}