mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 12:07:55 +00:00
08d02001bf
* Use our standard XYZMock(.init()) pattern everywhere instead of XYZMock.default. * Remove the configuration parameter label on mock convenience inits. * Update the enterprise submodule.
140 lines
6.7 KiB
Swift
140 lines
6.7 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 Compound
|
|
import SwiftUI
|
|
|
|
struct LeaveSpaceRoomDetailsCell: View {
|
|
@Environment(\.dynamicTypeSize) private var dynamicTypeSize
|
|
|
|
let room: LeaveSpaceRoomDetails
|
|
var hideSelection = false
|
|
let mediaProvider: MediaProviderProtocol?
|
|
|
|
let action: () -> Void
|
|
|
|
private var subtitle: String? {
|
|
guard !room.spaceServiceRoom.isSpace else { return nil }
|
|
return L10n.commonMemberCount(room.spaceServiceRoom.joinedMembersCount)
|
|
}
|
|
|
|
var visibilityIcon: KeyPath<CompoundIcons, Image>? {
|
|
switch room.spaceServiceRoom.visibility {
|
|
case .public: \.public
|
|
case .private: \.lockSolid
|
|
case .restricted: nil
|
|
case .none: \.lockSolid
|
|
}
|
|
}
|
|
|
|
var body: some View {
|
|
Button(action: action) {
|
|
HStack(spacing: 16) {
|
|
if dynamicTypeSize < .accessibility3 {
|
|
RoomAvatarImage(avatar: room.spaceServiceRoom.avatar,
|
|
avatarSize: .room(on: .leaveSpace),
|
|
mediaProvider: mediaProvider)
|
|
}
|
|
|
|
VStack(alignment: .leading, spacing: 0) {
|
|
Text(room.spaceServiceRoom.name)
|
|
.font(.compound.bodyLGSemibold)
|
|
.foregroundStyle(.compound.textPrimary)
|
|
.lineLimit(1)
|
|
.padding(.vertical, 1)
|
|
.padding(.vertical, subtitle == nil ? 10 : 0)
|
|
|
|
subtitleLabel
|
|
}
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.padding(.vertical, 8)
|
|
|
|
if !hideSelection {
|
|
ListRowAccessory.multiSelection(room.isSelected)
|
|
}
|
|
}
|
|
.padding(.horizontal, 16)
|
|
}
|
|
.buttonStyle(SpaceRoomCellButtonStyle(isHighlighted: false))
|
|
}
|
|
|
|
@ViewBuilder
|
|
private var subtitleLabel: some View {
|
|
if let subtitle {
|
|
Label {
|
|
Text(subtitle)
|
|
.font(.compound.bodyMD)
|
|
.foregroundStyle(.compound.textSecondary)
|
|
.lineLimit(1)
|
|
.padding(.vertical, 1)
|
|
} icon: {
|
|
if let visibilityIcon {
|
|
CompoundIcon(visibilityIcon,
|
|
size: .xSmall,
|
|
relativeTo: .compound.bodyMD)
|
|
.foregroundStyle(.compound.iconTertiary)
|
|
}
|
|
}
|
|
.labelStyle(.custom(spacing: 4))
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Previews
|
|
|
|
struct LeaveSpaceRoomDetailsCell_Previews: PreviewProvider, TestablePreview {
|
|
static var previews: some View {
|
|
VStack(spacing: 0) {
|
|
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "1",
|
|
name: "Space",
|
|
isSpace: true),
|
|
isLastOwner: false,
|
|
areCreatorsPrivileged: false,
|
|
isSelected: true),
|
|
mediaProvider: MediaProviderMock(.init())) { }
|
|
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "2",
|
|
name: "My Space",
|
|
isSpace: true),
|
|
isLastOwner: true,
|
|
areCreatorsPrivileged: false,
|
|
isSelected: false),
|
|
mediaProvider: MediaProviderMock(.init())) { }
|
|
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "2",
|
|
name: "My Space",
|
|
isSpace: true),
|
|
isLastOwner: true,
|
|
areCreatorsPrivileged: false,
|
|
isSelected: false),
|
|
hideSelection: true,
|
|
mediaProvider: MediaProviderMock(.init())) { }
|
|
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "3",
|
|
name: "Room",
|
|
isSpace: false),
|
|
isLastOwner: false,
|
|
areCreatorsPrivileged: false,
|
|
isSelected: true),
|
|
mediaProvider: MediaProviderMock(.init())) { }
|
|
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "4",
|
|
name: "My Room",
|
|
isSpace: false),
|
|
isLastOwner: true,
|
|
areCreatorsPrivileged: false,
|
|
isSelected: false),
|
|
mediaProvider: MediaProviderMock(.init())) { }
|
|
LeaveSpaceRoomDetailsCell(room: .init(spaceServiceRoom: SpaceServiceRoom.mock(id: "4",
|
|
name: "My Room",
|
|
isSpace: false),
|
|
isLastOwner: true,
|
|
areCreatorsPrivileged: false,
|
|
isSelected: false),
|
|
hideSelection: true,
|
|
mediaProvider: MediaProviderMock(.init())) { }
|
|
}
|
|
}
|
|
}
|