import 'dart:convert'; import 'dart:io'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:image_picker/image_picker.dart'; import 'package:supplier_new/common/settings.dart'; import '../login/login.dart'; class DashboardScreen extends StatefulWidget { const DashboardScreen({super.key}); @override State createState() => _DashboardScreenState(); } class _DashboardScreenState extends State { int _currentIndex = 0; final ImagePicker _picker = ImagePicker(); final storage = FlutterSecureStorage( aOptions: AndroidOptions( resetOnError: true, encryptedSharedPreferences: true, ), ); final GlobalKey _scaffoldKey = GlobalKey(); // Define a list of widgets for each screen final List _screens = [ HomeScreen(), HomeScreen(), HomeScreen(), HomeScreen(), HomeScreen(), ]; // List of bottom navigation bar items final List _bottomNavItems = [ BottomNavigationBarItem( icon:Padding( padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing child:ImageIcon(AssetImage('images/homeBottomIcon.png')),), // Replace with your image path label: "Home", ), BottomNavigationBarItem( icon: Padding( padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing child: ImageIcon(AssetImage('images/ordersBottomIcon.png')), ), label: "Orders", ), BottomNavigationBarItem( icon: Padding( padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing child: ImageIcon(AssetImage('images/plansBottomIcon.png')), ), // Replace with your image path label: "Plans", ), BottomNavigationBarItem( icon: Padding( padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing child:ImageIcon(AssetImage('images/resourcesBottomIcon.png')),), // Replace with your image path label: "Resources", ), BottomNavigationBarItem( icon:Padding( padding: EdgeInsets.fromLTRB(0,5,0,0), // Adjust height to control spacing child:ImageIcon(AssetImage('images/financialsBottomIcon.png')),), // Replace with your image path label: "Financials", ), ]; void _onItemTapped(int index) { setState(() { _currentIndex = index; }); } Future pickImageFromGallery() async { try { final image = await _picker.pickImage(source: ImageSource.gallery); if (image == null) return; final imageTemp = File(image.path); AppSettings.preLoaderDialog(context); bool isOnline = await AppSettings.internetConnectivity(); if(isOnline) { var res = await AppSettings.uploadrofileImageHTTPNew(image); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { AppSettings.profilePictureUrl = jsonDecode(res)['picture']; }); AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING'); } else{ Navigator.of(context, rootNavigator: true).pop(); AppSettings.longFailedToast('Please check interent'); } } on PlatformException catch (e) { Navigator.of(context, rootNavigator: true).pop(); AppSettings.longFailedToast('Failed to pick image: $e'); } } Future takeImageFromCamera() async { try { final image = await _picker.pickImage(source: ImageSource.camera); if (image == null) return; final imageTemp = File(image.path); AppSettings.preLoaderDialog(context); bool isOnline = await AppSettings.internetConnectivity(); if(isOnline){ var res = await AppSettings.uploadrofileImageHTTPNew(image); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { AppSettings.profilePictureUrl = jsonDecode(res)['picture']; }); AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING'); } else{ Navigator.of(context, rootNavigator: true).pop(); AppSettings.longFailedToast('Please check interent'); } } on PlatformException catch (e) { Navigator.of(context, rootNavigator: true).pop(); AppSettings.longFailedToast('Failed to pick image: $e'); } } showLogoutAlertDialog(context) { return showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return StatefulBuilder( builder: (BuildContext context, StateSetter setState) { return AlertDialog( backgroundColor: Color(0XFFFFFFFF),// Set your desired background color shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), // Optional: Rounded corners ), title: Center(child: Text('Logout?',style:fontTextStyle(16,Color(0XFF101214),FontWeight.w700)),), actions: [ Center( child: Row( mainAxisSize: MainAxisSize.min, children: [ Expanded(child: GestureDetector( onTap: (){ Navigator.of(context).pop(); }, child: Container( decoration: BoxDecoration( shape: BoxShape.rectangle, color: Color(0XFFFFFFFF), border: Border.all( width: 1, color: Color(0XFF1D7AFC)), borderRadius: BorderRadius.circular( 12, )), alignment: Alignment.center, child: Visibility( visible: true, child: Padding( padding: EdgeInsets.fromLTRB(16,12,16,12), child: Text( 'Cancel', style: fontTextStyle( 12, Color(0XFF1D7AFC), FontWeight.w600)), ), ), ), ),), SizedBox(width:MediaQuery.of(context).size.width * .016,), Expanded(child: GestureDetector( onTap: ()async{ await storage.deleteAll(); await Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => Login()), (Route route) => false, ); }, child: Container( decoration: BoxDecoration( shape: BoxShape.rectangle, color: Color(0XFFE2483D), border: Border.all( width: 1, color: Color(0XFFE2483D)), borderRadius: BorderRadius.circular( 12, )), alignment: Alignment.center, child: Visibility( visible: true, child: Padding( padding: EdgeInsets.fromLTRB(16,12,16,12), child: Text( 'Logout', style: fontTextStyle( 12, Color(0XFFFFFFFF), FontWeight.w600)), ), ), ) ),) ], ), ), ]); }); }); } @override Widget build(BuildContext context) { return WillPopScope( onWillPop: () async { if (_scaffoldKey.currentState?.isDrawerOpen ?? false) { // If the drawer is open, close it _scaffoldKey.currentState?.openEndDrawer(); return false; // Prevent the default back action (exit the app) } else if (_currentIndex == 2) { final shouldPop = await showDialog( context: context, builder: (context) { return AlertDialog( backgroundColor: Color(0XFFFFFFFF),// Set your desired background color shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), // Optional: Rounded corners ), title: Center(child: Text('Do you want to exit app?',style:fontTextStyle(16,Color(0XFF101214),FontWeight.w700)),), actionsAlignment: MainAxisAlignment.spaceBetween, actions: [ Center( child: Row( mainAxisSize: MainAxisSize.min, children: [ Expanded(child: GestureDetector( onTap: (){ Navigator.of(context).pop(false); }, child: Container( decoration: BoxDecoration( shape: BoxShape.rectangle, color: Color(0XFFFFFFFF), border: Border.all( width: 1, color: Color(0XFF1D7AFC)), borderRadius: BorderRadius.circular( 12, )), alignment: Alignment.center, child: Visibility( visible: true, child: Padding( padding: EdgeInsets.fromLTRB(16,12,16,12), child: Text( 'Cancel', style: fontTextStyle( 12, Color(0XFF1D7AFC), FontWeight.w600)), ), ), ), ),), SizedBox(width:MediaQuery.of(context).size.width * .016,), Expanded(child: GestureDetector( onTap: ()async{ SystemNavigator.pop(); }, child: Container( decoration: BoxDecoration( shape: BoxShape.rectangle, color: Color(0XFF1D7AFC), border: Border.all( width: 1, color: Color(0XFF1D7AFC)), borderRadius: BorderRadius.circular( 12, )), alignment: Alignment.center, child: Visibility( visible: true, child: Padding( padding: EdgeInsets.fromLTRB(16,12,16,12), child: Text( 'Confirm', style: fontTextStyle( 12, Color(0XFFFFFFFF), FontWeight.w600)), ), ), ) ),) ], ), ), ], ); }, ); return shouldPop!; } else { setState(() { _currentIndex = 2; }); return false; } }, child: Scaffold( key: _scaffoldKey, backgroundColor: Colors.white, appBar: AppBar( backgroundColor: Colors.white, elevation: 0, scrolledUnderElevation: 0, title: Text(_currentIndex==2?'Aquinto':_currentIndex==0?'History':_currentIndex==1?'Usage':_currentIndex==3?'Water Levels':'Resources',style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w500),), iconTheme: IconThemeData(color: Color(0XFF2A2A2A)), actions: [ Row( children: [ Padding(padding: EdgeInsets.fromLTRB(10,10,0,10), child: IconButton( icon: Image( image: AssetImage('images/calendar_appbar.png') ), onPressed: (){ }, ), ), Padding(padding: EdgeInsets.fromLTRB(0,10,10,10), child: IconButton( icon: Image.asset( 'images/notification_appbar.png', // Example URL image ), onPressed: (){ }, ), ) ], ) ], leading: IconButton( icon: Icon(Icons.menu), onPressed: () { _scaffoldKey.currentState?.openDrawer(); }, ), ), drawer: Drawer( width: MediaQuery.of(context).size.width, backgroundColor: Colors.white, child: Padding( padding: EdgeInsets.all(8), child: Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ SizedBox(height:MediaQuery.of(context).size.height * .05,), Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ /* GestureDetector( onTap: (){ Navigator.of(context).pop(true); }, child: Image.asset('images/appbar_backbutton.png',height: 25,width: 25,color: Color(0XFF2A2A2A),), ),*/ SizedBox(width:MediaQuery.of(context).size.width * .04,), Text( 'Menu', style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w500), ), ], ), SizedBox(height:MediaQuery.of(context).size.height * .016,), Padding( padding: EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ /*CircleAvatar( radius: 50, // Adjust the size of the circle backgroundColor: Colors.grey[200], backgroundImage:AppSettings.profilePictureUrl != '' && AppSettings.profilePictureUrl != 'null'?NetworkImage(AppSettings .profilePictureUrl) as ImageProvider: AssetImage('images/profile_pic.png',), // Your profile image ),*/ AppSettings.loginType.toString().toLowerCase()=='user'? GestureDetector( onTap: () { /*Navigator.push( context, new MaterialPageRoute( builder: (__) => new ImageZoomPage( imageName: 'Profile', imageDetails: AppSettings.profilePictureUrl)));*/ }, child: Stack( alignment: Alignment.center, // Centers the stack's children children: [ // CircleAvatar background ClipOval( child: Container( height: 100, // Ensure the container's height is the same as the profile image width: 100, decoration: BoxDecoration( color: Colors.transparent, shape: BoxShape.circle, // Makes the container circular image: DecorationImage( image: (AppSettings.profilePictureUrl != '' && AppSettings.profilePictureUrl != 'null') ? NetworkImage(AppSettings.profilePictureUrl) as ImageProvider : AssetImage( "images/profile_pic.png"), // picked file fit: BoxFit.cover)), ), ), // Positioned image on top of CircleAvatar Positioned( bottom: 0, // Adjust position as needed right: 0, // Adjust position as needed child: Container( width: 30, height: 30, decoration: BoxDecoration( boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.3), blurRadius: 4, offset: Offset(0, 2), // Shadow to make the edit icon pop ), ], shape: BoxShape.circle, color: Colors.white, // Background for the overlay ), child: GestureDetector( onTap: (){ showModalBottomSheet( context: context, builder: (BuildContext context) { return SizedBox( height: 200, child: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ GestureDetector( child: Icon( Icons.camera_alt_outlined, size: 100, color: primaryColor, ), onTap: () async { await takeImageFromCamera(); Navigator.pop(context); }, ), SizedBox( width: MediaQuery.of(context) .size .width * .20, ), GestureDetector( child: Icon( Icons.photo, size: 100, color: primaryColor, ), onTap: () async { await pickImageFromGallery(); Navigator.pop(context); }, ), ], ), ), ); }); }, child: Image.asset( 'images/edit_profile.png', // Ensure the image path is correct fit: BoxFit.cover, ), ), ), ), ], ), ):ClipOval( child: Container( height: 100, // Ensure the container's height is the same as the profile image width: 100, decoration: BoxDecoration( color: Colors.transparent, shape: BoxShape.circle, // Makes the container circular image: DecorationImage( image: (AssetImage( "images/profile_pic.png")), // picked file fit: BoxFit.contain)), ), ), SizedBox(height:MediaQuery.of(context).size.height * .016,), Text( AppSettings.userName, style: fontTextStyle(20,Color(0XFF2A2A2A),FontWeight.w500), ), Visibility( visible:AppSettings.loginType.toString().toLowerCase()=='user', child: Text( AppSettings.email, style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), ),), Text( AppSettings.phoneNumber, style: fontTextStyle(14,Color(0XFF2A2A2A),FontWeight.w400), ), ], ),), SizedBox(height:MediaQuery.of(context).size.height * .024,), ListTile( title: Row( children: [ Image( image: const AssetImage('images/logout_drawer.png'), height: 25, width: 25, fit: BoxFit.fill), SizedBox(width:MediaQuery.of(context).size.width * .04,), Text('Logout', style: fontTextStyle(16,Color(0XFFE2483D),FontWeight.w400),), ], ), onTap: () { showLogoutAlertDialog(context); }, ), ], ), ), ) ), body: _screens[_currentIndex], /*_body(),,*/ bottomNavigationBar: Padding( padding:EdgeInsets.fromLTRB(0, 0, 0, 0) , child: BottomNavigationBar( backgroundColor: Color(0XFFFFFFFF), items: _bottomNavItems, selectedItemColor: primaryColor, // Color of selected icon and text unselectedItemColor: Color(0XFF939495), // Color of unselected icon and text selectedLabelStyle: fontTextStyleHeight(10,primaryColor,FontWeight.w400,MediaQuery.of(context).size.height * .0032,), unselectedLabelStyle: fontTextStyleHeight(10,Color(0XFF939495),FontWeight.w400,MediaQuery.of(context).size.height * .0032,), currentIndex: _currentIndex, onTap: _onItemTapped, /*onTap: (index) { switch (index) { case 0: Navigator.push( context, MaterialPageRoute(builder: (context) => Resources()), ); break; case 1: Navigator.push( context, MaterialPageRoute(builder: (context) => TankLevels()), ); break; case 3: Navigator.push( context, MaterialPageRoute( builder: (context) => Consumption()), ); break; case 4: Navigator.push( context, MaterialPageRoute(builder: (context) => SupplierManagementDashboard()), ); break; } },*/ type: BottomNavigationBarType .fixed, // Ensures all 6 items are visible ), ) )); } } class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); @override State createState() => _HomeScreenState(); } class _HomeScreenState extends State { @override Widget build(BuildContext context) { return SingleChildScrollView( child: Padding( padding: EdgeInsets.all(10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ Text( "Hello! Welcome to ${AppSettings.buildingName}", style: fontTextStyle(16,Color(0XFF2A2A2A),FontWeight.w600), ), SizedBox(height:MediaQuery.of(context).size.height * .03,), ], ) ), ); } } // Screens for each bottom navigation item