101 lines
3.2 KiB
Swift
101 lines
3.2 KiB
Swift
import SwiftUI
|
|
|
|
struct NewConversationSheet: View {
|
|
var appState: AppState
|
|
var onCreated: (String) async -> Void
|
|
|
|
@State private var email = ""
|
|
@State private var groupName = ""
|
|
@State private var isGroup = false
|
|
@State private var memberEmails: [String] = [""]
|
|
@State private var isLoading = false
|
|
@State private var errorMessage: String?
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Form {
|
|
Section {
|
|
Toggle("Create Group", isOn: $isGroup)
|
|
|
|
if isGroup {
|
|
TextField("Group Name", text: $groupName)
|
|
}
|
|
}
|
|
|
|
Section(isGroup ? "Members" : "Recipient") {
|
|
if isGroup {
|
|
ForEach(memberEmails.indices, id: \.self) { index in
|
|
TextField("Email", text: $memberEmails[index])
|
|
.textContentType(.emailAddress)
|
|
.keyboardType(.emailAddress)
|
|
.autocapitalization(.none)
|
|
}
|
|
Button("Add Member") {
|
|
memberEmails.append("")
|
|
}
|
|
} else {
|
|
TextField("Email", text: $email)
|
|
.textContentType(.emailAddress)
|
|
.keyboardType(.emailAddress)
|
|
.autocapitalization(.none)
|
|
}
|
|
}
|
|
|
|
if let error = errorMessage {
|
|
Section {
|
|
Text(error)
|
|
.foregroundStyle(.red)
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle("New Conversation")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .cancellationAction) {
|
|
Button("Cancel") { dismiss() }
|
|
}
|
|
ToolbarItem(placement: .confirmationAction) {
|
|
Button("Create") {
|
|
Task { await create() }
|
|
}
|
|
.disabled(isLoading)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private func create() async {
|
|
isLoading = true
|
|
errorMessage = nil
|
|
|
|
let emails: [String]
|
|
if isGroup {
|
|
emails = memberEmails.map { $0.trimmed }.filter { !$0.isEmpty }
|
|
guard !emails.isEmpty else {
|
|
errorMessage = "Add at least one member"
|
|
isLoading = false
|
|
return
|
|
}
|
|
} else {
|
|
guard !email.trimmed.isEmpty else {
|
|
errorMessage = "Enter an email address"
|
|
isLoading = false
|
|
return
|
|
}
|
|
emails = [email.trimmed]
|
|
}
|
|
|
|
let name = isGroup && !groupName.trimmed.isEmpty ? groupName.trimmed : nil
|
|
let (convId, message) = await appState.chatClient.createConversation(emails: emails, name: name)
|
|
|
|
isLoading = false
|
|
|
|
if let convId = convId {
|
|
await onCreated(convId)
|
|
} else {
|
|
errorMessage = message
|
|
}
|
|
}
|
|
}
|