feat(ios): unify list cards and loading states

This commit is contained in:
chick
2026-09-10 01:35:12 +08:00
parent 995206ac23
commit c841748971
32 changed files with 1297 additions and 607 deletions
@@ -27,18 +27,27 @@ struct SendMessageFormView: View {
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))
VStack(alignment: .leading, spacing: 6) {
Text("实例")
.font(.subheadline.weight(.semibold))
.foregroundStyle(AITheme.ink)
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)
.aiSelectSurface()
}
.pickerStyle(.menu)
TextField("收件号码", text: $phoneNumber)
.textFieldStyle(AIFieldStyle())
#if os(iOS)
.keyboardType(.phonePad)
#endif
TextField("消息内容", text: $content, axis: .vertical)
.textFieldStyle(.plain)
@@ -54,24 +63,26 @@ struct SendMessageFormView: View {
}
}
if let validationMessage {
Text(validationMessage)
.font(.subheadline)
.foregroundStyle(AITheme.danger)
.frame(maxWidth: .infinity, alignment: .leading)
AIStatusBanner(validationMessage, tint: AITheme.danger, systemImage: "exclamationmark.triangle")
}
}
.padding(16)
}
}
.navigationTitle("发送消息")
.toolbar {
ToolbarItem(placement: .cancellationAction) {
.aiBottomActionBar {
HStack(spacing: 10) {
Button("取消") { dismiss() }
.buttonStyle(AIButtonStyle(kind: .secondary, size: .regular))
}
ToolbarItem(placement: .confirmationAction) {
.buttonStyle(
AIButtonStyle(
kind: .secondary,
size: .regular,
fixedWidth: AITheme.footerSecondaryButtonWidth
)
)
Button("发送") { send() }
.buttonStyle(AIButtonStyle(kind: .primary, size: .regular))
.buttonStyle(AIButtonStyle(kind: .primary, size: .regular, fillsWidth: true))
.disabled(!canSend)
}
}