Show badge in more places

♻️ Refactor account image
This commit is contained in:
2025-03-02 21:52:41 +08:00
parent 22fde6b400
commit 17e6b81f76
4 changed files with 60 additions and 25 deletions

View File

@ -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<SnNetworkProvider>();
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(

View File

@ -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),
),
],
)

View File

@ -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<UserDirectoryProvider>();
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(