Full functional message chat

This commit is contained in:
2024-05-30 23:14:29 +08:00
parent 2716690c41
commit 9a2e0756b8
12 changed files with 352 additions and 72 deletions

View File

@ -15,6 +15,7 @@ import 'package:solian/router.dart';
import 'package:solian/services.dart';
import 'package:solian/theme.dart';
import 'package:solian/widgets/chat/chat_message.dart';
import 'package:solian/widgets/chat/chat_message_action.dart';
import 'package:solian/widgets/chat/chat_message_input.dart';
class ChannelChatScreen extends StatefulWidget {
@ -117,17 +118,21 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
case 'messages.update':
final payload = Message.fromJson(event.payload!);
if (payload.channelId == _channel?.id) {
_pagingController.itemList
?.map((x) => x.id == payload.id ? payload : x)
.toList();
final idx = _pagingController.itemList
?.indexWhere((x) => x.uuid == payload.uuid);
if (idx != null) {
_pagingController.itemList?[idx] = payload;
}
}
break;
case 'messages.burnt':
final payload = Message.fromJson(event.payload!);
if (payload.channelId == _channel?.id) {
_pagingController.itemList = _pagingController.itemList
?.where((x) => x.id != payload.id)
.toList();
final idx = _pagingController.itemList
?.indexWhere((x) => x.uuid != payload.uuid);
if (idx != null) {
_pagingController.itemList?.removeAt(idx - 1);
}
}
break;
}
@ -142,6 +147,9 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
return a.createdAt.difference(b.createdAt).inMinutes <= 3;
}
Message? _messageToReplying;
Message? _messageToEditing;
Widget chatHistoryBuilder(context, item, index) {
bool isMerged = false, hasMerged = false;
if (index > 0) {
@ -158,16 +166,31 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
}
return InkWell(
child: Container(
padding: EdgeInsets.only(
top: !isMerged ? 8 : 0,
bottom: !hasMerged ? 8 : 0,
),
child: ChatMessage(
item: item,
isMerged: isMerged,
).paddingOnly(
top: !isMerged ? 8 : 0,
bottom: !hasMerged ? 8 : 0,
),
),
onLongPress: () {},
onLongPress: () {
showModalBottomSheet(
useRootNavigator: true,
context: context,
builder: (context) => ChatMessageAction(
channel: _channel!,
realm: _channel!.realm,
item: item,
onEdit: () {
setState(() => _messageToEditing = item);
},
onReply: () {
setState(() => _messageToReplying = item);
},
),
);
},
);
}
@ -254,6 +277,8 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
left: 16,
right: 16,
child: ChatMessageInput(
edit: _messageToEditing,
reply: _messageToReplying,
realm: widget.realm,
placeholder: placeholder,
channel: _channel!,
@ -262,6 +287,12 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
_pagingController.itemList?.insert(0, item);
});
},
onReset: () {
setState(() {
_messageToReplying = null;
_messageToEditing = null;
});
},
),
),
],

View File

@ -48,7 +48,7 @@ class _ChannelDetailScreenState extends State<ChannelDetailScreen> {
void promptLeaveChannel() async {
final did = await showDialog(
context: context,
builder: (context) => ChannelDeletion(
builder: (context) => ChannelDeletionDialog(
channel: widget.channel,
realm: widget.realm,
isOwned: _isOwned,

View File

@ -46,7 +46,7 @@ class _RealmDetailScreenState extends State<RealmDetailScreen> {
void promptLeaveChannel() async {
final did = await showDialog(
context: context,
builder: (context) => RealmDeletion(
builder: (context) => RealmDeletionDialog(
realm: widget.realm,
isOwned: _isOwned,
),