// AddFeedSheet.swift // Jarvis — add a new RSS feed: URL + name + confirm. import SwiftUI struct AddFeedSheet: View { /// Returns true on success. let onAdd: (String, String) async -> Bool @Environment(\.dismiss) private var dismiss @State private var url = "" @State private var name = "" @State private var isSubmitting = false @State private var errorMessage: String? private var canSubmit: Bool { !url.trimmingCharacters(in: .whitespaces).isEmpty && !name.trimmingCharacters(in: .whitespaces).isEmpty && !isSubmitting } var body: some View { ZStack { Color.black.ignoresSafeArea() VStack(alignment: .leading, spacing: 0) { HStack { Text("Add feed") .font(.system(size: 22, weight: .heavy)) .foregroundStyle(.white) Spacer() Button { dismiss() } label: { Image(systemName: "xmark") .font(.system(size: 15, weight: .bold)) .foregroundStyle(Color(hex: "888888")) .frame(width: 44, height: 44) } } .padding(.top, 8) field(label: "FEED URL", text: $url, placeholder: "https://example.com/rss", mono: true, keyboard: .URL) .padding(.top, 12) field(label: "DISPLAY NAME", text: $name, placeholder: "Example News", mono: false, keyboard: .default) .padding(.top, 16) if let errorMessage { Text(errorMessage) .font(.system(size: 13)) .foregroundStyle(Color(hex: "C25555")) .padding(.top, 14) } Button { Task { await submit() } } label: { HStack { Spacer() if isSubmitting { ProgressView().tint(.black) } else { Text("Add feed").font(.system(size: 16, weight: .bold)).foregroundStyle(.black) } Spacer() } .frame(height: 52) .background(canSubmit ? Palette.orange : Palette.surface2) .clipShape(RoundedRectangle(cornerRadius: 14)) } .disabled(!canSubmit) .padding(.top, 28) Spacer() } .padding(.horizontal, 20) } .preferredColorScheme(.dark) .presentationDetents([.medium]) .presentationDragIndicator(.visible) } private func field(label: String, text: Binding, placeholder: String, mono: Bool, keyboard: UIKeyboardType) -> some View { VStack(alignment: .leading, spacing: 8) { Text(label) .font(.system(size: 10, weight: .bold, design: .monospaced)) .kerning(0.8) .foregroundStyle(Color(hex: "666666")) TextField("", text: text, prompt: Text(placeholder).foregroundColor(Color(hex: "444444"))) .font(.system(size: 15, weight: .regular, design: mono ? .monospaced : .default)) .foregroundStyle(mono ? Palette.orange : .white) .autocorrectionDisabled() .textInputAutocapitalization(.never) .keyboardType(keyboard) .padding(14) .background(Palette.surface) .overlay(RoundedRectangle(cornerRadius: 12).stroke(Palette.surface2, lineWidth: 1)) .clipShape(RoundedRectangle(cornerRadius: 12)) } } private func submit() async { isSubmitting = true errorMessage = nil let ok = await onAdd(url.trimmingCharacters(in: .whitespaces), name.trimmingCharacters(in: .whitespaces)) isSubmitting = false if ok { dismiss() } else { errorMessage = "Couldn’t add feed. Check the URL and try again." } } }