diff --git a/example/lib/advanced_options_page.dart b/example/lib/advanced_options_page.dart index 212a15a8..e07afefd 100644 --- a/example/lib/advanced_options_page.dart +++ b/example/lib/advanced_options_page.dart @@ -7,6 +7,8 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'main.dart'; import 'notifications_service.dart'; +import 'choose_user_page.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; class AdvancedOptionsPage extends StatefulWidget { @override @@ -285,6 +287,20 @@ class _AdvancedOptionsPageState extends State { if (!kIsWeb) { initNotifications(client); } + + final secureStorage = FlutterSecureStorage(); + secureStorage.write( + key: kStreamApiKey, + value: apiKey, + ); + secureStorage.write( + key: kStreamUserId, + value: userId, + ); + secureStorage.write( + key: kStreamToken, + value: userToken, + ); } catch (e) { var errorText = 'Error connecting, retry'; if (e is Map) { diff --git a/example/lib/choose_user_page.dart b/example/lib/choose_user_page.dart index 0e16f012..1ff2a268 100644 --- a/example/lib/choose_user_page.dart +++ b/example/lib/choose_user_page.dart @@ -133,7 +133,7 @@ class ChooseUserPage extends StatelessWidget { final secureStorage = FlutterSecureStorage(); final client = StreamChat.of(context).client; - + client.apiKey = kDefaultStreamApiKey; await client.setUser( user, token, diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 43eb867e..02c2c726 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,6 +1,6 @@ name: example description: A new Flutter project. -version: 1.0.72+74 +version: 1.0.75+77 environment: sdk: ">=2.2.2 <3.0.0" diff --git a/lib/src/channel_info.dart b/lib/src/channel_info.dart index 2aa1b2cd..402dd73f 100644 --- a/lib/src/channel_info.dart +++ b/lib/src/channel_info.dart @@ -17,8 +17,34 @@ class ChannelInfo extends StatelessWidget { @override Widget build(BuildContext context) { final client = StreamChat.of(context).client; + return StreamBuilder>( + stream: channel.state.membersStream, + initialData: channel.state.members, + builder: (context, snapshot) { + return ValueListenableBuilder( + valueListenable: client.wsConnectionStatus, + builder: (context, status, child) { + switch (status) { + case ConnectionStatus.connected: + return _buildConnectedTitleState(context, snapshot.data); + case ConnectionStatus.connecting: + return _buildConnectingTitleState(context); + case ConnectionStatus.disconnected: + return _buildDisconnectedTitleState(context, client); + default: + return Offstage(); + } + }, + ); + }, + ); + } + + Widget _buildConnectedTitleState(BuildContext context, List members) { + var alternativeWidget; + if (channel.memberCount != null && channel.memberCount > 2) { - return Text( + alternativeWidget = Text( '${channel.memberCount} Members, ${channel.state.watcherCount} Online', style: StreamChatTheme.of(context) .channelTheme @@ -26,52 +52,26 @@ class ChannelInfo extends StatelessWidget { .lastMessageAt, ); } else { - return StreamBuilder>( - stream: channel.state.membersStream, - initialData: channel.state.members, - builder: (context, snapshot) { - return ValueListenableBuilder( - valueListenable: client.wsConnectionStatus, - builder: (context, status, child) { - switch (status) { - case ConnectionStatus.connected: - return _buildConnectedTitleState(context, snapshot.data); - case ConnectionStatus.connecting: - return _buildConnectingTitleState(context); - case ConnectionStatus.disconnected: - return _buildDisconnectedTitleState(context, client); - default: - return Offstage(); - } - }, - ); - }, + final otherMember = members.firstWhere( + (element) => element.userId != StreamChat.of(context).user.id, + orElse: () => null, ); - } - } - Widget _buildConnectedTitleState(BuildContext context, List members) { - var alternativeWidget; - - final otherMember = members.firstWhere( - (element) => element.userId != StreamChat.of(context).user.id, - orElse: () => null, - ); - - if (otherMember != null) { - if (otherMember.user.online) { - alternativeWidget = Text( - 'Online', - style: StreamChatTheme.of(context) - .channelTheme - .channelHeaderTheme - .lastMessageAt, - ); - } else { - alternativeWidget = Text( - 'Last seen ${Jiffy(otherMember.user.lastActive).fromNow()}', - style: textStyle, - ); + if (otherMember != null) { + if (otherMember.user.online) { + alternativeWidget = Text( + 'Online', + style: StreamChatTheme.of(context) + .channelTheme + .channelHeaderTheme + .lastMessageAt, + ); + } else { + alternativeWidget = Text( + 'Last seen ${Jiffy(otherMember.user.lastActive).fromNow()}', + style: textStyle, + ); + } } } diff --git a/lib/src/channel_preview.dart b/lib/src/channel_preview.dart index 3c9eeace..26f68812 100644 --- a/lib/src/channel_preview.dart +++ b/lib/src/channel_preview.dart @@ -104,7 +104,7 @@ class ChannelPreview extends StatelessWidget { .isAfter(channel .state.lastMessage.createdAt)) .length == - (channel.memberCount ?? 0) - 1, + (channel.memberCount ?? 0), ), ); } diff --git a/lib/src/message_widget.dart b/lib/src/message_widget.dart index 86479ebe..280de349 100644 --- a/lib/src/message_widget.dart +++ b/lib/src/message_widget.dart @@ -426,12 +426,13 @@ class _MessageWidgetState extends State { top: 0, child: Material( color: Colors.white, + clipBehavior: Clip.antiAlias, shape: CircleBorder(), child: Padding( padding: const EdgeInsets.all(1.0), child: UserAvatar( user: e.user, - constraints: BoxConstraints.loose(Size.fromRadius(16)), + constraints: BoxConstraints.loose(Size.fromRadius(8)), showOnlineStatus: false, ), ), diff --git a/lib/src/stream_svg_icon.dart b/lib/src/stream_svg_icon.dart index 1b0c9ae9..9a87ce9d 100644 --- a/lib/src/stream_svg_icon.dart +++ b/lib/src/stream_svg_icon.dart @@ -25,7 +25,6 @@ class StreamSvgIcon extends StatelessWidget { height: height, key: key, color: color, - fit: BoxFit.scaleDown, alignment: Alignment.center, ) : SvgPicture.asset( @@ -35,7 +34,6 @@ class StreamSvgIcon extends StatelessWidget { width: width, height: height, color: color, - fit: BoxFit.scaleDown, alignment: Alignment.center, ); } diff --git a/lib/src/thread_header.dart b/lib/src/thread_header.dart index c6cce13e..aa14cb61 100644 --- a/lib/src/thread_header.dart +++ b/lib/src/thread_header.dart @@ -85,7 +85,7 @@ class ThreadHeader extends StatelessWidget implements PreferredSizeWidget { ? AspectRatio( aspectRatio: 1, child: IconButton( - onPressed: onBackPressed, + onPressed: onBackPressed ?? () => Navigator.pop(context), icon: StreamSvgIcon.close( size: 24, color: Theme.of(context).brightness == Brightness.dark diff --git a/lib/src/user_avatar.dart b/lib/src/user_avatar.dart index 2e1f3e0e..756252cc 100644 --- a/lib/src/user_avatar.dart +++ b/lib/src/user_avatar.dart @@ -40,6 +40,7 @@ class UserAvatar extends StatelessWidget { final streamChatTheme = StreamChatTheme.of(context); Widget avatar = ClipRRect( + clipBehavior: Clip.antiAlias, borderRadius: borderRadius ?? streamChatTheme.ownMessageTheme.avatarTheme.borderRadius, child: Container(