diff --git a/assets/i18n/en-US.json b/assets/i18n/en-US.json index f3ab563d..4c64b100 100644 --- a/assets/i18n/en-US.json +++ b/assets/i18n/en-US.json @@ -1258,6 +1258,7 @@ "messageSentAt": "Sent at {}", "myTickets": "My Tickets", "drawHistory": "Draw History", + "lottery": "Lottery", "noLotteryTickets": "No lottery tickets yet", "buyYourFirstTicket": "Buy your first lottery ticket to get started!", "buyTicket": "Buy Ticket", @@ -1272,7 +1273,7 @@ "noDrawHistory": "No draw history yet", "buyLotteryTicket": "Buy Lottery Ticket", "selectNumbers": "Select Numbers", - "select5UniqueNumbers": "Select 5 unique numbers (0-99)", + "select5UniqueNumbers": "Select 5 unique numbers", "selectSpecialNumber": "Select Special Number", "selectMultiplier": "Select Multiplier", "baseCost": "Base Cost", @@ -1285,5 +1286,9 @@ "totalTickets": "Total Tickets", "totalWinners": "Total Winners", "prizePool": "Prize Pool", - "enterPinToConfirmPayment": "Enter your PIN code to confirm payment" + "enterPinToConfirmPayment": "Enter your PIN code to confirm payment", + "purchase": "Purchase", + "multiplierLabel": "Multiplier", + "specialOnly": "Special Only", + "matches": "Matches" } diff --git a/lib/screens/lottery.dart b/lib/screens/lottery.dart index c8d76ef3..1f6a8a30 100644 --- a/lib/screens/lottery.dart +++ b/lib/screens/lottery.dart @@ -293,14 +293,23 @@ class LotteryTicketsList extends HookConsumerWidget { final numbers = []; // Check if any numbers matched - bool hasAnyMatch = false; + bool hasAnyMatch = + ticket.matchedRegionOneNumbers != null && + ticket.matchedRegionOneNumbers!.isNotEmpty; // Add region one numbers for (final number in ticket.regionOneNumbers) { final isMatched = ticket.matchedRegionOneNumbers?.contains(number) ?? false; if (isMatched) hasAnyMatch = true; - numbers.add(_buildNumberWidget(context, number, isMatched: isMatched)); + numbers.add( + _buildNumberWidget( + context, + number, + isMatched: isMatched, + allUnmatched: !hasAnyMatch && ticket.drawStatus >= 1, + ), + ); } // Add region two number @@ -313,28 +322,15 @@ class LotteryTicketsList extends HookConsumerWidget { ticket.regionTwoNumber, isMatched: isSpecialMatched, isSpecial: true, + allUnmatched: !hasAnyMatch && ticket.drawStatus >= 1, ), ); - final wrapWidget = Wrap( + return Wrap( spacing: 6, crossAxisAlignment: WrapCrossAlignment.center, children: numbers, ); - - // If no numbers matched and ticket is drawn, apply red background - if (!hasAnyMatch && ticket.drawStatus >= 1) { - return Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: BoxDecoration( - color: Colors.red.withOpacity(0.1), - borderRadius: BorderRadius.circular(8), - ), - child: wrapWidget, - ); - } - - return wrapWidget; } Widget _buildNumberWidget( @@ -342,6 +338,7 @@ class LotteryTicketsList extends HookConsumerWidget { int number, { bool isMatched = false, bool isSpecial = false, + bool allUnmatched = false, }) { Color backgroundColor; Color textColor; @@ -364,6 +361,17 @@ class LotteryTicketsList extends HookConsumerWidget { isSpecial ? Theme.of(context).colorScheme.secondary : Theme.of(context).colorScheme.outline.withOpacity(0.3); + + // Blend with red if all numbers are unmatched + if (allUnmatched) { + backgroundColor = Color.alphaBlend( + Colors.red.withOpacity(0.3), + backgroundColor, + ); + if (!isSpecial) { + textColor = Color.alphaBlend(Colors.red.withOpacity(0.5), textColor); + } + } } return Container( @@ -548,7 +556,7 @@ class _LotteryPurchaseSheetState extends State { color: Theme.of(context).colorScheme.primary, ), ), - const Gap(8), + const Gap(16), _buildMultiplierSelector(), const Gap(16), @@ -667,7 +675,7 @@ class _LotteryPurchaseSheetState extends State { selectedNumbers.last == number && selectedNumbers.length == 6; - return InkWell( + return GestureDetector( onTap: () => _toggleNumber(number), child: Container( decoration: BoxDecoration( @@ -714,7 +722,8 @@ class _LotteryPurchaseSheetState extends State { initialValue: multiplier.toString(), keyboardType: TextInputType.number, decoration: InputDecoration( - labelText: 'Multiplier (1-10)', + labelText: 'multiplierLabel'.tr(), + prefixText: 'x', border: OutlineInputBorder(borderRadius: BorderRadius.circular(8)), contentPadding: const EdgeInsets.symmetric( horizontal: 16, @@ -723,7 +732,7 @@ class _LotteryPurchaseSheetState extends State { ), onChanged: (value) { final parsed = int.tryParse(value); - if (parsed != null && parsed >= 1 && parsed <= 10) { + if (parsed != null && parsed >= 1) { setState(() => multiplier = parsed); } }, @@ -741,18 +750,24 @@ class _LotteryPurchaseSheetState extends State { } Widget _buildPrizeStructure() { - final prizeStructure = { - '5+Special': '1000000.00', - '5': '100000.00', - '4+Special': '5000.00', - '4': '500.00', - '3+Special': '100.00', - '3': '50.00', - '2+Special': '10.00', - '2': '5.00', - '1+Special': '2.00', - '0+Special': '1.00', - }; + // Base rewards for matched numbers (0-5) + final baseRewards = [0, 10, 100, 500, 1000, 10000]; + + final prizeStructure = {}; + + // Generate prize structure for 0-5 matches with and without special + for (int matches = 5; matches >= 0; matches--) { + final baseReward = baseRewards[matches]; + + // With special number match (x10 multiplier) + final specialReward = baseReward * 10; + prizeStructure['$matches+Special'] = specialReward.toStringAsFixed(2); + + // Without special number match + if (matches > 0) { + prizeStructure[matches.toString()] = baseReward.toStringAsFixed(2); + } + } return Card( child: Padding( @@ -765,7 +780,11 @@ class _LotteryPurchaseSheetState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(entry.key.tr()), + Text( + entry.key == '0+Special' + ? 'specialOnly'.tr() + : entry.key.tr(), + ), Text( '${entry.value} ${'walletCurrencyShortPoints'.tr()}', ),