53 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
| import 'package:flutter/material.dart';
 | |
| 
 | |
| import 'package:badges/badges.dart' as b;
 | |
| import 'package:matrix/matrix.dart';
 | |
| 
 | |
| import 'matrix.dart';
 | |
| 
 | |
| class UnreadRoomsBadge extends StatelessWidget {
 | |
|   final bool Function(Room) filter;
 | |
|   final b.BadgePosition? badgePosition;
 | |
|   final Widget? child;
 | |
| 
 | |
|   const UnreadRoomsBadge({
 | |
|     super.key,
 | |
|     required this.filter,
 | |
|     this.badgePosition,
 | |
|     this.child,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     final theme = Theme.of(context);
 | |
| 
 | |
|     final unreadCount = Matrix.of(context)
 | |
|         .client
 | |
|         .rooms
 | |
|         .where(filter)
 | |
|         .where((r) => (r.isUnread || r.membership == Membership.invite))
 | |
|         .length;
 | |
|     return b.Badge(
 | |
|       badgeStyle: b.BadgeStyle(
 | |
|         badgeColor: theme.colorScheme.primary,
 | |
|         elevation: 4,
 | |
|         borderSide: BorderSide(
 | |
|           color: theme.colorScheme.surface,
 | |
|           width: 2,
 | |
|         ),
 | |
|       ),
 | |
|       badgeContent: Text(
 | |
|         unreadCount.toString(),
 | |
|         style: TextStyle(
 | |
|           color: theme.colorScheme.onPrimary,
 | |
|           fontSize: 12,
 | |
|         ),
 | |
|       ),
 | |
|       showBadge: unreadCount != 0,
 | |
|       badgeAnimation: const b.BadgeAnimation.scale(),
 | |
|       position: badgePosition ?? b.BadgePosition.bottomEnd(),
 | |
|       child: child,
 | |
|     );
 | |
|   }
 | |
| }
 |