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
@@ -73,10 +73,12 @@ class FeedController extends AsyncNotifier<FeedState> {
return;
}
final lastToken = query.trim().split(RegExp(r'\s+')).last;
final result =
await ref.read(searchServiceProvider).autocomplete(lastToken);
final suggestions =
result is Success<List<String>> ? result.data : const <String>[];
final result = await ref
.read(searchServiceProvider)
.autocompleteDetailed(lastToken, limit: 16);
final suggestions = result is Success<List<TagSuggestion>>
? result.data
: const <TagSuggestion>[];
state = AsyncData(current.copyWith(tagSuggestions: suggestions));
}
@@ -19,7 +19,7 @@ class FeedState {
final List<String> selectedProviderIds;
final String? ratingFilter;
final TopPeriodFilter topPeriodFilter;
final List<String> tagSuggestions;
final List<TagSuggestion> tagSuggestions;
final List<ContentProviderConfig> providers;
final bool isLoadingMore;
final bool hasMore;
@@ -31,7 +31,7 @@ class FeedState {
List<String>? selectedProviderIds,
String? ratingFilter,
TopPeriodFilter? topPeriodFilter,
List<String>? tagSuggestions,
List<TagSuggestion>? tagSuggestions,
bool clearRating = false,
List<ContentProviderConfig>? providers,
bool? isLoadingMore,
@@ -33,7 +33,7 @@ class FeedToolbar extends StatefulWidget {
final List<String> selectedTags;
final List<String> selectedProviderIds;
final TopPeriodFilter topPeriodFilter;
final List<String> tagSuggestions;
final List<TagSuggestion> tagSuggestions;
final String? rating;
final ValueChanged<String> onQuickProviderToggle;
final ValueChanged<String> onSearchChanged;
@@ -154,9 +154,9 @@ class _FeedToolbarState extends State<FeedToolbar> {
separatorBuilder: (_, __) => const SizedBox(width: 8),
itemBuilder: (context, index) => ActionChip(
avatar: const Icon(Icons.tag_rounded, size: 15),
label: Text(widget.tagSuggestions[index]),
label: _SuggestionLabel(widget.tagSuggestions[index]),
onPressed: () =>
_applySuggestion(widget.tagSuggestions[index]),
_applySuggestion(widget.tagSuggestions[index].name),
),
),
),
@@ -255,9 +255,9 @@ class _FeedToolbarState extends State<FeedToolbar> {
itemCount: widget.tagSuggestions.length,
separatorBuilder: (_, __) => const SizedBox(width: 6),
itemBuilder: (context, index) => ActionChip(
label: Text(widget.tagSuggestions[index]),
label: _SuggestionLabel(widget.tagSuggestions[index]),
onPressed: () =>
_applySuggestion(widget.tagSuggestions[index]),
_applySuggestion(widget.tagSuggestions[index].name),
),
),
),
@@ -282,6 +282,27 @@ class _FeedToolbarState extends State<FeedToolbar> {
}
}
class _SuggestionLabel extends StatelessWidget {
const _SuggestionLabel(this.suggestion);
final TagSuggestion suggestion;
@override
Widget build(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(suggestion.name),
const SizedBox(width: 6),
Text(
suggestion.categoryLabel,
style: Theme.of(context).textTheme.labelSmall,
),
],
);
}
}
Future<List<String>?> showProviderFilterSheet(
BuildContext context, {
required List<ContentProviderConfig> providers,