From a048bf86855bd19471fcefbc3e76f63bd85cd6c5 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 20 Oct 2021 13:38:02 +0530 Subject: [PATCH] fix: add message search thread navigation support Signed-off-by: xsahil03x --- packages/stream_chat_v1/lib/channel_page.dart | 4 +- .../stream_chat_v1/lib/routes/app_routes.dart | 43 +++++++++++++------ packages/stream_chat_v1/lib/thread_page.dart | 10 +++-- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/packages/stream_chat_v1/lib/channel_page.dart b/packages/stream_chat_v1/lib/channel_page.dart index af21cb6..6ed2398 100644 --- a/packages/stream_chat_v1/lib/channel_page.dart +++ b/packages/stream_chat_v1/lib/channel_page.dart @@ -142,9 +142,7 @@ class _ChannelPageState extends State { ); }, threadBuilder: (_, parentMessage) { - return ThreadPage( - parent: parentMessage, - ); + return ThreadPage(parent: parentMessage!); }, pinPermissions: ['owner', 'admin', 'member'], ), diff --git a/packages/stream_chat_v1/lib/routes/app_routes.dart b/packages/stream_chat_v1/lib/routes/app_routes.dart index a9beedc..78593c4 100644 --- a/packages/stream_chat_v1/lib/routes/app_routes.dart +++ b/packages/stream_chat_v1/lib/routes/app_routes.dart @@ -1,3 +1,4 @@ +import 'package:collection/src/iterable_extensions.dart'; import 'package:example/channel_list_page.dart'; import 'package:flutter/material.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; @@ -12,6 +13,7 @@ import '../home_page.dart'; import '../main.dart'; import '../new_chat_screen.dart'; import '../new_group_chat_screen.dart'; +import '../thread_page.dart'; import 'routes.dart'; class AppRoutes { @@ -48,18 +50,35 @@ class AppRoutes { ); case Routes.CHANNEL_PAGE: return MaterialPageRoute( - settings: RouteSettings(arguments: args, name: Routes.CHANNEL_PAGE), - builder: (_) { - final channelPageArgs = args as ChannelPageArgs; - return StreamChannel( - channel: channelPageArgs.channel!, - initialMessageId: channelPageArgs.initialMessage?.id, - child: ChannelPage( - highlightInitialMessage: - channelPageArgs.initialMessage != null, - ), - ); - }); + settings: RouteSettings(arguments: args, name: Routes.CHANNEL_PAGE), + builder: (context) { + final channelPageArgs = args as ChannelPageArgs; + final initialMessage = channelPageArgs.initialMessage; + + return StreamChannel( + channel: channelPageArgs.channel!, + initialMessageId: initialMessage?.id, + child: Builder( + builder: (context) { + final parentId = initialMessage?.parentId; + Message? parentMessage; + if (parentId != null) { + final channel = StreamChannel.of(context).channel; + parentMessage = channel.state!.messages + .firstWhereOrNull((it) => it.id == parentId); + } + if (parentMessage != null) { + return ThreadPage(parent: parentMessage); + } + return ChannelPage( + highlightInitialMessage: + channelPageArgs.initialMessage != null, + ); + }, + ), + ); + }, + ); case Routes.NEW_CHAT: return MaterialPageRoute( settings: RouteSettings(arguments: args, name: Routes.NEW_CHAT), diff --git a/packages/stream_chat_v1/lib/thread_page.dart b/packages/stream_chat_v1/lib/thread_page.dart index 5e9d4fc..ca8d67c 100644 --- a/packages/stream_chat_v1/lib/thread_page.dart +++ b/packages/stream_chat_v1/lib/thread_page.dart @@ -2,13 +2,13 @@ import 'package:flutter/material.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; class ThreadPage extends StatefulWidget { - final Message? parent; + final Message parent; final int? initialScrollIndex; final double? initialAlignment; ThreadPage({ Key? key, - this.parent, + required this.parent, this.initialScrollIndex, this.initialAlignment, }) : super(key: key); @@ -39,7 +39,7 @@ class _ThreadPageState extends State { return Scaffold( backgroundColor: StreamChatTheme.of(context).colorTheme.appBg, appBar: ThreadHeader( - parent: widget.parent!, + parent: widget.parent, ), body: Column( children: [ @@ -50,6 +50,8 @@ class _ThreadPageState extends State { initialAlignment: widget.initialAlignment, onMessageSwiped: _reply, messageFilter: defaultFilter, + showScrollToBottom: false, + highlightInitialMessage: true, messageBuilder: (context, details, messages, defaultMessage) { return defaultMessage.copyWith( onReplyTap: _reply, @@ -61,7 +63,7 @@ class _ThreadPageState extends State { pinPermissions: ['owner', 'admin', 'member'], ), ), - if (widget.parent!.type != 'deleted') + if (widget.parent.type != 'deleted') MessageInput( parentMessage: widget.parent, focusNode: _focusNode,