即时红包领取层弹窗加个本地兜底

This commit is contained in:
roxy 2026-05-11 13:39:49 +08:00
parent 39c5fbf208
commit 829914c58c
2 changed files with 40 additions and 0 deletions

View File

@ -26,6 +26,8 @@ class RoomRedPacketOpenDialog extends StatefulWidget {
static final Map<String, num> _claimedAmountByPacketId = {};
static final Set<String> _unavailablePacketIds = {};
static final ValueNotifier<int> claimedStateNotifier = ValueNotifier<int>(0);
static String? _activeDialogPacketId;
static DateTime? _activeDialogRequestedAt;
final RoomRedPacketUiData data;
final List<RoomRedPacketUiData>? 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<RoomRedPacketOpenDialog> createState() =>
_RoomRedPacketOpenDialogState();

View File

@ -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<RoomRedPacketSendPanel> {
priority: 1000,
),
);
if (!isDelayedPacket) {
_showImmediateSentRedPacketDialog(payload);
}
debugPrint(
'[RoomRedPacket][SendFallback] inserted local chat/floating packetId=$packetId roomId=$roomId',
);
}
void _showImmediateSentRedPacketDialog(Map<String, dynamic> 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);