chatapp3-flutter/lib/modules/chat/system/message_system_page.dart
2026-04-09 21:32:23 +08:00

1173 lines
45 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:convert';
import 'package:extended_image/extended_image.dart'
show ExtendedImage, ExtendedRawImage, ExtendedImageState, LoadState;
import 'package:extended_text/extended_text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:yumi/ui_kit/components/sc_compontent.dart';
import 'package:yumi/ui_kit/components/text/sc_text.dart';
import 'package:yumi/app/routes/sc_fluro_navigator.dart';
import 'package:yumi/shared/tools/sc_system_message_utils.dart';
import 'package:yumi/shared/data_sources/sources/repositories/sc_user_repository_impl.dart';
import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_custom_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_text_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:yumi/app_localizations.dart';
import 'package:yumi/ui_kit/components/appbar/socialchat_appbar.dart';
import 'package:yumi/ui_kit/components/dialog/dialog_base.dart';
import 'package:yumi/ui_kit/components/sc_tts.dart';
import 'package:yumi/ui_kit/theme/socialchat_theme.dart';
import 'package:yumi/app/constants/sc_screen.dart';
import 'package:yumi/shared/tools/sc_date_utils.dart';
import 'package:yumi/services/general/sc_app_general_manager.dart';
import 'package:yumi/services/audio/rtm_manager.dart';
import 'package:yumi/services/auth/user_profile_manager.dart';
import 'package:yumi/modules/store/store_route.dart';
import 'package:yumi/app/constants/sc_global_config.dart';
import 'package:yumi/app/config/business_logic_strategy.dart';
import '../../../shared/data_sources/models/enum/sc_sysytem_message_type.dart';
import '../../../shared/business_logic/models/res/sc_system_invit_message_res.dart';
class MessageSystemPage extends StatefulWidget {
final V2TimConversation? conversation;
final bool shrinkWrap;
//是否是房间内聊天界面。
final bool inRoom;
const MessageSystemPage({
Key? key,
this.conversation,
this.shrinkWrap = false,
this.inRoom = false,
}) : super(key: key);
@override
_MessageSystemPageState createState() => _MessageSystemPageState();
}
class _MessageSystemPageState extends State<MessageSystemPage> {
final ScrollController _scrollController = ScrollController();
final RefreshController _refreshController = RefreshController();
RtmProvider? rtmProvider;
V2TimConversation? currentConversation;
List<V2TimMessage> currentConversationMessageList = [];
BusinessLogicStrategy get _strategy => SCGlobalConfig.businessLogicStrategy;
@override
void initState() {
super.initState();
rtmProvider = Provider.of<RtmProvider>(context, listen: false);
currentConversation = widget.conversation;
rtmProvider?.onNewMessageCurrentConversationListener = _onNewMessage;
loadMsg();
}
@override
void dispose() {
rtmProvider?.onNewMessageCurrentConversationListener = null;
super.dispose();
}
Future<void> loadMsg() async {
V2TimValueCallback<List<V2TimMessage>> v2timValueCallback =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getC2CHistoryMessageList(
userID: currentConversation!.userID!,
count: 100,
lastMsgID: null,
);
List<V2TimMessage> messages = v2timValueCallback.data!;
// List<V2TimMessage> messages = await FTIM.getMessageManager().getMessages(conversation: currentConversation);
print("messages : ${messages?.length ?? 0}");
currentConversationMessageList ??= [];
currentConversationMessageList?.clear();
for (var msg in messages) {
if (!msg.isSelf! && msg.isPeerRead!) {
TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.sendMessageReadReceipts(messageIDList: [msg.msgID!]);
}
}
currentConversationMessageList.insertAll(0, messages ?? []);
setState(() {});
_scrollController.jumpTo(0.0);
}
_onNewMessage(V2TimMessage? message, {String? msgId}) async {
if (message == null) {
return;
}
if (message.userID != currentConversation?.userID) return;
int? index;
for (var element in currentConversationMessageList) {
if (msgId != null) {
if (msgId == element.msgID) {
element.status = MessageStatus.V2TIM_MSG_STATUS_SEND_FAIL;
setState(() {});
continue;
}
} else {
if (element.msgID == message.msgID) {
index = currentConversationMessageList.indexOf(element);
continue;
}
}
}
if (msgId != null) {
return;
}
if (index != null) {
currentConversationMessageList.removeAt(index!);
currentConversationMessageList.insert(index!, message);
} else {
currentConversationMessageList.insert(0, message);
}
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.markC2CMessageAsRead(userID: currentConversation!.userID!);
//发送已读回执
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.sendMessageReadReceipts(messageIDList: [message.msgID!]);
setState(() {});
// await FTIM.getContactManager().setReadMessage(currentConversation);
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
Image.asset(
_strategy.getSCMessageChatPageRoomSettingBackground(),
width: ScreenUtil().screenWidth,
height: ScreenUtil().screenHeight,
fit: BoxFit.fill,
),
Scaffold(
backgroundColor: Colors.transparent,
resizeToAvoidBottomInset: false,
appBar: SocialChatStandardAppBar(
title: SCAppLocalizations.of(context)!.system,
actions: [],
),
body: SafeArea(top: false, child: _msgList()),
),
],
);
}
Widget _msgList() {
print('xiaoxiliebiao:${currentConversationMessageList.length}');
return SmartRefresher(
enablePullDown: false,
enablePullUp: true,
onLoading: () async {
print('onLoading');
if (currentConversationMessageList.isNotEmpty) {
// 拉取单聊历史消息
// 首次拉取lastMsgID 设置为 null
// 再次拉取时lastMsgID 可以使用返回的消息列表中的最后一条消息的id
V2TimValueCallback<List<V2TimMessage>> v2timValueCallback =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getC2CHistoryMessageList(
userID: currentConversation!.userID ?? "",
count: 30,
lastMsgID: currentConversationMessageList.last.msgID,
);
List<V2TimMessage> messages =
v2timValueCallback.data as List<V2TimMessage>;
print('加载前:${currentConversationMessageList.length}');
currentConversationMessageList.addAll(messages);
print('加载后:${currentConversationMessageList.length}');
if (messages.length == 30) {
_refreshController.loadComplete();
} else {
_refreshController.loadNoData();
}
} else {
_refreshController.loadNoData();
}
setState(() {});
},
footer: CustomFooter(
height: 1,
builder: (context, mode) {
return SizedBox(
height: 1,
width: 1,
child: SizedBox(height: 1, width: 1),
);
},
),
controller: _refreshController,
child: Container(
child: CustomScrollView(
shrinkWrap: currentConversationMessageList.length > 10 ? false : true,
controller: _scrollController,
reverse: true,
physics: const ClampingScrollPhysics(),
// 禁用回弹效果
slivers: [
SliverList(
delegate: SliverChildBuilderDelegate(
(c, i) => _MessageItem(
message: currentConversationMessageList[i],
preMessage:
i < currentConversationMessageList.length - 1
? currentConversationMessageList[i + 1]
: null,
currentConversationMessageList:
currentConversationMessageList,
updateCall: () {
setState(() {});
},
),
childCount: currentConversationMessageList.length,
),
),
],
),
),
);
}
}
class _MessageItem extends StatelessWidget {
final V2TimMessage message;
final V2TimMessage? preMessage;
List<V2TimMessage> currentConversationMessageList = [];
Function updateCall;
///上一条
late BuildContext context;
_MessageItem({
required this.message,
this.preMessage,
required this.currentConversationMessageList,
required this.updateCall,
});
@override
Widget build(BuildContext context) {
this.context = context;
bool showTime = true;
int timestamp = (message.timestamp ?? 0) * 1000;
int preTimestamp = (preMessage?.timestamp ?? 0) * 1000;
if (preMessage != null) {
///5分钟以内 不显示
// print('timestamp:$timestamp===preTimestamp:${preTimestamp}');
if (DateTime.fromMillisecondsSinceEpoch(timestamp)
.difference(DateTime.fromMillisecondsSinceEpoch(preTimestamp))
.inMilliseconds <
1000 * 60 * 5) {
showTime = false;
}
}
String time = SCMDateUtils.formatMessageTime(
context,
DateTime.fromMillisecondsSinceEpoch(timestamp ?? 0),
);
String noticeType = "";
String tagHead = "";
if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) {
V2TimCustomElem customElem = message.customElem!;
String content = customElem.data ?? "";
final data = jsonDecode(content);
noticeType = data["noticeType"];
if (noticeType == SCSysytemMessageType.CP_LOVE_LETTER.name) {
var bean = SCSystemInvitMessageRes.fromJson(jsonDecode(data["content"]));
tagHead = bean.userAvatar ?? "";
}
}
print('status:${message.status}');
return Container(
margin: EdgeInsets.symmetric(horizontal: 15.w, vertical: 8.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
// textDirection: message.isSelf ? TextDirection.rtl : TextDirection.ltr,
children: <Widget>[
Visibility(
visible: showTime,
child: Container(
margin: EdgeInsets.only(bottom: 12.w),
child: Row(
children: <Widget>[
Spacer(),
Container(
alignment: Alignment.center,
padding: EdgeInsets.symmetric(
horizontal: width(15),
vertical: 8.w,
),
decoration: BoxDecoration(
color: Colors.black12,
borderRadius: BorderRadius.all(
Radius.circular(height(13)),
),
),
child: Text(
time,
style: TextStyle(
fontSize: sp(12),
color: Colors.white,
fontWeight: FontWeight.w400,
decoration: TextDecoration.none,
height: 1,
),
),
),
Spacer(),
],
),
),
),
Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
textDirection:
message.isSelf! ? TextDirection.rtl : TextDirection.ltr,
children: <Widget>[
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {},
child:
noticeType == SCSysytemMessageType.CP_LOVE_LETTER.name &&
tagHead.isNotEmpty
? netImage(
url: tagHead,
width: 45.w,
shape: BoxShape.circle,
)
: ExtendedImage.asset(
SCGlobalConfig.businessLogicStrategy.getMessagePageSystemMessageIcon(),
width: 45.w,
shape: BoxShape.circle,
fit: BoxFit.cover,
),
),
// 他人消息的阴影间隔是10dp
Container(width: 8.w),
Expanded(
child: Row(
textDirection: TextDirection.ltr,
children: <Widget>[
Expanded(
child: Container(
alignment: AlignmentDirectional.topStart,
margin: EdgeInsets.only(top: 4.w),
child: _msg(),
),
),
],
),
),
],
),
],
),
);
}
_msg() {
return _text();
}
///文本消息
_text() {
String content = "";
if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT) {
V2TimTextElem textElem = message.textElem!;
content = textElem.text ?? "";
} else if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_IMAGE) {
content = SCAppLocalizations.of(context)!.image;
} else if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_VIDEO) {
content = SCAppLocalizations.of(context)!.video;
} else if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND) {
content = SCAppLocalizations.of(context)!.sound;
} else if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) {
V2TimCustomElem customElem = message.customElem!;
content = customElem.data ?? "";
final data = jsonDecode(content);
String type = data["noticeType"];
if (type == SCSysytemMessageType.GIVE_AWAY_PROPS.name) {
String title = data["title"] ?? "";
String expand = data["expand"] ?? "";
return Builder(
builder: (ct) {
return GestureDetector(
child: Container(
decoration: BoxDecoration(
color: Color(0xff18F2B1).withOpacity(0.1),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(0),
topRight: Radius.circular(8.w),
bottomLeft: Radius.circular(8.w),
bottomRight: Radius.circular(8),
),
),
padding: EdgeInsets.all(8.0.w),
child: Column(
children: [
text(
SCAppLocalizations.of(context)!.propMessagePrompt,
maxLines: 1,
// specialTextSpanBuilder: MySpecialTextSpanBuilder(),
fontSize: sp(16),
textColor: Colors.white,
fontWeight: FontWeight.bold,
),
ExtendedText(
data["content"],
// specialTextSpanBuilder: MySpecialTextSpanBuilder(),
style: TextStyle(fontSize: sp(14), color: Colors.white),
),
expand.isNotEmpty
? Row(
children: [
SizedBox(width: 10.w),
netImage(
url: expand,
width: 45.w,
height: 45.w,
fit: BoxFit.contain,
),
],
)
: Container(),
],
),
),
onTap: () {
if (title.isNotEmpty) {
var dTitle = jsonDecode(title);
String propType = dTitle["propType"] ?? "";
if ("ACTIVITY" == propType ||
"ADMINISTRSCOR" == propType ||
"ACHIEVEMENT" == propType) {
}else {
SCNavigatorUtils.push(
context,
StoreRoute.bags,
replace: false,
);
}
} else {
SCNavigatorUtils.push(context, StoreRoute.bags, replace: false);
}
},
onLongPress: () {
_showMsgItemMenu(ct, "");
},
);
},
);
} else if (type == SCSysytemMessageType.AGENT_SEND_INVITE_HOST.name) {
return SCSystemMessageUtils.buildAgentSendInviteHostMessage(
data,
(ct, content) {
_showMsgItemMenu(ct, content);
},
(String id) {
rejectOpt(id, type);
},
(String id) {
acceptOpt(id, type);
},
context,
);
} else if (type == SCSysytemMessageType.BD_SEND_INVITE_AGENT.name) {
return SCSystemMessageUtils.buildBdSendInviteAgentMessage(
data,
(ct, content) {
_showMsgItemMenu(ct, content);
},
(String id) {
rejectOpt(id, type);
},
(String id) {
acceptOpt(id, type);
},
context,
);
} else if (type == SCSysytemMessageType.BD_LEADER_INVITE_BD.name) {
return SCSystemMessageUtils.buildBdLeaderInviteBdMessage(
data,
(ct, content) {
_showMsgItemMenu(ct, content);
},
(String id) {
rejectOpt(id, type);
},
(String id) {
acceptOpt(id, type);
},
context,
);
} else if (type == SCSysytemMessageType.BD_LEADER_INVITE_BD_LEADER.name) {
return SCSystemMessageUtils.buildBdLeaderInviteBdLeaderMessage(
data,
(ct, content) {
_showMsgItemMenu(ct, content);
},
(String id) {
rejectOpt(id, type);
},
(String id) {
acceptOpt(id, type);
},
context,
);
} else if (type == SCSysytemMessageType.ADMIN_INVITE_RECHARGE_AGENT.name) {
return SCSystemMessageUtils.buildAdminInviteRechargeAgentMessage(
data,
(ct, content) {
_showMsgItemMenu(ct, content);
},
(String id) {
rejectOpt(id, type);
},
(String id) {
acceptOpt(id, type);
},
context,
);
} else if (type == SCSysytemMessageType.CP_BUILD.name) {
return SCSystemMessageUtils.buildCPBuildMessage(
data,
(ct, content) {
_showMsgItemMenu(ct, content);
},
(String id) {
rejectOpt(id, type);
},
(String id) {
acceptOpt(id, type);
},
context,
);
} else if (type == SCSysytemMessageType.CP_LOVE_LETTER.name) {
return SCSystemMessageUtils.buildCPLoveLetterMessage(data, (ct, content) {
_showMsgItemMenu(ct, content);
}, context);
} else if (type == SCSysytemMessageType.USER_COINS_RECEIVED.name) {
return SCSystemMessageUtils.buildUserCoinsReceivedMessage(data, (
ct,
content,
) {
_showMsgItemMenu(ct, content);
}, context);
} else if (type == SCSysytemMessageType.COIN_SELLER_COINS_RECEIVED.name) {
return SCSystemMessageUtils.buildUserCoinsReceivedMessage(data, (
ct,
content,
) {
_showMsgItemMenu(ct, content);
}, context);
} else if (type == SCSysytemMessageType.USER_SPECIAL_AUDIT_RESULTS.name) {
if (data["content"] != null) {
return Builder(
builder: (ct) {
return GestureDetector(
onLongPress: () {
_showMsgItemMenu(ct, "");
},
onTap: () {},
child: Container(
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(blurRadius: 2.w, color: Colors.black26),
],
borderRadius: BorderRadius.only(
topLeft: Radius.circular(0),
topRight: Radius.circular(8.w),
bottomLeft: Radius.circular(8.w),
bottomRight: Radius.circular(8),
),
),
padding: EdgeInsets.all(8.0.w),
child: ExtendedText(
data["content"],
// specialTextSpanBuilder: MySpecialTextSpanBuilder(),
style: TextStyle(fontSize: sp(14), color: Colors.black54),
),
),
);
},
);
}
} else if (type == SCSysytemMessageType.USER_FOLLOW.name) {
String expand = data["expand"] ?? "";
if (data["content"] != null) {
var bean = SCSystemInvitMessageRes.fromJson(
jsonDecode(data["content"]),
);
return Builder(
builder: (ct) {
return GestureDetector(
onLongPress: () {
_showMsgItemMenu(ct, "");
},
child: Container(
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(blurRadius: 2.w, color: Colors.black26),
],
borderRadius: BorderRadius.only(
topLeft: Radius.circular(0),
topRight: Radius.circular(8.w),
bottomLeft: Radius.circular(8.w),
bottomRight: Radius.circular(8),
),
),
padding: EdgeInsets.all(8.0.w),
child: Column(
children: [
Row(
children: [
head(url: bean.userAvatar ?? "", width: 65.w),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
netImage(
url:
Provider.of<SCAppGeneralManager>(
context,
listen: false,
)
.findCountryByName(
bean.countryName ?? "",
)
?.nationalFlag ??
"",
borderRadius: BorderRadius.all(
Radius.circular(3.w),
),
width: 19.w,
height: 14.w,
),
SizedBox(width: 3.w),
Container(
constraints: BoxConstraints(
maxWidth: 160.w,
),
child: text(
bean.userNickname ?? "",
fontWeight: FontWeight.bold,
textColor: Colors.black,
fontSize: 16.sp,
),
),
],
),
GestureDetector(
child: Container(
padding: EdgeInsets.symmetric(vertical: 8.w),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
SCGlobalConfig.businessLogicStrategy.getIdBackgroundImage(bean.account != bean.actualAccount),
),
fit: BoxFit.fitWidth,
),
),
child: Row(
textDirection: TextDirection.ltr,
children: [
SizedBox(width: 38.w),
text(
bean.actualAccount ?? "",
fontSize: 12.sp,
textColor: Colors.white,
fontWeight: FontWeight.bold,
),
SizedBox(width: 5.w),
Image.asset(
SCGlobalConfig.businessLogicStrategy.getCopyIdIcon(),
width: 12.w,
height: 12.w,
),
SizedBox(width: 8.w),
],
),
),
onTap: () {
Clipboard.setData(
ClipboardData(
text: bean.actualAccount ?? "",
),
);
SCTts.show(
SCAppLocalizations.of(
context,
)!.copiedToClipboard,
);
},
),
],
),
],
),
SizedBox(height: 3.w),
GestureDetector(
child: Container(
alignment: AlignmentDirectional.center,
height: 25.w,
width: 65.w,
decoration: BoxDecoration(
color: Color(0xffB464FF),
borderRadius: BorderRadius.all(
Radius.circular(15.0),
),
),
child: text(
SCAppLocalizations.of(context)!.follow,
fontSize: 14.sp,
fontWeight: FontWeight.w600,
textColor: Colors.white,
),
),
onTap: () {
SCAccountRepository().followNew(expand).then((result) {
SCTts.show(SCAppLocalizations.of(context)!.followSucc);
});
},
),
Divider(
color: Colors.black12,
thickness: 0.5,
height: 28.w,
),
ExtendedText(
SCAppLocalizations.of(context)!.followedYou,
// specialTextSpanBuilder: MySpecialTextSpanBuilder(),
style: TextStyle(
fontSize: sp(14),
color: Colors.black54,
),
),
SizedBox(height: 5.w),
],
),
),
);
},
);
}
} else if (type == SCSysytemMessageType.VIOLSCION_WARNING.name) {
if (data["content"] != null) {
return Builder(
builder: (ct) {
return GestureDetector(
onLongPress: () {
_showMsgItemMenu(ct, "");
},
onTap: () {},
child: Container(
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(blurRadius: 2.w, color: Colors.black26),
],
borderRadius: BorderRadius.only(
topLeft: Radius.circular(0),
topRight: Radius.circular(8.w),
bottomLeft: Radius.circular(8.w),
bottomRight: Radius.circular(8),
),
),
padding: EdgeInsets.all(8.0.w),
child: ExtendedText(
data["content"],
// specialTextSpanBuilder: MySpecialTextSpanBuilder(),
style: TextStyle(fontSize: sp(14), color: Colors.black54),
),
),
);
},
);
}
} else if (type == SCSysytemMessageType.VIOLSCION_ADJUST.name) {
if (data["content"] != null) {
return Builder(
builder: (ct) {
return GestureDetector(
onLongPress: () {
_showMsgItemMenu(ct, "");
},
onTap: () {},
child: Container(
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(blurRadius: 2.w, color: Colors.black26),
],
borderRadius: BorderRadius.only(
topLeft: Radius.circular(0),
topRight: Radius.circular(8.w),
bottomLeft: Radius.circular(8.w),
bottomRight: Radius.circular(8),
),
),
padding: EdgeInsets.all(8.0.w),
child: ExtendedText(
data["content"],
// specialTextSpanBuilder: MySpecialTextSpanBuilder(),
style: TextStyle(fontSize: sp(14), color: Colors.black54),
),
),
);
},
);
}
}
if (content.isEmpty) {
if (customElem.extension == 'sendGift') {
content = SCAppLocalizations.of(context)!.gift2;
} else {
content = SCAppLocalizations.of(context)!.receivedAMessage;
}
}
}
return Builder(
builder: (ct) {
return GestureDetector(
onLongPress: () {
_showMsgItemMenu(ct, "");
},
child: Container(
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [BoxShadow(blurRadius: 2.w, color: Colors.black26)],
borderRadius: BorderRadius.only(
topLeft: Radius.circular(0),
topRight: Radius.circular(8.w),
bottomLeft: Radius.circular(8.w),
bottomRight: Radius.circular(8),
),
),
padding: EdgeInsets.all(8.0.w),
child: ExtendedText(
content,
// specialTextSpanBuilder: MySpecialTextSpanBuilder(),
style: TextStyle(fontSize: sp(14), color: Colors.black54),
),
),
);
},
);
}
void _showMsgItemMenu(BuildContext ct, String content) {
SmartDialog.showAttach(
tag: "showMsgItemMenu",
targetContext: ct,
alignment: Alignment.topCenter,
maskColor: Colors.transparent,
animationType: SmartAnimationType.fade,
scalePointBuilder: (selfSize) => Offset(selfSize.width, 10),
builder: (_) {
return Container(
margin: EdgeInsets.only(bottom: 10.w),
decoration: BoxDecoration(
color: Color(0xffdcdddf),
borderRadius: BorderRadius.circular(10),
),
padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.w),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
SmartDialog.dismiss(tag: "showMsgItemMenu");
_delete();
},
child: Container(
margin: EdgeInsets.symmetric(horizontal: 8.w),
child: Column(
children: [
Image.asset(
SCGlobalConfig.businessLogicStrategy.getSCMessageChatPageMessageMenuDeleteIcon(),
width: 20.w,
),
SizedBox(height: 3.w),
text(
SCAppLocalizations.of(context)!.delete,
fontSize: 12.sp,
textColor: Color(0xff777777),
),
],
),
),
),
],
),
);
},
);
}
///删除消息
void _delete() {
SmartDialog.show(
tag: "showDeleteDialog",
alignment: Alignment.bottomCenter,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return SafeArea(
child: Container(
height: 168.w,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8.0),
topRight: Radius.circular(8.0),
),
),
child: Column(
children: [
SizedBox(height: 10.w),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
text(
SCAppLocalizations.of(context)!.tips,
fontSize: 16.sp,
textColor: Colors.black,
fontWeight: FontWeight.bold,
),
],
),
SizedBox(height: 5.w),
Divider(height: height(1), color: SocialChatTheme.dividerColor),
GestureDetector(
child: Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
color: Colors.transparent,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
text(
SCAppLocalizations.of(context)!.deleteFromMyDevice,
fontSize: 14.sp,
textColor: Colors.black,
),
],
),
),
onTap: () async {
V2TimCallback deleteMessageFromLocalStorage =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessageFromLocalStorage(
msgID: message.msgID ?? "",
);
if (deleteMessageFromLocalStorage.code == 0) {
//删除成功
int index = 0;
for (var value in currentConversationMessageList) {
if (value.msgID == message.msgID) {
break;
}
index = index + 1;
}
currentConversationMessageList.removeAt(index);
updateCall();
SmartDialog.dismiss(tag: "showDeleteDialog");
}
},
),
Divider(height: height(1), color: SocialChatTheme.dividerColor),
GestureDetector(
onTap: () async {
V2TimCallback deleteMessageFromLocalStorage =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessages(msgIDs: [message.msgID ?? ""]);
if (deleteMessageFromLocalStorage.code == 0) {
//删除成功
int index = 0;
for (var value in currentConversationMessageList) {
if (value.msgID == message.msgID) {
break;
}
index = index + 1;
}
currentConversationMessageList.removeAt(index);
updateCall();
SmartDialog.dismiss(tag: "showDeleteDialog");
}
},
child: Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
color: Colors.transparent,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
text(
SCAppLocalizations.of(context)!.deleteOnAllDevices,
fontSize: 14.sp,
textColor: Colors.black,
),
],
),
),
),
Divider(height: height(1), color: SocialChatTheme.dividerColor),
GestureDetector(
onTap: () async {
SmartDialog.dismiss(tag: "showDeleteDialog");
},
child: Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
color: Colors.transparent,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
text(
SCAppLocalizations.of(context)!.cancel,
fontSize: 14.sp,
textColor: Colors.black,
),
],
),
),
),
],
),
),
);
},
);
}
void acceptOpt(String id, String type) {
SmartDialog.show(
tag: "showConfirmDialog",
alignment: Alignment.center,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return MsgDialog(
title: SCAppLocalizations.of(context)!.tips,
msg: SCAppLocalizations.of(context)!.confirmAcceptTheInvitation,
btnText: SCAppLocalizations.of(context)!.confirm,
onEnsure: () async {
if (type == SCSysytemMessageType.AGENT_SEND_INVITE_HOST.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteHostOpt(context, id, "1");
} else if (type == SCSysytemMessageType.BD_SEND_INVITE_AGENT.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteAgentOpt(context, id, "1");
} else if (type == SCSysytemMessageType.BD_LEADER_INVITE_BD.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteBDOpt(context, id, "1");
} else if (type ==
SCSysytemMessageType.BD_LEADER_INVITE_BD_LEADER.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteBDLeader(context, id, "1");
} else if (type ==
SCSysytemMessageType.ADMIN_INVITE_RECHARGE_AGENT.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteRechargeAgent(context, id, "1");
} else if (type == SCSysytemMessageType.CP_BUILD.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).cpRlationshipProcessApply(context, id, true);
}
},
);
},
);
}
void rejectOpt(String id, String type) {
SmartDialog.show(
tag: "showConfirmDialog",
alignment: Alignment.center,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return MsgDialog(
title: SCAppLocalizations.of(context)!.tips,
msg: SCAppLocalizations.of(context)!.confirmDeclineTheInvitation,
btnText: SCAppLocalizations.of(context)!.confirm,
onEnsure: () async {
if (type == SCSysytemMessageType.AGENT_SEND_INVITE_HOST.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteHostOpt(context, id, "2");
} else if (type == SCSysytemMessageType.BD_SEND_INVITE_AGENT.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteAgentOpt(context, id, "2");
} else if (type == SCSysytemMessageType.BD_LEADER_INVITE_BD.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteBDOpt(context, id, "2");
} else if (type ==
SCSysytemMessageType.BD_LEADER_INVITE_BD_LEADER.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteBDLeader(context, id, "2");
} else if (type ==
SCSysytemMessageType.ADMIN_INVITE_RECHARGE_AGENT.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).inviteRechargeAgent(context, id, "2");
} else if (type == SCSysytemMessageType.CP_BUILD.name) {
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).cpRlationshipProcessApply(context, id, false);
}
},
);
},
);
}
}