development
swift 40 lines 1.02 KB
Raw
1 import Combine
2 import Foundation
3
4 @MainActor
5 final class RecentSearchStore: ObservableObject {
6 @Published private(set) var queries: [String]
7
8 private let defaults: UserDefaults
9 private let storageKey = "klepon.recentSearches"
10 private let limit = 8
11
12 init(defaults: UserDefaults = .standard) {
13 self.defaults = defaults
14 self.queries = defaults.stringArray(forKey: storageKey) ?? []
15 }
16
17 func record(_ query: String) {
18 let trimmedQuery = query.trimmingCharacters(in: .whitespacesAndNewlines)
19 guard !trimmedQuery.isEmpty else { return }
20
21 queries.removeAll { $0.caseInsensitiveCompare(trimmedQuery) == .orderedSame }
22 queries.insert(trimmedQuery, at: 0)
23 queries = Array(queries.prefix(limit))
24 persist()
25 }
26
27 func remove(_ query: String) {
28 queries.removeAll { $0 == query }
29 persist()
30 }
31
32 func clear() {
33 queries = []
34 persist()
35 }
36
37 private func persist() {
38 defaults.set(queries, forKey: storageKey)
39 }
40 }