Add provider tag suggestions and tag categories

This commit is contained in:
2026-05-23 15:41:23 +03:00
parent 1b763c4d62
commit b02c776628
30 changed files with 1119 additions and 77 deletions
+16 -13
View File
@@ -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();
}