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,