From 9d82134f44a3ac97ecc9e62ab363c9f8fdf229d5 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Wed, 20 Jan 2021 13:23:56 +0530 Subject: [PATCH 1/6] fix: removed online indicator on group info screen modal --- .../example/lib/group_info_screen.dart | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/packages/flutter_widgets/example/lib/group_info_screen.dart b/packages/flutter_widgets/example/lib/group_info_screen.dart index 2207c282..eee83c00 100644 --- a/packages/flutter_widgets/example/lib/group_info_screen.dart +++ b/packages/flutter_widgets/example/lib/group_info_screen.dart @@ -938,28 +938,7 @@ class _GroupInfoScreenState extends State { } } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (user.online) - Material( - type: MaterialType.circle, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - constraints: BoxConstraints.tightFor( - width: 28, - height: 12, - ), - child: Material( - shape: CircleBorder(), - color: Color(0xff20E070), - ), - ), - color: StreamChatTheme.of(context).colorTheme.white, - ), - alternativeWidget, - ], - ); + return alternativeWidget; } Widget _buildModalListTile( From 2e12742165396ce30c7afdedfc7d85ee7a20c0d9 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Wed, 20 Jan 2021 13:31:04 +0530 Subject: [PATCH 2/6] fix: centered and made online indicator in chat_info_screen.dart smaller --- packages/flutter_widgets/example/lib/chat_info_screen.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/flutter_widgets/example/lib/chat_info_screen.dart b/packages/flutter_widgets/example/lib/chat_info_screen.dart index 4106b96e..a6b14dec 100644 --- a/packages/flutter_widgets/example/lib/chat_info_screen.dart +++ b/packages/flutter_widgets/example/lib/chat_info_screen.dart @@ -382,7 +382,7 @@ class _ChatInfoScreenState extends State { child: Container( padding: const EdgeInsets.symmetric(horizontal: 8.0), constraints: BoxConstraints.tightFor( - width: 28, + width: 24, height: 12, ), child: Material( @@ -393,6 +393,10 @@ class _ChatInfoScreenState extends State { color: StreamChatTheme.of(context).colorTheme.white, ), alternativeWidget, + if (widget.user.online) + SizedBox( + width: 24.0, + ), ], ); } From 38dd71891462ecfabc6a977dad27d33888934f63 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Wed, 20 Jan 2021 15:46:45 +0530 Subject: [PATCH 3/6] fix: Fix modal user avatar border --- packages/flutter_widgets/lib/src/image_footer.dart | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/flutter_widgets/lib/src/image_footer.dart b/packages/flutter_widgets/lib/src/image_footer.dart index 0c7a463a..0131561e 100644 --- a/packages/flutter_widgets/lib/src/image_footer.dart +++ b/packages/flutter_widgets/lib/src/image_footer.dart @@ -272,10 +272,7 @@ class _ImageFooterState extends State { clipBehavior: Clip.antiAlias, decoration: BoxDecoration( shape: BoxShape.circle, - color: StreamChatTheme.of(context) - .colorTheme - .white - .withOpacity(0.6), + color: Colors.white.withOpacity(0.6), boxShadow: [ BoxShadow( blurRadius: 8.0, @@ -286,7 +283,7 @@ class _ImageFooterState extends State { ), ], ), - padding: const EdgeInsets.all(1), + padding: const EdgeInsets.all(2), child: UserAvatar( user: widget.message.user, constraints: From ded8b37e6104403b747f2d71c5993e8a3d11ec36 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Wed, 20 Jan 2021 16:04:06 +0530 Subject: [PATCH 4/6] fix: Menu closes on download --- packages/flutter_widgets/lib/src/image_actions_modal.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/flutter_widgets/lib/src/image_actions_modal.dart b/packages/flutter_widgets/lib/src/image_actions_modal.dart index 97729ca1..85ab5090 100644 --- a/packages/flutter_widgets/lib/src/image_actions_modal.dart +++ b/packages/flutter_widgets/lib/src/image_actions_modal.dart @@ -83,12 +83,12 @@ class ImageActionsModal extends StatelessWidget { urls[currentIndex].assetUrl ?? urls[currentIndex].thumbUrl; + Navigator.pop(context); + if (urls[currentIndex].type == 'video') { await _saveVideo(url); - Navigator.pop(context); } else { await _saveImage(url); - Navigator.pop(context); } }, ), From d48ccf15dfcb80f40e0b198c54f7e3de3fd9b1c3 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Wed, 20 Jan 2021 16:21:03 +0530 Subject: [PATCH 5/6] feat: Added message reply --- .../lib/src/full_screen_media.dart | 2 + .../lib/src/giphy_attachment.dart | 20 ++++++++-- .../lib/src/image_actions_modal.dart | 4 +- .../lib/src/image_attachment.dart | 10 ++++- .../flutter_widgets/lib/src/image_header.dart | 39 +++++++++++-------- .../lib/src/message_list_view.dart | 20 ++++++++++ .../lib/src/message_widget.dart | 5 +++ .../lib/src/video_attachment.dart | 10 ++++- 8 files changed, 84 insertions(+), 26 deletions(-) diff --git a/packages/flutter_widgets/lib/src/full_screen_media.dart b/packages/flutter_widgets/lib/src/full_screen_media.dart index e164eec8..473c9a05 100644 --- a/packages/flutter_widgets/lib/src/full_screen_media.dart +++ b/packages/flutter_widgets/lib/src/full_screen_media.dart @@ -10,6 +10,8 @@ import 'stream_channel.dart'; import '../stream_chat_flutter.dart'; +enum ReturnActionType { none, reply } + typedef ShowMessageCallback = void Function(Message message, Channel channel); /// A full screen image widget diff --git a/packages/flutter_widgets/lib/src/giphy_attachment.dart b/packages/flutter_widgets/lib/src/giphy_attachment.dart index df5a5705..6abe3df9 100644 --- a/packages/flutter_widgets/lib/src/giphy_attachment.dart +++ b/packages/flutter_widgets/lib/src/giphy_attachment.dart @@ -13,6 +13,7 @@ class GiphyAttachment extends StatelessWidget { final Message message; final Size size; final ShowMessageCallback onShowMessage; + final ValueChanged onReturnAction; const GiphyAttachment({ Key key, @@ -21,6 +22,7 @@ class GiphyAttachment extends StatelessWidget { this.message, this.size, this.onShowMessage, + this.onReturnAction, }) : super(key: key); @override @@ -65,8 +67,9 @@ class GiphyAttachment extends StatelessWidget { Padding( padding: const EdgeInsets.all(8.0), child: GestureDetector( - onTap: () { - Navigator.push(context, MaterialPageRoute(builder: (_) { + onTap: () async { + var res = await Navigator.push(context, + MaterialPageRoute(builder: (_) { final channel = StreamChannel.of(context).channel; return StreamChannel( @@ -82,6 +85,10 @@ class GiphyAttachment extends StatelessWidget { ), ); })); + + if (res != null) { + onReturnAction(res); + } }, child: ClipRRect( borderRadius: BorderRadius.only( @@ -320,8 +327,9 @@ class GiphyAttachment extends StatelessWidget { Widget _buildSentAttachment(context) { return Container( child: GestureDetector( - onTap: () { - Navigator.push(context, MaterialPageRoute(builder: (_) { + onTap: () async { + var res = + await Navigator.push(context, MaterialPageRoute(builder: (_) { var channel = StreamChannel.of(context).channel; return StreamChannel( @@ -337,6 +345,10 @@ class GiphyAttachment extends StatelessWidget { ), ); })); + + if (res != null) { + onReturnAction(res); + } }, child: Stack( children: [ diff --git a/packages/flutter_widgets/lib/src/image_actions_modal.dart b/packages/flutter_widgets/lib/src/image_actions_modal.dart index 85ab5090..2a251c61 100644 --- a/packages/flutter_widgets/lib/src/image_actions_modal.dart +++ b/packages/flutter_widgets/lib/src/image_actions_modal.dart @@ -60,7 +60,9 @@ class ImageActionsModal extends StatelessWidget { size: 24.0, color: StreamChatTheme.of(context).colorTheme.grey, ), - () {}, + () { + Navigator.pop(context, ReturnActionType.reply); + }, ), _buildButton( context, diff --git a/packages/flutter_widgets/lib/src/image_attachment.dart b/packages/flutter_widgets/lib/src/image_attachment.dart index f9e3290b..4be47262 100644 --- a/packages/flutter_widgets/lib/src/image_attachment.dart +++ b/packages/flutter_widgets/lib/src/image_attachment.dart @@ -14,6 +14,7 @@ class ImageAttachment extends StatelessWidget { final Size size; final bool showTitle; final ShowMessageCallback onShowMessage; + final ValueChanged onReturnAction; const ImageAttachment({ Key key, @@ -23,6 +24,7 @@ class ImageAttachment extends StatelessWidget { this.messageTheme, this.showTitle = true, this.onShowMessage, + this.onReturnAction, }) : super(key: key); @override @@ -42,8 +44,8 @@ class ImageAttachment extends StatelessWidget { children: [ Expanded( child: GestureDetector( - onTap: () { - Navigator.push( + onTap: () async { + var result = await Navigator.push( context, MaterialPageRoute( builder: (_) { @@ -64,6 +66,10 @@ class ImageAttachment extends StatelessWidget { }, ), ); + + if (result != null) { + onReturnAction(result); + } }, child: CachedNetworkImage( height: size?.height, diff --git a/packages/flutter_widgets/lib/src/image_header.dart b/packages/flutter_widgets/lib/src/image_header.dart index 1f6237ab..1694f0b7 100644 --- a/packages/flutter_widgets/lib/src/image_header.dart +++ b/packages/flutter_widgets/lib/src/image_header.dart @@ -101,24 +101,29 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget { @override final Size preferredSize; - void _showMessageActionModalBottomSheet(BuildContext context) { + void _showMessageActionModalBottomSheet(BuildContext context) async { final channel = StreamChannel.of(context).channel; - showDialog( - context: context, - barrierColor: StreamChatTheme.of(context).colorTheme.overlay, - builder: (context) { - return StreamChannel( - channel: channel, - child: ImageActionsModal( - userName: userName, - sentAt: sentAt, - message: message, - urls: urls, - currentIndex: currentIndex, - onShowMessage: onShowMessage, - ), - ); - }); + var result = await showDialog( + context: context, + barrierColor: StreamChatTheme.of(context).colorTheme.overlay, + builder: (context) { + return StreamChannel( + channel: channel, + child: ImageActionsModal( + userName: userName, + sentAt: sentAt, + message: message, + urls: urls, + currentIndex: currentIndex, + onShowMessage: onShowMessage, + ), + ); + }, + ); + + if (result != null) { + Navigator.pop(context, result); + } } } diff --git a/packages/flutter_widgets/lib/src/message_list_view.dart b/packages/flutter_widgets/lib/src/message_list_view.dart index 666321d1..9a0fe955 100644 --- a/packages/flutter_widgets/lib/src/message_list_view.dart +++ b/packages/flutter_widgets/lib/src/message_list_view.dart @@ -780,6 +780,16 @@ class _MessageListViewState extends State { ? StreamChatTheme.of(context).ownMessageTheme : StreamChatTheme.of(context).otherMessageTheme, onShowMessage: widget.onShowMessage, + onReturnAction: (action) { + switch (action) { + case ReturnActionType.none: + break; + case ReturnActionType.reply: + FocusScope.of(context).unfocus(); + widget.onMessageSwiped(message); + break; + } + }, ); } @@ -930,6 +940,16 @@ class _MessageListViewState extends State { readList: readList, allRead: allRead, onShowMessage: widget.onShowMessage, + onReturnAction: (action) { + switch (action) { + case ReturnActionType.none: + break; + case ReturnActionType.reply: + FocusScope.of(context).unfocus(); + widget.onMessageSwiped(message); + break; + } + }, ); if (!message.isDeleted && !message.isSystem && !message.isEphemeral) { diff --git a/packages/flutter_widgets/lib/src/message_widget.dart b/packages/flutter_widgets/lib/src/message_widget.dart index 94e2164f..eeabaa13 100644 --- a/packages/flutter_widgets/lib/src/message_widget.dart +++ b/packages/flutter_widgets/lib/src/message_widget.dart @@ -120,6 +120,7 @@ class MessageWidget extends StatefulWidget { final List readList; final ShowMessageCallback onShowMessage; + final ValueChanged onReturnAction; /// If true show the users username next to the timestamp of the message final bool showUsername; @@ -178,6 +179,7 @@ class MessageWidget extends StatefulWidget { this.onShowMessage, this.editMessageInputBuilder, this.textBuilder, + this.onReturnAction, Map customAttachmentBuilders, this.readList, this.padding, @@ -199,6 +201,7 @@ class MessageWidget extends StatefulWidget { MediaQuery.of(context).size.height * 0.3, ), onShowMessage: onShowMessage, + onReturnAction: onReturnAction, ); }, 'video': (context, message, attachment) { @@ -211,6 +214,7 @@ class MessageWidget extends StatefulWidget { ), message: message, onShowMessage: onShowMessage, + onReturnAction: onReturnAction, ); }, 'giphy': (context, message, attachment) { @@ -223,6 +227,7 @@ class MessageWidget extends StatefulWidget { MediaQuery.of(context).size.height * 0.3, ), onShowMessage: onShowMessage, + onReturnAction: onReturnAction, ); }, 'file': (context, message, attachment) { diff --git a/packages/flutter_widgets/lib/src/video_attachment.dart b/packages/flutter_widgets/lib/src/video_attachment.dart index 83763aee..b775109f 100644 --- a/packages/flutter_widgets/lib/src/video_attachment.dart +++ b/packages/flutter_widgets/lib/src/video_attachment.dart @@ -15,6 +15,7 @@ class VideoAttachment extends StatefulWidget { final Size size; final Message message; final ShowMessageCallback onShowMessage; + final ValueChanged onReturnAction; VideoAttachment({ Key key, @@ -23,6 +24,7 @@ class VideoAttachment extends StatefulWidget { this.message, this.size, this.onShowMessage, + this.onReturnAction, }) : super(key: key); @override @@ -84,10 +86,10 @@ class _VideoAttachmentState extends State { }); return GestureDetector( - onTap: () { + onTap: () async { final channel = StreamChannel.of(context).channel; - Navigator.push( + var res = await Navigator.push( context, MaterialPageRoute( builder: (_) => StreamChannel( @@ -102,6 +104,10 @@ class _VideoAttachmentState extends State { ), ), ); + + if (res != null) { + widget.onReturnAction(res); + } }, child: Container( height: widget.size?.height, From a2343e8693dc118400440a7caabd4f820bdaa8a0 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 20 Jan 2021 12:40:19 +0100 Subject: [PATCH 6/6] extract on tap --- .../lib/src/giphy_attachment.dart | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/packages/flutter_widgets/lib/src/giphy_attachment.dart b/packages/flutter_widgets/lib/src/giphy_attachment.dart index 6abe3df9..0f89bc75 100644 --- a/packages/flutter_widgets/lib/src/giphy_attachment.dart +++ b/packages/flutter_widgets/lib/src/giphy_attachment.dart @@ -68,27 +68,7 @@ class GiphyAttachment extends StatelessWidget { padding: const EdgeInsets.all(8.0), child: GestureDetector( onTap: () async { - var res = await Navigator.push(context, - MaterialPageRoute(builder: (_) { - final channel = StreamChannel.of(context).channel; - - return StreamChannel( - channel: channel, - child: FullScreenMedia( - mediaAttachments: [ - attachment, - ], - userName: message.user.name, - sentAt: message.createdAt, - message: message, - onShowMessage: onShowMessage, - ), - ); - })); - - if (res != null) { - onReturnAction(res); - } + _onImageTap(context); }, child: ClipRRect( borderRadius: BorderRadius.only( @@ -324,6 +304,31 @@ class GiphyAttachment extends StatelessWidget { ); } + void _onImageTap(BuildContext context) async { + var res = await Navigator.push(context, MaterialPageRoute( + builder: (_) { + final channel = StreamChannel.of(context).channel; + + return StreamChannel( + channel: channel, + child: FullScreenMedia( + mediaAttachments: [ + attachment, + ], + userName: message.user.name, + sentAt: message.createdAt, + message: message, + onShowMessage: onShowMessage, + ), + ); + }, + )); + + if (res != null) { + onReturnAction(res); + } + } + Widget _buildSentAttachment(context) { return Container( child: GestureDetector(