Files
simplex-chat/apps/ios/Shared/Views/Chat/Group/ChannelMembersView.swift
2026-03-24 10:54:32 +00:00

97 lines
3.2 KiB
Swift

//
// ChannelMembersView.swift
// SimpleX (iOS)
//
// Created by spaced4ndy on 20.02.2026.
// Copyright © 2026 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct ChannelMembersView: View {
@ObservedObject var chat: Chat
var groupInfo: GroupInfo
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
var body: some View {
let members = chatModel.groupMembers
.filter { m in
let s = m.wrapped.memberStatus
return s != .memLeft && s != .memRemoved && m.wrapped.memberRole != .relay
}
if groupInfo.isOwner {
let subscriberCount = groupInfo.groupSummary.publicMemberCount ?? Int64(members.count + 1)
List {
Section(header: Text(subscriberCountStr(subscriberCount)).foregroundColor(theme.colors.secondary)) {
memberRow(GMember(groupInfo.membership), user: true, showRole: true)
ForEach(members) { member in
memberRow(member, user: false, showRole: member.wrapped.memberRole >= .owner)
}
}
}
} else {
let owners = members.filter { $0.wrapped.memberRole >= .owner }
List {
Section(header: Text("Owners").foregroundColor(theme.colors.secondary)) {
ForEach(owners) { member in
memberRow(member, user: false, showRole: false)
}
}
}
}
}
@ViewBuilder private func memberRow(_ gMember: GMember, user: Bool, showRole: Bool) -> some View {
let member = gMember.wrapped
let nameText = Text(member.chatViewName)
.foregroundColor(member.memberIncognito ? .indigo : theme.colors.onBackground)
let displayName = member.verified
? (Text(Image(systemName: "checkmark.shield")) + textSpace)
.font(.caption).baselineOffset(2).kerning(-2)
.foregroundColor(theme.colors.secondary) + nameText
: nameText
let row = HStack {
MemberProfileImage(member, size: 38)
.padding(.trailing, 2)
VStack(alignment: .leading) {
displayName
.lineLimit(1)
if user {
Text("you")
.font(.caption)
.foregroundColor(theme.colors.secondary)
}
}
Spacer()
if showRole {
Text(member.memberRole.text)
.foregroundColor(theme.colors.secondary)
}
}
if user {
row
} else {
NavigationLink {
GroupMemberInfoView(
groupInfo: groupInfo,
chat: chat,
groupMember: gMember,
scrollToItemId: Binding.constant(nil)
)
.navigationBarHidden(false)
} label: {
row
}
}
}
}
#Preview {
ChannelMembersView(
chat: Chat.sampleData,
groupInfo: GroupInfo.sampleData
)
}