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
@@ -214,11 +214,10 @@ class _PostMediaViewerState extends State<PostMediaViewer> {
}
List<String> _buildImageUrls(Post post) {
return {
post.sampleUrl,
post.fileUrl,
post.previewUrl,
}.where((url) => url.trim().isNotEmpty).toList();
final urls = post.fileType.toLowerCase().contains('gif')
? [post.fileUrl, post.sampleUrl, post.previewUrl]
: [post.sampleUrl, post.fileUrl, post.previewUrl];
return urls.where((url) => url.trim().isNotEmpty).toSet().toList();
}
List<String> _buildVideoUrls(Post post) {
@@ -11,16 +11,66 @@ class PostTagsPanel extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Wrap(
spacing: 8,
runSpacing: 8,
final groups = _groups(post);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
for (final tag in post.tags.take(80))
TagChip(
tag: tag,
onTap: () => context.go('/?q=${Uri.encodeQueryComponent(tag)}'),
for (final entry in groups.entries) ...[
Padding(
padding: const EdgeInsets.only(top: 8, bottom: 6),
child: Text(
_label(entry.key),
style: Theme.of(context).textTheme.labelLarge,
),
),
Wrap(
spacing: 8,
runSpacing: 8,
children: [
for (final tag in entry.value.take(80))
TagChip(
tag: tag,
onTap: () =>
context.go('/?q=${Uri.encodeQueryComponent(tag)}'),
),
],
),
],
],
);
}
Map<String, List<String>> _groups(Post post) {
if (post.tagGroups.isNotEmpty) {
final ordered = <String, List<String>>{};
for (final key in [
'artist',
'character',
'copyright',
'species',
'meta',
'general',
]) {
final tags = post.tagGroups[key];
if (tags != null && tags.isNotEmpty) ordered[key] = tags;
}
for (final entry in post.tagGroups.entries) {
ordered.putIfAbsent(entry.key, () => entry.value);
}
return ordered;
}
return {'general': post.tags};
}
String _label(String key) {
return switch (key) {
'artist' => 'Artist',
'character' => 'Character',
'copyright' => 'Copyright / Title',
'species' => 'Species',
'meta' => 'Meta',
'general' => 'General',
_ => 'Other',
};
}
}