diff --git a/lib/ui_kit/widgets/room/red_packet/room_red_packet_open_dialog.dart b/lib/ui_kit/widgets/room/red_packet/room_red_packet_open_dialog.dart index 7782951..c45428c 100644 --- a/lib/ui_kit/widgets/room/red_packet/room_red_packet_open_dialog.dart +++ b/lib/ui_kit/widgets/room/red_packet/room_red_packet_open_dialog.dart @@ -26,6 +26,8 @@ class RoomRedPacketOpenDialog extends StatefulWidget { static final Map _claimedAmountByPacketId = {}; static final Set _unavailablePacketIds = {}; static final ValueNotifier claimedStateNotifier = ValueNotifier(0); + static String? _activeDialogPacketId; + static DateTime? _activeDialogRequestedAt; final RoomRedPacketUiData data; final List? dataList; @@ -66,6 +68,12 @@ class RoomRedPacketOpenDialog extends StatefulWidget { } } + final nextPacketId = packets[initialIndex].packetId.trim(); + if (_isDuplicateDialogRequest(nextPacketId)) { + return; + } + _activeDialogPacketId = nextPacketId; + _activeDialogRequestedAt = DateTime.now(); SmartDialog.dismiss(tag: dialogTag); SmartDialog.show( tag: dialogTag, @@ -208,6 +216,17 @@ class RoomRedPacketOpenDialog extends StatefulWidget { } } + static bool _isDuplicateDialogRequest(String packetId) { + if (packetId.isEmpty || _activeDialogPacketId != packetId) { + return false; + } + final requestedAt = _activeDialogRequestedAt; + final isRecent = + requestedAt != null && + DateTime.now().difference(requestedAt) < const Duration(seconds: 1); + return isRecent || SmartDialog.checkExist(tag: dialogTag); + } + @override State createState() => _RoomRedPacketOpenDialogState(); diff --git a/lib/ui_kit/widgets/room/red_packet/room_red_packet_send_panel.dart b/lib/ui_kit/widgets/room/red_packet/room_red_packet_send_panel.dart index 5a27833..afe018c 100644 --- a/lib/ui_kit/widgets/room/red_packet/room_red_packet_send_panel.dart +++ b/lib/ui_kit/widgets/room/red_packet/room_red_packet_send_panel.dart @@ -29,6 +29,8 @@ import 'package:yumi/ui_kit/components/sc_tts.dart'; import 'package:yumi/ui_kit/widgets/room/room_msg_item.dart'; import 'package:yumi/ui_kit/widgets/room/red_packet/room_red_packet_error.dart'; import 'package:yumi/ui_kit/widgets/room/red_packet/room_red_packet_history_page.dart'; +import 'package:yumi/ui_kit/widgets/room/red_packet/room_red_packet_models.dart'; +import 'package:yumi/ui_kit/widgets/room/red_packet/room_red_packet_open_dialog.dart'; import 'package:yumi/ui_kit/widgets/room/red_packet/room_red_packet_rule_page.dart'; class RoomRedPacketSendPanel extends StatefulWidget { @@ -737,11 +739,30 @@ class _RoomRedPacketSendPanelState extends State { priority: 1000, ), ); + if (!isDelayedPacket) { + _showImmediateSentRedPacketDialog(payload); + } debugPrint( '[RoomRedPacket][SendFallback] inserted local chat/floating packetId=$packetId roomId=$roomId', ); } + void _showImmediateSentRedPacketDialog(Map payload) { + final dialogData = RoomRedPacketUiData.fromJson(payload); + if (!dialogData.hasPacketId || + !dialogData.isOpenable || + RoomRedPacketOpenDialog.isClaimedLocally(dialogData.packetId)) { + return; + } + WidgetsBinding.instance.addPostFrameCallback((_) { + final currentContext = navigatorKey.currentState?.context; + if (currentContext == null || !currentContext.mounted) { + return; + } + RoomRedPacketOpenDialog.show(currentContext, dialogData); + }); + } + void _showInsufficientBalanceRechargeSheet() { SmartDialog.dismiss(tag: RoomRedPacketSendPanel.dialogTag); _RoomRedPacketRechargeSheet.show(context);