Files
flutter-samples/packages/chatty/lib/ui/home/chat/chat_view.dart
T
2021-10-12 12:04:06 +02:00

163 lines
4.7 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.backgroundColor;
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: Filter.in_(
'members',
[StreamChat.of(context).currentUser!.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.currentUser;
if (channel.isGroup) {
name = channel.extraData['name'] as String?;
image = channel.extraData['image'] as String?;
} else {
final friend = channel.state!.members
.where((element) => element.userId != currentUser!.id)
.first
.user!;
name = friend.name;
image = friend.extraData['image'] as String?;
}
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,
),
),
],
),
),
),
),
);
}
}