diff --git a/lib/providers/post.dart b/lib/providers/post.dart index 7c4589e..51b2efb 100644 --- a/lib/providers/post.dart +++ b/lib/providers/post.dart @@ -28,6 +28,7 @@ class SnPostContentProvider { Future> _preloadRelatedDataInBatch(List out) async { Set rids = {}; + Set uids = {}; for (var i = 0; i < out.length; i++) { rids.addAll(out[i].body['attachments']?.cast() ?? []); if (out[i].body['thumbnail'] != null) { @@ -41,6 +42,9 @@ class SnPostContentProvider { repostTo: await _preloadRelatedDataSingle(out[i].repostTo!), ); } + if (out[i].publisher.type == 0) { + uids.add(out[i].publisher.accountId); + } } final attachments = await _attach.getMultiple(rids.toList()); @@ -65,15 +69,15 @@ class SnPostContentProvider { ); } - await _ud.listAccount( - attachments.where((ele) => ele != null).map((ele) => ele!.accountId).toSet(), - ); + uids.addAll(attachments.where((ele) => ele != null).map((ele) => ele!.accountId)); + await _ud.listAccount(uids); return out; } Future _preloadRelatedDataSingle(SnPost out) async { Set rids = {}; + Set uids = {}; rids.addAll(out.body['attachments']?.cast() ?? []); if (out.body['thumbnail'] != null) { rids.add(out.body['thumbnail']); @@ -86,6 +90,9 @@ class SnPostContentProvider { repostTo: await _preloadRelatedDataSingle(out.repostTo!), ); } + if (out.publisher.type == 0) { + uids.add(out.publisher.accountId); + } final attachments = await _attach.getMultiple(rids.toList()); @@ -108,6 +115,9 @@ class SnPostContentProvider { ), ); + uids.addAll(attachments.where((ele) => ele != null).map((ele) => ele!.accountId)); + await _ud.listAccount(uids); + return out; } diff --git a/lib/widgets/account/account_image.dart b/lib/widgets/account/account_image.dart index c9f989b..e9ab60b 100644 --- a/lib/widgets/account/account_image.dart +++ b/lib/widgets/account/account_image.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:provider/provider.dart'; +import 'package:styled_widget/styled_widget.dart'; import 'package:surface/providers/sn_network.dart'; import 'package:surface/widgets/universal_image.dart'; @@ -9,6 +10,7 @@ class AccountImage extends StatelessWidget { final Color? backgroundColor; final Color? foregroundColor; final double? radius; + final double? borderRadius; final Widget? fallbackWidget; final Widget? badge; @@ -18,6 +20,7 @@ class AccountImage extends StatelessWidget { this.backgroundColor, this.foregroundColor, this.radius, + this.borderRadius, this.fallbackWidget, this.badge, }); @@ -27,29 +30,30 @@ class AccountImage extends StatelessWidget { final sn = context.read(); final url = sn.getAttachmentUrl(content ?? ''); - final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; return Stack( children: [ - CircleAvatar( - key: Key('attachment-${content.hashCode}'), - radius: radius, - backgroundColor: backgroundColor, - backgroundImage: (content?.isNotEmpty ?? false) - ? ResizeImage( - UniversalImage.provider(url), - width: ((radius ?? 20) * devicePixelRatio * 2).round(), - height: ((radius ?? 20) * devicePixelRatio * 2).round(), - policy: ResizeImagePolicy.fit, - ) - : null, - child: (content?.isEmpty ?? true) - ? (fallbackWidget ?? - Icon( - Symbols.account_circle, - size: radius != null ? radius! * 1.2 : 24, - color: foregroundColor, - )) - : null, + SizedBox( + width: (radius != null ? radius! : 20) * 2, + height: (radius != null ? radius! : 20) * 2, + child: ClipRRect( + borderRadius: BorderRadius.circular(borderRadius ?? radius ?? 20), + child: (content?.isEmpty ?? true) + ? Container( + color: backgroundColor ?? Theme.of(context).colorScheme.primaryContainer, + child: (fallbackWidget ?? + Icon( + Symbols.account_circle, + size: radius != null ? radius! * 1.2 : 24, + color: foregroundColor, + )) + .center(), + ) + : AutoResizeUniversalImage( + sn.getAttachmentUrl(url), + key: Key('attachment-${content.hashCode}'), + fit: BoxFit.cover, + ), + ), ), if (badge != null) Positioned( diff --git a/lib/widgets/chat/chat_message.dart b/lib/widgets/chat/chat_message.dart index 9e94598..1efc9e4 100644 --- a/lib/widgets/chat/chat_message.dart +++ b/lib/widgets/chat/chat_message.dart @@ -117,7 +117,7 @@ class ChatMessage extends StatelessWidget { Shadow( offset: Offset(1, 1), blurRadius: 5.0, - color: Color.fromARGB(150, 0, 0, 0), + color: Color.fromARGB(255, 0, 0, 0), ), ], ) diff --git a/lib/widgets/post/post_item.dart b/lib/widgets/post/post_item.dart index 4981d53..1b11c45 100644 --- a/lib/widgets/post/post_item.dart +++ b/lib/widgets/post/post_item.dart @@ -22,6 +22,7 @@ import 'package:share_plus/share_plus.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:surface/providers/config.dart'; import 'package:surface/providers/sn_network.dart'; +import 'package:surface/providers/user_directory.dart'; import 'package:surface/providers/userinfo.dart'; import 'package:surface/screens/post/post_detail.dart'; import 'package:surface/types/attachment.dart'; @@ -42,6 +43,8 @@ import 'package:surface/widgets/post/publisher_popover.dart'; import 'package:surface/widgets/universal_image.dart'; import 'package:xml/xml.dart'; +import '../../screens/account/profile_page.dart' show kBadgesMeta; + class OpenablePostItem extends StatelessWidget { final SnPost data; final bool showReactions; @@ -867,12 +870,30 @@ class _PostContentHeader extends StatelessWidget { @override Widget build(BuildContext context) { + final ud = context.read(); + final user = data.publisher.type == 0 ? ud.getAccountFromCache(data.publisher.accountId) : null; + return Row( children: [ GestureDetector( child: AccountImage( content: data.publisher.avatar, radius: isCompact ? 12 : 20, + badge: (user?.badges.isNotEmpty ?? false) + ? Icon( + kBadgesMeta[user!.badges.first.type]?.$2 ?? Symbols.question_mark, + color: kBadgesMeta[user.badges.first.type]?.$3, + fill: 1, + size: 18, + shadows: [ + Shadow( + offset: Offset(1, 1), + blurRadius: 5.0, + color: Color.fromARGB(255, 0, 0, 0), + ), + ], + ) + : null, ), onTap: () { showPopover(