Files
flutter-samples/chatty/lib/ui/home/chat/chat_view.dart
T
bd6bb66279 Stream Chatty added as example (#21)
* app updated

* readme updated

* rename base folder

* update chatty's readme

Co-authored-by: Neevash Ramdial <[email protected]>
2021-03-10 14:53:20 -04:00

161 lines
4.6 KiB
Dart

import 'package:stream_chatter/ui/common/my_channel_preview.dart';
import 'package:flutter/material.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
class ChatView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final textColor = Theme.of(context).appBarTheme.color;
return Scaffold(
backgroundColor: Theme.of(context).canvasColor,
appBar: AppBar(
title: Text(
'Chats',
style: TextStyle(
fontSize: 24,
color: textColor,
fontWeight: FontWeight.w800,
),
),
centerTitle: false,
elevation: 0,
backgroundColor: Theme.of(context).canvasColor,
),
body: ChannelsBloc(
child: ChannelListView(
filter: {
'members': {
'\$in': [StreamChat.of(context).user?.id],
}
},
sort: [SortOption('last_message_at')],
channelPreviewBuilder: (context, channel) {
return Container(
color: Theme.of(context).canvasColor,
child: MyChannelPreview(
channel: channel,
heroTag: channel.id,
onImageTap: () {
String name;
String image;
final currentUser = StreamChat.of(context).client.state.user;
if (channel.isGroup) {
name = channel.extraData['name'];
image = channel.extraData['image'];
} else {
final friend =
channel.state.members.where((element) => element.userId != currentUser.id).first.user;
name = friend.name;
image = friend.extraData['image'];
}
return Navigator.of(context).push(
PageRouteBuilder(
barrierColor: Colors.black45,
barrierDismissible: true,
opaque: false,
pageBuilder: (context, animation1, _) {
return FadeTransition(
opacity: animation1,
child: ChatDetailView(
channelId: channel.id,
image: image,
name: name,
),
);
}),
);
},
onTap: (channel) => {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return StreamChannel(
child: ChannelPage(),
channel: channel,
);
},
),
)
},
),
);
},
channelWidget: ChannelPage(),
),
),
);
}
}
class ChannelPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ChannelHeader(),
body: Column(
children: [
Expanded(
child: MessageListView(),
),
MessageInput(),
],
),
);
}
}
class ChatDetailView extends StatelessWidget {
const ChatDetailView({
Key key,
this.image,
this.name,
this.channelId,
}) : super(key: key);
final String image;
final String name;
final String channelId;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: Navigator.of(context).pop,
child: Material(
color: Colors.transparent,
child: Dialog(
backgroundColor: Colors.transparent,
elevation: 0,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Hero(
tag: channelId,
child: ClipOval(
child: Image.network(
image,
height: 180,
width: 180,
fit: BoxFit.cover,
),
),
),
Text(
name,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 22,
),
),
],
),
),
),
),
);
}
}