import 'package:flutter/material.dart'; import 'package:jiffy/jiffy.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; class ChannelInfo extends StatelessWidget { final Channel channel; /// The style of the text displayed final TextStyle textStyle; /// If true the typing indicator will be rendered if a user is typing final bool showTypingIndicator; const ChannelInfo({ Key key, @required this.channel, this.textStyle, this.showTypingIndicator = true, }) : super(key: key); @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) { alternativeWidget = Text( '${channel.memberCount} Members, ${channel.state.watcherCount} Online', style: StreamChatTheme.of(context) .channelTheme .channelHeaderTheme .lastMessageAt, ); } else { 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 (!showTypingIndicator) { return alternativeWidget ?? Offstage(); } return TypingIndicator( alignment: Alignment.center, alternativeWidget: alternativeWidget, style: textStyle, ); } Widget _buildConnectingTitleState(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( height: 16, width: 16, child: Center( child: CircularProgressIndicator(), ), ), SizedBox(width: 10), Text( 'Searching for Network', style: textStyle, ), ], ); } Widget _buildDisconnectedTitleState(BuildContext context, Client client) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Offline...', style: textStyle, ), TextButton( style: TextButton.styleFrom( padding: const EdgeInsets.all(0), tapTargetSize: MaterialTapTargetSize.shrinkWrap, visualDensity: VisualDensity( horizontal: VisualDensity.minimumDensity, vertical: VisualDensity.minimumDensity, ), ), onPressed: () async { await client.disconnect(); return client.connect(); }, child: Text( 'Try Again', style: textStyle.copyWith( color: StreamChatTheme.of(context).colorTheme.accentBlue, ), ), ), ], ); } }