|
|
@@ -6,15 +6,28 @@
|
|
|
//
|
|
|
|
|
|
import SwiftUI
|
|
|
+import SwiftData
|
|
|
|
|
|
struct TagBarView: View {
|
|
|
@Binding var tags: [Tag]
|
|
|
+ @EnvironmentObject var allHints: URLHintArray
|
|
|
+
|
|
|
@State private var active: String = ""
|
|
|
@FocusState private var isFocused: Bool
|
|
|
-
|
|
|
+
|
|
|
var body: some View {
|
|
|
HStack {
|
|
|
ForEach($tags) { tag in
|
|
|
+ let url = allHints.array.filter({ $0.matches(tag.wrappedValue) })
|
|
|
+ .first?.url(tag.wrappedValue)
|
|
|
+ if url != nil {
|
|
|
+ Link(destination: url!) {
|
|
|
+ Label("", systemImage: "link")
|
|
|
+ }
|
|
|
+ .padding(.leading, -8)
|
|
|
+ .padding(.trailing, -10)
|
|
|
+ }
|
|
|
+
|
|
|
TextField("", text: tag.id)
|
|
|
.focused($isFocused)
|
|
|
.onChange(of: isFocused) {
|
|
|
@@ -24,7 +37,7 @@ struct TagBarView: View {
|
|
|
.scaledToFit()
|
|
|
TextField("Tag", text: $active)
|
|
|
.onSubmit {
|
|
|
- if !tags.contains(where: { $0.id.caseInsensitiveCompare(active) == .orderedSame }) {
|
|
|
+ if !tags.contains(where: { $0.like(active) }) {
|
|
|
tags.append(Tag(id: active))
|
|
|
}
|
|
|
active = ""
|
|
|
@@ -35,5 +48,9 @@ struct TagBarView: View {
|
|
|
|
|
|
#Preview {
|
|
|
@Previewable @State var tags = Array<Tag>()
|
|
|
+ @Previewable @State var allHints = URLHintArray([
|
|
|
+ URLHint(prefix: "RPD:", replacement: "http://localhost/")
|
|
|
+ ])
|
|
|
TagBarView(tags: $tags)
|
|
|
+ .environmentObject(allHints)
|
|
|
}
|