import SwiftUI struct InstanceFormView: View { @Environment(\.dismiss) private var dismiss @ObservedObject var model: FleetViewModel @State private var name = "" @State private var originText = "" @State private var tagsText = "" @State private var password = "" @State private var validationMessage: String? var body: some View { NavigationStack { ZStack { AITheme.canvas.ignoresSafeArea() ScrollView { VStack(spacing: 12) { AICard { VStack(alignment: .leading, spacing: 14) { field("名称", text: $name, placeholder: "Home Node") field("地址", text: $originText, placeholder: "http://192.168.1.10:3000") field("标签", text: $tagsText, placeholder: "home, primary") SecureField("实例密码(可选)", text: $password) .textContentType(.password) .padding(.horizontal, 12) .frame(minHeight: 38) .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("保存") { save() } .buttonStyle(AIButtonStyle(kind: .primary, size: .regular)) } } } } private func field(_ title: String, text: Binding, placeholder: String) -> some View { VStack(alignment: .leading, spacing: 6) { Text(title) .font(.subheadline.weight(.semibold)) .foregroundStyle(AITheme.ink) TextField(placeholder, text: text) .textFieldStyle(.plain) .padding(.horizontal, 12) .frame(minHeight: 38) .background(AITheme.canvas) .clipShape(RoundedRectangle(cornerRadius: AITheme.buttonRadius)) } } private func save() { guard let origin = URL(string: originText.trimmingCharacters(in: .whitespacesAndNewlines)), origin.scheme == "http" || origin.scheme == "https", origin.host != nil else { validationMessage = "请输入有效的 HTTP 或 HTTPS 根地址。" return } let tags = tagsText .split(separator: ",") .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } .filter { !$0.isEmpty } let input = InstanceInput( name: name, origin: origin, tags: tags, password: password.isEmpty ? nil : password ) Task { do { try await model.add(input) dismiss() } catch { validationMessage = "保存失败,请检查地址是否重复。" } } } }