diff --git a/lib/widgets/attachments/attachment_item.dart b/lib/widgets/attachments/attachment_item.dart index 1774137..aa67cf5 100644 --- a/lib/widgets/attachments/attachment_item.dart +++ b/lib/widgets/attachments/attachment_item.dart @@ -147,17 +147,21 @@ class _AttachmentItemImage extends StatelessWidget { errorWidget: (context, url, error) { return Material( color: Theme.of(context).colorScheme.surface, - child: Center( - child: const Icon(Icons.close, size: 32) - .animate(onPlay: (e) => e.repeat(reverse: true)) - .fade(duration: 500.ms), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.close, size: 32) + .animate(onPlay: (e) => e.repeat(reverse: true)) + .fade(duration: 500.ms), + Text(error.toString()), + ], ), ); }, ) else Image.network( - ServiceFinder.buildUrl('files', '/attachments/${item.id}'), + ServiceFinder.buildUrl('files', '/attachments/${item.rid}'), fit: fit, loadingBuilder: (BuildContext context, Widget child, ImageChunkEvent? loadingProgress) { @@ -174,10 +178,14 @@ class _AttachmentItemImage extends StatelessWidget { errorBuilder: (context, error, stackTrace) { return Material( color: Theme.of(context).colorScheme.surface, - child: Center( - child: const Icon(Icons.close, size: 32) - .animate(onPlay: (e) => e.repeat(reverse: true)) - .fade(duration: 500.ms), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.close, size: 32) + .animate(onPlay: (e) => e.repeat(reverse: true)) + .fade(duration: 500.ms), + Text(error.toString()), + ], ), ); }, diff --git a/lib/widgets/attachments/attachment_list.dart b/lib/widgets/attachments/attachment_list.dart index ef8dde8..1311903 100644 --- a/lib/widgets/attachments/attachment_list.dart +++ b/lib/widgets/attachments/attachment_list.dart @@ -132,6 +132,9 @@ class _AttachmentListState extends State { _getMetadataList(); } + Color get _unFocusColor => + Theme.of(context).colorScheme.onSurface.withOpacity(0.75); + @override Widget build(BuildContext context) { if (widget.attachmentsId.isEmpty) { @@ -139,12 +142,24 @@ class _AttachmentListState extends State { } if (_isLoading) { - return Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surfaceContainerHigh, - ), - child: const LinearProgressIndicator(), - ); + return Row( + children: [ + Icon( + Icons.file_copy, + size: 12, + color: _unFocusColor, + ).paddingOnly(right: 5), + Text( + 'attachmentHint'.trParams( + {'count': widget.attachmentsId.length.toString()}, + ), + style: TextStyle(color: _unFocusColor, fontSize: 12), + ) + ], + ) + .paddingSymmetric(horizontal: 8) + .animate(onPlay: (c) => c.repeat(reverse: true)) + .fadeIn(duration: 1250.ms); } if (widget.isColumn) { @@ -159,6 +174,9 @@ class _AttachmentListState extends State { if (element == null) return const SizedBox(); double ratio = element.metadata?['ratio']?.toDouble() ?? 16 / 9; return Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainerHigh, + ), constraints: BoxConstraints( maxWidth: widget.columnMaxWidth, maxHeight: 640, @@ -204,6 +222,7 @@ class _AttachmentListState extends State { final element = _attachmentsMeta[idx]; return Container( decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainerHigh, border: Border.all( color: Theme.of(context).dividerColor, width: 1, diff --git a/lib/widgets/link_expansion.dart b/lib/widgets/link_expansion.dart index aa79891..da5f6c4 100644 --- a/lib/widgets/link_expansion.dart +++ b/lib/widgets/link_expansion.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; @@ -17,8 +18,36 @@ class LinkExpansion extends StatelessWidget { return SvgPicture.network(url, width: width, height: height); } return PlatformInfo.canCacheImage - ? CachedNetworkImage(imageUrl: url, width: width, height: height) - : Image.network(url, width: width, height: height); + ? CachedNetworkImage( + imageUrl: url, + width: width, + height: height, + errorWidget: (context, url, error) { + return Material( + color: Theme.of(context).colorScheme.surface, + child: Center( + child: const Icon(Icons.close, size: 32) + .animate(onPlay: (e) => e.repeat(reverse: true)) + .fade(duration: 500.ms), + ), + ); + }, + ) + : Image.network( + url, + width: width, + height: height, + errorBuilder: (context, error, stackTrace) { + return Material( + color: Theme.of(context).colorScheme.surface, + child: Center( + child: const Icon(Icons.close, size: 32) + .animate(onPlay: (e) => e.repeat(reverse: true)) + .fade(duration: 500.ms), + ), + ); + }, + ); } @override diff --git a/pubspec.lock b/pubspec.lock index 2b0aec9..cc1f8a7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -865,10 +865,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: ddc16d34b0d74cb313986918c0f0885a7ba2fc24d8fb8419de75f0015144ccfe + sha256: "2ddb88e9ad56ae15ee144ed10e33886777eb5ca2509a914850a5faa7b52ff459" url: "https://pub.dev" source: hosted - version: "14.2.3" + version: "14.2.7" graphs: dependency: transitive description: @@ -953,10 +953,10 @@ packages: dependency: transitive description: name: image_picker_android - sha256: "8c5abf0dcc24fe6e8e0b4a5c0b51a5cf30cefdf6407a3213dae61edc75a70f56" + sha256: c0a6763d50b354793d0192afd0a12560b823147d3ded7c6b77daf658fa05cc85 url: "https://pub.dev" source: hosted - version: "0.8.12+12" + version: "0.8.12+13" image_picker_for_web: dependency: transitive description: @@ -1153,10 +1153,10 @@ packages: dependency: "direct main" description: name: media_kit - sha256: "3289062540e3b8b9746e5c50d95bd78a9289826b7227e253dff806d002b9e67a" + sha256: "1f1deee148533d75129a6f38251ff8388e33ee05fc2d20a6a80e57d6051b7b62" url: "https://pub.dev" source: hosted - version: "1.1.10+1" + version: "1.1.11" media_kit_libs_android_video: dependency: transitive description: @@ -1193,34 +1193,34 @@ packages: dependency: "direct main" description: name: media_kit_libs_video - sha256: "3688e0c31482074578652bf038ce6301a5d21e1eda6b54fc3117ffeb4bdba067" + sha256: "20bb4aefa8fece282b59580e1cd8528117297083a6640c98c2e98cfc96b93288" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" media_kit_libs_windows_video: dependency: transitive description: name: media_kit_libs_windows_video - sha256: "7bace5f35d9afcc7f9b5cdadb7541d2191a66bb3fc71bfa11c1395b3360f6122" + sha256: "32654572167825c42c55466f5d08eee23ea11061c84aa91b09d0e0f69bdd0887" url: "https://pub.dev" source: hosted - version: "1.0.9" + version: "1.0.10" media_kit_native_event_loop: dependency: transitive description: name: media_kit_native_event_loop - sha256: a605cf185499d14d58935b8784955a92a4bf0ff4e19a23de3d17a9106303930e + sha256: "7d82e3b3e9ded5c35c3146c5ba1da3118d1dd8ac3435bac7f29f458181471b40" url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.0.9" media_kit_video: dependency: "direct main" description: name: media_kit_video - sha256: c048d11a19e379aebbe810647636e3fc6d18374637e2ae12def4ff8a4b99a882 + sha256: "2cc3b966679963ba25a4ce5b771e532a521ebde7c6aa20e9802bec95d9916c8f" url: "https://pub.dev" source: hosted - version: "1.2.4" + version: "1.2.5" meta: dependency: transitive description: @@ -1385,10 +1385,10 @@ packages: dependency: transitive description: name: permission_handler_html - sha256: d220eb8476b466d58b161e10b3001d93999010a26228a3fb89c4280db1249546 + sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 url: "https://pub.dev" source: hosted - version: "0.1.3+1" + version: "0.1.3+2" permission_handler_platform_interface: dependency: transitive description: @@ -1481,10 +1481,10 @@ packages: dependency: transitive description: name: process_run - sha256: c917dfb5f7afad4c7485bc00a4df038621248fce046105020cea276d1a87c820 + sha256: "112a77da35be50617ed9e2230df68d0817972f225e7f97ce8336f76b4e601606" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" protobuf: dependency: transitive description: @@ -1934,10 +1934,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79 + sha256: e35a698ac302dd68e41f73250bd9517fe3ab5fa4f18fe4647a0872db61bacbab url: "https://pub.dev" source: hosted - version: "6.3.9" + version: "6.3.10" url_launcher_ios: dependency: transitive description: @@ -2140,4 +2140,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.5.0 <4.0.0" - flutter: ">=3.22.0" + flutter: ">=3.24.0"