Always open manage member sheet (#4110)

* always open manage member sheet

* Update ElementX/Sources/Screens/ManageRoomMemberSheet/ManageRoomMemberSheetModels.swift

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>

* Update ElementX/Sources/Screens/ManageRoomMemberSheet/ManageRoomMemberSheetModels.swift

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>

* pr suggestions and handled the buttons actions correctly

* Update ElementX/Sources/Screens/ManageRoomMemberSheet/View/ManageRoomMemberSheetView.swift

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>

* fixed some compilation errors

* added some documentation

* using a struct instead of a protocol

* using arguments instead of a struct

---------

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>
This commit is contained in:
Mauro
2025-05-19 16:17:57 +02:00
committed by GitHub
parent 4f4b4b236d
commit 9a8819ac26
25 changed files with 334 additions and 170 deletions
+36 -26
View File
@@ -377,12 +377,14 @@ class TimelineViewModelTests: XCTestCase {
value.bindings.manageMemberViewModel != nil
}
viewModel.context.send(viewAction: .tappedOnSenderDetails(userID: RoomMemberProxyMock.mockAlice.userID))
viewModel.context.send(viewAction: .tappedOnSenderDetails(sender: .init(with: RoomMemberProxyMock.mockAlice)))
try await deferred.fulfill()
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.member.id, RoomMemberProxyMock.mockAlice.userID)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.canBan, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.canKick, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.id, RoomMemberProxyMock.mockAlice.userID)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.permissions.canBan, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.permissions.canKick, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.isKickDisabled, false)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.isBanUnbanDisabled, false)
}
func testShowDetailsForAnAdmin() async throws {
@@ -402,25 +404,24 @@ class TimelineViewModelTests: XCTestCase {
timelineControllerFactory: TimelineControllerFactoryMock(.init()),
clientProxy: ClientProxyMock(.init()))
let deferredState = deferFulfillment(viewModel.context.$viewState) { value in
var deferredState = deferFulfillment(viewModel.context.$viewState) { value in
!value.canCurrentUserKick && !value.canCurrentUserBan
}
try await deferredState.fulfill()
let deferredAction = deferFulfillment(viewModel.actions) { action in
switch action {
case .displaySenderDetails(let userID):
return userID == RoomMemberProxyMock.mockAdmin.userID
default:
return false
}
deferredState = deferFulfillment(viewModel.context.$viewState) { value in
value.bindings.manageMemberViewModel != nil
}
viewModel.context.send(viewAction: .tappedOnSenderDetails(userID: RoomMemberProxyMock.mockAdmin.userID))
try await deferredAction.fulfill()
viewModel.context.send(viewAction: .tappedOnSenderDetails(sender: .init(with: RoomMemberProxyMock.mockAdmin)))
try await deferredState.fulfill()
XCTAssertNil(viewModel.context.manageMemberViewModel)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.permissions.canBan, false)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.permissions.canKick, false)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.isKickDisabled, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.isBanUnbanDisabled, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.id, RoomMemberProxyMock.mockAdmin.userID)
}
func testShowDetailsForABannedUser() async throws {
@@ -440,25 +441,25 @@ class TimelineViewModelTests: XCTestCase {
timelineControllerFactory: TimelineControllerFactoryMock(.init()),
clientProxy: ClientProxyMock(.init()))
let deferredState = deferFulfillment(viewModel.context.$viewState) { value in
var deferredState = deferFulfillment(viewModel.context.$viewState) { value in
value.canCurrentUserKick && value.canCurrentUserBan
}
try await deferredState.fulfill()
let deferredAction = deferFulfillment(viewModel.actions) { action in
switch action {
case .displaySenderDetails(let userID):
return userID == RoomMemberProxyMock.mockBanned[0].userID
default:
return false
}
deferredState = deferFulfillment(viewModel.context.$viewState) { value in
value.bindings.manageMemberViewModel != nil
}
viewModel.context.send(viewAction: .tappedOnSenderDetails(userID: RoomMemberProxyMock.mockBanned[0].userID))
try await deferredAction.fulfill()
viewModel.context.send(viewAction: .tappedOnSenderDetails(sender: .init(with: RoomMemberProxyMock.mockBanned[0])))
try await deferredState.fulfill()
XCTAssertNil(viewModel.context.manageMemberViewModel)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.permissions.canBan, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.permissions.canKick, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.isKickDisabled, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.isBanUnbanDisabled, false)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.state.isMemberBanned, true)
XCTAssertEqual(viewModel.context.manageMemberViewModel?.id, RoomMemberProxyMock.mockBanned[0].userID)
}
// MARK: - Pins
@@ -576,3 +577,12 @@ private extension TextRoomTimelineItem {
content: .init(body: "Hello, World!"))
}
}
private extension TimelineItemSender {
init(with proxy: RoomMemberProxyMock) {
self.init(id: proxy.userID,
displayName: proxy.displayName ?? "",
isDisplayNameAmbiguous: false,
avatarURL: proxy.avatarURL)
}
}