From a44b7394fe3369b948493a55d5cc49090f37ff7c Mon Sep 17 00:00:00 2001 From: roxy Date: Sat, 16 May 2026 04:08:51 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A9=BA=E5=A5=96=E5=8A=B1reward=E5=BC=B9?= =?UTF-8?q?=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/l10n/intl_en.json | 2 +- .../rocket/room_rocket_reward_dialog.dart | 46 +++++++++++++++++-- ...room_rocket_reward_dialog_loader_test.dart | 27 +++++++++++ 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/assets/l10n/intl_en.json b/assets/l10n/intl_en.json index bca0970..43bde15 100644 --- a/assets/l10n/intl_en.json +++ b/assets/l10n/intl_en.json @@ -724,7 +724,7 @@ "roomRocketNoteTitle": "Note", "roomRocketNoteSectionTitle": "Each time a VIP", "roomRocketNoteSectionBody": "1. Each time a VIP level is purchased, it is valid for 30 days, and can be manually renewed after expiration.", - "roomRocketRewardEmptyText": "No rewards earned. Better luck next time.", + "roomRocketRewardEmptyText": "No reward", "roomRocketRecordEmptyText": "No reward records", "launchRocket": "Launch Rocket", "roomRocketFuelFullNotice": "Rocket fuel is full! Launching in {1}s!" diff --git a/lib/ui_kit/widgets/room/rocket/room_rocket_reward_dialog.dart b/lib/ui_kit/widgets/room/rocket/room_rocket_reward_dialog.dart index 1e67126..d0bfe6f 100644 --- a/lib/ui_kit/widgets/room/rocket/room_rocket_reward_dialog.dart +++ b/lib/ui_kit/widgets/room/rocket/room_rocket_reward_dialog.dart @@ -35,7 +35,7 @@ class RoomRocketRewardDialog extends StatelessWidget { final emptyText = _translate( localizations, 'roomRocketRewardEmptyText', - 'No rewards earned. Better luck next time.', + 'No reward', ); final contentDirection = Directionality.of(context); final resolvedRewards = _normalizeRewards( @@ -257,7 +257,7 @@ class _RewardDialogCanvas extends StatelessWidget { if (isEmpty) _buildEmptyState() else ...[ - _buildRewardGrid(), + rewards.isEmpty ? _buildRewardEmptyState() : _buildRewardGrid(), _buildWinnerList(), ], _buildLoadingText(), @@ -380,9 +380,6 @@ class _RewardDialogCanvas extends StatelessWidget { } Widget _buildRewardGrid() { - if (rewards.isEmpty) { - return const SizedBox.shrink(); - } final columns = math.max(3, (rewards.length / 2).ceil()); return Positioned( left: s(28), @@ -425,6 +422,45 @@ class _RewardDialogCanvas extends StatelessWidget { ); } + Widget _buildRewardEmptyState() { + return Positioned( + left: s(0), + top: s(268), + width: s(_designWidth), + height: s(178), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + _RewardDialogAssets.empty, + width: s(72), + height: s(72), + fit: BoxFit.contain, + ), + SizedBox(height: s(10)), + SizedBox( + width: s(250), + child: Text( + emptyText, + textDirection: contentDirection, + textScaler: TextScaler.noScaling, + maxLines: 2, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white.withValues(alpha: 0.72), + fontSize: s(13), + height: 1.25, + fontWeight: FontWeight.w600, + decoration: TextDecoration.none, + ), + ), + ), + ], + ), + ); + } + Widget _buildWinnerList() { return Positioned( left: s(12), diff --git a/test/room_rocket_reward_dialog_loader_test.dart b/test/room_rocket_reward_dialog_loader_test.dart index 3fb48f8..bda3aa8 100644 --- a/test/room_rocket_reward_dialog_loader_test.dart +++ b/test/room_rocket_reward_dialog_loader_test.dart @@ -1,5 +1,8 @@ +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:yumi/shared/business_logic/models/res/sc_room_rocket_api_res.dart'; +import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_dialog.dart'; +import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_reward_dialog.dart'; import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_reward_dialog_loader.dart'; void main() { @@ -27,6 +30,30 @@ void main() { expect(records.map((item) => item.rewardAmount), [5000, 5200]); }); }); + + group('room rocket reward dialog', () { + testWidgets('shows reward empty state when room winners exist', ( + tester, + ) async { + await tester.pumpWidget( + const MaterialApp( + home: Scaffold( + body: RoomRocketRewardDialog( + rewards: [], + winners: [ + RoomRocketRewardWinner(nickname: 'test man'), + ], + loadingText: '', + useMockFallback: false, + ), + ), + ), + ); + + expect(find.text('No reward'), findsOneWidget); + expect(find.text('test man'), findsOneWidget); + }); + }); } SCRoomRocketRewardRecordRes _rewardRecord({