124 lines
4.3 KiB
Swift
124 lines
4.3 KiB
Swift
import SwiftUI
|
|
|
|
struct GroupInfoView: View {
|
|
let conversation: Conversation
|
|
var appState: AppState
|
|
@State private var showRenameSheet = false
|
|
@State private var showLeaveConfirm = false
|
|
@State private var newName = ""
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
private var isCreator: Bool {
|
|
conversation.createdBy == appState.currentUser?.id
|
|
}
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
List {
|
|
// Avatar section
|
|
Section {
|
|
HStack {
|
|
Spacer()
|
|
VStack(spacing: 8) {
|
|
CircularAvatarView(
|
|
name: conversation.name ?? "Group",
|
|
size: 64,
|
|
isGroup: true
|
|
)
|
|
|
|
Text(conversation.name ?? "Group")
|
|
.font(.title2.bold())
|
|
|
|
Text("\(conversation.members.count) members")
|
|
.font(.subheadline)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
Spacer()
|
|
}
|
|
.listRowBackground(Color.clear)
|
|
}
|
|
|
|
// Actions
|
|
if isCreator {
|
|
Section {
|
|
Button("Rename Group") {
|
|
newName = conversation.name ?? ""
|
|
showRenameSheet = true
|
|
}
|
|
|
|
Button("Change Avatar") {
|
|
// Photo picker would go here
|
|
}
|
|
}
|
|
}
|
|
|
|
// Members
|
|
Section("Members") {
|
|
ForEach(conversation.members) { member in
|
|
HStack {
|
|
CircularAvatarView(name: member.username, size: 32, isGroup: false)
|
|
|
|
VStack(alignment: .leading) {
|
|
Text(member.username)
|
|
.font(.body)
|
|
Text(member.email)
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
|
|
Spacer()
|
|
|
|
if member.userId == conversation.createdBy {
|
|
Text("Admin")
|
|
.font(.caption)
|
|
.foregroundStyle(.blue)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Leave / Delete
|
|
Section {
|
|
Button("Leave Group", role: .destructive) {
|
|
showLeaveConfirm = true
|
|
}
|
|
|
|
if isCreator {
|
|
Button("Delete Group", role: .destructive) {
|
|
Task {
|
|
await appState.chatClient.deleteConversation(convId: conversation.id)
|
|
dismiss()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle("Group Info")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .topBarTrailing) {
|
|
Button("Done") { dismiss() }
|
|
}
|
|
}
|
|
.alert("Leave Group?", isPresented: $showLeaveConfirm) {
|
|
Button("Cancel", role: .cancel) {}
|
|
Button("Leave", role: .destructive) {
|
|
Task {
|
|
await appState.chatClient.leaveGroup(convId: conversation.id)
|
|
dismiss()
|
|
}
|
|
}
|
|
}
|
|
.alert("Rename Group", isPresented: $showRenameSheet) {
|
|
TextField("Group Name", text: $newName)
|
|
Button("Cancel", role: .cancel) {}
|
|
Button("Rename") {
|
|
Task {
|
|
await appState.chatClient.renameConversation(convId: conversation.id, name: newName)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|