feat(ios): add cross-instance message center

This commit is contained in:
chick
2026-09-09 00:18:56 +08:00
parent 54eb8dcb86
commit 7778693807
8 changed files with 559 additions and 1 deletions
@@ -0,0 +1,78 @@
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?
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)
.padding(.horizontal, 12)
.frame(minHeight: AITheme.buttonHeight)
.background(AITheme.canvas)
.clipShape(RoundedRectangle(cornerRadius: AITheme.buttonRadius))
TextField("消息内容", text: $content, axis: .vertical)
.lineLimit(4...8)
.padding(12)
.background(AITheme.canvas)
.clipShape(RoundedRectangle(cornerRadius: AITheme.buttonRadius))
}
}
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))
}
}
}
}
private func send() {
Task {
do {
try await model.send(phoneNumber: phoneNumber, content: content)
phoneNumber = ""
content = ""
validationMessage = nil
dismiss()
} catch {
validationMessage = "发送失败,请检查号码、内容和实例登录状态。"
}
}
}
}