first commit
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
import Foundation
|
||||
import SwiftUI
|
||||
|
||||
/// 搜索 ViewModel
|
||||
@MainActor
|
||||
class SearchViewModel: ObservableObject {
|
||||
@Published var keyword: String = ""
|
||||
@Published var results: [Movie.Video] = []
|
||||
@Published var isSearching = false
|
||||
@Published var searchHistory: [String] = []
|
||||
@Published var errorMessage: String?
|
||||
|
||||
private let sourceService = SourceService.shared
|
||||
|
||||
init() {
|
||||
loadSearchHistory()
|
||||
}
|
||||
|
||||
/// 执行搜索
|
||||
func search() async {
|
||||
let trimmed = keyword.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
guard !trimmed.isEmpty else { return }
|
||||
|
||||
isSearching = true
|
||||
errorMessage = nil
|
||||
results = []
|
||||
|
||||
// 保存搜索历史
|
||||
addToHistory(trimmed)
|
||||
|
||||
let videos = await sourceService.searchAll(keyword: trimmed)
|
||||
self.results = videos
|
||||
|
||||
if videos.isEmpty {
|
||||
errorMessage = "未找到相关内容"
|
||||
}
|
||||
|
||||
isSearching = false
|
||||
}
|
||||
|
||||
/// 在指定源搜索
|
||||
func searchInSource(_ source: SourceBean) async {
|
||||
let trimmed = keyword.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
guard !trimmed.isEmpty else { return }
|
||||
|
||||
isSearching = true
|
||||
|
||||
do {
|
||||
let videos = try await sourceService.search(sourceBean: source, keyword: trimmed)
|
||||
self.results = videos
|
||||
} catch {
|
||||
errorMessage = error.localizedDescription
|
||||
}
|
||||
|
||||
isSearching = false
|
||||
}
|
||||
|
||||
// MARK: - 搜索历史
|
||||
|
||||
private func loadSearchHistory() {
|
||||
searchHistory = UserDefaults.standard.stringArray(forKey: HawkConfig.SEARCH_HISTORY) ?? []
|
||||
}
|
||||
|
||||
private func addToHistory(_ keyword: String) {
|
||||
searchHistory.removeAll { $0 == keyword }
|
||||
searchHistory.insert(keyword, at: 0)
|
||||
if searchHistory.count > 20 {
|
||||
searchHistory = Array(searchHistory.prefix(20))
|
||||
}
|
||||
UserDefaults.standard.set(searchHistory, forKey: HawkConfig.SEARCH_HISTORY)
|
||||
}
|
||||
|
||||
func clearHistory() {
|
||||
searchHistory = []
|
||||
UserDefaults.standard.removeObject(forKey: HawkConfig.SEARCH_HISTORY)
|
||||
}
|
||||
|
||||
func removeFromHistory(_ keyword: String) {
|
||||
searchHistory.removeAll { $0 == keyword }
|
||||
UserDefaults.standard.set(searchHistory, forKey: HawkConfig.SEARCH_HISTORY)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user