- Refactor authentication flow to require endpoint for login and decouple token saving - Add and integrate search functionality for bookmarks - Simplify and improve server settings setup (remove connection test, direct save & login) - Update sidebar/tab navigation to include search and improve structure - Show placeholder image in BookmarkCardView if no image is available, ensuring consistent layout - Improve BookmarkDetailView header and meta info display - Add utility for domain extraction from URLs - General code cleanup and minor UI/UX improvements
49 lines
1.3 KiB
Swift
49 lines
1.3 KiB
Swift
import Foundation
|
|
import Combine
|
|
import SwiftUI
|
|
|
|
@Observable
|
|
class SearchBookmarksViewModel {
|
|
private let searchBookmarksUseCase = DefaultUseCaseFactory.shared.makeSearchBookmarksUseCase()
|
|
|
|
var searchQuery: String = "" {
|
|
didSet {
|
|
throttleSearch()
|
|
}
|
|
}
|
|
var bookmarks: BookmarksPage? = nil
|
|
var isLoading = false
|
|
var errorMessage: String? = nil
|
|
|
|
private var searchWorkItem: DispatchWorkItem?
|
|
|
|
private func throttleSearch() {
|
|
searchWorkItem?.cancel()
|
|
let workItem = DispatchWorkItem { [weak self] in
|
|
guard let self = self else { return }
|
|
Task {
|
|
await self.search()
|
|
}
|
|
}
|
|
searchWorkItem = workItem
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: workItem)
|
|
}
|
|
|
|
@MainActor
|
|
func search() async {
|
|
guard !searchQuery.isEmpty else {
|
|
bookmarks = nil
|
|
return
|
|
}
|
|
isLoading = true
|
|
errorMessage = nil
|
|
do {
|
|
let result = try await searchBookmarksUseCase.execute(search: searchQuery)
|
|
bookmarks = result
|
|
} catch {
|
|
errorMessage = "Fehler bei der Suche"
|
|
bookmarks = nil
|
|
}
|
|
isLoading = false
|
|
}
|
|
} |