pr suggestions

This commit is contained in:
Mauro Romito
2025-12-04 15:50:43 +01:00
committed by Mauro
parent d9d9606765
commit 81ac54d23a
4 changed files with 38 additions and 38 deletions
@@ -67,7 +67,7 @@ struct SecurityAndPrivacyScreenViewState: BindableState {
} }
var isSpaceMembersOptionAvailable: Bool { var isSpaceMembersOptionAvailable: Bool {
currentSettings.accessType.isSpaceUsers || isSpaceMembersOptionSelectable currentSettings.accessType.isSpaceMembers || isSpaceMembersOptionSelectable
} }
var isSpaceMembersOptionSelectable: Bool { var isSpaceMembersOptionSelectable: Bool {
@@ -75,7 +75,7 @@ struct SecurityAndPrivacyScreenViewState: BindableState {
} }
var isAskToJoinWithSpaceMembersOptionAvailable: Bool { var isAskToJoinWithSpaceMembersOptionAvailable: Bool {
currentSettings.accessType.isAskToJoinWithSpaceUsers || isAskToJoinWithSpaceMembersOptionSelectable currentSettings.accessType.isAskToJoinWithSpaceMembers || isAskToJoinWithSpaceMembersOptionSelectable
} }
var isAskToJoinWithSpaceMembersOptionSelectable: Bool { var isAskToJoinWithSpaceMembersOptionSelectable: Bool {
@@ -113,9 +113,9 @@ struct SecurityAndPrivacyScreenViewState: BindableState {
} }
var accessSectionFooter: AttributedString? { var accessSectionFooter: AttributedString? {
if (bindings.desiredSettings.accessType.isSpaceUsers && if (bindings.desiredSettings.accessType.isSpaceMembers &&
isSpaceMembersOptionSelectable) || isSpaceMembersOptionSelectable) ||
(bindings.desiredSettings.accessType.isAskToJoinWithSpaceUsers && (bindings.desiredSettings.accessType.isAskToJoinWithSpaceMembers &&
isAskToJoinWithSpaceMembersOptionSelectable), isAskToJoinWithSpaceMembersOptionSelectable),
case .multiple = spaceSelection { case .multiple = spaceSelection {
Self.accessSectionFooterAttributedString Self.accessSectionFooterAttributedString
@@ -141,7 +141,7 @@ struct SecurityAndPrivacyScreenViewState: BindableState {
} else if selectableSpacesCount > 1 { } else if selectableSpacesCount > 1 {
.multiple .multiple
} else if let joinedParent = joinedParentSpaces.first { } else if let joinedParent = joinedParentSpaces.first {
if currentSettings.accessType.isSpaceUsers || currentSettings.accessType.isAskToJoinWithSpaceUsers { if currentSettings.accessType.isSpaceMembers || currentSettings.accessType.isAskToJoinWithSpaceMembers {
if currentSettings.accessType.spaceIDs.isEmpty { if currentSettings.accessType.spaceIDs.isEmpty {
// Edge case where the access type is already space members, but it does not contain any id // 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 // So if the user wants to add their own parent they need to do it from the selection menu
@@ -197,22 +197,22 @@ struct SecurityAndPrivacySettings: Equatable {
enum SecurityAndPrivacyRoomAccessType: Equatable { enum SecurityAndPrivacyRoomAccessType: Equatable {
case inviteOnly case inviteOnly
case askToJoin case askToJoin
case askToJoinWithSpaceUsers(spaceIDs: [String]) case askToJoinWithSpaceMembers(spaceIDs: [String])
case anyone case anyone
case spaceUsers(spaceIDs: [String]) case spaceMembers(spaceIDs: [String])
var isSpaceUsers: Bool { var isSpaceMembers: Bool {
switch self { switch self {
case .spaceUsers: case .spaceMembers:
true true
default: default:
false false
} }
} }
var isAskToJoinWithSpaceUsers: Bool { var isAskToJoinWithSpaceMembers: Bool {
switch self { switch self {
case .askToJoinWithSpaceUsers: case .askToJoinWithSpaceMembers:
true true
default: default:
false false
@@ -221,16 +221,16 @@ enum SecurityAndPrivacyRoomAccessType: Equatable {
var isAddressRequired: Bool { var isAddressRequired: Bool {
switch self { switch self {
case .inviteOnly, .spaceUsers: case .inviteOnly, .spaceMembers:
false false
case .anyone, .askToJoin, .askToJoinWithSpaceUsers: case .anyone, .askToJoin, .askToJoinWithSpaceMembers:
true true
} }
} }
var spaceIDs: [String] { var spaceIDs: [String] {
switch self { switch self {
case .spaceUsers(let spaceIDs), .askToJoinWithSpaceUsers(let spaceIDs): case .spaceMembers(let spaceIDs), .askToJoinWithSpaceMembers(let spaceIDs):
return spaceIDs return spaceIDs
case .inviteOnly, .askToJoin, .anyone: case .inviteOnly, .askToJoin, .anyone:
return [] return []
@@ -81,7 +81,7 @@ class SecurityAndPrivacyScreenViewModel: SecurityAndPrivacyScreenViewModelType,
case .selectedSpaceMembersAccess: case .selectedSpaceMembersAccess:
handleSelectedSpaceMembersAccess() handleSelectedSpaceMembersAccess()
case .manageSpaces: case .manageSpaces:
displayManageAuthorizedSpacesScreen(isAskToJoin: state.bindings.desiredSettings.accessType.isAskToJoinWithSpaceUsers) displayManageAuthorizedSpacesScreen(isAskToJoin: state.bindings.desiredSettings.accessType.isAskToJoinWithSpaceMembers)
case .selectedAskToJoinWithSpaceMembersAccess: case .selectedAskToJoinWithSpaceMembersAccess:
handleSelectedAskToJoinWithSpaceMembersAccess() handleSelectedAskToJoinWithSpaceMembersAccess()
} }
@@ -237,16 +237,16 @@ class SecurityAndPrivacyScreenViewModel: SecurityAndPrivacyScreenViewModelType,
} }
private func handleSelectedSpaceMembersAccess() { private func handleSelectedSpaceMembersAccess() {
guard !state.bindings.desiredSettings.accessType.isSpaceUsers else { guard !state.bindings.desiredSettings.accessType.isSpaceMembers else {
// If the user is tapping the space members access again we do nothing // If the user is tapping the space members access again we do nothing
return return
} }
switch state.spaceSelection { switch state.spaceSelection {
case .singleJoined(let joinedParent): case .singleJoined(let joinedParent):
state.bindings.desiredSettings.accessType = .spaceUsers(spaceIDs: [joinedParent.id]) state.bindings.desiredSettings.accessType = .spaceMembers(spaceIDs: [joinedParent.id])
case .singleUnknown(let id): case .singleUnknown(let id):
state.bindings.desiredSettings.accessType = .spaceUsers(spaceIDs: [id]) state.bindings.desiredSettings.accessType = .spaceMembers(spaceIDs: [id])
case .empty: case .empty:
break // Very edge case. We do nothing in this case. break // Very edge case. We do nothing in this case.
case .multiple: case .multiple:
@@ -255,16 +255,16 @@ class SecurityAndPrivacyScreenViewModel: SecurityAndPrivacyScreenViewModelType,
} }
private func handleSelectedAskToJoinWithSpaceMembersAccess() { private func handleSelectedAskToJoinWithSpaceMembersAccess() {
guard !state.bindings.desiredSettings.accessType.isAskToJoinWithSpaceUsers else { guard !state.bindings.desiredSettings.accessType.isAskToJoinWithSpaceMembers else {
// If the user is tapping the ask to join with space members access again we do nothing // If the user is tapping the ask to join with space members access again we do nothing
return return
} }
switch state.spaceSelection { switch state.spaceSelection {
case .singleJoined(let joinedParent): case .singleJoined(let joinedParent):
state.bindings.desiredSettings.accessType = .askToJoinWithSpaceUsers(spaceIDs: [joinedParent.id]) state.bindings.desiredSettings.accessType = .askToJoinWithSpaceMembers(spaceIDs: [joinedParent.id])
case .singleUnknown(let id): case .singleUnknown(let id):
state.bindings.desiredSettings.accessType = .askToJoinWithSpaceUsers(spaceIDs: [id]) state.bindings.desiredSettings.accessType = .askToJoinWithSpaceMembers(spaceIDs: [id])
case .empty: case .empty:
break // Very edge case. We do nothing in this case. break // Very edge case. We do nothing in this case.
case .multiple: case .multiple:
@@ -284,7 +284,7 @@ class SecurityAndPrivacyScreenViewModel: SecurityAndPrivacyScreenViewModelType,
authorizedSpacesSelection.selectedIDs authorizedSpacesSelection.selectedIDs
.sink { [weak self] desiredSelectedIDs in .sink { [weak self] desiredSelectedIDs in
let sortedIDs = desiredSelectedIDs.sorted() let sortedIDs = desiredSelectedIDs.sorted()
self?.state.bindings.desiredSettings.accessType = isAskToJoin ? .askToJoinWithSpaceUsers(spaceIDs: sortedIDs) : .spaceUsers(spaceIDs: sortedIDs) self?.state.bindings.desiredSettings.accessType = isAskToJoin ? .askToJoinWithSpaceMembers(spaceIDs: sortedIDs) : .spaceMembers(spaceIDs: sortedIDs)
} }
.store(in: &cancellables) .store(in: &cancellables)
@@ -314,9 +314,9 @@ private extension SecurityAndPrivacyRoomAccessType {
.knock .knock
case .anyone: case .anyone:
.public .public
case .spaceUsers(let spaceIDs): case .spaceMembers(let spaceIDs):
.restricted(rules: spaceIDs.map { .roomMembership(roomId: $0) }) .restricted(rules: spaceIDs.map { .roomMembership(roomId: $0) })
case .askToJoinWithSpaceUsers(let spaceIDs): case .askToJoinWithSpaceMembers(let spaceIDs):
.knockRestricted(rules: spaceIDs.map { .roomMembership(roomId: $0) }) .knockRestricted(rules: spaceIDs.map { .roomMembership(roomId: $0) })
} }
} }
@@ -358,9 +358,9 @@ private extension Optional where Wrapped == JoinRule {
case .knock: case .knock:
return .askToJoin return .askToJoin
case .knockRestricted(let rules): case .knockRestricted(let rules):
return .askToJoinWithSpaceUsers(spaceIDs: Self.spaceIDs(from: rules)) return .askToJoinWithSpaceMembers(spaceIDs: Self.spaceIDs(from: rules))
case .restricted(let rules): case .restricted(let rules):
return .spaceUsers(spaceIDs: Self.spaceIDs(from: rules)) return .spaceMembers(spaceIDs: Self.spaceIDs(from: rules))
default: default:
return .inviteOnly return .inviteOnly
} }
@@ -55,7 +55,7 @@ struct SecurityAndPrivacyScreen: View {
ListRow(label: .default(title: L10n.screenSecurityAndPrivacyRoomAccessSpaceMembersOptionTitle, ListRow(label: .default(title: L10n.screenSecurityAndPrivacyRoomAccessSpaceMembersOptionTitle,
description: context.viewState.spaceMembersDescription, description: context.viewState.spaceMembersDescription,
icon: \.space), icon: \.space),
kind: .selection(isSelected: context.desiredSettings.accessType.isSpaceUsers) { kind: .selection(isSelected: context.desiredSettings.accessType.isSpaceMembers) {
context.send(viewAction: .selectedSpaceMembersAccess) context.send(viewAction: .selectedSpaceMembersAccess)
}) })
.disabled(!context.viewState.isSpaceMembersOptionSelectable) .disabled(!context.viewState.isSpaceMembersOptionSelectable)
@@ -103,7 +103,7 @@ struct SecurityAndPrivacyScreen: View {
ListRow(label: .default(title: L10n.screenSecurityAndPrivacyAskToJoinOptionTitle, ListRow(label: .default(title: L10n.screenSecurityAndPrivacyAskToJoinOptionTitle,
description: context.viewState.askToJoinWithSpaceMembersDescription, description: context.viewState.askToJoinWithSpaceMembersDescription,
icon: \.userAdd), icon: \.userAdd),
kind: .selection(isSelected: context.desiredSettings.accessType.isAskToJoinWithSpaceUsers) { context.send(viewAction: .selectedAskToJoinWithSpaceMembersAccess) }) kind: .selection(isSelected: context.desiredSettings.accessType.isAskToJoinWithSpaceMembers) { context.send(viewAction: .selectedAskToJoinWithSpaceMembersAccess) })
.disabled(!context.viewState.isAskToJoinWithSpaceMembersOptionSelectable) .disabled(!context.viewState.isAskToJoinWithSpaceMembersOptionSelectable)
} }
@@ -44,7 +44,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
} }
context.send(viewAction: .selectedSpaceMembersAccess) context.send(viewAction: .selectedSpaceMembersAccess)
XCTAssertEqual(context.desiredSettings.accessType, .spaceUsers(spaceIDs: [space.id])) XCTAssertEqual(context.desiredSettings.accessType, .spaceMembers(spaceIDs: [space.id]))
XCTAssertNil(context.viewState.accessSectionFooter) XCTAssertNil(context.viewState.accessSectionFooter)
XCTAssertFalse(context.viewState.isSaveDisabled) XCTAssertFalse(context.viewState.isSaveDisabled)
@@ -75,7 +75,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
} }
context.send(viewAction: .selectedAskToJoinWithSpaceMembersAccess) context.send(viewAction: .selectedAskToJoinWithSpaceMembersAccess)
XCTAssertEqual(context.desiredSettings.accessType, .askToJoinWithSpaceUsers(spaceIDs: [space.id])) XCTAssertEqual(context.desiredSettings.accessType, .askToJoinWithSpaceMembers(spaceIDs: [space.id]))
XCTAssertNil(context.viewState.accessSectionFooter) XCTAssertNil(context.viewState.accessSectionFooter)
XCTAssertFalse(context.viewState.isSaveDisabled) XCTAssertFalse(context.viewState.isSaveDisabled)
@@ -97,7 +97,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
let deferred = deferFulfillment(context.$viewState) { $0.joinedParentSpaces.count == 0 } let deferred = deferFulfillment(context.$viewState) { $0.joinedParentSpaces.count == 0 }
try await deferred.fulfill() try await deferred.fulfill()
XCTAssertEqual(context.viewState.currentSettings.accessType, .spaceUsers(spaceIDs: [space.id])) XCTAssertEqual(context.viewState.currentSettings.accessType, .spaceMembers(spaceIDs: [space.id]))
XCTAssertEqual(context.desiredSettings, context.viewState.currentSettings) XCTAssertEqual(context.desiredSettings, context.viewState.currentSettings)
XCTAssertTrue(context.viewState.isSpaceMembersOptionSelectable) XCTAssertTrue(context.viewState.isSpaceMembersOptionSelectable)
XCTAssertNil(context.viewState.accessSectionFooter) XCTAssertNil(context.viewState.accessSectionFooter)
@@ -113,7 +113,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
context.send(viewAction: .selectedSpaceMembersAccess) context.send(viewAction: .selectedSpaceMembersAccess)
XCTAssertTrue(context.viewState.isSaveDisabled) XCTAssertTrue(context.viewState.isSaveDisabled)
XCTAssertEqual(context.desiredSettings.accessType, .spaceUsers(spaceIDs: [space.id])) XCTAssertEqual(context.desiredSettings.accessType, .spaceMembers(spaceIDs: [space.id]))
guard case .singleUnknown = context.viewState.spaceSelection else { guard case .singleUnknown = context.viewState.spaceSelection else {
XCTFail("Expected spaceSelection to be .singleUnknown") XCTFail("Expected spaceSelection to be .singleUnknown")
return return
@@ -150,7 +150,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
context.send(viewAction: .selectedSpaceMembersAccess) context.send(viewAction: .selectedSpaceMembersAccess)
try await deferredAction.fulfill() try await deferredAction.fulfill()
selectedIDs.send([spaces[0].id]) selectedIDs.send([spaces[0].id])
XCTAssertEqual(context.desiredSettings.accessType, .spaceUsers(spaceIDs: [spaces[0].id])) XCTAssertEqual(context.desiredSettings.accessType, .spaceMembers(spaceIDs: [spaces[0].id]))
XCTAssertNotNil(context.viewState.accessSectionFooter) XCTAssertNotNil(context.viewState.accessSectionFooter)
XCTAssertFalse(context.viewState.isSaveDisabled) XCTAssertFalse(context.viewState.isSaveDisabled)
@@ -194,7 +194,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
context.send(viewAction: .selectedAskToJoinWithSpaceMembersAccess) context.send(viewAction: .selectedAskToJoinWithSpaceMembersAccess)
try await deferredAction.fulfill() try await deferredAction.fulfill()
selectedIDs.send([spaces[0].id]) selectedIDs.send([spaces[0].id])
XCTAssertEqual(context.desiredSettings.accessType, .askToJoinWithSpaceUsers(spaceIDs: [spaces[0].id])) XCTAssertEqual(context.desiredSettings.accessType, .askToJoinWithSpaceMembers(spaceIDs: [spaces[0].id]))
XCTAssertNotNil(context.viewState.accessSectionFooter) XCTAssertNotNil(context.viewState.accessSectionFooter)
XCTAssertFalse(context.viewState.isSaveDisabled) XCTAssertFalse(context.viewState.isSaveDisabled)
@@ -216,7 +216,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
let deferred = deferFulfillment(context.$viewState) { $0.selectableSpacesCount == 4 } let deferred = deferFulfillment(context.$viewState) { $0.selectableSpacesCount == 4 }
try await deferred.fulfill() try await deferred.fulfill()
XCTAssertTrue(context.viewState.currentSettings.accessType.isSpaceUsers) XCTAssertTrue(context.viewState.currentSettings.accessType.isSpaceMembers)
XCTAssertTrue(context.viewState.isSaveDisabled) XCTAssertTrue(context.viewState.isSaveDisabled)
XCTAssertTrue(context.viewState.isSpaceMembersOptionSelectable) XCTAssertTrue(context.viewState.isSpaceMembersOptionSelectable)
guard case .multiple = context.viewState.spaceSelection else { guard case .multiple = context.viewState.spaceSelection else {
@@ -240,7 +240,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
context.send(viewAction: .manageSpaces) context.send(viewAction: .manageSpaces)
try await deferredAction.fulfill() try await deferredAction.fulfill()
selectedIDs.send([spaces[0].id, "unknownSpaceID"]) selectedIDs.send([spaces[0].id, "unknownSpaceID"])
XCTAssertEqual(context.desiredSettings.accessType, .spaceUsers(spaceIDs: [spaces[0].id, "unknownSpaceID"])) XCTAssertEqual(context.desiredSettings.accessType, .spaceMembers(spaceIDs: [spaces[0].id, "unknownSpaceID"]))
XCTAssertNotNil(context.viewState.accessSectionFooter) XCTAssertNotNil(context.viewState.accessSectionFooter)
XCTAssertFalse(context.viewState.isSaveDisabled) XCTAssertFalse(context.viewState.isSaveDisabled)
@@ -263,7 +263,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
let deferred = deferFulfillment(context.$viewState) { $0.selectableSpacesCount == 0 } let deferred = deferFulfillment(context.$viewState) { $0.selectableSpacesCount == 0 }
try await deferred.fulfill() try await deferred.fulfill()
XCTAssertTrue(context.viewState.currentSettings.accessType.isSpaceUsers) XCTAssertTrue(context.viewState.currentSettings.accessType.isSpaceMembers)
XCTAssertTrue(context.viewState.isSaveDisabled) XCTAssertTrue(context.viewState.isSaveDisabled)
XCTAssertFalse(context.viewState.isSpaceMembersOptionSelectable) XCTAssertFalse(context.viewState.isSpaceMembersOptionSelectable)
XCTAssertNil(context.viewState.accessSectionFooter) XCTAssertNil(context.viewState.accessSectionFooter)
@@ -283,7 +283,7 @@ class SecurityAndPrivacyScreenViewModelTests: XCTestCase {
let deferred = deferFulfillment(context.$viewState) { $0.selectableSpacesCount == 1 } let deferred = deferFulfillment(context.$viewState) { $0.selectableSpacesCount == 1 }
try await deferred.fulfill() try await deferred.fulfill()
XCTAssertTrue(context.viewState.currentSettings.accessType.isSpaceUsers) XCTAssertTrue(context.viewState.currentSettings.accessType.isSpaceMembers)
XCTAssertTrue(context.viewState.isSaveDisabled) XCTAssertTrue(context.viewState.isSaveDisabled)
XCTAssertTrue(context.viewState.isSpaceMembersOptionSelectable) XCTAssertTrue(context.viewState.isSpaceMembersOptionSelectable)
XCTAssertNotNil(context.viewState.accessSectionFooter) XCTAssertNotNil(context.viewState.accessSectionFooter)