import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:flutter_svg/flutter_svg.dart'; import '../Notifier/RentalContactProvider .dart'; class MainScreen extends StatefulWidget { RentalContactProvider provider; MainScreen({super.key, required this.provider}); @override State createState() => _MainScreenState(); } class _MainScreenState extends State with SingleTickerProviderStateMixin { int _selectedIndex = 0; late AnimationController _animationController; late Animation _fadeAnimation; late Animation _scaleAnimation; final List _menuTitles = [ "Dashboard", "View Orders", "View Ledger", "Make Payment", "View Tickets", ]; final List _menuIcons = [ Icons.dashboard_rounded, Icons.shopping_bag_rounded, Icons.account_balance_wallet_rounded, Icons.payment_rounded, Icons.support_agent_rounded, ]; final List _menuColors = [ const Color(0xFF26BAE7), const Color(0xFF4CAF50), const Color(0xFFFF9800), const Color(0xFF9C27B0), const Color(0xFFF44336), ]; @override void initState() { super.initState(); _animationController = AnimationController( vsync: this, duration: const Duration(milliseconds: 800), ); _fadeAnimation = Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation(parent: _animationController, curve: Curves.easeInOut), ); _scaleAnimation = Tween(begin: 0.95, end: 1.0).animate( CurvedAnimation(parent: _animationController, curve: Curves.elasticOut), ); _animationController.forward(); } @override void dispose() { _animationController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final rentalProvider = Provider.of(context); final contact = rentalProvider.rentalContact; return Scaffold( backgroundColor: const Color(0xFFF5F8FC), appBar: AppBar( title: AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: Text( _menuTitles[_selectedIndex], key: ValueKey(_selectedIndex), style: const TextStyle( fontSize: 20, fontWeight: FontWeight.w700, color: Colors.white, ), ), ), backgroundColor: const Color(0xFF273172), elevation: 0, iconTheme: const IconThemeData(color: Colors.white), actions: [ IconButton( icon: const Icon(Icons.notifications_none_rounded), onPressed: () {}, ), const SizedBox(width: 8), ], ), drawer: _buildDrawer(contact), body: AnimatedSwitcher( duration: const Duration(milliseconds: 500), child: _buildBody(contact), ), ); } Widget _buildDrawer(rentalContact) { return Drawer( width: 280, child: Container( decoration: const BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ Color(0xFF273172), Color(0xFF26BAE7), ], ), ), child: Column( children: [ // Header Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: Colors.white.withOpacity(0.1), borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20), ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Logo and App Name Row( children: [ Container( padding: const EdgeInsets.all(1), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.1), blurRadius: 10, ), ], ), // child: SvgPicture.network( // "https://genrentals.in/assets/img/logo-black.svg", // height: 28, // ), ), const SizedBox(width: 12), const Text( "Gen Rentals", style: TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.w700, ), ), ], ), const SizedBox(height: 20), // User Info Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white.withOpacity(0.1), borderRadius: BorderRadius.circular(12), border: Border.all(color: Colors.white.withOpacity(0.2)), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Branch Name", style: const TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w600, ), ), const SizedBox(height: 4), Text( "Branch Address", style: TextStyle( color: Colors.white.withOpacity(0.8), fontSize: 12, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 8), Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), decoration: BoxDecoration( color: Colors.white.withOpacity(0.2), borderRadius: BorderRadius.circular(8), ), child: const Text( "Balance: ₹ 0", style: TextStyle( color: Colors.white, fontSize: 12, fontWeight: FontWeight.w600, ), ), ), ], ), ), ], ), ), const SizedBox(height: 8), // Menu items Expanded( child: Container( decoration: const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(20), topRight: Radius.circular(20), ), ), child: ListView( padding: const EdgeInsets.all(16), children: [ ...List.generate(_menuTitles.length, (index) => _buildDrawerItem(index, _menuTitles[index], _menuIcons[index], _menuColors[index]) ), const SizedBox(height: 16), const Divider(height: 1), const SizedBox(height: 16), _buildDrawerItem(-1, "Logout", Icons.logout_rounded, const Color(0xFFF44336)), ], ), ), ), ], ), ), ); } Widget _buildDrawerItem(int index, String title, IconData icon, Color color) { return Container( margin: const EdgeInsets.only(bottom: 8), child: Material( color: Colors.transparent, child: InkWell( borderRadius: BorderRadius.circular(12), onTap: () { if (index == -1) { // Logout Navigator.pushReplacementNamed(context, "/login"); } else { setState(() => _selectedIndex = index); Navigator.pop(context); // close drawer } }, child: Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: _selectedIndex == index ? color.withOpacity(0.1) : Colors.transparent, borderRadius: BorderRadius.circular(12), border: _selectedIndex == index ? Border.all(color: color.withOpacity(0.3)) : null, ), child: Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: color.withOpacity(0.1), shape: BoxShape.circle, ), child: Icon( icon, color: color, size: 20, ), ), const SizedBox(width: 16), Expanded( child: Text( title, style: TextStyle( fontSize: 16, fontWeight: _selectedIndex == index ? FontWeight.w600 : FontWeight.w500, color: _selectedIndex == index ? color : Colors.grey.shade700, ), ), ), if (_selectedIndex == index) Container( width: 8, height: 8, decoration: BoxDecoration( color: color, shape: BoxShape.circle, ), ), ], ), ), ), ), ); } Widget _buildBody(rentalContact) { return AnimatedBuilder( animation: _animationController, builder: (context, child) { return Opacity( opacity: _fadeAnimation.value, child: Transform.scale( scale: _scaleAnimation.value, child: _getCurrentScreen(rentalContact), ), ); }, ); } Widget _getCurrentScreen(rentalContact) { switch (_selectedIndex) { case 0: return _buildDashboard(rentalContact); case 1: return _buildPlaceholderScreen("View Orders", Icons.shopping_bag_rounded); case 2: return _buildPlaceholderScreen("View Ledger", Icons.account_balance_wallet_rounded); case 3: return _buildPlaceholderScreen("Make Payment", Icons.payment_rounded); case 4: return _buildPlaceholderScreen("View Tickets", Icons.support_agent_rounded); default: return _buildDashboard(rentalContact); } } Widget _buildDashboard(rentalContact) { return SingleChildScrollView( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Welcome Section Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( gradient: const LinearGradient( colors: [Color(0xFF273172), Color(0xFF26BAE7)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( color: const Color(0xFF273172).withOpacity(0.3), blurRadius: 20, offset: const Offset(0, 10), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( "Welcome Back!", style: TextStyle( fontSize: 24, fontWeight: FontWeight.w700, color: Colors.white, ), ), const SizedBox(height: 8), Text( "Here's your dashboard overview", style: TextStyle( fontSize: 16, color: Colors.white.withOpacity(0.8), ), ), const SizedBox(height: 20), _buildInfoRow(Icons.phone_android_rounded, "Mobile", widget.provider.rentalContact!.mob.toString()), _buildInfoRow(Icons.business_rounded, "Office", "N/A"), _buildInfoRow(Icons.account_balance_wallet_rounded, "Balance", "₹ 0"), ], ), ), const SizedBox(height: 24), // Quick Stats const Text( "Quick Stats", style: TextStyle( fontSize: 20, fontWeight: FontWeight.w700, color: Color(0xFF273172), ), ), const SizedBox(height: 16), GridView.count( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), crossAxisCount: 2, crossAxisSpacing: 16, mainAxisSpacing: 16, children: [ _buildStatCard("Active Orders", "12", Icons.shopping_bag_rounded, const Color(0xFF4CAF50)), _buildStatCard("Pending Payments", "5", Icons.payment_rounded, const Color(0xFFFF9800)), _buildStatCard("Open Tickets", "3", Icons.support_agent_rounded, const Color(0xFFF44336)), _buildStatCard("Total Balance", "₹0", Icons.account_balance_wallet_rounded, const Color(0xFF26BAE7)), ], ), const SizedBox(height: 24), // Recent Activities Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 5), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( "Recent Activities", style: TextStyle( fontSize: 18, fontWeight: FontWeight.w600, color: Color(0xFF273172), ), ), const SizedBox(height: 16), _buildActivityItem("New order placed", "2 hours ago", Icons.shopping_bag_rounded), _buildActivityItem("Payment received", "1 day ago", Icons.payment_rounded), _buildActivityItem("Ticket resolved", "2 days ago", Icons.support_agent_rounded), ], ), ), ], ), ); } Widget _buildInfoRow(IconData icon, String label, String value) { return Padding( padding: const EdgeInsets.symmetric(vertical: 6), child: Row( children: [ Icon(icon, color: Colors.white.withOpacity(0.7), size: 18), const SizedBox(width: 12), Text( "$label: ", style: TextStyle( color: Colors.white.withOpacity(0.7), fontSize: 14, ), ), Text( value, style: const TextStyle( color: Colors.white, fontSize: 14, fontWeight: FontWeight.w600, ), ), ], ), ); } Widget _buildStatCard(String title, String value, IconData icon, Color color) { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10, offset: const Offset(0, 5), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: color.withOpacity(0.1), shape: BoxShape.circle, ), child: Icon(icon, color: color, size: 20), ), const SizedBox(height: 12), Text( value, style: TextStyle( fontSize: 20, fontWeight: FontWeight.w700, color: color, ), ), const SizedBox(height: 4), Text( title, style: TextStyle( fontSize: 12, color: Colors.grey.shade600, ), ), ], ), ); } Widget _buildActivityItem(String title, String time, IconData icon) { return Container( margin: const EdgeInsets.only(bottom: 12), padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.grey.shade50, borderRadius: BorderRadius.circular(12), ), child: Row( children: [ Container( padding: const EdgeInsets.all(6), decoration: BoxDecoration( color: const Color(0xFF26BAE7).withOpacity(0.1), shape: BoxShape.circle, ), child: Icon(icon, color: const Color(0xFF26BAE7), size: 16), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: const TextStyle( fontSize: 14, fontWeight: FontWeight.w500, ), ), Text( time, style: TextStyle( fontSize: 12, color: Colors.grey.shade500, ), ), ], ), ), ], ), ); } Widget _buildPlaceholderScreen(String title, IconData icon) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: const Color(0xFF26BAE7).withOpacity(0.1), shape: BoxShape.circle, ), child: Icon( icon, size: 64, color: const Color(0xFF26BAE7), ), ), const SizedBox(height: 24), Text( title, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.w600, color: Color(0xFF273172), ), ), const SizedBox(height: 12), Text( "This feature is coming soon", style: TextStyle( fontSize: 16, color: Colors.grey.shade600, ), ), ], ), ); } }