From e15575f0ae86e4649108a7dba28f2d691eaa1325 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 11 Aug 2021 16:34:24 +0530 Subject: [PATCH 1/3] refactor(ui): Replace `channel.extraDataStream` with `channel.nameStream`, `channel.imageStream` in `ChannelName` and `ChannelAvatar` widget respectively. Signed-off-by: xsahil03x --- .../lib/src/channel_avatar.dart | 13 ++--- .../lib/src/channel_name.dart | 36 ++++++------ .../test/src/channel_header_test.dart | 55 +++++++++---------- .../test/src/channel_image_test.dart | 47 ++++++---------- .../test/src/channel_name_test.dart | 12 ++-- .../test/src/channel_preview_test.dart | 12 ++-- .../test/src/thread_header_test.dart | 8 +-- 7 files changed, 79 insertions(+), 104 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/channel_avatar.dart b/packages/stream_chat_flutter/lib/src/channel_avatar.dart index 551fd278..a2390e81 100644 --- a/packages/stream_chat_flutter/lib/src/channel_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/channel_avatar.dart @@ -90,12 +90,11 @@ class ChannelAvatar extends StatelessWidget { final colorTheme = chatThemeData.colorTheme; final previewTheme = chatThemeData.channelPreviewTheme.avatarTheme; - return BetterStreamBuilder>( - stream: channel.extraDataStream, - initialData: channel.extraData, - builder: (context, extraData) { - final channelImage = extraData['image']; - + return StreamBuilder( + stream: channel.imageStream, + initialData: channel.image, + builder: (context, snapshot) { + final channelImage = snapshot.data; if (channelImage != null) { Widget child = ClipRRect( borderRadius: borderRadius ?? previewTheme?.borderRadius, @@ -108,7 +107,7 @@ class ChannelAvatar extends StatelessWidget { imageUrl: channelImage, errorWidget: (_, __, ___) => Center( child: Text( - extraData['name']?[0] ?? '', + channel.name?[0] ?? '', style: TextStyle( color: colorTheme.barsBg, fontWeight: FontWeight.bold, diff --git a/packages/stream_chat_flutter/lib/src/channel_name.dart b/packages/stream_chat_flutter/lib/src/channel_name.dart index 4ae4f935..6fb76d82 100644 --- a/packages/stream_chat_flutter/lib/src/channel_name.dart +++ b/packages/stream_chat_flutter/lib/src/channel_name.dart @@ -27,40 +27,40 @@ class ChannelName extends StatelessWidget { final client = StreamChat.of(context); final channel = StreamChannel.of(context).channel; - return BetterStreamBuilder>( - stream: channel.extraDataStream, - initialData: channel.extraData, - builder: (context, data) => _buildName( - data, - channel.state?.members, + assert(channel.state != null, 'Channel ${channel.id} is not initialized'); + + return StreamBuilder( + stream: channel.nameStream, + initialData: channel.name, + builder: (context, snapshot) => _buildName( + snapshot.data, + channel.state!.members, client, ), ); } Widget _buildName( - Map extraData, - List? members, + String? name, + List members, StreamChatState client, ) => LayoutBuilder( builder: (context, constraints) { - var title = context.translations.noTitleText; - if (extraData['name'] != null) { - title = extraData['name']; - } else { + var title = name; + if (title == null && members.isNotEmpty) { final otherMembers = members - ?.where((member) => member.userId != client.currentUser!.id); - if (otherMembers?.length == 1) { - if (otherMembers!.first.user != null) { + .where((member) => member.userId != client.currentUser!.id); + if (otherMembers.length == 1) { + if (otherMembers.first.user != null) { title = otherMembers.first.user!.name; } - } else if (otherMembers?.isNotEmpty == true) { + } else if (otherMembers.isNotEmpty == true) { final maxWidth = constraints.maxWidth; final maxChars = maxWidth / (textStyle?.fontSize ?? 1); var currentChars = 0; final currentMembers = []; - otherMembers!.forEach((element) { + otherMembers.forEach((element) { final newLength = currentChars + (element.user?.name.length ?? 0); if (newLength < maxChars) { @@ -77,7 +77,7 @@ class ChannelName extends StatelessWidget { } return Text( - title, + title ?? context.translations.noTitleText, style: textStyle, overflow: textOverflow, ); diff --git a/packages/stream_chat_flutter/test/src/channel_header_test.dart b/packages/stream_chat_flutter/test/src/channel_header_test.dart index f7157871..95d2e751 100644 --- a/packages/stream_chat_flutter/test/src/channel_header_test.dart +++ b/packages/stream_chat_flutter/test/src/channel_header_test.dart @@ -26,12 +26,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => client.wsConnectionStatusStream) .thenAnswer((_) => Stream.value(ConnectionStatus.connected)); @@ -91,12 +90,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); @@ -159,12 +157,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); @@ -305,12 +302,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); @@ -373,12 +369,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); diff --git a/packages/stream_chat_flutter/test/src/channel_image_test.dart b/packages/stream_chat_flutter/test/src/channel_image_test.dart index f6d110dd..be2ade55 100644 --- a/packages/stream_chat_flutter/test/src/channel_image_test.dart +++ b/packages/stream_chat_flutter/test/src/channel_image_test.dart @@ -20,14 +20,11 @@ void main() { when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id')); when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - 'image': 'imagetest', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - 'image': 'imagetest', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); await tester.pumpWidget(MaterialApp( home: StreamChat( @@ -43,7 +40,7 @@ void main() { final image = tester.widget(find.byType(CachedNetworkImage)); - expect(image.imageUrl, 'imagetest'); + expect(image.imageUrl, 'https://bit.ly/321RmWb'); }, ); @@ -59,12 +56,10 @@ void main() { when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id')); when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream).thenAnswer((i) => Stream.value(null)); + when(() => channel.image).thenReturn(null); when(() => channelState.membersStream).thenAnswer((i) => Stream.value([ Member( userId: 'user-id', @@ -132,12 +127,9 @@ void main() { when(() => clientState.currentUser).thenReturn(currentUser); when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream).thenAnswer((i) => Stream.value(null)); final members = [ Member( userId: 'user-id', @@ -198,14 +190,11 @@ void main() { when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id')); when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - 'image': 'imagetest', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - 'image': 'imagetest', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); await tester.pumpWidget(MaterialApp( home: StreamChat( diff --git a/packages/stream_chat_flutter/test/src/channel_name_test.dart b/packages/stream_chat_flutter/test/src/channel_name_test.dart index fc868eb0..dcfda04f 100644 --- a/packages/stream_chat_flutter/test/src/channel_name_test.dart +++ b/packages/stream_chat_flutter/test/src/channel_name_test.dart @@ -21,17 +21,13 @@ void main() { when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); - when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.isMutedStream).thenAnswer((_) => Stream.value(false)); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); - when(() => channelState.membersStream).thenAnswer((i) => Stream.value([ + when(() => channelState.membersStream).thenAnswer((_) => Stream.value([ Member( userId: 'user-id', user: User(id: 'user-id'), diff --git a/packages/stream_chat_flutter/test/src/channel_preview_test.dart b/packages/stream_chat_flutter/test/src/channel_preview_test.dart index 7d0c549e..0ffa9a36 100644 --- a/packages/stream_chat_flutter/test/src/channel_preview_test.dart +++ b/packages/stream_chat_flutter/test/src/channel_preview_test.dart @@ -26,12 +26,12 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test name', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test name', - }); + when(() => channel.nameStream) + .thenAnswer((i) => Stream.value('test name')); + when(() => channel.name).thenReturn('test name'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => clientState.channels).thenReturn({ channel.cid!: channel, }); diff --git a/packages/stream_chat_flutter/test/src/thread_header_test.dart b/packages/stream_chat_flutter/test/src/thread_header_test.dart index 1bc4c865..babe4318 100644 --- a/packages/stream_chat_flutter/test/src/thread_header_test.dart +++ b/packages/stream_chat_flutter/test/src/thread_header_test.dart @@ -22,12 +22,8 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.name).thenReturn('test'); + when(() => channel.nameStream).thenAnswer((i) => Stream.value('test')); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); From 54b162749d44c77b0b78aa0743668b621a1e9bcd Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 11 Aug 2021 16:34:24 +0530 Subject: [PATCH 2/3] refactor(ui): Replace `channel.extraDataStream` with `channel.nameStream`, `channel.imageStream` in `ChannelName` and `ChannelAvatar` widget respectively. Signed-off-by: xsahil03x --- .../lib/src/channel_avatar.dart | 13 ++--- .../lib/src/channel_name.dart | 36 ++++++------ .../test/src/channel_header_test.dart | 55 +++++++++---------- .../test/src/channel_image_test.dart | 47 ++++++---------- .../test/src/channel_name_test.dart | 12 ++-- .../test/src/channel_preview_test.dart | 12 ++-- .../test/src/thread_header_test.dart | 8 +-- 7 files changed, 79 insertions(+), 104 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/channel_avatar.dart b/packages/stream_chat_flutter/lib/src/channel_avatar.dart index 551fd278..a2390e81 100644 --- a/packages/stream_chat_flutter/lib/src/channel_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/channel_avatar.dart @@ -90,12 +90,11 @@ class ChannelAvatar extends StatelessWidget { final colorTheme = chatThemeData.colorTheme; final previewTheme = chatThemeData.channelPreviewTheme.avatarTheme; - return BetterStreamBuilder>( - stream: channel.extraDataStream, - initialData: channel.extraData, - builder: (context, extraData) { - final channelImage = extraData['image']; - + return StreamBuilder( + stream: channel.imageStream, + initialData: channel.image, + builder: (context, snapshot) { + final channelImage = snapshot.data; if (channelImage != null) { Widget child = ClipRRect( borderRadius: borderRadius ?? previewTheme?.borderRadius, @@ -108,7 +107,7 @@ class ChannelAvatar extends StatelessWidget { imageUrl: channelImage, errorWidget: (_, __, ___) => Center( child: Text( - extraData['name']?[0] ?? '', + channel.name?[0] ?? '', style: TextStyle( color: colorTheme.barsBg, fontWeight: FontWeight.bold, diff --git a/packages/stream_chat_flutter/lib/src/channel_name.dart b/packages/stream_chat_flutter/lib/src/channel_name.dart index 4ae4f935..6fb76d82 100644 --- a/packages/stream_chat_flutter/lib/src/channel_name.dart +++ b/packages/stream_chat_flutter/lib/src/channel_name.dart @@ -27,40 +27,40 @@ class ChannelName extends StatelessWidget { final client = StreamChat.of(context); final channel = StreamChannel.of(context).channel; - return BetterStreamBuilder>( - stream: channel.extraDataStream, - initialData: channel.extraData, - builder: (context, data) => _buildName( - data, - channel.state?.members, + assert(channel.state != null, 'Channel ${channel.id} is not initialized'); + + return StreamBuilder( + stream: channel.nameStream, + initialData: channel.name, + builder: (context, snapshot) => _buildName( + snapshot.data, + channel.state!.members, client, ), ); } Widget _buildName( - Map extraData, - List? members, + String? name, + List members, StreamChatState client, ) => LayoutBuilder( builder: (context, constraints) { - var title = context.translations.noTitleText; - if (extraData['name'] != null) { - title = extraData['name']; - } else { + var title = name; + if (title == null && members.isNotEmpty) { final otherMembers = members - ?.where((member) => member.userId != client.currentUser!.id); - if (otherMembers?.length == 1) { - if (otherMembers!.first.user != null) { + .where((member) => member.userId != client.currentUser!.id); + if (otherMembers.length == 1) { + if (otherMembers.first.user != null) { title = otherMembers.first.user!.name; } - } else if (otherMembers?.isNotEmpty == true) { + } else if (otherMembers.isNotEmpty == true) { final maxWidth = constraints.maxWidth; final maxChars = maxWidth / (textStyle?.fontSize ?? 1); var currentChars = 0; final currentMembers = []; - otherMembers!.forEach((element) { + otherMembers.forEach((element) { final newLength = currentChars + (element.user?.name.length ?? 0); if (newLength < maxChars) { @@ -77,7 +77,7 @@ class ChannelName extends StatelessWidget { } return Text( - title, + title ?? context.translations.noTitleText, style: textStyle, overflow: textOverflow, ); diff --git a/packages/stream_chat_flutter/test/src/channel_header_test.dart b/packages/stream_chat_flutter/test/src/channel_header_test.dart index f7157871..95d2e751 100644 --- a/packages/stream_chat_flutter/test/src/channel_header_test.dart +++ b/packages/stream_chat_flutter/test/src/channel_header_test.dart @@ -26,12 +26,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => client.wsConnectionStatusStream) .thenAnswer((_) => Stream.value(ConnectionStatus.connected)); @@ -91,12 +90,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); @@ -159,12 +157,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); @@ -305,12 +302,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); @@ -373,12 +369,11 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); diff --git a/packages/stream_chat_flutter/test/src/channel_image_test.dart b/packages/stream_chat_flutter/test/src/channel_image_test.dart index f6d110dd..be2ade55 100644 --- a/packages/stream_chat_flutter/test/src/channel_image_test.dart +++ b/packages/stream_chat_flutter/test/src/channel_image_test.dart @@ -20,14 +20,11 @@ void main() { when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id')); when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - 'image': 'imagetest', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - 'image': 'imagetest', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); await tester.pumpWidget(MaterialApp( home: StreamChat( @@ -43,7 +40,7 @@ void main() { final image = tester.widget(find.byType(CachedNetworkImage)); - expect(image.imageUrl, 'imagetest'); + expect(image.imageUrl, 'https://bit.ly/321RmWb'); }, ); @@ -59,12 +56,10 @@ void main() { when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id')); when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream).thenAnswer((i) => Stream.value(null)); + when(() => channel.image).thenReturn(null); when(() => channelState.membersStream).thenAnswer((i) => Stream.value([ Member( userId: 'user-id', @@ -132,12 +127,9 @@ void main() { when(() => clientState.currentUser).thenReturn(currentUser); when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream).thenAnswer((i) => Stream.value(null)); final members = [ Member( userId: 'user-id', @@ -198,14 +190,11 @@ void main() { when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id')); when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - 'image': 'imagetest', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - 'image': 'imagetest', - }); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); await tester.pumpWidget(MaterialApp( home: StreamChat( diff --git a/packages/stream_chat_flutter/test/src/channel_name_test.dart b/packages/stream_chat_flutter/test/src/channel_name_test.dart index fc868eb0..dcfda04f 100644 --- a/packages/stream_chat_flutter/test/src/channel_name_test.dart +++ b/packages/stream_chat_flutter/test/src/channel_name_test.dart @@ -21,17 +21,13 @@ void main() { when(() => channel.state).thenReturn(channelState); when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); - when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.isMutedStream).thenAnswer((_) => Stream.value(false)); + when(() => channel.nameStream).thenAnswer((_) => Stream.value('test')); + when(() => channel.name).thenReturn('test'); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); - when(() => channelState.membersStream).thenAnswer((i) => Stream.value([ + when(() => channelState.membersStream).thenAnswer((_) => Stream.value([ Member( userId: 'user-id', user: User(id: 'user-id'), diff --git a/packages/stream_chat_flutter/test/src/channel_preview_test.dart b/packages/stream_chat_flutter/test/src/channel_preview_test.dart index d6f3a5ea..47554605 100644 --- a/packages/stream_chat_flutter/test/src/channel_preview_test.dart +++ b/packages/stream_chat_flutter/test/src/channel_preview_test.dart @@ -28,12 +28,12 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test name', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test name', - }); + when(() => channel.nameStream) + .thenAnswer((i) => Stream.value('test name')); + when(() => channel.name).thenReturn('test name'); + when(() => channel.imageStream) + .thenAnswer((i) => Stream.value('https://bit.ly/321RmWb')); + when(() => channel.image).thenReturn('https://bit.ly/321RmWb'); when(() => clientState.channels).thenReturn({ channel.cid!: channel, }); diff --git a/packages/stream_chat_flutter/test/src/thread_header_test.dart b/packages/stream_chat_flutter/test/src/thread_header_test.dart index 1bc4c865..babe4318 100644 --- a/packages/stream_chat_flutter/test/src/thread_header_test.dart +++ b/packages/stream_chat_flutter/test/src/thread_header_test.dart @@ -22,12 +22,8 @@ void main() { when(() => channel.client).thenReturn(client); when(() => channel.isMuted).thenReturn(false); when(() => channel.isMutedStream).thenAnswer((i) => Stream.value(false)); - when(() => channel.extraDataStream).thenAnswer((i) => Stream.value({ - 'name': 'test', - })); - when(() => channel.extraData).thenReturn({ - 'name': 'test', - }); + when(() => channel.name).thenReturn('test'); + when(() => channel.nameStream).thenAnswer((i) => Stream.value('test')); when(() => channelState.unreadCount).thenReturn(1); when(() => channelState.unreadCountStream) .thenAnswer((i) => Stream.value(1)); From 8627865b44405596c912bc278c1a304a0411bc3a Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 20 Aug 2021 17:04:32 +0530 Subject: [PATCH 3/3] refactor(ui): use `BetterStreamBuilder` in `ChannelAvatar` and `ChannelName` Signed-off-by: xsahil03x --- .../lib/src/channel_avatar.dart | 80 +++++++++---------- .../lib/src/channel_name.dart | 39 +++++---- 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/channel_avatar.dart b/packages/stream_chat_flutter/lib/src/channel_avatar.dart index a2390e81..ace5f310 100644 --- a/packages/stream_chat_flutter/lib/src/channel_avatar.dart +++ b/packages/stream_chat_flutter/lib/src/channel_avatar.dart @@ -90,56 +90,54 @@ class ChannelAvatar extends StatelessWidget { final colorTheme = chatThemeData.colorTheme; final previewTheme = chatThemeData.channelPreviewTheme.avatarTheme; - return StreamBuilder( + return BetterStreamBuilder( stream: channel.imageStream, initialData: channel.image, - builder: (context, snapshot) { - final channelImage = snapshot.data; - if (channelImage != null) { - Widget child = ClipRRect( - borderRadius: borderRadius ?? previewTheme?.borderRadius, - child: Container( - constraints: constraints ?? previewTheme?.constraints, - decoration: BoxDecoration(color: colorTheme.accentPrimary), - child: InkWell( - onTap: onTap, - child: CachedNetworkImage( - imageUrl: channelImage, - errorWidget: (_, __, ___) => Center( - child: Text( - channel.name?[0] ?? '', - style: TextStyle( - color: colorTheme.barsBg, - fontWeight: FontWeight.bold, - ), + builder: (context, channelImage) { + Widget child = ClipRRect( + borderRadius: borderRadius ?? previewTheme?.borderRadius, + child: Container( + constraints: constraints ?? previewTheme?.constraints, + decoration: BoxDecoration(color: colorTheme.accentPrimary), + child: InkWell( + onTap: onTap, + child: CachedNetworkImage( + imageUrl: channelImage, + errorWidget: (_, __, ___) => Center( + child: Text( + channel.name?[0] ?? '', + style: TextStyle( + color: colorTheme.barsBg, + fontWeight: FontWeight.bold, ), ), - fit: BoxFit.cover, ), + fit: BoxFit.cover, + ), + ), + ), + ); + + if (selected) { + child = ClipRRect( + key: const Key('selectedImage'), + borderRadius: BorderRadius.circular(selectionThickness) + + (borderRadius ?? + previewTheme?.borderRadius ?? + BorderRadius.zero), + child: Container( + constraints: constraints ?? previewTheme?.constraints, + color: selectionColor ?? colorTheme.accentPrimary, + child: Padding( + padding: EdgeInsets.all(selectionThickness), + child: child, ), ), ); - - if (selected) { - child = ClipRRect( - key: const Key('selectedImage'), - borderRadius: BorderRadius.circular(selectionThickness) + - (borderRadius ?? - previewTheme?.borderRadius ?? - BorderRadius.zero), - child: Container( - constraints: constraints ?? previewTheme?.constraints, - color: selectionColor ?? colorTheme.accentPrimary, - child: Padding( - padding: EdgeInsets.all(selectionThickness), - child: child, - ), - ), - ); - } - return child; } - + return child; + }, + noDataBuilder: (context) { final currentUser = streamChat.currentUser!; final otherMembers = channel.state!.members .where((it) => it.userId != currentUser.id) diff --git a/packages/stream_chat_flutter/lib/src/channel_name.dart b/packages/stream_chat_flutter/lib/src/channel_name.dart index 6fb76d82..918aa076 100644 --- a/packages/stream_chat_flutter/lib/src/channel_name.dart +++ b/packages/stream_chat_flutter/lib/src/channel_name.dart @@ -29,33 +29,39 @@ class ChannelName extends StatelessWidget { assert(channel.state != null, 'Channel ${channel.id} is not initialized'); - return StreamBuilder( + return BetterStreamBuilder( stream: channel.nameStream, initialData: channel.name, - builder: (context, snapshot) => _buildName( - snapshot.data, + builder: (context, channelName) => Text( + channelName, + style: textStyle, + overflow: textOverflow, + ), + noDataBuilder: (context) => _generateName( + client.currentUser!, channel.state!.members, - client, ), ); } - Widget _buildName( - String? name, + Widget _generateName( + User currentUser, List members, - StreamChatState client, ) => LayoutBuilder( builder: (context, constraints) { - var title = name; - if (title == null && members.isNotEmpty) { - final otherMembers = members - .where((member) => member.userId != client.currentUser!.id); + var channelName = context.translations.noTitleText; + final otherMembers = members.where( + (member) => member.userId != currentUser.id, + ); + + if (otherMembers.isNotEmpty) { if (otherMembers.length == 1) { - if (otherMembers.first.user != null) { - title = otherMembers.first.user!.name; + final user = otherMembers.first.user; + if (user != null) { + channelName = user.name; } - } else if (otherMembers.isNotEmpty == true) { + } else { final maxWidth = constraints.maxWidth; final maxChars = maxWidth / (textStyle?.fontSize ?? 1); var currentChars = 0; @@ -71,13 +77,14 @@ class ChannelName extends StatelessWidget { final exceedingMembers = otherMembers.length - currentMembers.length; - title = '${currentMembers.map((e) => e.user?.name).join(', ')} ' + channelName = + '${currentMembers.map((e) => e.user?.name).join(', ')} ' '${exceedingMembers > 0 ? '+ $exceedingMembers' : ''}'; } } return Text( - title ?? context.translations.noTitleText, + channelName, style: textStyle, overflow: textOverflow, );