/// Page: Home Page /// /// Main dashboard screen of the Worker app. /// Displays member card, promotions, and quick action sections. library; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:worker/core/router/app_router.dart'; import 'package:worker/core/theme/colors.dart'; import 'package:worker/features/home/presentation/providers/member_card_provider.dart'; import 'package:worker/features/home/presentation/providers/promotions_provider.dart'; import 'package:worker/features/home/presentation/widgets/member_card_widget.dart'; import 'package:worker/features/home/presentation/widgets/promotion_slider.dart'; import 'package:worker/features/home/presentation/widgets/quick_action_section.dart'; import 'package:worker/generated/l10n/app_localizations.dart'; /// Home Page /// /// Main entry point of the app after login. /// Shows: /// - Member card (Diamond/Platinum/Gold) /// - Promotional banners /// - Quick action sections /// - Bottom navigation /// - Floating action button (Chat) class HomePage extends ConsumerWidget { const HomePage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final l10n = AppLocalizations.of(context); // Watch member card state final memberCardAsync = ref.watch(memberCardProvider); // Watch promotions state final promotionsAsync = ref.watch(promotionsProvider); return Scaffold( backgroundColor: AppColors.grey50, body: RefreshIndicator( onRefresh: () async { // Refresh both member card and promotions await Future.wait([ ref.read(memberCardProvider.notifier).refresh(), ref.read(promotionsProvider.notifier).refresh(), ]); }, child: CustomScrollView( slivers: [ // Add top padding for status bar SliverPadding( padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top), ), // Member Card Section SliverToBoxAdapter( child: memberCardAsync.when( data: (memberCard) => MemberCardWidget(memberCard: memberCard), loading: () => Container( margin: const EdgeInsets.all(16), height: 200, decoration: BoxDecoration( color: AppColors.grey100, borderRadius: BorderRadius.circular(16), ), child: const Center(child: CircularProgressIndicator()), ), error: (error, stack) => Container( margin: const EdgeInsets.all(16), padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: AppColors.danger.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(16), ), child: Column( mainAxisSize: MainAxisSize.min, children: [ const Icon( Icons.error_outline, color: AppColors.danger, size: 48, ), const SizedBox(height: 8), Text( l10n.error, style: const TextStyle( color: AppColors.danger, fontWeight: FontWeight.w600, ), ), const SizedBox(height: 4), Text( error.toString(), style: const TextStyle( color: AppColors.grey500, fontSize: 12, ), textAlign: TextAlign.center, ), ], ), ), ), ), // Promotions Section SliverToBoxAdapter( child: promotionsAsync.when( data: (promotions) => promotions.isNotEmpty ? Padding( padding: const EdgeInsets.symmetric(vertical: 8), child: PromotionSlider( promotions: promotions, onPromotionTap: (promotion) { // TODO: Navigate to promotion details ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( '${l10n.viewDetails}: ${promotion.title}', ), ), ); }, ), ) : const SizedBox.shrink(), loading: () => const Padding( padding: EdgeInsets.all(16), child: Center(child: CircularProgressIndicator()), ), error: (error, stack) => const SizedBox.shrink(), ), ), // Quick Action Sections SliverToBoxAdapter( child: Column( children: [ const SizedBox(height: 8), // Products & Cart Section QuickActionSection( title: '${l10n.products} & ${l10n.cart}', actions: [ QuickAction( icon: Icons.grid_view, label: l10n.products, onTap: () => context.pushNamed(RouteNames.products), ), QuickAction( icon: Icons.shopping_cart, label: l10n.cart, badge: '3', onTap: () => _showComingSoon(context, l10n.cart, l10n), ), QuickAction( icon: Icons.favorite, label: 'Yêu thích', onTap: () => _showComingSoon(context, 'Yêu thích', l10n), ), ], ), // Loyalty Section QuickActionSection( title: l10n.loyalty, actions: [ QuickAction( icon: Icons.card_giftcard, label: l10n.redeemReward, onTap: () => _showComingSoon(context, l10n.redeemReward, l10n), ), QuickAction( icon: Icons.history, label: l10n.pointsHistory, onTap: () => _showComingSoon(context, l10n.pointsHistory, l10n), ), QuickAction( icon: Icons.person_add, label: l10n.referral, onTap: () => _showComingSoon(context, l10n.referral, l10n), ), ], ), // Quote Requests Section QuickActionSection( title: l10n.quotes, actions: [ QuickAction( icon: Icons.description, label: l10n.quotes, onTap: () => _showComingSoon(context, l10n.quotes, l10n), ), QuickAction( icon: Icons.receipt_long, label: l10n.quotes, onTap: () => _showComingSoon(context, l10n.quotes, l10n), ), ], ), // Orders & Payments Section QuickActionSection( title: '${l10n.orders} & ${l10n.payments}', actions: [ QuickAction( icon: Icons.inventory_2, label: l10n.orders, onTap: () => _showComingSoon(context, l10n.orders, l10n), ), QuickAction( icon: Icons.payment, label: l10n.payments, onTap: () => _showComingSoon(context, l10n.payments, l10n), ), ], ), // Sample Houses & News Section QuickActionSection( title: l10n.projects, actions: [ QuickAction( icon: Icons.home_work, label: 'Nhà mẫu', onTap: () => _showComingSoon(context, 'Nhà mẫu', l10n), ), QuickAction( icon: Icons.business, label: l10n.projects, onTap: () => _showComingSoon(context, l10n.projects, l10n), ), QuickAction( icon: Icons.article, label: 'Tin tức', onTap: () => _showComingSoon(context, 'Tin tức', l10n), ), ], ), // Bottom Padding (for FAB clearance) const SizedBox(height: 80), ], ), ), ], ), ), // Floating Action Button (Chat) floatingActionButton: FloatingActionButton( onPressed: () => _showComingSoon(context, l10n.chat, l10n), backgroundColor: AppColors.accentCyan, child: const Icon(Icons.chat_bubble), ), // Bottom Navigation Bar bottomNavigationBar: BottomNavigationBar( type: BottomNavigationBarType.fixed, currentIndex: 0, items: [ BottomNavigationBarItem( icon: const Icon(Icons.home), label: l10n.home, ), BottomNavigationBarItem( icon: const Icon(Icons.loyalty), label: l10n.loyalty, ), BottomNavigationBarItem( icon: const Icon(Icons.local_offer), label: l10n.promotions, ), BottomNavigationBarItem( icon: const Badge( label: Text('5'), child: Icon(Icons.notifications), ), label: l10n.notifications, ), BottomNavigationBarItem( icon: const Icon(Icons.account_circle), label: l10n.settings, ), ], onTap: (index) { // TODO: Implement navigation final labels = [ l10n.home, l10n.loyalty, l10n.promotions, l10n.notifications, l10n.settings, ]; _showComingSoon(context, labels[index], l10n); }, ), ); } /// Show coming soon message void _showComingSoon( BuildContext context, String feature, AppLocalizations l10n, ) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('$feature - ${l10n.comingSoon}'), duration: const Duration(seconds: 1), ), ); } }