diff --git a/lib/widgets/avatar_or_hash.dart b/lib/widgets/avatar_or_hash.dart index accae27..cdd1009 100644 --- a/lib/widgets/avatar_or_hash.dart +++ b/lib/widgets/avatar_or_hash.dart @@ -1,16 +1,19 @@ import "package:color_hash/color_hash.dart"; +import "package:flutter/material.dart"; import "package:flutter/widgets.dart"; class AvatarOrHash extends StatelessWidget { final Uri? avatar; final String title; final Widget? fallback; + final bool hasBadge; final double height; final Map headers; const AvatarOrHash( this.avatar, this.title, { this.fallback, + this.hasBadge = false, this.height = 24, required this.headers, super.key, @@ -22,18 +25,24 @@ class AvatarOrHash extends StatelessWidget { color: ColorHash(title).color, child: Center(child: Text(title[0])), ); - return ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(4)), - child: SizedBox( - height: height, - width: height, - child: avatar == null - ? fallback ?? box - : Image.network( - avatar.toString(), - headers: headers, - errorBuilder: (_, _, _) => box, - ), + return Center( + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(4)), + child: Badge( + isLabelVisible: hasBadge, + smallSize: 10, + backgroundColor: Theme.of(context).colorScheme.primary, + child: avatar == null + ? fallback ?? box + : Image.network( + avatar.toString(), + headers: headers, + width: height, + height: height, + fit: BoxFit.contain, + errorBuilder: (_, _, _) => box, + ), + ), ), ); } diff --git a/lib/widgets/chat_page/room_appbar.dart b/lib/widgets/chat_page/room_appbar.dart index e61b43c..83396e9 100644 --- a/lib/widgets/chat_page/room_appbar.dart +++ b/lib/widgets/chat_page/room_appbar.dart @@ -26,7 +26,7 @@ class RoomAppbar extends StatelessWidget implements PreferredSizeWidget { ? AvatarOrHash( room.avatar, room.title, - height: 32, + height: 24, fallback: Icon(Icons.numbers), headers: room.roomData.client.headers, ) diff --git a/lib/widgets/chat_page/sidebar.dart b/lib/widgets/chat_page/sidebar.dart index 417dff3..4470757 100644 --- a/lib/widgets/chat_page/sidebar.dart +++ b/lib/widgets/chat_page/sidebar.dart @@ -8,7 +8,6 @@ import "package:nexus/controllers/spaces_controller.dart"; import "package:nexus/helpers/extension_helper.dart"; import "package:nexus/pages/settings_page.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; -import "package:nexus/widgets/chat_page/unread.dart"; class Sidebar extends HookConsumerWidget { const Sidebar({super.key}); @@ -47,18 +46,16 @@ class Sidebar extends HookConsumerWidget { destinations: spaces .map( (space) => NavigationRailDestination( - icon: Unread( - isUnread: + icon: AvatarOrHash( + space.avatar, + fallback: space.icon, + space.title, + headers: space.client.headers, + hasBadge: space.children.firstWhereOrNull( (room) => room.roomData.hasNewMessages, ) != null, - child: AvatarOrHash( - space.avatar, - fallback: space.icon, - space.title, - headers: space.client.headers, - ), ), label: Text(space.title), padding: EdgeInsets.only(top: 4), @@ -110,16 +107,14 @@ class Sidebar extends HookConsumerWidget { .map( (room) => NavigationRailDestination( label: Text(room.title), - icon: Unread( - isUnread: room.roomData.hasNewMessages, - child: AvatarOrHash( - room.avatar, - room.title, - fallback: selectedSpace == 1 - ? null - : Icon(Icons.numbers), - headers: space.client.headers, - ), + icon: AvatarOrHash( + hasBadge: room.roomData.hasNewMessages, + room.avatar, + room.title, + fallback: selectedSpace == 1 + ? null + : Icon(Icons.numbers), + headers: space.client.headers, ), ), ) diff --git a/lib/widgets/chat_page/unread.dart b/lib/widgets/chat_page/unread.dart deleted file mode 100644 index 4c478ed..0000000 --- a/lib/widgets/chat_page/unread.dart +++ /dev/null @@ -1,15 +0,0 @@ -import "package:flutter/material.dart"; - -class Unread extends StatelessWidget { - final bool isUnread; - final Widget child; - const Unread({required this.isUnread, required this.child, super.key}); - - @override - Widget build(BuildContext context) => Badge( - smallSize: 8, - backgroundColor: Theme.of(context).colorScheme.primary, - isLabelVisible: isUnread, - child: child, - ); -}