Files
letro-ios/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenModels.swift
Mauro 0154e10f98 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>
2025-05-19 14:17:57 +00:00

100 lines
3.0 KiB
Swift

//
// Copyright 2022-2024 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
// Please see LICENSE files in the repository root for full details.
//
import Foundation
enum RoomMembersListScreenViewModelAction {
case selectMember(_ member: RoomMemberProxyProtocol)
case invite
var isSelectMember: Bool {
switch self {
case .selectMember:
true
default:
false
}
}
}
/// The different modes that the screen can be in.
enum RoomMembersListScreenMode {
/// The screen is showing invited and joined members.
case members
/// The screen is showing banned members (to mods/admins)
case banned
}
struct RoomMemberListScreenEntry: Equatable {
let member: RoomMemberDetails
let verificationState: UserIdentityVerificationState
}
struct RoomMembersListScreenViewState: BindableState {
private var joinedMembers: [RoomMemberListScreenEntry]
private var invitedMembers: [RoomMemberListScreenEntry]
private var bannedMembers: [RoomMemberListScreenEntry]
let joinedMembersCount: Int
var bannedMembersCount: Int { bannedMembers.count }
var canInviteUsers = false
var canKickUsers = false
var canBanUsers = false
var bindings: RoomMembersListScreenViewStateBindings
init(joinedMembersCount: Int,
joinedMembers: [RoomMemberListScreenEntry] = [],
invitedMembers: [RoomMemberListScreenEntry] = [],
bannedMembers: [RoomMemberListScreenEntry] = [],
bindings: RoomMembersListScreenViewStateBindings) {
self.joinedMembersCount = joinedMembersCount
self.joinedMembers = joinedMembers
self.invitedMembers = invitedMembers
self.bannedMembers = bannedMembers
self.bindings = bindings
}
var visibleJoinedMembers: [RoomMemberListScreenEntry] {
joinedMembers
.filter { $0.member.matches(searchQuery: bindings.searchQuery) }
}
var visibleInvitedMembers: [RoomMemberListScreenEntry] {
invitedMembers
.filter { $0.member.matches(searchQuery: bindings.searchQuery) }
}
var visibleBannedMembers: [RoomMemberListScreenEntry] {
bannedMembers
.filter { $0.member.matches(searchQuery: bindings.searchQuery) }
}
}
struct RoomMembersListScreenViewStateBindings {
var searchQuery = ""
/// The current mode the screen is in.
var mode: RoomMembersListScreenMode = .members
/// A sheet model for the selected member to kick, ban, promote etc.
var manageMemeberViewModel: ManageRoomMemberSheetViewModel?
/// Information describing the currently displayed alert.
var alertInfo: AlertInfo<RoomMembersListScreenAlertType>?
}
enum RoomMembersListScreenViewAction {
case selectMember(RoomMemberDetails)
case invite
}
enum RoomMembersListScreenAlertType: Hashable {
case unbanConfirmation(RoomMemberDetails)
case kickConfirmation
case banConfirmation
}