import 'package:example/utils/localizations.dart'; import 'package:example/routes/routes.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; class PinnedMessagesScreen extends StatefulWidget { const PinnedMessagesScreen({super.key}); @override State createState() => _PinnedMessagesScreenState(); } class _PinnedMessagesScreenState extends State { late final controller = StreamMessageSearchListController( client: StreamChat.of(context).client, filter: Filter.in_( 'cid', [StreamChannel.of(context).channel.cid!], ), messageFilter: Filter.equal( 'pinned', true, ), sort: [ const SortOption( 'created_at', direction: SortOption.ASC, ), ], limit: 20, ); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: StreamChatTheme.of(context).colorTheme.barsBg, appBar: AppBar( elevation: 1, centerTitle: true, title: Text( AppLocalizations.of(context).pinnedMessages, style: TextStyle( color: StreamChatTheme.of(context).colorTheme.textHighEmphasis, fontSize: 16.0, ), ), leading: const StreamBackButton(), backgroundColor: StreamChatTheme.of(context).colorTheme.barsBg, ), body: StreamMessageSearchListView( controller: controller, emptyBuilder: (_) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ StreamSvgIcon.pin( size: 136.0, color: StreamChatTheme.of(context).colorTheme.disabled, ), const SizedBox(height: 16.0), Text( AppLocalizations.of(context).noPinnedItems, style: TextStyle( fontSize: 17.0, color: StreamChatTheme.of(context).colorTheme.textHighEmphasis, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8.0), RichText( textAlign: TextAlign.center, text: TextSpan(children: [ TextSpan( text: '${AppLocalizations.of(context).longPressMessage} ', style: TextStyle( fontSize: 14.0, color: StreamChatTheme.of(context) .colorTheme .textHighEmphasis .withOpacity(0.5), ), ), TextSpan( text: AppLocalizations.of(context).pinToConversation, style: TextStyle( fontSize: 14.0, fontWeight: FontWeight.bold, color: StreamChatTheme.of(context) .colorTheme .textHighEmphasis .withOpacity(0.5), ), ), ]), ), ], ), ); }, onMessageTap: (messageResponse) async { final client = StreamChat.of(context).client; final router = GoRouter.of(context); final message = messageResponse.message; final channel = client.channel( messageResponse.channel!.type, id: messageResponse.channel!.id, ); if (channel.state == null) { await channel.watch(); } router.pushNamed( Routes.CHANNEL_PAGE.name, pathParameters: Routes.CHANNEL_PAGE.params(channel), queryParameters: Routes.CHANNEL_PAGE.queryParams(message), ); }, ), ); } @override void dispose() { controller.dispose(); super.dispose(); } }