Files
letro-ios/ElementX/Sources/Screens/Spaces/SpaceScreen/SpaceScreenModels.swift
2026-02-26 16:29:52 +01:00

84 lines
2.5 KiB
Swift

//
// Copyright 2025 Element Creations Ltd.
// Copyright 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 SwiftUI
enum SpaceScreenViewModelAction {
case selectSpace(SpaceRoomListProxyProtocol)
case selectUnjoinedSpace(SpaceServiceRoom)
case selectRoom(roomID: String)
case leftSpace
case presentRolesAndPermissions(roomProxy: JoinedRoomProxyProtocol)
case presentTransferOwnership(roomProxy: JoinedRoomProxyProtocol)
case displayMembers(roomProxy: JoinedRoomProxyProtocol)
case displaySpaceSettings(roomProxy: JoinedRoomProxyProtocol)
case addExistingChildren
case displayCreateChildRoomFlow(space: SpaceServiceRoom)
}
struct SpaceScreenViewState: BindableState {
var space: SpaceServiceRoom
var permalink: URL?
var roomProxy: JoinedRoomProxyProtocol?
var paginationState: PaginationState = .idle
var rooms: [SpaceServiceRoom]
var selectedSpaceRoomID: String?
var joiningRoomIDs: Set<String> = []
var canEditBaseInfo = false
var canEditRolesAndPermissions = false
var canEditSecurityAndPrivacy = false
var canEditChildren = false
var editMode: EditMode = .inactive
var editModeSelectedIDs: Set<String> = []
var editModeRemovedIDs: Set<String> = []
var bindings = SpaceScreenViewStateBindings()
var shouldShowEmptyState: Bool {
rooms.isEmpty && paginationState == .endReached && canEditChildren
}
var visibleRooms: [SpaceServiceRoom] {
if editMode == .inactive {
rooms
} else {
rooms.filter { !$0.isSpace && !editModeRemovedIDs.contains($0.id) }
}
}
var isSpaceManagementEnabled: Bool {
canEditBaseInfo || canEditRolesAndPermissions || canEditSecurityAndPrivacy
}
func isSpaceIDSelected(_ spaceID: String) -> Bool {
selectedSpaceRoomID == spaceID || editModeSelectedIDs.contains(spaceID)
}
}
struct SpaceScreenViewStateBindings {
var isPresentingRemoveChildrenConfirmation = false
var leaveSpaceViewModel: LeaveSpaceViewModel?
}
enum SpaceScreenViewAction {
case spaceAction(SpaceRoomCell.Action)
case leaveSpace
case spaceSettings(roomProxy: JoinedRoomProxyProtocol)
case displayMembers(roomProxy: JoinedRoomProxyProtocol)
case addExistingRooms
case createChildRoom
case manageChildren
case removeSelectedChildren
case confirmRemoveSelectedChildren
case finishManagingChildren
}