fluffychat/lib/widgets/unread_rooms_badge.dart

60 lines
1.6 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
2023-01-26 08:47:30 +00:00
import 'package:badges/badges.dart' as b;
import 'package:matrix/matrix.dart';
import 'matrix.dart';
class UnreadRoomsBadge extends StatelessWidget {
final bool Function(Room) filter;
2023-01-26 08:47:30 +00:00
final b.BadgePosition? badgePosition;
final Widget? child;
const UnreadRoomsBadge({
super.key,
required this.filter,
this.badgePosition,
this.child,
});
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: Matrix.of(context)
.client
.onSync
.stream
.where((syncUpdate) => syncUpdate.hasRoomUpdate),
builder: (context, _) {
final unreadCount = Matrix.of(context)
.client
.rooms
.where(filter)
.where((r) => (r.isUnread || r.membership == Membership.invite))
.length;
return b.Badge(
2023-08-19 06:17:40 +00:00
badgeStyle: b.BadgeStyle(
badgeColor: Theme.of(context).colorScheme.primary,
elevation: 4,
borderSide: BorderSide(
2024-05-16 07:05:04 +00:00
color: Theme.of(context).colorScheme.surface,
2023-08-19 06:17:40 +00:00
width: 2,
),
),
badgeContent: Text(
unreadCount.toString(),
style: TextStyle(
color: Theme.of(context).colorScheme.onPrimary,
fontSize: 12,
),
),
showBadge: unreadCount != 0,
2023-08-19 06:17:40 +00:00
badgeAnimation: const b.BadgeAnimation.scale(),
position: badgePosition ?? b.BadgePosition.bottomEnd(),
child: child,
);
},
);
}
}