diff --git a/lib/common/painter/wheel_painter.dart b/lib/common/painter/wheel_painter.dart new file mode 100644 index 0000000..2c2545c --- /dev/null +++ b/lib/common/painter/wheel_painter.dart @@ -0,0 +1,184 @@ +import 'dart:math' as math; +import 'package:flutter/material.dart'; + +import '../../presentation/pages/mini_games/ferris_wheel/data/model.dart'; +import '../theme/theme.dart'; + +class WheelPainter extends CustomPainter { + final List sections; + + WheelPainter({required this.sections}); + + @override + void paint(Canvas canvas, Size size) { + final center = Offset(size.width / 2, size.height / 2); + final radius = size.width / 2; + final sectionAngle = 2 * math.pi / sections.length; + + // Draw outer white border + final outerBorderPaint = Paint() + ..color = Colors.white + ..style = PaintingStyle.fill; + canvas.drawCircle(center, radius, outerBorderPaint); + + // Draw blue border ring + final blueBorderPaint = Paint() + ..color = const Color(0xFF3B82F6) + ..style = PaintingStyle.fill; + canvas.drawCircle(center, radius - 8, blueBorderPaint); + + // Draw inner white circle + final innerWhitePaint = Paint() + ..color = Colors.white + ..style = PaintingStyle.fill; + canvas.drawCircle(center, radius - 20, innerWhitePaint); + + // Draw sections + for (int i = 0; i < sections.length; i++) { + final startAngle = i * sectionAngle - math.pi / 2; + + // Section background + final sectionPaint = Paint() + ..color = sections[i].color + ..style = PaintingStyle.fill; + + canvas.drawArc( + Rect.fromCircle(center: center, radius: radius - 22), + startAngle, + sectionAngle, + true, + sectionPaint, + ); + + // Draw icon in each section + final iconAngle = startAngle + sectionAngle / 2; + final iconPosition = Offset( + center.dx + (radius - 60) * math.cos(iconAngle), + center.dy + (radius - 60) * math.sin(iconAngle), + ); + + // Draw icon background circle + final iconBgPaint = Paint() + ..color = Colors.white + ..style = PaintingStyle.fill; + canvas.drawCircle(iconPosition, 16, iconBgPaint); + + // Save canvas state for icon drawing + canvas.save(); + canvas.translate(iconPosition.dx, iconPosition.dy); + + // Draw icon using TextPainter to simulate Icon widget + final iconText = _getIconText(sections[i].icon); + final iconTextPainter = TextPainter( + text: TextSpan( + text: iconText, + style: TextStyle( + fontFamily: 'MaterialIcons', + fontSize: 20, + color: sections[i].color, + fontWeight: FontWeight.normal, + ), + ), + textDirection: TextDirection.ltr, + ); + iconTextPainter.layout(); + iconTextPainter.paint( + canvas, + Offset(-iconTextPainter.width / 2, -iconTextPainter.height / 2), + ); + + canvas.restore(); + + // Draw prize text + final textAngle = startAngle + sectionAngle / 2; + final textPosition = Offset( + center.dx + (radius - 100) * math.cos(textAngle), + center.dy + (radius - 100) * math.sin(textAngle), + ); + + // Save canvas state for text rotation + canvas.save(); + canvas.translate(textPosition.dx, textPosition.dy); + canvas.rotate(textAngle + math.pi / 2); + + final textPainter = TextPainter( + text: TextSpan( + text: sections[i].prize, + style: const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ), + textDirection: TextDirection.ltr, + ); + textPainter.layout(); + textPainter.paint( + canvas, + Offset(-textPainter.width / 2, -textPainter.height / 2), + ); + + canvas.restore(); + } + + // Draw white dots around the outer edge + final dotPaint = Paint() + ..color = Colors.white + ..style = PaintingStyle.fill; + + for (int i = 0; i < 24; i++) { + final dotAngle = (2 * math.pi / 24) * i; + final dotPosition = Offset( + center.dx + (radius - 14) * math.cos(dotAngle), + center.dy + (radius - 14) * math.sin(dotAngle), + ); + canvas.drawCircle(dotPosition, 3, dotPaint); + } + + // Draw section dividers + final dividerPaint = Paint() + ..color = AppColor.white + ..style = PaintingStyle.stroke + ..strokeWidth = 2; + + for (int i = 0; i < sections.length; i++) { + final angle = i * sectionAngle - math.pi / 2; + final lineStart = Offset( + center.dx + (radius - 130) * math.cos(angle), + center.dy + (radius - 130) * math.sin(angle), + ); + final lineEnd = Offset( + center.dx + (radius - 22) * math.cos(angle), + center.dy + (radius - 22) * math.sin(angle), + ); + canvas.drawLine(lineStart, lineEnd, dividerPaint); + } + } + + String _getIconText(IconData icon) { + // Convert IconData to Unicode string for drawing + switch (icon.codePoint) { + case 0xe8f4: // Icons.visibility + return String.fromCharCode(0xe8f4); + case 0xe8f5: // Icons.visibility_off + return String.fromCharCode(0xe8f5); + case 0xe850: // Icons.account_balance_wallet + return String.fromCharCode(0xe850); + case 0xe151: // Icons.card_giftcard + return String.fromCharCode(0xe151); + case 0xe5d5: // Icons.refresh + return String.fromCharCode(0xe5d5); + case 0xe263: // Icons.attach_money + return String.fromCharCode(0xe263); + case 0xe8a1: // Icons.redeem + return String.fromCharCode(0xe8a1); + case 0xe57d: // Icons.monetization_on + return String.fromCharCode(0xe57d); + default: + return String.fromCharCode(0xe87c); // Default star icon + } + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/lib/presentation/pages/main/pages/home/widgets/feature_section.dart b/lib/presentation/pages/main/pages/home/widgets/feature_section.dart index cce9dd5..0cf23af 100644 --- a/lib/presentation/pages/main/pages/home/widgets/feature_section.dart +++ b/lib/presentation/pages/main/pages/home/widgets/feature_section.dart @@ -31,6 +31,12 @@ class HomeFeatureSection extends StatelessWidget { iconColor: const Color(0xFF388E3C), onTap: () => context.router.push(MerchantRoute()), ), + HomeFeatureCard( + icon: Icons.blur_circular, + title: 'Wheels', + iconColor: const Color(0xFF388E3C), + onTap: () => context.router.push(FerrisWheelRoute()), + ), ], ), ); diff --git a/lib/presentation/pages/mini_games/ferris_wheel/data/model.dart b/lib/presentation/pages/mini_games/ferris_wheel/data/model.dart new file mode 100644 index 0000000..55a85dd --- /dev/null +++ b/lib/presentation/pages/mini_games/ferris_wheel/data/model.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class WheelSection { + final Color color; + final IconData icon; + final String prize; + final int value; + + WheelSection({ + required this.color, + required this.icon, + required this.prize, + required this.value, + }); +} + +class PrizeHistory { + final String prize; + final DateTime dateTime; + final int value; + final Color color; + final IconData icon; + + PrizeHistory({ + required this.prize, + required this.dateTime, + required this.value, + required this.color, + required this.icon, + }); +} diff --git a/lib/presentation/pages/mini_games/ferris_wheel/ferris_wheel_page.dart b/lib/presentation/pages/mini_games/ferris_wheel/ferris_wheel_page.dart new file mode 100644 index 0000000..cedc4fd --- /dev/null +++ b/lib/presentation/pages/mini_games/ferris_wheel/ferris_wheel_page.dart @@ -0,0 +1,924 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'dart:math' as math; + +import '../../../../common/theme/theme.dart'; +import '../../../../common/painter/wheel_painter.dart'; +import 'data/model.dart'; + +@RoutePage() +class FerrisWheelPage extends StatefulWidget { + const FerrisWheelPage({super.key}); + + @override + State createState() => _FerrisWheelPageState(); +} + +class _FerrisWheelPageState extends State + with TickerProviderStateMixin { + late AnimationController _rotationController; + late AnimationController _glowController; + late AnimationController _pulseController; + late AnimationController _idleRotationController; + + Animation? _spinAnimation; + Animation? _pulseAnimation; + Animation? _idleRotationAnimation; + + int tokens = 3; + bool isSpinning = false; + String resultText = 'Belum pernah spin'; + double currentRotation = 0.0; + int currentTabIndex = 0; + + List prizeHistory = []; + + List wheelSections = [ + WheelSection( + color: AppColor.primary, + icon: Icons.visibility, + prize: '1 JT', + value: 1000000, + ), + WheelSection( + color: AppColor.info, + icon: Icons.account_balance_wallet, + prize: '10RB', + value: 10000, + ), + WheelSection( + color: AppColor.warning, + icon: Icons.card_giftcard, + prize: '50', + value: 50, + ), + WheelSection( + color: AppColor.success, + icon: Icons.refresh, + prize: 'SPIN', + value: 1, + ), + WheelSection( + color: AppColor.primaryDark, + icon: Icons.visibility, + prize: '30', + value: 30, + ), + WheelSection( + color: AppColor.textLight, + icon: Icons.attach_money, + prize: '5RB', + value: 5000, + ), + WheelSection( + color: AppColor.secondary, + icon: Icons.redeem, + prize: '20', + value: 20, + ), + WheelSection( + color: AppColor.info, + icon: Icons.monetization_on, + prize: '5RB', + value: 5000, + ), + ]; + + @override + void initState() { + super.initState(); + + // Initialize animation controllers + _rotationController = AnimationController( + duration: const Duration(seconds: 4), + vsync: this, + ); + + _glowController = AnimationController( + duration: const Duration(milliseconds: 2000), + vsync: this, + ); + + _pulseController = AnimationController( + duration: const Duration(milliseconds: 800), + vsync: this, + ); + + _idleRotationController = AnimationController( + duration: const Duration(seconds: 10), // 10 detik per putaran + vsync: this, + ); + + // Initialize animations + _pulseAnimation = Tween(begin: 1.0, end: 1.1).animate( + CurvedAnimation(parent: _pulseController, curve: Curves.easeInOut), + ); + + _idleRotationAnimation = Tween( + begin: 0.0, + end: 2 * math.pi, + ).animate(_idleRotationController); + + // Start animations + _glowController.repeat(reverse: true); + _pulseController.repeat(reverse: true); + _idleRotationController.repeat(); + } + + @override + void dispose() { + _rotationController.dispose(); + _glowController.dispose(); + _pulseController.dispose(); + _idleRotationController.dispose(); + super.dispose(); + } + + void _spinWheel() { + if (isSpinning || tokens <= 0) return; + + setState(() { + isSpinning = true; + tokens--; + resultText = 'Sedang berputar...'; + }); + + // Stop idle rotation + _idleRotationController.stop(); + + int targetSection = math.Random().nextInt(8); + double sectionAngle = (2 * math.pi) / 8; + double targetAngle = (targetSection * sectionAngle) + (sectionAngle / 2); + double baseRotations = 4 + math.Random().nextDouble() * 3; + + // Calculate current total rotation + double currentIdleRotation = _idleRotationAnimation?.value ?? 0.0; + double finalRotation = + currentRotation + + currentIdleRotation + + (baseRotations * 2 * math.pi) + + targetAngle; + + _spinAnimation = + Tween( + begin: currentRotation + currentIdleRotation, + end: finalRotation, + ).animate( + CurvedAnimation( + parent: _rotationController, + curve: Curves.easeOutCubic, + ), + ); + + _rotationController.reset(); + _rotationController.animateTo(1.0).then((_) { + setState(() { + currentRotation = finalRotation; + isSpinning = false; + resultText = + 'Selamat! Anda mendapat ${wheelSections[targetSection].prize}!'; + + prizeHistory.insert( + 0, + PrizeHistory( + prize: wheelSections[targetSection].prize, + dateTime: DateTime.now(), + value: wheelSections[targetSection].value, + color: wheelSections[targetSection].color, + icon: wheelSections[targetSection].icon, + ), + ); + }); + + _showWinDialog(wheelSections[targetSection]); + + // Restart idle rotation + _idleRotationController.reset(); + _idleRotationController.repeat(); + }); + } + + void _showWinDialog(WheelSection section) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + child: Container( + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: AppColor.primaryGradient, + ), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 80, + height: 80, + decoration: BoxDecoration( + color: AppColor.white, + borderRadius: BorderRadius.circular(40), + boxShadow: [ + BoxShadow( + color: AppColor.black.withOpacity(0.2), + blurRadius: 15, + spreadRadius: 2, + ), + ], + ), + child: Icon(section.icon, color: section.color, size: 40), + ), + const SizedBox(height: 16), + Text( + '🎉 Selamat! 🎉', + style: AppStyle.h5.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textWhite, + ), + ), + const SizedBox(height: 8), + Text( + 'Anda mendapatkan', + style: AppStyle.lg.copyWith(color: AppColor.textWhite), + ), + const SizedBox(height: 4), + Text( + section.prize, + style: AppStyle.h5.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textWhite, + ), + ), + const SizedBox(height: 20), + ElevatedButton( + onPressed: () => Navigator.of(context).pop(), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.white, + foregroundColor: AppColor.primary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(25), + ), + padding: const EdgeInsets.symmetric( + horizontal: 30, + vertical: 12, + ), + ), + child: Text( + 'Terima Kasih', + style: AppStyle.md.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.primary, + ), + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildMainContent() { + return Column( + children: [ + Container( + margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: AppColor.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: AppColor.primary, + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: Text( + 'G', + style: AppStyle.lg.copyWith( + color: AppColor.textWhite, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + const SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'GPY268e42', + style: AppStyle.lg.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textPrimary, + ), + ), + Text( + 'Warrior', + style: AppStyle.sm.copyWith( + color: AppColor.textSecondary, + ), + ), + ], + ), + ], + ), + Row( + children: [ + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + color: AppColor.warning, + shape: BoxShape.circle, + ), + child: Icon( + Icons.circle, + size: 12, + color: AppColor.textWhite, + ), + ), + const SizedBox(width: 8), + Text( + 'Token: $tokens', + style: AppStyle.lg.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textPrimary, + ), + ), + ], + ), + ], + ), + ), + + Text( + resultText, + style: AppStyle.md.copyWith(color: AppColor.textWhite), + ), + + const SizedBox(height: 20), + + Expanded( + child: Center( + child: Stack( + alignment: Alignment.center, + children: [ + AnimatedBuilder( + animation: _glowController, + builder: (context, child) { + return Container( + width: 340, + height: 340, + decoration: BoxDecoration( + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: AppColor.white.withOpacity( + 0.3 + 0.2 * _glowController.value, + ), + blurRadius: 40, + spreadRadius: 10, + ), + ], + ), + ); + }, + ), + AnimatedBuilder( + animation: isSpinning + ? _rotationController + : _idleRotationController, + builder: (context, child) { + double rotationAngle; + + if (isSpinning) { + rotationAngle = _spinAnimation?.value ?? currentRotation; + } else { + rotationAngle = + currentRotation + + (_idleRotationAnimation?.value ?? 0.0); + } + + return Transform.rotate( + angle: rotationAngle, + child: CustomPaint( + size: const Size(320, 320), + painter: WheelPainter(sections: wheelSections), + ), + ); + }, + ), + AnimatedBuilder( + animation: + _pulseAnimation ?? const AlwaysStoppedAnimation(1.0), + builder: (context, child) { + return Transform.scale( + scale: _pulseAnimation?.value ?? 1.0, + child: Container( + width: 100, + height: 100, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [AppColor.warning, AppColor.warning], + ), + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: AppColor.black.withOpacity(0.3), + blurRadius: 15, + offset: const Offset(0, 6), + ), + BoxShadow( + color: AppColor.warning.withOpacity(0.5), + blurRadius: 20, + spreadRadius: (_pulseAnimation?.value ?? 1.0) * 5, + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(50), + onTap: _spinWheel, + child: Center( + child: Text( + 'SPIN', + style: AppStyle.lg.copyWith( + color: AppColor.textWhite, + fontWeight: FontWeight.bold, + letterSpacing: 1, + ), + ), + ), + ), + ), + ), + ); + }, + ), + Positioned( + top: 30, + child: Container( + width: 0, + height: 0, + decoration: BoxDecoration( + border: Border( + left: BorderSide(width: 15, color: Colors.transparent), + right: BorderSide(width: 15, color: Colors.transparent), + bottom: BorderSide(width: 30, color: AppColor.error), + ), + ), + ), + ), + ], + ), + ), + ), + + Container( + margin: const EdgeInsets.all(20), + child: Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [AppColor.warning, AppColor.warning], + ), + borderRadius: BorderRadius.circular(15), + ), + child: Text( + '❄️ Spin 30x lagi buat mainin spesial spin', + textAlign: TextAlign.center, + style: AppStyle.lg.copyWith( + color: AppColor.textWhite, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ], + ); + } + + Widget _buildPrizeListContent() { + return Container( + margin: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: AppColor.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Text( + '🎁 Daftar Hadiah', + style: AppStyle.h6.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textPrimary, + ), + ), + ), + const SizedBox(height: 20), + Expanded( + child: ListView.builder( + itemCount: wheelSections.length, + itemBuilder: (context, index) { + final section = wheelSections[index]; + return Container( + margin: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.white, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: AppColor.black.withOpacity(0.05), + blurRadius: 5, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: section.color, + borderRadius: BorderRadius.circular(25), + ), + child: Icon( + section.icon, + color: AppColor.white, + size: 24, + ), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + section.prize, + style: AppStyle.lg.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textPrimary, + ), + ), + Text( + 'Nilai: ${section.value}', + style: AppStyle.sm.copyWith( + color: AppColor.textSecondary, + ), + ), + ], + ), + ), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + decoration: BoxDecoration( + color: section.color.withOpacity(0.1), + borderRadius: BorderRadius.circular(15), + ), + child: Text( + 'Hadiah', + style: AppStyle.sm.copyWith( + color: section.color, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ); + }, + ), + ), + ], + ), + ); + } + + Widget _buildHistoryContent() { + return Container( + margin: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: AppColor.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Text( + '📜 Riwayat Hadiah', + style: AppStyle.h6.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textPrimary, + ), + ), + ), + const SizedBox(height: 20), + Expanded( + child: prizeHistory.isEmpty + ? Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.history, + size: 80, + color: AppColor.white.withOpacity(0.5), + ), + const SizedBox(height: 16), + Text( + 'Belum ada riwayat spin', + style: AppStyle.lg.copyWith( + color: AppColor.white.withOpacity(0.7), + ), + ), + const SizedBox(height: 8), + Text( + 'Mulai spin untuk melihat riwayat hadiah', + style: AppStyle.md.copyWith( + color: AppColor.white.withOpacity(0.5), + ), + ), + ], + ), + ) + : ListView.builder( + itemCount: prizeHistory.length, + itemBuilder: (context, index) { + final history = prizeHistory[index]; + return Container( + margin: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.white, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: AppColor.black.withOpacity(0.05), + blurRadius: 5, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: history.color, + borderRadius: BorderRadius.circular(25), + ), + child: Icon( + history.icon, + color: AppColor.white, + size: 24, + ), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + history.prize, + style: AppStyle.lg.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textPrimary, + ), + ), + Text( + '${history.dateTime.day}/${history.dateTime.month}/${history.dateTime.year} ${history.dateTime.hour.toString().padLeft(2, '0')}:${history.dateTime.minute.toString().padLeft(2, '0')}', + style: AppStyle.sm.copyWith( + color: AppColor.textSecondary, + ), + ), + ], + ), + ), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + decoration: BoxDecoration( + color: AppColor.success.withOpacity(0.1), + borderRadius: BorderRadius.circular(15), + ), + child: Text( + 'Menang', + style: AppStyle.sm.copyWith( + color: AppColor.success, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ); + }, + ), + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: AppColor.primaryGradient, + ), + ), + child: SafeArea( + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + IconButton( + onPressed: () => context.router.back(), + icon: Icon( + Icons.close, + color: AppColor.textWhite, + size: 28, + ), + ), + Expanded( + child: Text( + 'SPIN & WIN', + style: AppStyle.h6.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.textWhite, + letterSpacing: 2, + ), + ), + ), + IconButton( + onPressed: () {}, + icon: Icon(Icons.volume_up, color: AppColor.textWhite), + ), + IconButton( + onPressed: () {}, + icon: Icon(Icons.info_outline, color: AppColor.textWhite), + ), + ], + ), + ), + + Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + decoration: BoxDecoration( + color: AppColor.white.withOpacity(0.2), + borderRadius: BorderRadius.circular(25), + ), + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () => setState(() => currentTabIndex = 0), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + color: currentTabIndex == 0 + ? AppColor.white + : Colors.transparent, + borderRadius: BorderRadius.circular(25), + ), + child: Text( + 'Spin Wheel', + textAlign: TextAlign.center, + style: AppStyle.md.copyWith( + fontWeight: FontWeight.bold, + color: currentTabIndex == 0 + ? AppColor.primary + : AppColor.textWhite, + ), + ), + ), + ), + ), + Expanded( + child: GestureDetector( + onTap: () => setState(() => currentTabIndex = 1), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + color: currentTabIndex == 1 + ? AppColor.white + : Colors.transparent, + borderRadius: BorderRadius.circular(25), + ), + child: Text( + 'Daftar Hadiah', + textAlign: TextAlign.center, + style: AppStyle.md.copyWith( + fontWeight: FontWeight.bold, + color: currentTabIndex == 1 + ? AppColor.primary + : AppColor.textWhite, + ), + ), + ), + ), + ), + Expanded( + child: GestureDetector( + onTap: () => setState(() => currentTabIndex = 2), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + color: currentTabIndex == 2 + ? AppColor.white + : Colors.transparent, + borderRadius: BorderRadius.circular(25), + ), + child: Text( + 'Riwayat', + textAlign: TextAlign.center, + style: AppStyle.md.copyWith( + fontWeight: FontWeight.bold, + color: currentTabIndex == 2 + ? AppColor.primary + : AppColor.textWhite, + ), + ), + ), + ), + ), + ], + ), + ), + + const SizedBox(height: 20), + + Expanded( + child: currentTabIndex == 0 + ? _buildMainContent() + : currentTabIndex == 1 + ? _buildPrizeListContent() + : _buildHistoryContent(), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/presentation/router/app_router.dart b/lib/presentation/router/app_router.dart index 0bdeb39..3dd92fa 100644 --- a/lib/presentation/router/app_router.dart +++ b/lib/presentation/router/app_router.dart @@ -59,5 +59,8 @@ class AppRouter extends RootStackRouter { AutoRoute(page: AccountMyRoute.page), AutoRoute(page: AddressRoute.page), AutoRoute(page: PaymentRoute.page), + + // Mini Games + AutoRoute(page: FerrisWheelRoute.page), ]; } diff --git a/lib/presentation/router/app_router.gr.dart b/lib/presentation/router/app_router.gr.dart index 73092e6..a7606fb 100644 --- a/lib/presentation/router/app_router.gr.dart +++ b/lib/presentation/router/app_router.gr.dart @@ -9,64 +9,66 @@ // coverage:ignore-file // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:auto_route/auto_route.dart' as _i28; +import 'package:auto_route/auto_route.dart' as _i29; import 'package:enaklo/presentation/pages/account/account_my/account_my_page.dart' as _i1; import 'package:enaklo/presentation/pages/account/address/address_page.dart' as _i2; import 'package:enaklo/presentation/pages/account/payment/payment_page.dart' - as _i17; + as _i18; import 'package:enaklo/presentation/pages/auth/create_password/create_password_page.dart' as _i3; -import 'package:enaklo/presentation/pages/auth/login/login_page.dart' as _i7; -import 'package:enaklo/presentation/pages/auth/otp/otp_page.dart' as _i15; +import 'package:enaklo/presentation/pages/auth/login/login_page.dart' as _i8; +import 'package:enaklo/presentation/pages/auth/otp/otp_page.dart' as _i16; import 'package:enaklo/presentation/pages/auth/password/password_page.dart' - as _i16; -import 'package:enaklo/presentation/pages/auth/pin/pin_page.dart' as _i18; + as _i17; +import 'package:enaklo/presentation/pages/auth/pin/pin_page.dart' as _i19; import 'package:enaklo/presentation/pages/auth/register/register_page.dart' - as _i23; + as _i24; import 'package:enaklo/presentation/pages/draw/draw_page.dart' as _i5; import 'package:enaklo/presentation/pages/draw/pages/draw_detail/draw_detail_page.dart' as _i4; -import 'package:enaklo/presentation/pages/main/main_page.dart' as _i8; +import 'package:enaklo/presentation/pages/main/main_page.dart' as _i9; import 'package:enaklo/presentation/pages/main/pages/home/home_page.dart' - as _i6; + as _i7; import 'package:enaklo/presentation/pages/main/pages/order/order_page.dart' - as _i14; + as _i15; import 'package:enaklo/presentation/pages/main/pages/profile/profile_page.dart' - as _i22; + as _i23; import 'package:enaklo/presentation/pages/main/pages/voucher/voucher_page.dart' - as _i27; -import 'package:enaklo/presentation/pages/merchant/merchant_page.dart' as _i10; + as _i28; +import 'package:enaklo/presentation/pages/merchant/merchant_page.dart' as _i11; import 'package:enaklo/presentation/pages/merchant/pages/merchant_detail/merchant_detail_page.dart' - as _i9; + as _i10; +import 'package:enaklo/presentation/pages/mini_games/ferris_wheel/ferris_wheel_page.dart' + as _i6; import 'package:enaklo/presentation/pages/notification/notification_page.dart' - as _i11; -import 'package:enaklo/presentation/pages/onboarding/onboarding_page.dart' as _i12; -import 'package:enaklo/presentation/pages/order/order_detail/order_detail_page.dart' +import 'package:enaklo/presentation/pages/onboarding/onboarding_page.dart' as _i13; +import 'package:enaklo/presentation/pages/order/order_detail/order_detail_page.dart' + as _i14; import 'package:enaklo/presentation/pages/poin/pages/poin_history_page.dart' - as _i19; + as _i20; import 'package:enaklo/presentation/pages/poin/pages/product_redeem/product_redeem_page.dart' - as _i21; -import 'package:enaklo/presentation/pages/poin/poin_page.dart' as _i20; -import 'package:enaklo/presentation/pages/reward/reward_page.dart' as _i24; -import 'package:enaklo/presentation/pages/splash/splash_page.dart' as _i25; + as _i22; +import 'package:enaklo/presentation/pages/poin/poin_page.dart' as _i21; +import 'package:enaklo/presentation/pages/reward/reward_page.dart' as _i25; +import 'package:enaklo/presentation/pages/splash/splash_page.dart' as _i26; import 'package:enaklo/presentation/pages/voucher/voucher_detail/voucher_detail_page.dart' - as _i26; -import 'package:enaklo/sample/sample_data.dart' as _i30; -import 'package:flutter/material.dart' as _i29; + as _i27; +import 'package:enaklo/sample/sample_data.dart' as _i31; +import 'package:flutter/material.dart' as _i30; /// generated route for /// [_i1.AccountMyPage] -class AccountMyRoute extends _i28.PageRouteInfo { - const AccountMyRoute({List<_i28.PageRouteInfo>? children}) +class AccountMyRoute extends _i29.PageRouteInfo { + const AccountMyRoute({List<_i29.PageRouteInfo>? children}) : super(AccountMyRoute.name, initialChildren: children); static const String name = 'AccountMyRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { return const _i1.AccountMyPage(); @@ -76,13 +78,13 @@ class AccountMyRoute extends _i28.PageRouteInfo { /// generated route for /// [_i2.AddressPage] -class AddressRoute extends _i28.PageRouteInfo { - const AddressRoute({List<_i28.PageRouteInfo>? children}) +class AddressRoute extends _i29.PageRouteInfo { + const AddressRoute({List<_i29.PageRouteInfo>? children}) : super(AddressRoute.name, initialChildren: children); static const String name = 'AddressRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { return const _i2.AddressPage(); @@ -92,13 +94,13 @@ class AddressRoute extends _i28.PageRouteInfo { /// generated route for /// [_i3.CreatePasswordPage] -class CreatePasswordRoute extends _i28.PageRouteInfo { - const CreatePasswordRoute({List<_i28.PageRouteInfo>? children}) +class CreatePasswordRoute extends _i29.PageRouteInfo { + const CreatePasswordRoute({List<_i29.PageRouteInfo>? children}) : super(CreatePasswordRoute.name, initialChildren: children); static const String name = 'CreatePasswordRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { return const _i3.CreatePasswordPage(); @@ -108,11 +110,11 @@ class CreatePasswordRoute extends _i28.PageRouteInfo { /// generated route for /// [_i4.DrawDetailPage] -class DrawDetailRoute extends _i28.PageRouteInfo { +class DrawDetailRoute extends _i29.PageRouteInfo { DrawDetailRoute({ - _i29.Key? key, + _i30.Key? key, required _i5.DrawEvent drawEvent, - List<_i28.PageRouteInfo>? children, + List<_i29.PageRouteInfo>? children, }) : super( DrawDetailRoute.name, args: DrawDetailRouteArgs(key: key, drawEvent: drawEvent), @@ -121,7 +123,7 @@ class DrawDetailRoute extends _i28.PageRouteInfo { static const String name = 'DrawDetailRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { final args = data.argsAs(); @@ -133,7 +135,7 @@ class DrawDetailRoute extends _i28.PageRouteInfo { class DrawDetailRouteArgs { const DrawDetailRouteArgs({this.key, required this.drawEvent}); - final _i29.Key? key; + final _i30.Key? key; final _i5.DrawEvent drawEvent; @@ -145,13 +147,13 @@ class DrawDetailRouteArgs { /// generated route for /// [_i5.DrawPage] -class DrawRoute extends _i28.PageRouteInfo { - const DrawRoute({List<_i28.PageRouteInfo>? children}) +class DrawRoute extends _i29.PageRouteInfo { + const DrawRoute({List<_i29.PageRouteInfo>? children}) : super(DrawRoute.name, initialChildren: children); static const String name = 'DrawRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { return const _i5.DrawPage(); @@ -160,60 +162,76 @@ class DrawRoute extends _i28.PageRouteInfo { } /// generated route for -/// [_i6.HomePage] -class HomeRoute extends _i28.PageRouteInfo { - const HomeRoute({List<_i28.PageRouteInfo>? children}) +/// [_i6.FerrisWheelPage] +class FerrisWheelRoute extends _i29.PageRouteInfo { + const FerrisWheelRoute({List<_i29.PageRouteInfo>? children}) + : super(FerrisWheelRoute.name, initialChildren: children); + + static const String name = 'FerrisWheelRoute'; + + static _i29.PageInfo page = _i29.PageInfo( + name, + builder: (data) { + return const _i6.FerrisWheelPage(); + }, + ); +} + +/// generated route for +/// [_i7.HomePage] +class HomeRoute extends _i29.PageRouteInfo { + const HomeRoute({List<_i29.PageRouteInfo>? children}) : super(HomeRoute.name, initialChildren: children); static const String name = 'HomeRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i6.HomePage(); + return const _i7.HomePage(); }, ); } /// generated route for -/// [_i7.LoginPage] -class LoginRoute extends _i28.PageRouteInfo { - const LoginRoute({List<_i28.PageRouteInfo>? children}) +/// [_i8.LoginPage] +class LoginRoute extends _i29.PageRouteInfo { + const LoginRoute({List<_i29.PageRouteInfo>? children}) : super(LoginRoute.name, initialChildren: children); static const String name = 'LoginRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i7.LoginPage(); + return const _i8.LoginPage(); }, ); } /// generated route for -/// [_i8.MainPage] -class MainRoute extends _i28.PageRouteInfo { - const MainRoute({List<_i28.PageRouteInfo>? children}) +/// [_i9.MainPage] +class MainRoute extends _i29.PageRouteInfo { + const MainRoute({List<_i29.PageRouteInfo>? children}) : super(MainRoute.name, initialChildren: children); static const String name = 'MainRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i8.MainPage(); + return const _i9.MainPage(); }, ); } /// generated route for -/// [_i9.MerchantDetailPage] -class MerchantDetailRoute extends _i28.PageRouteInfo { +/// [_i10.MerchantDetailPage] +class MerchantDetailRoute extends _i29.PageRouteInfo { MerchantDetailRoute({ - _i29.Key? key, - required _i30.MerchantModel merchant, - List<_i28.PageRouteInfo>? children, + _i30.Key? key, + required _i31.MerchantModel merchant, + List<_i29.PageRouteInfo>? children, }) : super( MerchantDetailRoute.name, args: MerchantDetailRouteArgs(key: key, merchant: merchant), @@ -222,11 +240,11 @@ class MerchantDetailRoute extends _i28.PageRouteInfo { static const String name = 'MerchantDetailRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { final args = data.argsAs(); - return _i9.MerchantDetailPage(key: args.key, merchant: args.merchant); + return _i10.MerchantDetailPage(key: args.key, merchant: args.merchant); }, ); } @@ -234,9 +252,9 @@ class MerchantDetailRoute extends _i28.PageRouteInfo { class MerchantDetailRouteArgs { const MerchantDetailRouteArgs({this.key, required this.merchant}); - final _i29.Key? key; + final _i30.Key? key; - final _i30.MerchantModel merchant; + final _i31.MerchantModel merchant; @override String toString() { @@ -245,60 +263,60 @@ class MerchantDetailRouteArgs { } /// generated route for -/// [_i10.MerchantPage] -class MerchantRoute extends _i28.PageRouteInfo { - const MerchantRoute({List<_i28.PageRouteInfo>? children}) +/// [_i11.MerchantPage] +class MerchantRoute extends _i29.PageRouteInfo { + const MerchantRoute({List<_i29.PageRouteInfo>? children}) : super(MerchantRoute.name, initialChildren: children); static const String name = 'MerchantRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i10.MerchantPage(); + return const _i11.MerchantPage(); }, ); } /// generated route for -/// [_i11.NotificationPage] -class NotificationRoute extends _i28.PageRouteInfo { - const NotificationRoute({List<_i28.PageRouteInfo>? children}) +/// [_i12.NotificationPage] +class NotificationRoute extends _i29.PageRouteInfo { + const NotificationRoute({List<_i29.PageRouteInfo>? children}) : super(NotificationRoute.name, initialChildren: children); static const String name = 'NotificationRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i11.NotificationPage(); + return const _i12.NotificationPage(); }, ); } /// generated route for -/// [_i12.OnboardingPage] -class OnboardingRoute extends _i28.PageRouteInfo { - const OnboardingRoute({List<_i28.PageRouteInfo>? children}) +/// [_i13.OnboardingPage] +class OnboardingRoute extends _i29.PageRouteInfo { + const OnboardingRoute({List<_i29.PageRouteInfo>? children}) : super(OnboardingRoute.name, initialChildren: children); static const String name = 'OnboardingRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i12.OnboardingPage(); + return const _i13.OnboardingPage(); }, ); } /// generated route for -/// [_i13.OrderDetailPage] -class OrderDetailRoute extends _i28.PageRouteInfo { +/// [_i14.OrderDetailPage] +class OrderDetailRoute extends _i29.PageRouteInfo { OrderDetailRoute({ - _i29.Key? key, - required _i14.Order order, - List<_i28.PageRouteInfo>? children, + _i30.Key? key, + required _i15.Order order, + List<_i29.PageRouteInfo>? children, }) : super( OrderDetailRoute.name, args: OrderDetailRouteArgs(key: key, order: order), @@ -307,11 +325,11 @@ class OrderDetailRoute extends _i28.PageRouteInfo { static const String name = 'OrderDetailRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { final args = data.argsAs(); - return _i13.OrderDetailPage(key: args.key, order: args.order); + return _i14.OrderDetailPage(key: args.key, order: args.order); }, ); } @@ -319,9 +337,9 @@ class OrderDetailRoute extends _i28.PageRouteInfo { class OrderDetailRouteArgs { const OrderDetailRouteArgs({this.key, required this.order}); - final _i29.Key? key; + final _i30.Key? key; - final _i14.Order order; + final _i15.Order order; @override String toString() { @@ -330,77 +348,77 @@ class OrderDetailRouteArgs { } /// generated route for -/// [_i14.OrderPage] -class OrderRoute extends _i28.PageRouteInfo { - const OrderRoute({List<_i28.PageRouteInfo>? children}) +/// [_i15.OrderPage] +class OrderRoute extends _i29.PageRouteInfo { + const OrderRoute({List<_i29.PageRouteInfo>? children}) : super(OrderRoute.name, initialChildren: children); static const String name = 'OrderRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i14.OrderPage(); + return const _i15.OrderPage(); }, ); } /// generated route for -/// [_i15.OtpPage] -class OtpRoute extends _i28.PageRouteInfo { - const OtpRoute({List<_i28.PageRouteInfo>? children}) +/// [_i16.OtpPage] +class OtpRoute extends _i29.PageRouteInfo { + const OtpRoute({List<_i29.PageRouteInfo>? children}) : super(OtpRoute.name, initialChildren: children); static const String name = 'OtpRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i15.OtpPage(); + return const _i16.OtpPage(); }, ); } /// generated route for -/// [_i16.PasswordPage] -class PasswordRoute extends _i28.PageRouteInfo { - const PasswordRoute({List<_i28.PageRouteInfo>? children}) +/// [_i17.PasswordPage] +class PasswordRoute extends _i29.PageRouteInfo { + const PasswordRoute({List<_i29.PageRouteInfo>? children}) : super(PasswordRoute.name, initialChildren: children); static const String name = 'PasswordRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i16.PasswordPage(); + return const _i17.PasswordPage(); }, ); } /// generated route for -/// [_i17.PaymentPage] -class PaymentRoute extends _i28.PageRouteInfo { - const PaymentRoute({List<_i28.PageRouteInfo>? children}) +/// [_i18.PaymentPage] +class PaymentRoute extends _i29.PageRouteInfo { + const PaymentRoute({List<_i29.PageRouteInfo>? children}) : super(PaymentRoute.name, initialChildren: children); static const String name = 'PaymentRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i17.PaymentPage(); + return const _i18.PaymentPage(); }, ); } /// generated route for -/// [_i18.PinPage] -class PinRoute extends _i28.PageRouteInfo { +/// [_i19.PinPage] +class PinRoute extends _i29.PageRouteInfo { PinRoute({ - _i29.Key? key, + _i30.Key? key, bool isCreatePin = true, String? title, - List<_i28.PageRouteInfo>? children, + List<_i29.PageRouteInfo>? children, }) : super( PinRoute.name, args: PinRouteArgs(key: key, isCreatePin: isCreatePin, title: title), @@ -409,13 +427,13 @@ class PinRoute extends _i28.PageRouteInfo { static const String name = 'PinRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { final args = data.argsAs( orElse: () => const PinRouteArgs(), ); - return _i18.PinPage( + return _i19.PinPage( key: args.key, isCreatePin: args.isCreatePin, title: args.title, @@ -427,7 +445,7 @@ class PinRoute extends _i28.PageRouteInfo { class PinRouteArgs { const PinRouteArgs({this.key, this.isCreatePin = true, this.title}); - final _i29.Key? key; + final _i30.Key? key; final bool isCreatePin; @@ -440,45 +458,45 @@ class PinRouteArgs { } /// generated route for -/// [_i19.PoinHistoryPage] -class PoinHistoryRoute extends _i28.PageRouteInfo { - const PoinHistoryRoute({List<_i28.PageRouteInfo>? children}) +/// [_i20.PoinHistoryPage] +class PoinHistoryRoute extends _i29.PageRouteInfo { + const PoinHistoryRoute({List<_i29.PageRouteInfo>? children}) : super(PoinHistoryRoute.name, initialChildren: children); static const String name = 'PoinHistoryRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i19.PoinHistoryPage(); + return const _i20.PoinHistoryPage(); }, ); } /// generated route for -/// [_i20.PoinPage] -class PoinRoute extends _i28.PageRouteInfo { - const PoinRoute({List<_i28.PageRouteInfo>? children}) +/// [_i21.PoinPage] +class PoinRoute extends _i29.PageRouteInfo { + const PoinRoute({List<_i29.PageRouteInfo>? children}) : super(PoinRoute.name, initialChildren: children); static const String name = 'PoinRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i20.PoinPage(); + return const _i21.PoinPage(); }, ); } /// generated route for -/// [_i21.ProductRedeemPage] -class ProductRedeemRoute extends _i28.PageRouteInfo { +/// [_i22.ProductRedeemPage] +class ProductRedeemRoute extends _i29.PageRouteInfo { ProductRedeemRoute({ - _i29.Key? key, - required _i20.Product product, - required _i20.PointCard pointCard, - List<_i28.PageRouteInfo>? children, + _i30.Key? key, + required _i21.Product product, + required _i21.PointCard pointCard, + List<_i29.PageRouteInfo>? children, }) : super( ProductRedeemRoute.name, args: ProductRedeemRouteArgs( @@ -491,11 +509,11 @@ class ProductRedeemRoute extends _i28.PageRouteInfo { static const String name = 'ProductRedeemRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { final args = data.argsAs(); - return _i21.ProductRedeemPage( + return _i22.ProductRedeemPage( key: args.key, product: args.product, pointCard: args.pointCard, @@ -511,11 +529,11 @@ class ProductRedeemRouteArgs { required this.pointCard, }); - final _i29.Key? key; + final _i30.Key? key; - final _i20.Product product; + final _i21.Product product; - final _i20.PointCard pointCard; + final _i21.PointCard pointCard; @override String toString() { @@ -524,97 +542,97 @@ class ProductRedeemRouteArgs { } /// generated route for -/// [_i22.ProfilePage] -class ProfileRoute extends _i28.PageRouteInfo { - const ProfileRoute({List<_i28.PageRouteInfo>? children}) +/// [_i23.ProfilePage] +class ProfileRoute extends _i29.PageRouteInfo { + const ProfileRoute({List<_i29.PageRouteInfo>? children}) : super(ProfileRoute.name, initialChildren: children); static const String name = 'ProfileRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i22.ProfilePage(); + return const _i23.ProfilePage(); }, ); } /// generated route for -/// [_i23.RegisterPage] -class RegisterRoute extends _i28.PageRouteInfo { - const RegisterRoute({List<_i28.PageRouteInfo>? children}) +/// [_i24.RegisterPage] +class RegisterRoute extends _i29.PageRouteInfo { + const RegisterRoute({List<_i29.PageRouteInfo>? children}) : super(RegisterRoute.name, initialChildren: children); static const String name = 'RegisterRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i23.RegisterPage(); + return const _i24.RegisterPage(); }, ); } /// generated route for -/// [_i24.RewardPage] -class RewardRoute extends _i28.PageRouteInfo { - const RewardRoute({List<_i28.PageRouteInfo>? children}) +/// [_i25.RewardPage] +class RewardRoute extends _i29.PageRouteInfo { + const RewardRoute({List<_i29.PageRouteInfo>? children}) : super(RewardRoute.name, initialChildren: children); static const String name = 'RewardRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i24.RewardPage(); + return const _i25.RewardPage(); }, ); } /// generated route for -/// [_i25.SplashPage] -class SplashRoute extends _i28.PageRouteInfo { - const SplashRoute({List<_i28.PageRouteInfo>? children}) +/// [_i26.SplashPage] +class SplashRoute extends _i29.PageRouteInfo { + const SplashRoute({List<_i29.PageRouteInfo>? children}) : super(SplashRoute.name, initialChildren: children); static const String name = 'SplashRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i25.SplashPage(); + return const _i26.SplashPage(); }, ); } /// generated route for -/// [_i26.VoucherDetailPage] -class VoucherDetailRoute extends _i28.PageRouteInfo { - const VoucherDetailRoute({List<_i28.PageRouteInfo>? children}) +/// [_i27.VoucherDetailPage] +class VoucherDetailRoute extends _i29.PageRouteInfo { + const VoucherDetailRoute({List<_i29.PageRouteInfo>? children}) : super(VoucherDetailRoute.name, initialChildren: children); static const String name = 'VoucherDetailRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i26.VoucherDetailPage(); + return const _i27.VoucherDetailPage(); }, ); } /// generated route for -/// [_i27.VoucherPage] -class VoucherRoute extends _i28.PageRouteInfo { - const VoucherRoute({List<_i28.PageRouteInfo>? children}) +/// [_i28.VoucherPage] +class VoucherRoute extends _i29.PageRouteInfo { + const VoucherRoute({List<_i29.PageRouteInfo>? children}) : super(VoucherRoute.name, initialChildren: children); static const String name = 'VoucherRoute'; - static _i28.PageInfo page = _i28.PageInfo( + static _i29.PageInfo page = _i29.PageInfo( name, builder: (data) { - return const _i27.VoucherPage(); + return const _i28.VoucherPage(); }, ); }