mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
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:
+44
-14
@@ -13,10 +13,19 @@ struct ManageRoomMemberSheetView: View {
|
||||
|
||||
var body: some View {
|
||||
Form {
|
||||
AvatarHeaderView(member: context.viewState.member,
|
||||
avatarSize: .user(on: .memberDetails),
|
||||
mediaProvider: context.mediaProvider) {
|
||||
EmptyView()
|
||||
switch context.viewState.memberDetails {
|
||||
case .memberDetails(let member):
|
||||
AvatarHeaderView(member: member,
|
||||
avatarSize: .user(on: .memberDetails),
|
||||
mediaProvider: context.mediaProvider) {
|
||||
EmptyView()
|
||||
}
|
||||
case .loadingMemberDetails(let sender):
|
||||
AvatarHeaderView(sender: sender,
|
||||
avatarSize: .user(on: .memberDetails),
|
||||
mediaProvider: context.mediaProvider) {
|
||||
EmptyView()
|
||||
}
|
||||
}
|
||||
|
||||
Section {
|
||||
@@ -28,22 +37,28 @@ struct ManageRoomMemberSheetView: View {
|
||||
}
|
||||
|
||||
Section {
|
||||
if context.viewState.canKick {
|
||||
if context.viewState.permissions.canKick {
|
||||
ListRow(label: .default(title: L10n.screenBottomSheetManageRoomMemberRemove,
|
||||
icon: \.close,
|
||||
role: .destructive),
|
||||
kind: .button {
|
||||
context.send(viewAction: .kick)
|
||||
})
|
||||
.disabled(context.viewState.isKickDisabled)
|
||||
}
|
||||
|
||||
if context.viewState.canBan {
|
||||
ListRow(label: .default(title: L10n.screenBottomSheetManageRoomMemberBan,
|
||||
icon: \.block,
|
||||
if context.viewState.permissions.canBan {
|
||||
let title = context.viewState.isMemberBanned ? L10n.screenBottomSheetManageRoomMemberUnban : L10n.screenBottomSheetManageRoomMemberBan
|
||||
let icon: KeyPath<CompoundIcons, Image> = context.viewState.isMemberBanned ? \.restart : \.block
|
||||
let action: ManageRoomMemberSheetViewAction = context.viewState.isMemberBanned ? .unban : .ban
|
||||
|
||||
ListRow(label: .default(title: title,
|
||||
icon: icon,
|
||||
role: .destructive),
|
||||
kind: .button {
|
||||
context.send(viewAction: .ban)
|
||||
context.send(viewAction: action)
|
||||
})
|
||||
.disabled(context.viewState.isBanUnbanDisabled)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -58,27 +73,42 @@ struct ManageRoomMemberSheetView: View {
|
||||
struct ManageRoomMemberSheetView_Previews: PreviewProvider, TestablePreview {
|
||||
static let allActionsViewModel = ManageRoomMemberSheetViewModel.mock()
|
||||
|
||||
static let allActionsDisabledViewModel = ManageRoomMemberSheetViewModel.mock(powerLevel: 0)
|
||||
|
||||
static let kickOnlyViewModel = ManageRoomMemberSheetViewModel.mock(canBan: false)
|
||||
|
||||
static let banOnlyViewModel = ManageRoomMemberSheetViewModel.mock(canKick: false)
|
||||
|
||||
static let unbanOnlyViewModel = ManageRoomMemberSheetViewModel.mock(canKick: false, memberIsBanned: true)
|
||||
|
||||
static var previews: some View {
|
||||
ManageRoomMemberSheetView(context: allActionsViewModel.context)
|
||||
.previewDisplayName("All Actions")
|
||||
ManageRoomMemberSheetView(context: allActionsDisabledViewModel.context)
|
||||
.previewDisplayName("All Actions Disabled")
|
||||
ManageRoomMemberSheetView(context: kickOnlyViewModel.context)
|
||||
.previewDisplayName("Kick Only")
|
||||
ManageRoomMemberSheetView(context: banOnlyViewModel.context)
|
||||
.previewDisplayName("Ban Only")
|
||||
ManageRoomMemberSheetView(context: unbanOnlyViewModel.context)
|
||||
.previewDisplayName("Unban Only")
|
||||
}
|
||||
}
|
||||
|
||||
private extension ManageRoomMemberSheetViewModel {
|
||||
static func mock(canKick: Bool = true,
|
||||
canBan: Bool = true) -> ManageRoomMemberSheetViewModel {
|
||||
let member = RoomMemberDetails(withProxy: RoomMemberProxyMock.mockDan)
|
||||
return ManageRoomMemberSheetViewModel(member: member,
|
||||
canKick: canKick,
|
||||
canBan: canBan,
|
||||
canBan: Bool = true,
|
||||
memberIsBanned: Bool = false,
|
||||
powerLevel: Int = 100) -> ManageRoomMemberSheetViewModel {
|
||||
let member = if memberIsBanned {
|
||||
RoomMemberDetails(withProxy: RoomMemberProxyMock.mockBanned[0])
|
||||
} else {
|
||||
RoomMemberDetails(withProxy: RoomMemberProxyMock.mockDan)
|
||||
}
|
||||
return ManageRoomMemberSheetViewModel(memberDetails: .memberDetails(roomMember: member),
|
||||
permissions: .init(canKick: canKick,
|
||||
canBan: canBan,
|
||||
ownPowerLevel: powerLevel),
|
||||
roomProxy: JoinedRoomProxyMock(.init()),
|
||||
userIndicatorController: UserIndicatorControllerMock(),
|
||||
analyticsService: ServiceLocator.shared.analytics,
|
||||
|
||||
Reference in New Issue
Block a user