145 lines
4.0 KiB
Dart
145 lines
4.0 KiB
Dart
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<List<Member>>(
|
|
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<Member> 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,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|