import SwiftUI struct SendMessageFormView: View { @Environment(\.dismiss) private var dismiss @ObservedObject var model: MessagesViewModel @State private var phoneNumber = "" @State private var content = "" @State private var validationMessage: String? private var trimmedPhoneNumber: String { phoneNumber.trimmingCharacters(in: .whitespacesAndNewlines) } private var trimmedContent: String { content.trimmingCharacters(in: .whitespacesAndNewlines) } private var canSend: Bool { !trimmedPhoneNumber.isEmpty && !trimmedContent.isEmpty } var body: some View { NavigationStack { ZStack { AITheme.canvas.ignoresSafeArea() ScrollView { VStack(spacing: 12) { AICard { VStack(alignment: .leading, spacing: 14) { Picker("实例", selection: Binding( get: { model.selectedInstanceID ?? model.instances.first?.id }, set: { model.selectedInstanceID = $0 } )) { ForEach(model.instances) { instance in Text(instance.name).tag(Optional(instance.id)) } } .pickerStyle(.menu) TextField("收件号码", text: $phoneNumber) .textFieldStyle(AIFieldStyle()) TextField("消息内容", text: $content, axis: .vertical) .textFieldStyle(.plain) .padding(.horizontal, 12) .frame(minHeight: AITheme.buttonHeight) .background(AITheme.canvas) .clipShape(RoundedRectangle(cornerRadius: AITheme.buttonRadius)) .overlay { RoundedRectangle(cornerRadius: AITheme.buttonRadius) .strokeBorder(AITheme.line) } .lineLimit(4...8) } } if let validationMessage { Text(validationMessage) .font(.subheadline) .foregroundStyle(AITheme.danger) .frame(maxWidth: .infinity, alignment: .leading) } } .padding(16) } } .navigationTitle("发送消息") .toolbar { ToolbarItem(placement: .cancellationAction) { Button("取消") { dismiss() } .buttonStyle(AIButtonStyle(kind: .secondary, size: .regular)) } ToolbarItem(placement: .confirmationAction) { Button("发送") { send() } .buttonStyle(AIButtonStyle(kind: .primary, size: .regular)) .disabled(!canSend) } } } } private func send() { Task { do { try await model.send(phoneNumber: trimmedPhoneNumber, content: trimmedContent) phoneNumber = "" content = "" validationMessage = nil dismiss() } catch { validationMessage = "发送失败,请检查号码、内容和实例登录状态。" } } } }