会话页面

This commit is contained in:
2022-10-26 14:05:58 +08:00
parent 099d2b4423
commit 76bd3f94fd
33 changed files with 2956 additions and 31 deletions

View File

@@ -0,0 +1,274 @@
import 'package:chat/configs/app_colors.dart';
import 'package:chat/routes/contact_routes.dart';
import 'package:chat/routes/user_routes.dart';
import 'package:chat/services/auth_service.dart';
import 'package:chat/views/conversation/widgets/show_custom_message.dart';
import 'package:chat/views/conversation/widgets/show_face_message.dart';
import 'package:chat/views/conversation/widgets/show_file_message.dart';
import 'package:chat/views/conversation/widgets/show_image_message.dart';
import 'package:chat/views/conversation/widgets/show_location_message.dart';
import 'package:chat/views/conversation/widgets/show_merger_message.dart';
import 'package:chat/views/conversation/widgets/show_sound_message.dart';
import 'package:chat/views/conversation/widgets/show_text_message.dart';
import 'package:chat/views/conversation/widgets/show_video_message.dart';
import 'package:chat/widgets/custom_avatar.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tencent_im_sdk_plugin/enum/group_change_info_type.dart';
import 'package:tencent_im_sdk_plugin/enum/group_tips_elem_type.dart';
import 'package:tencent_im_sdk_plugin/enum/message_elem_type.dart';
import 'package:tencent_im_sdk_plugin/models/v2_tim_message.dart';
class MessageWidget extends StatelessWidget {
final V2TimMessage message;
const MessageWidget(this.message, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
switch (message.elemType) {
case MessageElemType.V2TIM_ELEM_TYPE_TEXT:
return _buildMessage(ShowTextMessage(message));
case MessageElemType.V2TIM_ELEM_TYPE_IMAGE:
return _buildMessage(ShowImageMessage(message));
case MessageElemType.V2TIM_ELEM_TYPE_SOUND:
return _buildMessage(ShowSoundMessage(message));
case MessageElemType.V2TIM_ELEM_TYPE_VIDEO:
return _buildMessage(ShowVideoMessage(message));
case MessageElemType.V2TIM_ELEM_TYPE_FILE:
return _buildMessage(ShowFileMessage(message));
case MessageElemType.V2TIM_ELEM_TYPE_LOCATION:
return _buildMessage(ShowLocationMessage(message));
case MessageElemType.V2TIM_ELEM_TYPE_FACE:
return _buildMessage(ShowFaceMessage(message));
case MessageElemType.V2TIM_ELEM_TYPE_MERGER:
return _buildMessage(ShowMergerMessage(message));
case MessageElemType.V2TIM_ELEM_TYPE_CUSTOM:
return _buildMessage(ShowCustomMessage(message));
case MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS:
return _buildGroupTipMessage();
default:
return Text('未识别的消息类型 ${message.elemType}');
}
}
/// 构造群提示消息
Widget _buildGroupTipMessage() {
switch (message.groupTipsElem!.type) {
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_GROUP_INFO_CHANGE:
return _buildGroupInfoChangeMessage();
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_JOIN:
return _buildGroupTypeJoinMessage();
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_INVITE:
return _buildGroupTypeInviteMessage();
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_QUIT:
return _buildGroupTypeQuitMessage();
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_KICKED:
return _buildGroupTypeKickedMessage();
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_SET_ADMIN:
return _buildGroupTypeSetAdminMessage();
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_CANCEL_ADMIN:
return _buildGroupTypeCancelAdminMessage();
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_MEMBER_INFO_CHANGE:
return _buildGroupTypeMemberInfoChangeMessage();
default:
return Text(message.groupTipsElem!.type.toString());
}
}
Widget _buildGroupTypeMemberInfoChangeMessage() {
return Center(
child: Text(
'${message.groupTipsElem!.opMember.nickName}修改了群成员资料',
style: const TextStyle(
color: AppColors.unactive,
fontSize: 12,
),
),
);
}
Widget _buildGroupTypeCancelAdminMessage() {
String op = message.groupTipsElem!.opMember.nickName ?? '';
String text = '';
for (var e in message.groupTipsElem!.memberList!) {
text += e?.nickName ?? '\t';
}
text = '$op取消了$text的管理员身份';
return Center(
child: Text(
text,
style: const TextStyle(
color: AppColors.unactive,
fontSize: 12,
),
),
);
}
Widget _buildGroupTypeSetAdminMessage() {
String op = message.groupTipsElem!.opMember.nickName ?? '';
String text = '';
for (var e in message.groupTipsElem!.memberList!) {
text += e?.nickName ?? '\t';
}
text = '$op将$text设置为管理员';
return Center(
child: Text(
text,
style: const TextStyle(
color: AppColors.unactive,
fontSize: 12,
),
),
);
}
Widget _buildGroupTypeKickedMessage() {
String op = message.groupTipsElem!.opMember.nickName ?? '';
String text = '';
for (var e in message.groupTipsElem!.memberList!) {
text += e?.nickName ?? '\t';
}
text = '$op将$text踢出群组';
return Center(
child: Text(
text,
style: const TextStyle(
color: AppColors.unactive,
fontSize: 12,
),
),
);
}
/// 退出群组的消息解析
Widget _buildGroupTypeQuitMessage() {
if (message.groupTipsElem!.memberList!.isEmpty) {
return Container();
}
return Center(
child: Text(
'${message.groupTipsElem!.memberList!.first?.nickName}退出了群组',
style: const TextStyle(
color: AppColors.unactive,
fontSize: 12,
),
),
);
}
Widget _buildGroupTypeInviteMessage() {
String op = message.groupTipsElem!.opMember.nickName ?? '';
String text = '';
for (var e in message.groupTipsElem!.memberList!) {
text += e?.nickName ?? '\t';
}
text = '$op邀请$text加入群组';
return Center(
child: Text(
text,
style: const TextStyle(
color: AppColors.unactive,
fontSize: 12,
),
),
);
}
Widget _buildGroupTypeJoinMessage() {
String text = '';
for (var e in message.groupTipsElem!.memberList!) {
text += e?.nickName ?? '\t';
}
text = '$text加入群组';
return Center(
child: Text(
text,
style: const TextStyle(
color: AppColors.unactive,
fontSize: 12,
),
),
);
}
/// 解析群资料修改的内容
Widget _buildGroupInfoChangeMessage() {
String text = '';
switch (message.groupTipsElem!.groupChangeInfoList!.first!.type) {
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_NAME:
text =
'${message.groupTipsElem!.opMember.nickName} 修改群名称 ${message.groupTipsElem!.groupChangeInfoList!.first!.value}';
break;
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_INTRODUCTION:
text = '群简介修改';
break;
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_NOTIFICATION:
text = '${message.groupTipsElem!.opMember.nickName} 更新了群公告';
break;
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_FACE_URL:
text = '群头像修改';
break;
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER:
text = '${message.groupTipsElem!.memberList!.first!.nickName} 成为新群主';
break;
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_CUSTOM:
text = '群自定义字段变更';
break;
default:
text = message.groupTipsElem!.groupChangeInfoList![0]!.type.toString();
break;
}
return Center(
child: Text(
text,
style: const TextStyle(
color: AppColors.unactive,
fontSize: 12,
),
),
);
}
/// 构造普通内容的消息
Widget _buildMessage(Widget child) {
return Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
textDirection: message.isSelf! ? TextDirection.rtl : TextDirection.ltr,
children: [
InkWell(
onTap: () {
if (message.isSelf!) {
Get.toNamed(UserRoutes.info);
} else {
Get.toNamed(
ContactRoutes.friendProfile,
);
}
},
child: message.isSelf!
? GetX<AuthService>(builder: (_) {
return CustomAvatar(
_.userInfo.value.avatar ?? '',
size: 43,
radius: 4,
);
})
: CustomAvatar(
message.faceUrl,
size: 43,
radius: 4,
),
),
const SizedBox(width: 8),
GestureDetector(
onLongPress: () {},
child: child,
),
],
);
}
}