61 lines
1.8 KiB
Dart
61 lines
1.8 KiB
Dart
import 'package:cached_network_image/cached_network_image.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:island/models/activitypub.dart';
|
|
import 'package:material_symbols_icons/symbols.dart';
|
|
|
|
class ActorPictureWidget extends StatelessWidget {
|
|
final SnActivityPubActor actor;
|
|
final double radius;
|
|
|
|
const ActorPictureWidget({super.key, required this.actor, this.radius = 16});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final avatarUrl = actor.avatarUrl;
|
|
if (avatarUrl == null) {
|
|
return CircleAvatar(
|
|
radius: radius,
|
|
backgroundColor: Theme.of(context).colorScheme.surfaceContainer,
|
|
child: Icon(
|
|
Symbols.person,
|
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
|
),
|
|
);
|
|
}
|
|
|
|
return Stack(
|
|
children: [
|
|
CircleAvatar(
|
|
backgroundImage: CachedNetworkImageProvider(avatarUrl),
|
|
radius: radius,
|
|
backgroundColor: Theme.of(context).colorScheme.surfaceContainer,
|
|
child: avatarUrl.isNotEmpty
|
|
? null
|
|
: Icon(
|
|
Symbols.person,
|
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
|
),
|
|
),
|
|
Positioned(
|
|
right: 0,
|
|
bottom: 0,
|
|
child: CircleAvatar(
|
|
backgroundImage: actor.instance.iconUrl != null
|
|
? CachedNetworkImageProvider(actor.instance.iconUrl!)
|
|
: null,
|
|
radius: radius * 0.4,
|
|
backgroundColor: Theme.of(context).colorScheme.primary,
|
|
child: actor.instance.iconUrl == null
|
|
? Icon(
|
|
Symbols.public,
|
|
size: radius * 0.6,
|
|
color: Theme.of(context).colorScheme.onPrimary,
|
|
)
|
|
: null,
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|