Add provider tag suggestions and tag categories
This commit is contained in:
@@ -1,11 +1,14 @@
|
||||
import '../../core/utils/result.dart';
|
||||
import '../models/search_history.dart';
|
||||
import '../models/tag_suggestion.dart';
|
||||
import '../providers/provider_manager.dart';
|
||||
import '../repositories/search_repository.dart';
|
||||
|
||||
class SearchService {
|
||||
SearchService(this._repository);
|
||||
SearchService(this._repository, [this._providerManager]);
|
||||
|
||||
final SearchRepository _repository;
|
||||
final ProviderManager? _providerManager;
|
||||
|
||||
List<String> parseTags(String query) {
|
||||
return query
|
||||
@@ -35,21 +38,21 @@ class SearchService {
|
||||
|
||||
Future<Result<List<String>>> autocomplete(String prefix,
|
||||
{int limit = 10}) async {
|
||||
final recent = await _repository.recent(limit: 100);
|
||||
return recent.fold(
|
||||
onSuccess: (items) {
|
||||
final needle = prefix.toLowerCase();
|
||||
final values = <String>{};
|
||||
for (final item in items) {
|
||||
for (final tag in item.tags) {
|
||||
if (tag.toLowerCase().startsWith(needle)) values.add(tag);
|
||||
}
|
||||
}
|
||||
return Success(values.take(limit).toList());
|
||||
},
|
||||
final result = await autocompleteDetailed(prefix, limit: limit);
|
||||
return result.fold(
|
||||
onSuccess: (items) => Success(items.map((item) => item.name).toList()),
|
||||
onError: Error<List<String>>.new,
|
||||
);
|
||||
}
|
||||
|
||||
Future<Result<List<TagSuggestion>>> autocompleteDetailed(
|
||||
String prefix, {
|
||||
int limit = 10,
|
||||
}) async {
|
||||
final manager = _providerManager;
|
||||
if (manager == null || prefix.trim().isEmpty) return const Success([]);
|
||||
return manager.suggestTags(prefix.trim(), limit: limit);
|
||||
}
|
||||
|
||||
Future<Result<void>> clearHistory() => _repository.clear();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user