Files
letro-ios/ElementX/Sources/Screens/InviteUsersScreen/InviteUsersScreenModels.swift
Skye Elliot 477bf859c5 Prompt user when inviting users with uncached identities (#5331)
If the user attempts to invite someone (to a room or creating a DM) whose identity is not cached, we prompt them to make sure this was their intention.
2026-04-14 14:51:58 +03:00

87 lines
2.3 KiB
Swift

//
// Copyright 2025 Element Creations Ltd.
// Copyright 2022-2025 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
import MatrixRustSDK
// periphery:ignore - for generic conformance
enum InviteUsersScreenErrorType: Error {
case unknown
}
enum InviteUsersScreenViewModelAction {
case dismiss
}
enum InviteUsersScreenRoomType {
case draft
case room(roomProxy: JoinedRoomProxyProtocol)
}
struct InviteUsersScreenViewState: BindableState {
var bindings = InviteUsersScreenViewStateBindings()
var usersSection: UserDiscoverySection = .init(type: .suggestions, users: [])
var selectedUsers: [UserProfileProxy] = []
var membershipState: [String: MembershipState] = .init()
var usersToConfirm: [UserProfileProxy] = []
var isSearching = false
var hasEmptySearchResults: Bool {
!isSearching && usersSection.type == .searchResult && usersSection.users.isEmpty
}
func isUserSelected(_ user: UserProfileProxy) -> Bool {
isUserDisabled(user) || selectedUsers.contains { $0.userID == user.userID }
}
func isUserDisabled(_ user: UserProfileProxy) -> Bool {
let membershipState = membershipState(user)
return membershipState == .invite || membershipState == .join
}
func membershipState(_ user: UserProfileProxy) -> MembershipState? {
membershipState[user.userID]
}
let isSkippable: Bool
var actionText: String {
if isSkippable, selectedUsers.isEmpty {
L10n.actionSkip
} else {
L10n.actionInvite
}
}
var isActionDisabled: Bool {
isSkippable ? false : selectedUsers.isEmpty
}
}
struct InviteUsersScreenViewStateBindings {
var searchQuery = ""
var selectedUsersPosition: String?
/// Whether we are showing the confirmation dialog.
var presentConfirmationDialog = false
/// Information describing the currently displayed alert.
var alertInfo: AlertInfo<InviteUsersScreenErrorType>?
}
enum InviteUsersScreenViewAction {
case cancel
case proceed
case removeUnknownUsers
case confirmUnknownUsers
case toggleUser(UserProfileProxy)
}