✨ Attachment badges
This commit is contained in:
		| @@ -1,20 +1,58 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:get/get.dart'; | ||||
| import 'package:solian/models/attachment.dart'; | ||||
| import 'package:solian/services.dart'; | ||||
|  | ||||
| class AttachmentItem extends StatelessWidget { | ||||
|   final Attachment item; | ||||
|   final String? badge; | ||||
|   final bool show; | ||||
|   final Function onHide; | ||||
|  | ||||
|   const AttachmentItem({super.key, required this.item}); | ||||
|   const AttachmentItem({ | ||||
|     super.key, | ||||
|     required this.item, | ||||
|     required this.onHide, | ||||
|     this.badge, | ||||
|     this.show = true, | ||||
|   }); | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Hero( | ||||
|       tag: Key('a${item.uuid}'), | ||||
|       child: Image.network( | ||||
|         '${ServiceFinder.services['paperclip']}/api/attachments/${item.id}', | ||||
|         fit: BoxFit.cover, | ||||
|       child: Stack( | ||||
|         fit: StackFit.expand, | ||||
|         children: [ | ||||
|           Image.network( | ||||
|             '${ServiceFinder.services['paperclip']}/api/attachments/${item.id}', | ||||
|             fit: BoxFit.cover, | ||||
|           ), | ||||
|           if (show && badge != null) | ||||
|             Positioned( | ||||
|               right: 12, | ||||
|               bottom: 8, | ||||
|               child: Material( | ||||
|                 color: Colors.transparent, | ||||
|                 child: Chip(label: Text(badge!)), | ||||
|               ), | ||||
|             ), | ||||
|           if (show && item.isMature) | ||||
|             Positioned( | ||||
|               top: 8, | ||||
|               left: 12, | ||||
|               child: Material( | ||||
|                 color: Colors.transparent, | ||||
|                 child: ActionChip( | ||||
|                   visualDensity: const VisualDensity(vertical: -4, horizontal: -4), | ||||
|                   avatar: Icon(Icons.visibility_off, color: Theme.of(context).colorScheme.onSurfaceVariant), | ||||
|                   label: Text('hide'.tr), | ||||
|                   onPressed: () => onHide(), | ||||
|                 ), | ||||
|               ), | ||||
|             ), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ class SolianMessages extends Translations { | ||||
|   @override | ||||
|   Map<String, Map<String, String>> get keys => { | ||||
|         'en_US': { | ||||
|           'hide': 'Hide', | ||||
|           'okay': 'Okay', | ||||
|           'next': 'Next', | ||||
|           'page': 'Page', | ||||
| @@ -52,6 +53,7 @@ class SolianMessages extends Translations { | ||||
|           'attachmentAlt': 'Alternative text', | ||||
|         }, | ||||
|         'zh_CN': { | ||||
|           'hide': '隐藏', | ||||
|           'okay': '确认', | ||||
|           'next': '下一步', | ||||
|           'cancel': '取消', | ||||
|   | ||||
| @@ -121,7 +121,15 @@ class _AttachmentListState extends State<AttachmentList> { | ||||
|             child: Stack( | ||||
|               fit: StackFit.expand, | ||||
|               children: [ | ||||
|                 AttachmentItem(key: Key('a${element!.uuid}'), item: element), | ||||
|                 AttachmentItem( | ||||
|                   key: Key('a${element!.uuid}'), | ||||
|                   item: element, | ||||
|                   badge: _attachmentsMeta.length > 1 ? '${idx+1}/${_attachmentsMeta.length}' : null, | ||||
|                   show: !element.isMature || _showMature, | ||||
|                   onHide: () { | ||||
|                     setState(() => _showMature = false); | ||||
|                   }, | ||||
|                 ), | ||||
|                 if (element.isMature && !_showMature) | ||||
|                   BackdropFilter( | ||||
|                     filter: ImageFilter.blur(sigmaX: 20, sigmaY: 20), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user