| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- //
- // TagBarView.swift
- // Todos
- //
- // Created by Sam Jaffe on 2/28/26.
- //
- import SwiftUI
- import SwiftData
- struct TagBarView: View {
- @Environment(\.modelContext) private var modelContext
- @Binding var task: Task
- @AppStorage(UserDefaultsKeys.UrlHints) var allHints = CodableArray<URLHint>()
- @State private var active: String = ""
- @FocusState private var isFocused: Bool
- var body: some View {
- HStack {
- ForEach($task.tags) { tag in
- if let url = allHints.filter({ $0.matches(tag.wrappedValue) })
- .first?.url(tag.wrappedValue) {
- Link(destination: url) {
- Label("", systemImage: "link")
- }
- .padding(.leading, -8)
- .padding(.trailing, -10)
- }
- TextField("", text: tag.id)
- .focused($isFocused)
- .onChange(of: isFocused) {
- task.tags.removeAll(where: { $0.id.isEmpty })
- }
- }
- .scaledToFit()
- TextField("Tag", text: $active)
- .onSubmit(addItem)
- }
- }
- private func addItem() {
- if !active.isEmpty && !task.tags.contains(where: { $0.like(active) }) {
- let newTag = Tag(id: active, parent: task)
- modelContext.insert(newTag)
- task.tags.append(newTag)
- }
- active = ""
- }
- }
- #Preview {
- @Previewable @State var task = Task()
- TagBarView(task: $task)
- }
|