summaryrefslogtreecommitdiff
path: root/Sora/Views/Post/Grid/PostGridSearchHistoryView.swift
blob: e3068392f093e8a33adea613ca3e1e60d50523fa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import SwiftUI

struct PostGridSearchHistoryView: View {
  @EnvironmentObject private var manager: BooruManager
  @EnvironmentObject private var settings: SettingsManager
  @State private var searchText: String = ""
  @Binding var selectedTab: Int
  @Binding var isPresented: Bool

  var filteredHistory: [BooruSearchQuery] {
    guard !searchText.isEmpty else {
      return settings.searchHistory
    }

    return settings.searchHistory
      .filter { query in
        query.tags
          .joined(separator: " ")
          .lowercased()
          .contains(searchText.lowercased())
      }
  }

  var body: some View {
    NavigationStack {
      VStack {
        if settings.searchHistory.isEmpty {
          ContentUnavailableView(
            "No History",
            systemImage: "magnifyingglass",
            description: Text("Recent searches will appear here.")
          )
        } else {
          List {
            if filteredHistory.isEmpty, !searchText.isEmpty {
              Text("No matching history found")
            }

            ForEach(
              filteredHistory.sorted { $0.date > $1.date },
              id: \.id
            ) { query in
              Button(action: {
                let previousProvider = settings.preferredBooru

                settings.preferredBooru = query.provider
                manager.searchText = query.tags.joined(separator: " ")
                selectedTab = 0

                isPresented.toggle()

                if previousProvider == settings.preferredBooru {
                  manager.performSearch()
                }
              }) {
                GenericItemView(
                  item: query,
                  removeAction: settings.removeSearchHistoryEntry
                )
              }
              #if os(macOS)
                .buttonStyle(.plain)
              #endif
            }
            .onDelete(perform: settings.removeSearchHistoryEntry)
          }
          #if os(macOS)
            .listStyle(.plain)
          #endif
        }
      }
    }
    .navigationTitle("Search History")
    .searchable(text: $searchText)
  }
}

#Preview {
  PostGridSearchHistoryView(
    selectedTab: .constant(0),
    isPresented: .constant(true)
  )
  .environmentObject(SettingsManager())
  .environmentObject(BooruManager(.safebooru))
}