diff --git a/lib/controller/message/chat_controller.dart b/lib/controller/message/chat_controller.dart index 3dc20e2..d9a20ed 100644 --- a/lib/controller/message/chat_controller.dart +++ b/lib/controller/message/chat_controller.dart @@ -45,6 +45,9 @@ class ChatController extends GetxController { // 需要显示508错误提示的消息ID集合(临时状态,不持久化) final Set _roseErrorMessageIds = {}; + // 需要显示敏感词错误提示的消息ID集合(临时状态,不持久化) + final Set _sensitiveWordMessageIds = {}; + // 网络服务 final NetworkService _networkService = NetworkService(); @@ -58,6 +61,17 @@ class ChatController extends GetxController { _roseErrorMessageIds.add(messageId); update(); } + + /// 检查消息是否需要显示敏感词错误提示 + bool shouldShowSensitiveWordError(String messageId) { + return _sensitiveWordMessageIds.contains(messageId); + } + + /// 添加需要显示敏感词错误提示的消息ID + void addSensitiveWordMessageId(String messageId) { + _sensitiveWordMessageIds.add(messageId); + update(); + } ChatController({ required this.userId, @@ -753,6 +767,22 @@ class ChatController extends GetxController { .toList(); if (newMessages.isNotEmpty) { + // 从新消息的 attributes 中恢复错误码状态 + for (var msg in newMessages) { + if (msg.status == MessageStatus.FAIL && msg.direction == MessageDirection.SEND) { + try { + final errorCode = msg.attributes?['errorCode'] as String?; + if (errorCode == 'E0002') { + _roseErrorMessageIds.add(msg.msgId); + } else if (errorCode == 'E0001') { + _sensitiveWordMessageIds.add(msg.msgId); + } + } catch (e) { + // 忽略错误 + } + } + } + messages.insertAll(0, newMessages); // 更新游标为最旧的消息ID(列表开头) _cursor = newMessages.first.msgId; @@ -769,8 +799,9 @@ class ChatController extends GetxController { } else { // 刷新时替换整个列表,但需要去重(处理重发消息的情况) // 对于相同内容的消息,只保留最新的(msgId更大的) - // 重新进入页面时,清空临时错误提示状态(不持久化) + // 重新进入页面时,清空临时错误提示状态,然后从消息 attributes 中恢复 _roseErrorMessageIds.clear(); + _sensitiveWordMessageIds.clear(); final Map contentToMessage = {}; @@ -802,6 +833,22 @@ class ChatController extends GetxController { // 按时间戳排序(从旧到新) deduplicatedMessages.sort((a, b) => a.serverTime.compareTo(b.serverTime)); + // 从消息 attributes 中恢复错误码状态 + for (var msg in deduplicatedMessages) { + if (msg.status == MessageStatus.FAIL && msg.direction == MessageDirection.SEND) { + try { + final errorCode = msg.attributes?['errorCode'] as String?; + if (errorCode == 'E0002') { + _roseErrorMessageIds.add(msg.msgId); + } else if (errorCode == 'E0001') { + _sensitiveWordMessageIds.add(msg.msgId); + } + } catch (e) { + // 忽略错误 + } + } + } + messages.assignAll(deduplicatedMessages); // 更新游标为最旧的消息ID(列表开头) if (deduplicatedMessages.isNotEmpty) { diff --git a/lib/im/im_manager.dart b/lib/im/im_manager.dart index e15b80a..59a6050 100644 --- a/lib/im/im_manager.dart +++ b/lib/im/im_manager.dart @@ -286,7 +286,7 @@ class IMManager { // 检查错误码是否为508(玫瑰不足) try { - final errorCode = err.code; + final errorCode = err.description; // 通知 ChatController 更新消息状态 final targetId = message.to; @@ -299,11 +299,23 @@ class IMManager { // 更新消息对象 controller.messages[index] = message; - // 如果是508错误,添加到临时错误提示集合中(不存储到消息attributes) - if (errorCode == 508) { + // 将错误码保存到消息 attributes 中(用于页面重新加载时恢复状态) + message.attributes ??= {}; + message.attributes!['errorCode'] = errorCode; + + // 如果是508错误,添加到临时错误提示集合中 + if (errorCode == 'E0002') { controller.addRoseErrorMessageId(message.msgId); if (Get.isLogEnable) { - Get.log('⚠️ [IMManager] 检测到错误码508(玫瑰不足),已添加到临时错误提示集合: msgId=${message.msgId}'); + Get.log('⚠️ [IMManager] 检测到错误码E0002(玫瑰不足),已添加到临时错误提示集合: msgId=${message.msgId}'); + } + } + + // 如果是E0001错误(敏感词拦截),添加到临时错误提示集合中 + if (errorCode == 'E0001') { + controller.addSensitiveWordMessageId(message.msgId); + if (Get.isLogEnable) { + Get.log('⚠️ [IMManager] 检测到错误码E0001(敏感词拦截),已添加到临时错误提示集合: msgId=${message.msgId}'); } } @@ -338,11 +350,23 @@ class IMManager { final matchedMessage = controller.messages[contentIndex]; controller.messages[contentIndex] = message; + // 将错误码保存到消息 attributes 中(用于页面重新加载时恢复状态) + message.attributes ??= {}; + message.attributes!['errorCode'] = errorCode.toString(); + // 如果是508错误,添加到临时错误提示集合中(使用匹配到的消息ID) - if (errorCode == 508) { + if (errorCode == 508 || errorCode == 'E0002') { controller.addRoseErrorMessageId(matchedMessage.msgId); if (Get.isLogEnable) { - Get.log('⚠️ [IMManager] 检测到错误码508(玫瑰不足),已通过内容匹配添加到临时错误提示集合: msgId=${matchedMessage.msgId}'); + Get.log('⚠️ [IMManager] 检测到错误码508/E0002(玫瑰不足),已通过内容匹配添加到临时错误提示集合: msgId=${matchedMessage.msgId}'); + } + } + + // 如果是E0001错误(敏感词拦截),添加到临时错误提示集合中 + if (errorCode == 'E0001') { + controller.addSensitiveWordMessageId(matchedMessage.msgId); + if (Get.isLogEnable) { + Get.log('⚠️ [IMManager] 检测到错误码E0001(敏感词拦截),已通过内容匹配添加到临时错误提示集合: msgId=${matchedMessage.msgId}'); } } diff --git a/lib/pages/message/chat_page.dart b/lib/pages/message/chat_page.dart index b2e6bf9..06f0d64 100644 --- a/lib/pages/message/chat_page.dart +++ b/lib/pages/message/chat_page.dart @@ -252,6 +252,11 @@ class _ChatPageState extends State { message.status == MessageStatus.FAIL && controller.shouldShowRoseError(message.msgId); + // 检查是否需要显示敏感词错误提示(使用临时状态,不持久化) + final showSensitiveWordError = isSentByMe && + message.status == MessageStatus.FAIL && + controller.shouldShowSensitiveWordError(message.msgId); + // 🚀 性能优化:为每个消息项设置唯一的 key return Column( crossAxisAlignment: CrossAxisAlignment.stretch, @@ -265,6 +270,8 @@ class _ChatPageState extends State { ), // 显示错误提示(错误码508) if (showRoseError) _buildRoseErrorHint(context), + // 显示敏感词错误提示(错误码E0001) + if (showSensitiveWordError) _buildSensitiveWordErrorHint(context), ], ); }, @@ -647,4 +654,23 @@ class _ChatPageState extends State { ), ); } + + // 构建敏感词错误提示 + Widget _buildSensitiveWordErrorHint(BuildContext context) { + return Container( + margin: EdgeInsets.only(top: 8.h, bottom: 8.h), + padding: EdgeInsets.symmetric(horizontal: 16.w), + width: double.infinity, + child: Center( + child: Text( + '聊天内容包含敏感词', + style: TextStyle( + fontSize: 11.sp, + color: Color.fromRGBO(199, 199, 199, 1), + ), + textAlign: TextAlign.center, + ), + ), + ); + } } diff --git a/lib/widget/live/live_room_notice_chat_panel.dart b/lib/widget/live/live_room_notice_chat_panel.dart index 970ddbe..9a278bd 100644 --- a/lib/widget/live/live_room_notice_chat_panel.dart +++ b/lib/widget/live/live_room_notice_chat_panel.dart @@ -3,8 +3,10 @@ import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/extension/ex_widget.dart'; import 'package:dating_touchme_app/generated/assets.dart'; import 'package:dating_touchme_app/widget/live/live_room_chat_item.dart'; +import 'package:dating_touchme_app/widget/live/live_recharge_popup.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; class LiveRoomNoticeChatPanel extends StatefulWidget { @@ -51,6 +53,18 @@ class _LiveRoomNoticeChatPanelState extends State { final linkMicCard = controller.linkMicCard.value; final cardNum = linkMicCard?.num ?? 0; + // 如果 cardNum 为 0,显示"上麦20玫瑰" + if (cardNum == 0) { + return Text( + '上麦20玫瑰', + style: TextStyle( + fontSize: 9.w, + color: Colors.white.withOpacity(0.8), + ), + ); + } + + // 否则显示剩余相亲卡数量 return Text( '剩余$cardNum张相亲卡', style: TextStyle( @@ -148,6 +162,25 @@ class _LiveRoomNoticeChatPanelState extends State { ], ), ).onTap(() async{ + // 检查是否需要弹出充值弹框 + if (!controller.isLive.value) { + final userData = GlobalData().userData; + final isMale = userData?.genderCode == 0; + if (isMale) { + final linkMicCard = controller.linkMicCard.value; + final cardNum = linkMicCard?.num ?? 0; + // 如果显示"上麦20玫瑰"且玫瑰数量小于20,弹出充值弹框 + if (cardNum == 0 && controller.roseCount.value < 20) { + SmartDialog.show( + alignment: Alignment.bottomCenter, + maskColor: Colors.black.withOpacity(0.5), + builder: (_) => const LiveRechargePopup(), + ); + return; + } + } + } + if(controller.isLive.value){ await controller.leaveChat(); }else{ diff --git a/lib/widget/message/text_item.dart b/lib/widget/message/text_item.dart index 7574b51..fe303b6 100644 --- a/lib/widget/message/text_item.dart +++ b/lib/widget/message/text_item.dart @@ -261,6 +261,20 @@ class TextItem extends StatelessWidget { return SizedBox.shrink(); } + // 检查是否是敏感词消息 + bool isSensitiveWordMessage = false; + try { + final chatController = Get.find(); + isSensitiveWordMessage = chatController.shouldShowSensitiveWordError(message.msgId); + } catch (e) { + // ChatController 可能不存在,忽略错误 + } + + // 如果是敏感词消息,不显示重发按钮 + if (isSensitiveWordMessage) { + return SizedBox.shrink(); + } + // 检查消息状态 final status = message.status;