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 { final ScrollController _scrollController = ScrollController(); final RefreshController _refreshController = RefreshController(); RtmProvider? rtmProvider; V2TimConversation? currentConversation; List currentConversationMessageList = []; BusinessLogicStrategy get _strategy => SCGlobalConfig.businessLogicStrategy; @override void initState() { super.initState(); rtmProvider = Provider.of(context, listen: false); currentConversation = widget.conversation; rtmProvider?.onNewMessageCurrentConversationListener = _onNewMessage; loadMsg(); } @override void dispose() { rtmProvider?.onNewMessageCurrentConversationListener = null; super.dispose(); } Future loadMsg() async { V2TimValueCallback> v2timValueCallback = await TencentImSDKPlugin.v2TIMManager .getMessageManager() .getC2CHistoryMessageList( userID: currentConversation!.userID!, count: 100, lastMsgID: null, ); List messages = v2timValueCallback.data!; // List 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> v2timValueCallback = await TencentImSDKPlugin.v2TIMManager .getMessageManager() .getC2CHistoryMessageList( userID: currentConversation!.userID ?? "", count: 30, lastMsgID: currentConversationMessageList.last.msgID, ); List messages = v2timValueCallback.data as List; 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 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: [ Visibility( visible: showTime, child: Container( margin: EdgeInsets.only(bottom: 12.w), child: Row( children: [ 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: [ 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: [ 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( 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( context, listen: false, ).inviteHostOpt(context, id, "1"); } else if (type == SCSysytemMessageType.BD_SEND_INVITE_AGENT.name) { Provider.of( context, listen: false, ).inviteAgentOpt(context, id, "1"); } else if (type == SCSysytemMessageType.BD_LEADER_INVITE_BD.name) { Provider.of( context, listen: false, ).inviteBDOpt(context, id, "1"); } else if (type == SCSysytemMessageType.BD_LEADER_INVITE_BD_LEADER.name) { Provider.of( context, listen: false, ).inviteBDLeader(context, id, "1"); } else if (type == SCSysytemMessageType.ADMIN_INVITE_RECHARGE_AGENT.name) { Provider.of( context, listen: false, ).inviteRechargeAgent(context, id, "1"); } else if (type == SCSysytemMessageType.CP_BUILD.name) { Provider.of( 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( context, listen: false, ).inviteHostOpt(context, id, "2"); } else if (type == SCSysytemMessageType.BD_SEND_INVITE_AGENT.name) { Provider.of( context, listen: false, ).inviteAgentOpt(context, id, "2"); } else if (type == SCSysytemMessageType.BD_LEADER_INVITE_BD.name) { Provider.of( context, listen: false, ).inviteBDOpt(context, id, "2"); } else if (type == SCSysytemMessageType.BD_LEADER_INVITE_BD_LEADER.name) { Provider.of( context, listen: false, ).inviteBDLeader(context, id, "2"); } else if (type == SCSysytemMessageType.ADMIN_INVITE_RECHARGE_AGENT.name) { Provider.of( context, listen: false, ).inviteRechargeAgent(context, id, "2"); } else if (type == SCSysytemMessageType.CP_BUILD.name) { Provider.of( context, listen: false, ).cpRlationshipProcessApply(context, id, false); } }, ); }, ); } }