From b5d4df493ec2b0fb8dddd38a32ee350b447f9fdf Mon Sep 17 00:00:00 2001 From: venbaittech Date: Sat, 1 Feb 2025 17:55:37 +0530 Subject: [PATCH] charts added and bug fix --- android/app/build.gradle | 4 +- assets/banners/fcsc.png | Bin 11792 -> 19097 bytes assets/icons/uae_numbers/bookmarks.png | Bin 0 -> 325 bytes assets/icons/uae_numbers/share.png | Bin 0 -> 375 bytes assets/logos/fcsc.png | Bin 558 -> 2302 bytes assets/splash_screen/logo.png | Bin 25412 -> 19097 bytes lib/config/my_router.dart | 4 +- .../icons/uae_numbers_asset_path.dart | 7 + .../auth_verification/create_new_pw.dart | 17 +- .../auth_verification/registration.dart | 86 +- .../Screens/charts/screens/chart_screen.dart | 264 +++-- .../Screens/charts/widgets/chart_widget.dart | 358 ++++++- lib/presentation/Screens/profilepage.dart | 6 +- .../routes/auth_routes/login_route.dart | 46 +- .../Drawer Items/edit_profile.dart | 960 +++++++++--------- .../drawer_routes/custom_drawer_routes.dart | 29 +- pubspec.yaml | 4 +- 17 files changed, 1151 insertions(+), 634 deletions(-) create mode 100644 assets/icons/uae_numbers/bookmarks.png create mode 100644 assets/icons/uae_numbers/share.png create mode 100644 lib/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 0b8467e3..02d9a058 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -15,12 +15,12 @@ if (localPropertiesFile.exists()) { def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { - flutterVersionCode = "3" + flutterVersionCode = "6" } def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { - flutterVersionName = "1.0.2" + flutterVersionName = "1.0.5" } def keystorePropertiesFile = rootProject.file("key.properties") diff --git a/assets/banners/fcsc.png b/assets/banners/fcsc.png index 4de43a5c4c6e3de85809f061638c20602be4da86..03eff4b63c56e0be969e17bd971b4e64c9141b1a 100644 GIT binary patch literal 19097 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 diff --git a/assets/icons/uae_numbers/bookmarks.png b/assets/icons/uae_numbers/bookmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..82d02a7b230fcdda741da71375bb05052de77e60 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoM!3HGxw}u@9Qk(@Ik;M!Q+`=Ht$S`Y;1W=H% zILO_JVcj{Imp~3nx}&cn1H;CC?mvmFK>jUH7srqa#^ zqrreNhe7%PTPpL7hP(i?2Hr!FKNfaz7_!PW)LqgHt*hx*o9~dt(^QKF(b* T#YRaK=t~AqS3j3^P6P000;W1^@s654Bdt00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yPvQpm!8nj^1gkpDUJx(E`wI&1dA~A{v3TDVF((t>MZkf7jooA7<8VtgsM>y;A#nl#GqA?5ar^>{9O=j8J|<`S12_| zxqFPe|F}M|Ko8F_Q3hUM=2X==qO`7&G<@!y$P75xfNfW*sN%$zodx#pGO-5JS(Gpj zTn!6t3-bjjGvFlc{5hHAf%sNxuy@uOKkvw6k|aYQ_l6uWPAe(Ewxx#1!Q1egcmM_? V)wMo8P!j+E002ovPDHLkV1k(0kc|KU literal 0 HcmV?d00001 diff --git a/assets/logos/fcsc.png b/assets/logos/fcsc.png index 044f949079b72bf5e84bd17a90047a53bd1fb545..dfbf3987e14c3ad96ec8112efd31522e82b60ea0 100644 GIT binary patch literal 2302 zcmd6peK^y5AIE>AAq#CgeswhS6g$|22(vs+L!&|-es!{REx*!Hw^W`dG8-p!$C5i| zY*NxBe$`Rb^vIk}tuj+0c-tJ*KtaPM1}5Y~ltRLbmRMqBKHD}<0t8afkZ zPGa}?BWF9WVYU!xyPa|U|AbvG$DJ=NY&KOU?76YH|1j)QA6MDZe++i9iv+!iw7agj zNHB9L?QVi1VU^_0^3Y}wgG&Bofql-svQ7aQ=oqOAk^jalwi-0LGUQbTyVQyGNx{hS zBDHrl+SnYMU7}03gqFObV9fC}?VH%(Gt6S23Nc95PYp&!d#t}8Wn=-EZNJJVc2O!D z84VoRvEWjpFA3@kJzt`mVGX73!rNRoDP1D~e~!DY^-)>Zup~h-iVcR#Fl&jls~flN z;(2fY$(>r%O2p{mX~vuK4v?HJl?m~AcYb0PXB&W0Jnf)u?609ne*wqk>I%#=`#!Us z7#kw3DRSG~=H#o_3WH2ZCT)s@8O?SB&=gNwbMhWNwm7#)0G>#9RIvi~=GD_BcY9Bq&AQ&E3-yiZe%5xf+48~7 z=_T_FORMA2-ii%+>(8@e>UKWb9q469F3gN!=fYvn7^>pgAUV^M9R8T0@_5?usJPo@ zS6B~2^`N~rkR2p!|2UlUoHy%M!}6;Z0ZB!`zz#3)W)-}-iG)iOO@44!o_qeR^czv`!E8)WhpVbvOLaf<;mzkrxWVqc zy+m1P$04nJ+T6(sGEJf2)(~Ze3)^oC|A#Se7uL*8jd(5XpH-avZ60zpI!;o z-dn>EhfVe8hr~X=|0u6uHWEq-n$4Bx{Nk?jK7Zn2wr)TiIEuV?LRFWdoU1W@MwH>( z{sOL{$ZmeR<75lRL*h;_naf`gsDeqj?Y0KQOrmjaa z(0H;ix|ALFaIJFum_6<)1zL-Se3^|DG*k%BprHl4jEshSCA}A?+o_S@Cl*3Sb2-B3 z!uQp_abZxY&S)uoV6@|LA?DM1g#MS2xAPL^xZr1SNgzT;XM81y)_;F0nO zoJmT0*@X#tGxM!qJ$1PVHm}Lzj=a#k2KY9R{%6hsw?%wgC^O|g=B^c#NuVw-gx_^5 zmwp%fP|pU+bmn%ZF_Tza%;d>9XR`9?u`^!s-%$g-?F9Tzu0y^{fxMe@3#WuC5%p!Q zvE-7i$A7>IJev>y(z!)iOO{;1MuJZQk)|m)Jz0!3#mkbOd(E%R%@C;ENk+9!k^|U7 ztu;On}*)mVFfI;S4Yzcp(hce@^)apqX;;LUl%=xR8+}W={E?dl5nW8=CV}j_%LhvC40O8B z>M6&zxmnQWsa>bX;I?r<<7Q5aF}D=gOVzN!cM)I4&#F2qIz#shzrU_Whn%u|4a93b zQdrJLw@lc&#);Of1NteuU7>nvS7SFkkm$e7j%Hc$M#2?i+uWDYmW5hfc_UHJ^UMAf zf(t&~09TA83c+Dj6r%X}^6>MjB2lApS$w22rQwI^q=__Gj2&<%%32;c6sK8U*(p(j z40hmZWy_JmU9cVWZQmfquC}&XWXoXt6TiD-ur(z5;A|eo>>-frr9wFF=B-q>mdEH( zLuD4C(0PH{JEoP>o@SLIJqbEgq^kx_CmFGOhNbEfkX`)Rs!UNQ9q6BI+hC4h~L!1<}FJAVP8S z3+Uz~I0z0xi<65Vpo0jCZVnC=L2Q>Uf)o^WDT4p1EwxS3=6uiErA>25o7`Q&2VN5H zNO;J5+`V@(05E7w?C&~GQG;HLP!wB&HRvb!%Mdgt=F+x7F^m34P=91xdv+Fmk9_2x!fXp=dr6C$H7eZ_cNotC5jYpAws__!E3vm%+$-IQdW1G8z;^$UWZ dXlnf%;s?#wg=dHF=H>tZ002ovPDHLkV1mOk>aYL+ diff --git a/assets/splash_screen/logo.png b/assets/splash_screen/logo.png index 8c3218e8f97d9884e8e460bf8ab12d5bb9648906..03eff4b63c56e0be969e17bd971b4e64c9141b1a 100644 GIT binary patch literal 19097 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 Ny;V?uQz>r|{6C#shF<^x diff --git a/lib/config/my_router.dart b/lib/config/my_router.dart index 1678f6e3..c02c0097 100644 --- a/lib/config/my_router.dart +++ b/lib/config/my_router.dart @@ -413,7 +413,9 @@ final GoRouter router = GoRouter( builder: (context, state) { final userId = state.pathParameters['userId']!; final email = state.pathParameters['email']!; - return CreateNewPw(userId: userId, email: email); + final key = state.uri.queryParameters['key'] ?? ''; + + return CreateNewPw(userId: userId, email: email, keyParam: key); }, ), GoRoute( diff --git a/lib/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart b/lib/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart new file mode 100644 index 00000000..903aca60 --- /dev/null +++ b/lib/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; + +abstract class UaeNumbersAssetPath { + static const _basePath = 'assets/icons/uae_numbers'; + static const bookmarksUae = '$_basePath/bookmarks.png'; + static const shareUae = '$_basePath/share.png'; +} \ No newline at end of file diff --git a/lib/presentation/Screens/auth_verification/create_new_pw.dart b/lib/presentation/Screens/auth_verification/create_new_pw.dart index 2e63faa1..83692570 100644 --- a/lib/presentation/Screens/auth_verification/create_new_pw.dart +++ b/lib/presentation/Screens/auth_verification/create_new_pw.dart @@ -13,7 +13,9 @@ import '../../../config/my_theme.dart'; class CreateNewPw extends StatefulWidget { final String userId; final String email; - const CreateNewPw({Key? key, required this.userId, required this.email}); + final String? keyParam; + + const CreateNewPw({Key? key, required this.userId, required this.email, required this.keyParam}); @override State createState() => _CreateNewPwState(); @@ -210,7 +212,14 @@ class _CreateNewPwState extends State { alignment: Alignment.topRight, child: GestureDetector( onTap: () { - context.go('/editProfile'); + + if (widget.keyParam == 'editProfile') { + context.go('/editProfile'); + }else + { + context.go('/profile/${widget.userId}'); + } + }, child: Container( margin: EdgeInsets.only(top: 16,left: 16,bottom: 16,right: 1), // Add margin for positioning @@ -351,8 +360,8 @@ class _CreateNewPwState extends State { SizedBox(height: screenHeight / 5), Center( child: Container( - height: screenHeight / 8, - width: screenWidth / 2, + height: screenHeight / 12, + width: screenWidth / 2.5, decoration: BoxDecoration( image: DecorationImage( image: AssetImage("assets/splash_screen/logo.png"), diff --git a/lib/presentation/Screens/auth_verification/registration.dart b/lib/presentation/Screens/auth_verification/registration.dart index 616c128e..a4650aad 100644 --- a/lib/presentation/Screens/auth_verification/registration.dart +++ b/lib/presentation/Screens/auth_verification/registration.dart @@ -31,6 +31,7 @@ class _RegisterScreenState extends State { String? _password; bool registrationSuccess = false; bool registrationFailed = false; + bool isRegistering = false; dynamic userID; final pb = PocketBase('https://pb.venbait.in'); @@ -144,6 +145,12 @@ class _RegisterScreenState extends State { final regex = RegExp( r'^[A-Za-z0-9~!@#$%^&*()_+=[\]{}|;:,.<>?/-àèìòùáéíóúÀÈÌÒÙÁÉÍÓÚ]*$'); + // Define regular expressions for password complexity requirements + final hasUppercase = RegExp(r'[A-Z]'); + final hasLowercase = RegExp(r'[a-z]'); + final hasDigit = RegExp(r'\d'); + final hasSpecialCharacter = RegExp(r'[~!@#$%^&*()_+=[\]{}|;:,.<>?/-]'); + if (value == null || value.isEmpty) { return 'Required'; } else if (value.length < 8) { @@ -151,7 +158,7 @@ class _RegisterScreenState extends State { } // Check the length constraint - if (value.length < 8 || value.length > 40) { + if (value.length < 8 || value.length > 64) { return 'Password must be between 8 and 64 characters'; } @@ -160,6 +167,27 @@ class _RegisterScreenState extends State { return 'Password contains invalid characters'; } + // Track missing constraints + List missingConstraints = []; + + if (!hasUppercase.hasMatch(value)) { + missingConstraints.add('uppercase letter'); + } + if (!hasLowercase.hasMatch(value)) { + missingConstraints.add('lowercase letter'); + } + if (!hasDigit.hasMatch(value)) { + missingConstraints.add('numeric digit'); + } + if (!hasSpecialCharacter.hasMatch(value)) { + missingConstraints.add('special character'); + } + + // If there are missing constraints, return a consolidated message + if (missingConstraints.isNotEmpty) { + return 'At least one ${missingConstraints.join(', ')}'; + } + _password = value; // Store the password for confirm password validation return null; } @@ -185,12 +213,15 @@ class _RegisterScreenState extends State { Future _registerUser() async { if (_formKey.currentState?.validate() ?? false) { if (isChecked) { + setState(() { + isRegistering = true; // Disable the button + }); try { final adminAuth = await pb.admins .authWithPassword('pb@venbainfotech.com', 'pb@venbainfotech.com'); final adminToken = adminAuth.token; - print('adminToken- ${adminToken}'); + print('adminTokenREgistration- ${adminToken}'); // Create user in PocketBase final response = await pb.collection('users').create(body: { 'uname': _usernameController.text, @@ -211,6 +242,7 @@ class _RegisterScreenState extends State { userID = response.id; registrationSuccess = true; registrationFailed = false; // Show success message on success + isRegistering = false; }); // Navigate to ProfileScreen after successful registration @@ -249,6 +281,9 @@ class _RegisterScreenState extends State { registrationFailed = true; registrationSuccess = false; }); + setState(() { + isRegistering = false; // Re-enable the button after error + }); } } } else { @@ -330,7 +365,9 @@ class _RegisterScreenState extends State { buildIconContainer(Icons.report, Color(0xFF7DAFBC)), SizedBox(height: 20), Text( - "Your registration is pending for verification.", + context.translate( + 'Your registration is pending for verification.', + 'تسجيلك في انتظار التحقق.'), textAlign: TextAlign.center, style: TextStyle( fontSize: 16, @@ -339,7 +376,9 @@ class _RegisterScreenState extends State { ), SizedBox(height: 10), Text( - "Kindly verify your mail to proceed further.", + context.translate( + 'Kindly verify your mail to proceed further.', + 'يرجى التحقق من البريد الخاص بك للمضي قدما.'), textAlign: TextAlign.center, style: TextStyle( fontSize: 14, @@ -350,14 +389,14 @@ class _RegisterScreenState extends State { ElevatedButton( onPressed: () => {context.go('/')}, child: Text( - 'Go to Login', + context.translate('Go to Login', 'اذهب إلى تسجيل الدخول'), ), ), SizedBox(height: screenheight / 5), Center( child: Container( - height: screenheight / 8, - width: screenwidth / 2, + height: screenheight / 16, + width: screenwidth / 2.5, decoration: BoxDecoration( image: DecorationImage( image: AssetImage( @@ -379,7 +418,8 @@ class _RegisterScreenState extends State { buildIconContainer(Icons.report, Colors.red), SizedBox(height: 20), Text( - "Sorry ${_usernameController.text}!", + context.translate('Sorry ${_usernameController.text}!', + 'آسف ${_usernameController.text}!'), textAlign: TextAlign.center, style: TextStyle( fontSize: 16, @@ -388,7 +428,9 @@ class _RegisterScreenState extends State { ), SizedBox(height: 10), Text( - "Your registration process failed. For further assistance, please contact support.", + context.translate( + 'Your registration process failed. For further assistance, please contact support.', + 'فشلت عملية التسجيل الخاصة بك. لمزيد من المساعدة، يرجى الاتصال بالدعم.'), textAlign: TextAlign.center, style: TextStyle( fontSize: 14, @@ -409,14 +451,14 @@ class _RegisterScreenState extends State { }) }, child: Text( - 'Retry', + context.translate('Retry', 'أعد المحاولة'), ), ), SizedBox(height: screenheight / 5), Center( child: Container( - height: screenheight / 8, - width: screenwidth / 2, + height: screenheight / 16, + width: screenwidth / 2.5, decoration: BoxDecoration( image: DecorationImage( image: AssetImage( @@ -475,7 +517,8 @@ class _RegisterScreenState extends State { decoration: InputDecoration( // hintText: 'Enter your email', hintText: _showHints[1] - ? AppLocalizations.of(context)!.enter_your_email + ? AppLocalizations.of(context)! + .enter_your_email : null, // _showHints[1] ? 'Enter your email' : null, prefixIcon: Icon( @@ -500,7 +543,8 @@ class _RegisterScreenState extends State { obscureText: _obscurePassword, decoration: InputDecoration( hintText: _showHints[2] - ? AppLocalizations.of(context)!.enter_your_password + ? AppLocalizations.of(context)! + .enter_your_password : null, // _showHints[2] ? 'Enter your password' : null, prefixIcon: Icon( @@ -510,8 +554,8 @@ class _RegisterScreenState extends State { suffixIcon: IconButton( icon: Icon( _obscurePassword - ? Icons.visibility - : Icons.visibility_off, + ? Icons.visibility_off + : Icons.visibility, color: Colors.blue, ), onPressed: () { @@ -545,8 +589,8 @@ class _RegisterScreenState extends State { suffixIcon: IconButton( icon: Icon( _obscureConfirmPassword - ? Icons.visibility - : Icons.visibility_off, + ? Icons.visibility_off + : Icons.visibility, color: Colors.blue, ), onPressed: () { @@ -632,7 +676,7 @@ class _RegisterScreenState extends State { SizedBox( width: screenwidth / 1.3, child: ElevatedButton( - onPressed: _registerUser, + onPressed: isRegistering ? null : _registerUser, style: ElevatedButton.styleFrom( backgroundColor: Color( 0xFFA7887A), // Brownish color for Register @@ -719,8 +763,8 @@ class _RegisterScreenState extends State { ), Center( child: Container( - height: screenheight / 8, - width: screenwidth / 2, + height: screenheight / 16, + width: screenwidth / 2.5, decoration: BoxDecoration( image: DecorationImage( image: AssetImage( diff --git a/lib/presentation/Screens/charts/screens/chart_screen.dart b/lib/presentation/Screens/charts/screens/chart_screen.dart index 291e7e1d..c962a673 100644 --- a/lib/presentation/Screens/charts/screens/chart_screen.dart +++ b/lib/presentation/Screens/charts/screens/chart_screen.dart @@ -3,9 +3,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; +import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart'; import 'package:uae_stat/presentation/Screens/charts/services/api_service.dart'; import 'package:uae_stat/presentation/Screens/charts/widgets/chart_widget.dart'; import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; +import 'package:uae_stat/presentation/components/my_toggle.dart'; import '../filters/search_filter_helper.dart'; @@ -492,53 +494,139 @@ class _ChartScreen1State extends ConsumerState { ), ), // Button Section + // Padding( + // padding: const EdgeInsets.all(16.0), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // ElevatedButton( + // onPressed: () { + // // Clear all selected filters + // selectedFilters.forEach((filter) { + // filter["filter_data"].clear(); + // }); + // setState(() { + // chartsData = List.from(originalTabChartsData); + // cardData = List.from(originalTabCardData); + // }); + // // Reset the selectedFiltersStorage to empty when clearing + // selectedFiltersStorage.clear(); + // Navigator.pop(context); + // }, + // child: Text(context.translate( + // 'Clear', + // 'واضح', + // )), + // style: ElevatedButton.styleFrom( + // backgroundColor: Colors.grey, + // ), + // ), + // ElevatedButton( + // onPressed: () { + // print( + // "Selected Filters before applying: $selectedFilters"); + // setState(() { + // chartsData = originalTabChartsData; + // cardData = originalTabCardData; + // }); + // + // applyFilters(context, filters, chartsData, cardData, + // selectedFilters); + // // Save the selected filters to storage after applying + // selectedFiltersStorage = List.from(selectedFilters); + // }, + // child: Text(context.translate( + // 'Apply Filter', + // 'تطبيق الفلتر', + // )), + // style: ElevatedButton.styleFrom( + // backgroundColor: Colors.blue, + // ), + // ), + // ], + // ), + // ), Padding( padding: const EdgeInsets.all(16.0), child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ElevatedButton( - onPressed: () { - // Clear all selected filters - selectedFilters.forEach((filter) { - filter["filter_data"].clear(); - }); - setState(() { - chartsData = List.from(originalTabChartsData); - cardData = List.from(originalTabCardData); - }); - // Reset the selectedFiltersStorage to empty when clearing - selectedFiltersStorage.clear(); - Navigator.pop(context); - }, - child: Text(context.translate( - 'Clear', - 'واضح', - )), - style: ElevatedButton.styleFrom( - backgroundColor: Colors.grey, + Expanded( + child: ElevatedButton( + onPressed: () { + selectedFilters.forEach((filter) { + filter["filter_data"].clear(); + }); + setState(() { + chartsData = List.from(originalTabChartsData); + cardData = List.from(originalTabCardData); + }); + selectedFiltersStorage.clear(); + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12), // Added padding + child: Text( + context.translate('Clear', 'واضح'), + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + overflow: + TextOverflow.ellipsis, // Prevents wrapping + maxLines: 1, // Ensures single line + ), + ), + style: ElevatedButton.styleFrom( + backgroundColor: Color(0xFF92722A), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), ), ), - ElevatedButton( - onPressed: () { - print( - "Selected Filters before applying: $selectedFilters"); - setState(() { - chartsData = originalTabChartsData; - cardData = originalTabCardData; - }); + SizedBox(width: 16), + Expanded( + child: ElevatedButton( + onPressed: () { + print( + "Selected Filters before applying: $selectedFilters"); + setState(() { + chartsData = originalTabChartsData; + cardData = originalTabCardData; + }); - applyFilters(context, filters, chartsData, cardData, - selectedFilters); - // Save the selected filters to storage after applying - selectedFiltersStorage = List.from(selectedFilters); - }, - child: Text(context.translate( - 'Apply Filter', - 'تطبيق الفلتر', - )), - style: ElevatedButton.styleFrom( - backgroundColor: Colors.blue, + applyFilters(context, filters, chartsData, cardData, + selectedFilters); + selectedFiltersStorage = List.from(selectedFilters); + }, + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12), // Added padding + child: FittedBox( + fit: BoxFit + .scaleDown, // Ensures text resizes if necessary + child: Text( + context.translate( + 'Apply Filter', 'تطبيق الفلتر'), + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + overflow: + TextOverflow.ellipsis, // Prevents wrapping + maxLines: 1, // Ensures single line + ), + ), + ), + style: ElevatedButton.styleFrom( + backgroundColor: Color(0xFF92722A), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), ), ), ], @@ -646,9 +734,18 @@ class _ChartScreen1State extends ConsumerState { @override Widget build(BuildContext context) { + final locale = ref.watch(localeProvider); + final localeNotifier = ref.read(localeProvider.notifier); ref.listen(localeProvider, (previous, next) { final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null - fetchChartData(widget.dataSets, localeCode); + // fetchChartData(widget.dataSets, localeCode); + + fetchChartData(widget.dataSets, localeCode).then((_) { + if (_tabsData.isNotEmpty) { + // Call onTabSelected for the first tab + onTabSelected(_tabsData[0]['id']); + } + }); }); double myheight = MediaQuery.of(context).size.height; double mywidth = MediaQuery.of(context).size.width; @@ -660,6 +757,23 @@ class _ChartScreen1State extends ConsumerState { appBar: AppBar( backgroundColor: color, elevation: 0, + actions: [ + // IconButton( + // onPressed: () {}, + // icon: const Icon(Icons.toggle_off_outlined), + // ), + MyToggle( + // key: toggleKey, + isOn: locale?.languageCode == 'en', + knobTextWhenOn: 'ع', + knobTextWhenOff: 'EN', + pathColorWhenOn: Colors.grey.shade300, + pathColorWhenOff: Colors.grey.shade300, + onTap: () { + ref.read(localeProvider.notifier).toggleLocale(); + }, + ), + ], leading: IconButton( icon: Icon(Icons.arrow_back_ios_new, color: Colors.white), onPressed: () { @@ -753,8 +867,12 @@ class _ChartScreen1State extends ConsumerState { ), ), SizedBox(width: 5), - Icon(Icons.bookmark_add_outlined, - color: Colors.white, size: 18), + Image.asset( + UaeNumbersAssetPath.bookmarksUae, + color: Colors.white, + width: 24, + height: 24, + ), ], ), SizedBox(width: 10), @@ -771,8 +889,12 @@ class _ChartScreen1State extends ConsumerState { ), ), SizedBox(width: 5), - Icon(Icons.share_sharp, - color: Colors.white, size: 18), + Image.asset( + UaeNumbersAssetPath.shareUae, + color: Colors.white, + width: 24, + height: 24, + ), ], ), SizedBox( @@ -901,10 +1023,13 @@ class _ChartScreen1State extends ConsumerState { Flexible( fit: FlexFit.loose, child: FittedBox( - // fit: BoxFit.contain, child: Text( '${chart_heading ?? 'NA'}', textAlign: TextAlign.center, + maxLines: 2, // Limit to 2 lines + softWrap: + true, // Enable soft wrapping + // overflow: TextOverflow.ellipsis, // Handle overflow gracefully style: TextStyle( fontSize: 11, fontWeight: FontWeight.w400, @@ -993,19 +1118,28 @@ class _ChartScreen1State extends ConsumerState { }, ), const SizedBox(height: 5), - Text( - '${chart_heading ?? 'NA'}', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 11, - fontWeight: FontWeight.w400, - color: Colors.black87, + Flexible( + fit: FlexFit.loose, + child: FittedBox( + child: Text( + '${chart_heading ?? 'NA'}', + textAlign: TextAlign.center, + maxLines: 2, // Limit to 2 lines + softWrap: + true, // Enable soft wrapping + // overflow: TextOverflow.ellipsis, // Handle overflow gracefully + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.w400, + color: Colors.black87, + ), + ), ), ), Text( '(${data['firstYear'] ?? 'NA'} - ${data['lastYear'] ?? 'NA'})', style: const TextStyle( - fontSize: 11, color: Colors.grey), + fontSize: 10, color: Colors.grey), ), Flexible( fit: FlexFit.loose, @@ -1049,10 +1183,13 @@ class _ChartScreen1State extends ConsumerState { Flexible( fit: FlexFit.loose, child: FittedBox( - // fit: BoxFit.contain, child: Text( '${chart_heading ?? 'NA'}', textAlign: TextAlign.center, + maxLines: 2, // Limit to 2 lines + softWrap: + true, // Enable soft wrapping + // overflow: TextOverflow.ellipsis, // Handle overflow gracefully style: TextStyle( fontSize: 11, fontWeight: FontWeight.w400, @@ -1124,14 +1261,17 @@ class _ChartScreen1State extends ConsumerState { Flexible( fit: FlexFit.loose, child: FittedBox( - fit: BoxFit.contain, child: Text( - apiService.formatAmount( - data['lastYearValue']), - style: const TextStyle( - fontSize: 22, - fontWeight: FontWeight.w900, - color: Color(0xFF90B0D5), + '${chart_heading ?? 'NA'}', + textAlign: TextAlign.center, + maxLines: 2, // Limit to 2 lines + softWrap: + true, // Enable soft wrapping + // overflow: TextOverflow.ellipsis, // Handle overflow gracefully + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.w400, + color: Colors.black87, ), ), ), diff --git a/lib/presentation/Screens/charts/widgets/chart_widget.dart b/lib/presentation/Screens/charts/widgets/chart_widget.dart index 05755d86..ca303309 100644 --- a/lib/presentation/Screens/charts/widgets/chart_widget.dart +++ b/lib/presentation/Screens/charts/widgets/chart_widget.dart @@ -72,27 +72,34 @@ class ChartWidget extends StatelessWidget { }).toList(); } - List generateIndicators(dynamic chartData, groupByValue) { + List generateIndicators(dynamic chartData, String groupByValue) { return chartData['response'].asMap().entries.map((entry) { int index = entry.key; var data = entry.value; Color color = Colors.primaries[index % Colors.primaries.length]; String title = data['ObsKey'][groupByValue] ?? ''; + String shortTitle = + title.length > 10 ? '${title.substring(0, 10)}…' : title; + return Row( mainAxisSize: MainAxisSize.min, children: [ Container( - width: 16, - height: 16, + width: 10, + height: 10, decoration: BoxDecoration( color: color, shape: BoxShape.circle, ), ), SizedBox(width: 8), - Text( - title, - style: TextStyle(fontSize: 14), + Tooltip( + message: title, // Full text on hover + child: Text( + shortTitle, + style: TextStyle(fontSize: 12), + overflow: TextOverflow.ellipsis, // Ensures text doesn't overflow + ), ), ], ); @@ -299,7 +306,7 @@ class ChartWidget extends StatelessWidget { touchTooltipData: BarTouchTooltipData( // tooltipBgColor: Colors.black.withOpacity(0.8), fitInsideHorizontally: true, - fitInsideVertically: false, + fitInsideVertically: true, tooltipPadding: const EdgeInsets.all(8), tooltipMargin: 16, getTooltipItem: @@ -541,11 +548,21 @@ class ChartWidget extends StatelessWidget { ), ), ]); - case 'line_trend_2': + case 'line_trend_population': + final List uniqueColorsLine_trend_2 = [ + Color(0xFF6097CD), + Color(0xFFD086A7), + Color(0xFF98BCE5), + Color(0xFFA7B5C5), + Color(0xFFBED3EC), + Color(0xFFD4E3F4), + ]; + Set selectedYears = {1970, 1980, 1990, 2000, 2010, 2020}; Map groupColorMap = {}; int colorIndex = 0; for (String group in groupByValues) { - groupColorMap[group] = uniqueColors[colorIndex % uniqueColors.length]; + groupColorMap[group] = uniqueColorsLine_trend_2[ + colorIndex % uniqueColorsLine_trend_2.length]; colorIndex++; } @@ -565,15 +582,17 @@ class ChartWidget extends StatelessWidget { ); } - // Find the maximum year and calculate the range for the last 5 years - int maxYear = years.reduce((a, b) => a > b ? a : b); - int minYear = maxYear - 5; + if (years.isNotEmpty) { + // Find the latest available year + int latestYear = years.reduce((a, b) => a > b ? a : b); + selectedYears.add(latestYear); // Include the latest year in selection + } - // Filter chart data to only include entries within the last 5 years +// Filter chart data to include only the selected years List filteredData = (chartData['response'] as List).where((entry) { int year = int.tryParse(entry['ObsKey']['TIME_PERIOD'] ?? '0') ?? 0; - return year >= minYear && year <= maxYear; + return selectedYears.contains(year); }).toList(); Set uniqueXValues = filteredData @@ -583,7 +602,7 @@ class ChartWidget extends StatelessWidget { // Generate line bars for the chart List lineBars = - lineBarsData2(filteredData, groupByValues, groupByKey); + lineBarsData(filteredData, groupByValues, groupByKey); return Column(children: [ Text( @@ -600,12 +619,124 @@ class ChartWidget extends StatelessWidget { child: LineChart(LineChartData( lineTouchData: lineTouchData1(), gridData: gridData(), - titlesData: titlesData2(uniqueXValues), + titlesData: titlesData1(uniqueXValues), borderData: borderData(), lineBarsData: lineBars, minX: uniqueXValues.reduce((a, b) => a < b ? a : b), maxX: uniqueXValues.reduce((a, b) => a > b ? a : b), ))), + Padding( + padding: const EdgeInsets.all(8.0), + child: Wrap( + spacing: 12, + runSpacing: 8, + children: groupByValues.map((group) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 12, + height: 12, + color: groupColorMap[group], + ), + SizedBox(width: 6), + Text( + group, + style: TextStyle(fontSize: 14), + ), + ], + ); + }).toList(), + ), + ), + ]); + case 'line_trend_2': + final List uniqueColorsLine_trend_2 = [ + Color(0xFF6097CD), + Color(0xFFD086A7), + Color(0xFF98BCE5), + Color(0xFFA7B5C5), + Color(0xFFBED3EC), + Color(0xFFD4E3F4), + ]; + Set selectedYears = {1970, 1980, 1990, 2000, 2010, 2020}; + Map groupColorMap = {}; + int colorIndex = 0; + for (String group in groupByValues) { + groupColorMap[group] = uniqueColorsLine_trend_2[ + colorIndex % uniqueColorsLine_trend_2.length]; + colorIndex++; + } + + // Extract all years from the chart data + List years = (chartData['response'] as List) + .map((entry) => + int.tryParse(entry['ObsKey']['TIME_PERIOD'] ?? '0') ?? 0) + .toList(); + + if (years.isEmpty) { + // Return an empty chart if no data + return LineChart( + LineChartData( + titlesData: FlTitlesData(show: false), + lineBarsData: [], + ), + ); + } + + if (years.isNotEmpty) { + // Find the latest available year + int latestYear = years.reduce((a, b) => a > b ? a : b); + selectedYears.add(latestYear); // Include the latest year in selection + } + +// Filter chart data to include only the selected years + List filteredData = + (chartData['response'] as List).where((entry) { + int year = int.tryParse(entry['ObsKey']['TIME_PERIOD'] ?? '0') ?? 0; + return selectedYears.contains(year); + }).toList(); + + Set uniqueXValues = filteredData + .map( + (entry) => double.parse(entry['ObsKey']['TIME_PERIOD'])) + .toSet(); + + // Generate line bars for the chart + List lineBars = lineBarsData2(filteredData); + + return Column(children: [ + Text( + chartData['chart_heading'] ?? '', // Chart title from data + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w400, + ), + textAlign: TextAlign.center, + ), + SizedBox(height: 10), + // Chart + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, // Enable horizontal scrolling + padding: const EdgeInsets.only(right: 40), + child: SizedBox( + width: (uniqueXValues.length * 80) + + 80, // Adjust width dynamically + child: LineChart( + LineChartData( + lineTouchData: lineTouchData1(), + gridData: gridData(), + titlesData: titlesData1(uniqueXValues), + borderData: borderData(), + lineBarsData: lineBars, + minX: uniqueXValues.reduce((a, b) => a < b ? a : b), + maxX: uniqueXValues.reduce((a, b) => a > b ? a : b), + ), + ), + ), + ), + ), ]); case 'bar_chart': // Extract groupBy values and their corresponding y-axis values @@ -697,6 +828,106 @@ class ChartWidget extends StatelessWidget { ), )) ]); + case 'bar_chart_horizontal': + // Extract groupBy values and their corresponding y-axis values + List xAxisData = []; + List yAxisData = []; + + for (var entry in chartData['response']) { + var xValue = entry['ObsKey'][groupByKey]; + var yValue = entry['ObsValue']['Value']; + if (xValue != null && yValue != null) { + xAxisData.add(xValue.toString()); + yAxisData.add(double.tryParse(yValue.toString()) ?? 0.0); + } + } + int rotationTurns = 1; + return Column(children: [ + Text( + chartData['chart_heading'] ?? '', // Chart title from data + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w400, + ), + textAlign: TextAlign.center, + ), + SizedBox(height: 10), + // Chart + Expanded( + child: BarChart( + BarChartData( + alignment: BarChartAlignment.spaceAround, + maxY: yAxisData.isNotEmpty + ? yAxisData.reduce((a, b) => a > b ? a : b) * 1.2 + : 10, + rotationQuarterTurns: rotationTurns, + barTouchData: BarTouchData(enabled: true), + titlesData: FlTitlesData( + leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: false, + interval: (yAxisData.isNotEmpty + ? yAxisData.reduce((a, b) => a > b ? a : b) / 5 + : 1), + getTitlesWidget: (value, meta) { + return Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Text('${value.toInt()}'), + ); + }, + reservedSize: 60, + ), + ), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + getTitlesWidget: (value, meta) { + if (value.toInt() < xAxisData.length) { + return Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Transform.rotate( + angle: -45 * + (3.1415927 / 180), // Rotating by -45 degrees + alignment: Alignment.center, + child: Text( + xAxisData[value.toInt()], + style: TextStyle(fontSize: 12), + ), + ), + ); + } + return Container(); + }, + reservedSize: 60, + ), + ), + topTitles: AxisTitles( + sideTitles: SideTitles(showTitles: false), // Hide top titles + ), + rightTitles: AxisTitles( + sideTitles: + SideTitles(showTitles: false), // Hide right titles + ), + ), + gridData: FlGridData(show: false), + borderData: FlBorderData(show: false), + barGroups: List.generate( + xAxisData.length, + (index) => BarChartGroupData( + x: index, + barRods: [ + BarChartRodData( + toY: yAxisData[index], + color: Colors.blueAccent, + borderRadius: BorderRadius.circular(4), + width: 20, + ), + ], + ), + ), + ), + )) + ]); case 'fl_multi_bar': double _calculateChartWidth(dynamic chartData) { int totalBars = chartData['response']?.length ?? 0; @@ -712,6 +943,15 @@ class ChartWidget extends StatelessWidget { if (chartData['dataset'] == 'health_services') { crop = item['ObsKey']['SECTOR']; cropType = item['ObsKey'][groupByKey]; + } else if (chartData['dataset'] == 'general_education') { + crop = item['ObsKey']['GENDER']; + cropType = item['ObsKey'][groupByKey]; + } else if (chartData['dataset'] == 'higher_education') { + crop = item['ObsKey']['GENDER']; + cropType = item['ObsKey'][groupByKey]; + } else if (chartData['dataset'] == 'labour_force') { + crop = item['ObsKey']['GENDER']; + cropType = item['ObsKey'][groupByKey]; } else { crop = item['ObsKey']['CROP']; cropType = item['ObsKey'][groupByKey]; @@ -781,6 +1021,12 @@ class ChartWidget extends StatelessWidget { barTouchData: BarTouchData( touchTooltipData: BarTouchTooltipData( tooltipHorizontalAlignment: FLHorizontalAlignment.center, + tooltipRoundedRadius: 8, + fitInsideHorizontally: + true, // Ensure it fits within the screen + fitInsideVertically: true, + tooltipPadding: EdgeInsets.all(8), + tooltipMargin: 16, // Only show tooltip when touched getTooltipItem: (group, groupIndex, rod, rodIndex) { if (rod.toY == 0 || touchedGroupIndex == -1) { @@ -873,8 +1119,14 @@ class ChartWidget extends StatelessWidget { // Iterate over the chartData to group crops by CROP_TYPE for (var item in chartData['response']) { - String crop = item['ObsKey']['CROP']; - String cropType = item['ObsKey']['CROP_TYPE']; + String crop, cropType; + if (chartData['dataset'] == 'natural_reserves') { + crop = item['ObsKey']['NR_TYPE']; + cropType = item['ObsKey'][groupByKey]; + } else { + crop = item['ObsKey']['CROP']; + cropType = item['ObsKey'][groupByKey]; + } if (groupedCrops.containsKey(cropType)) { groupedCrops[cropType]!.add(crop); @@ -985,15 +1237,22 @@ class ChartWidget extends StatelessWidget { bottomTitles: AxisTitles( sideTitles: SideTitles( showTitles: true, - reservedSize: 20, // Added space for rotated titles + reservedSize: 80, // Added space for rotated titles getTitlesWidget: (value, meta) { if (value < groupByValues.length) { String title = groupByValues.elementAt(value.toInt()); return Transform.rotate( - angle: -0.5, // Rotation in radians (~ -30 degrees) - child: Text( - title, - style: const TextStyle(fontSize: 12), + angle: -1.58, // Rotation in radians (~ -30 degrees) + child: Center( + child: SizedBox( + width: 80, + child: Text( + title, + style: const TextStyle(fontSize: 12), + softWrap: true, + maxLines: 2, + ), + ), ), ); } @@ -1010,7 +1269,7 @@ class ChartWidget extends StatelessWidget { show: true, border: const Border( // left: BorderSide(color: Colors.grey), - bottom: BorderSide(color: Colors.grey), + bottom: BorderSide(color: Colors.white), ), ), gridData: FlGridData( @@ -1084,47 +1343,25 @@ class ChartWidget extends StatelessWidget { ); } - List lineBarsData2(List filteredData, - Set groupByValues, String groupByKey) { + List lineBarsData2(List filteredData) { List lineBars = []; - print('filteredData $filteredData'); - print('filteredData222 $groupByValues'); - final List uniqueColors = [ - Color(0xFF648CBA), - Color(0xFF90B0D5), - Color(0xFF98BCE5), - Color(0xFFA7B5C5), - Color(0xFFBED3EC), - Color(0xFFD4E3F4), - ]; - // Create a map to assign colors to each group in order - Map groupColorMap = {}; - int colorIndex = 0; - for (String group in groupByValues) { - groupColorMap[group] = uniqueColors[colorIndex % uniqueColors.length]; - colorIndex++; - } - - print('Group-Color Map: $groupColorMap'); - - // Create a map to store the values by year and gender (M and F) + // Create a map to store population values by year and gender Map> yearGenderMap = {}; - // Populate the yearGenderMap with male and female values for (var entry in filteredData) { - int year = int.parse(entry['ObsKey']['TIME_PERIOD']); + int year = int.tryParse(entry['ObsKey']['TIME_PERIOD'].toString()) ?? 0; String gender = entry['ObsKey']['GENDER']; - double value = double.parse(entry['ObsValue']['Value'].toString()); + double value = + double.tryParse(entry['ObsValue']['Value'].toString()) ?? 0.0; if (!yearGenderMap.containsKey(year)) { yearGenderMap[year] = {'M': 0.0, 'F': 0.0}; } - // Assign value based on gender - if (gender == 'M') { + if (gender == 'Male') { yearGenderMap[year]!['M'] = value; - } else if (gender == 'F') { + } else if (gender == 'Female') { yearGenderMap[year]!['F'] = value; } } @@ -1205,7 +1442,14 @@ class ChartWidget extends StatelessWidget { // Helper functions for chart styles LineTouchData lineTouchData1() { return LineTouchData( - touchTooltipData: LineTouchTooltipData(), + touchTooltipData: LineTouchTooltipData( + // tooltipBgColor: Colors.black.withOpacity(0.7), // Tooltip background + tooltipRoundedRadius: 8, + fitInsideHorizontally: true, // Ensure it fits within the screen + fitInsideVertically: true, + tooltipPadding: EdgeInsets.all(8), + tooltipMargin: 16, // Adds margin to prevent clipping + ), handleBuiltInTouches: true, ); } @@ -1534,6 +1778,12 @@ class ChartWidget extends StatelessWidget { toY: value, // Use the parsed value color: barColor, // Dynamic color width: 20, + // backDrawRodData: BackgroundBarChartRodData( + // show: true, + // toY: 400000, + // color: Colors.grey.shade300, + // ), + // ); }).toList(); diff --git a/lib/presentation/Screens/profilepage.dart b/lib/presentation/Screens/profilepage.dart index e77c3187..04eb0a0d 100644 --- a/lib/presentation/Screens/profilepage.dart +++ b/lib/presentation/Screens/profilepage.dart @@ -451,7 +451,7 @@ class _ProfileScreenState extends State { controller: _usernameController, focusNode: _focusNodes[0], decoration: InputDecoration( - hintText: _showHints[0] ? 'Enter the User Name' : null, + // hintText: _showHints[0] ? 'Enter the User Name' : null, hintStyle: TextStyle(color: Colors.grey), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), @@ -477,8 +477,8 @@ class _ProfileScreenState extends State { controller: _emailController, focusNode: _focusNodes[1], decoration: InputDecoration( - hintText: - _showHints[1] ? 'mohammad.hassan@fcsc.gov.ae' : null, + // hintText: + // _showHints[1] ? 'mohammad.hassan@fcsc.gov.ae' : null, hintStyle: TextStyle(color: Colors.grey), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), diff --git a/lib/presentation/routes/auth_routes/login_route.dart b/lib/presentation/routes/auth_routes/login_route.dart index 20fb5f46..b74d62f2 100644 --- a/lib/presentation/routes/auth_routes/login_route.dart +++ b/lib/presentation/routes/auth_routes/login_route.dart @@ -354,14 +354,22 @@ class LoginRoute extends HookConsumerWidget { 'Email', 'بريد إلكتروني', ), - validator: FieldValidator.email(), + validator: (value) { + if (value == null || value.isEmpty) { + return context.translate('Required', 'مطلوب'); + } + return FieldValidator.email()(value); + }, imgPath: MiscIconAssetPath.person, controller: emailCtl, ), 15.verticalSpace, ThemedFormField( validator: (text) { - if (text!.length < 8) { + if (text == null || text.isEmpty) { + return context.translate('Required', 'مطلوب'); + } + else if (text.length < 8) { return 'The password must be at least 8 characters'; } return FieldValidator.password(minLength: 8)(text); @@ -462,16 +470,16 @@ class LoginRoute extends HookConsumerWidget { width: double.infinity, child: ElevatedButton( onPressed: () async { - final prefs = await SharedPreferences.getInstance(); - prefs.clear(); - final userId = 'guest'; - if (userId.isNotEmpty) { - await saveUserId(userId); - } - context.go('/myhomepage'); - //context.go('/${context.language}/${BottomNavBarItem.home.routePath}'), - }, - //context.go('/${context.language}/${BottomNavBarItem.home.routePath}'), + final prefs = await SharedPreferences.getInstance(); + prefs.clear(); + final userId = 'guest'; + if (userId.isNotEmpty) { + await saveUserId(userId); + } + context.go('/myhomepage'); + //context.go('/${context.language}/${BottomNavBarItem.home.routePath}'), + }, + //context.go('/${context.language}/${BottomNavBarItem.home.routePath}'), style: ButtonStyle( shape: WidgetStatePropertyAll( RoundedRectangleBorder( @@ -515,7 +523,7 @@ class LoginRoute extends HookConsumerWidget { ); final fcscBanner = Image.asset( BannerAssetPath.fcsc, - height: 56, + height: 40, ); final screenWidth = MediaQuery.of(context).size.width; final listViewHorizontalPadding = @@ -528,14 +536,16 @@ class LoginRoute extends HookConsumerWidget { 36.verticalSpace, Align( alignment: AlignmentDirectional.topEnd, - child: MyToggle(isOn: locale?.languageCode == 'en', + child: MyToggle( + isOn: locale?.languageCode == 'en', knobTextWhenOn: 'ع', knobTextWhenOff: 'EN', pathColorWhenOn: Colors.grey.shade300, pathColorWhenOff: Colors.grey.shade300, - onTap: (){ + onTap: () { ref.read(localeProvider.notifier).toggleLocale(); - },), + }, + ), ), 16.verticalSpace, helloAndPleaseLoginTexts, @@ -543,9 +553,9 @@ class LoginRoute extends HookConsumerWidget { form, 20.verticalSpace, dontHaveAnAccountRegisterBtn, - 36.verticalSpace, + 20.verticalSpace, continueAsGuestBtn, - 72.verticalSpace, + 25.verticalSpace, fcscBanner, ], ); diff --git a/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart b/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart index fbaff1ef..7ea353b1 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:io'; - import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -67,7 +66,7 @@ class _EditProfileState extends State { final _picker = ImagePicker(); File? _profileImage; String _avatarUrl = ''; - bool isPageLoad= false; + bool isPageLoad = false; // Regular expression to validate Full Name (no special characters) final RegExp _nameRegExp = RegExp(r'^[a-zA-Z\s]+$'); @@ -169,7 +168,6 @@ class _EditProfileState extends State { }, ); - print('userDetails: $userDetailsResponse'); setState(() { _usernameController.text = userDetailsResponse.data['uname'] ?? ''; @@ -199,7 +197,7 @@ class _EditProfileState extends State { if (avatarFilename.isNotEmpty && recordId.isNotEmpty) { _avatarUrl = - 'https://pb.venbait.in/api/files/$collectionId/$recordId/$avatarFilename'; + 'https://pb.venbait.in/api/files/$collectionId/$recordId/$avatarFilename'; } else { _avatarUrl = ''; // Reset to default or empty } @@ -232,14 +230,14 @@ class _EditProfileState extends State { // await Future.delayed(Duration(seconds: 8)); // Example delay final XFile? pickedFile = - await _picker.pickImage(source: ImageSource.gallery); + await _picker.pickImage(source: ImageSource.gallery); if (pickedFile != null) { setState(() { _isLoading = true; // Start loading }); print(pickedFile); final String fileExtension = - pickedFile.path.split('.').last.toLowerCase(); + pickedFile.path.split('.').last.toLowerCase(); print('fileExtension $fileExtension'); if (fileExtension == 'jpg' || fileExtension == 'jpeg' || @@ -265,9 +263,13 @@ class _EditProfileState extends State { final DateTime today = DateTime.now(); final DateTime initialDate = _selectedDate ?? today.subtract( - const Duration(days: 365 * 18),); // Default to 18 years ago - final DateTime firstDate = today.subtract(const Duration( - days: 365 * 100,),); // Allow picking dates back to 100 years ago + const Duration(days: 365 * 18), + ); // Default to 18 years ago + final DateTime firstDate = today.subtract( + const Duration( + days: 365 * 100, + ), + ); // Allow picking dates back to 100 years ago final DateTime lastDate = today; // Allow picking dates up to today // Updated Date format to DD/MM/YYYY @@ -336,19 +338,21 @@ class _EditProfileState extends State { // Create a multipart request final uri = - Uri.parse('${_pb.baseUrl}/api/collections/users/records/$userID'); + Uri.parse('${_pb.baseUrl}/api/collections/users/records/$userID'); final request = http.MultipartRequest('PATCH', uri); // Add fields to the request - request.fields['country_region'] = countryRegion; // Only update country here + request.fields['country_region'] = + countryRegion; // Only update country here // If profile image exists, add it if (_profileImage != null) { - request.files.add(await http.MultipartFile.fromPath( - 'avatar', - _profileImage!.path, - ),); - + request.files.add( + await http.MultipartFile.fromPath( + 'avatar', + _profileImage!.path, + ), + ); } // Add headers (e.g., authorization) @@ -360,7 +364,6 @@ class _EditProfileState extends State { print('ShowConfirmationuser response - $response '); // Handle response if (response.statusCode == 200) { - _resetFormFields(); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Profile updated successfully!')), @@ -370,8 +373,8 @@ class _EditProfileState extends State { } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: - Text('Failed to update profile: ${response.statusCode}'),), + content: Text('Failed to update profile: ${response.statusCode}'), + ), ); } } catch (error) { @@ -432,464 +435,498 @@ class _EditProfileState extends State { padding: const EdgeInsets.all(20.0), child: isPageLoad ? Center( - child: CircularProgressIndicator(), - ) + child: CircularProgressIndicator(), + ) : Column( - children: [ - // CircleAvatar( - // radius: 50, - // backgroundImage: _profileImage != null - // ? FileImage( - // _profileImage!) // If a local file is selected - // : _avatarUrl.isNotEmpty - // ? NetworkImage(_avatarUrl) // Load from URL - // : AssetImage( - // "assets/edit_profile/profile.png") - // as ImageProvider, - // - // //backgroundImage: NetworkImage(_avatarUrl) as ImageProvider, - // - // child: - // Align( - // alignment: Alignment.bottomRight, - // child: GestureDetector( - // onTap: _pickImage, // Call `_pickImage` on tap - // child: CircleAvatar( - // radius: 15, - // backgroundColor: Colors.white, - // child: Icon( - // Icons.camera_alt, - // size: 15, - // color: Colors.grey, - // ), - // ), - // ), - // ), - // ), + children: [ + // CircleAvatar( + // radius: 50, + // backgroundImage: _profileImage != null + // ? FileImage( + // _profileImage!) // If a local file is selected + // : _avatarUrl.isNotEmpty + // ? NetworkImage(_avatarUrl) // Load from URL + // : AssetImage( + // "assets/edit_profile/profile.png") + // as ImageProvider, + // + // //backgroundImage: NetworkImage(_avatarUrl) as ImageProvider, + // + // child: + // Align( + // alignment: Alignment.bottomRight, + // child: GestureDetector( + // onTap: _pickImage, // Call `_pickImage` on tap + // child: CircleAvatar( + // radius: 15, + // backgroundColor: Colors.white, + // child: Icon( + // Icons.camera_alt, + // size: 15, + // color: Colors.grey, + // ), + // ), + // ), + // ), + // ), + // Stack( + // alignment: Alignment.center, + // children: [ + // // FutureBuilder to load the image + // FutureBuilder( + // future: _loadProfileImage(), + // builder: (context, snapshot) { + // if (snapshot.connectionState == ConnectionState.waiting) { + // // While the image is loading, show a progress indicator + // return CircleAvatar( + // radius: 50, + // child: CircularProgressIndicator(), + // ); + // } else if (snapshot.hasError || snapshot.data == null) { + // // If there's an error or no image, show an error icon + // return CircleAvatar( + // radius: 50, + // child: CircularProgressIndicator(), + // ); + // } else { + // // Display the loaded image + // return CircleAvatar( + // radius: 50, + // backgroundImage: snapshot.data, + // child: Align( + // alignment: Alignment.bottomRight, + // child: GestureDetector( + // onTap: _pickImage, + // child: CircleAvatar( + // radius: 15, + // backgroundColor: Colors.white, + // child: Icon( + // Icons.camera_alt, + // size: 15, + // color: Colors.grey, + // ), + // ), + // ), + // ), + // ); + // } + // }, + // ), + // ], + // ), - - // Stack( - // alignment: Alignment.center, - // children: [ - // // FutureBuilder to load the image - // FutureBuilder( - // future: _loadProfileImage(), - // builder: (context, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // // While the image is loading, show a progress indicator - // return CircleAvatar( - // radius: 50, - // child: CircularProgressIndicator(), - // ); - // } else if (snapshot.hasError || snapshot.data == null) { - // // If there's an error or no image, show an error icon - // return CircleAvatar( - // radius: 50, - // child: CircularProgressIndicator(), - // ); - // } else { - // // Display the loaded image - // return CircleAvatar( - // radius: 50, - // backgroundImage: snapshot.data, - // child: Align( - // alignment: Alignment.bottomRight, - // child: GestureDetector( - // onTap: _pickImage, - // child: CircleAvatar( - // radius: 15, - // backgroundColor: Colors.white, - // child: Icon( - // Icons.camera_alt, - // size: 15, - // color: Colors.grey, - // ), - // ), - // ), - // ), - // ); - // } - // }, - // ), - // ], - // ), - - Stack( - alignment: Alignment.center, - children: [ - CircleAvatar( - radius: 50, - backgroundImage: _profileImage != null - ? FileImage(_profileImage!) // If a local file is selected - : _avatarUrl.isNotEmpty - ? NetworkImage(_avatarUrl) // Load from URL - : AssetImage('assets/edit_profile/profile.png') as ImageProvider, - child: _avatarUrl.isNotEmpty - ? FutureBuilder( - future: _loadImage(_avatarUrl), - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return Center( - child: CircularProgressIndicator(), - ); - } else if (snapshot.hasError) { - return Center( - child: Icon(Icons.error), - ); - } else { - return Align( - alignment: Alignment.bottomRight, - child: GestureDetector( - onTap: _pickImage, // Call `_pickImage` on tap - child: CircleAvatar( - radius: 15, - backgroundColor: Colors.white, - child: Icon( - Icons.camera_alt, - size: 15, - color: Colors.grey, + Stack( + alignment: Alignment.center, + children: [ + CircleAvatar( + radius: 50, + backgroundImage: _profileImage != null + ? FileImage( + _profileImage!) // If a local file is selected + : _avatarUrl.isNotEmpty + ? NetworkImage( + _avatarUrl) // Load from URL + : AssetImage( + 'assets/edit_profile/profile.png') + as ImageProvider, + child: _avatarUrl.isNotEmpty + ? FutureBuilder( + future: _loadImage(_avatarUrl), + builder: (context, snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return Center( + child: + CircularProgressIndicator(), + ); + } else if (snapshot.hasError) { + return Center( + child: Icon(Icons.error), + ); + } else { + return Align( + alignment: + Alignment.bottomRight, + child: GestureDetector( + onTap: + _pickImage, // Call `_pickImage` on tap + child: CircleAvatar( + radius: 15, + backgroundColor: + Colors.white, + child: Icon( + Icons.camera_alt, + size: 15, + color: Colors.grey, + ), + ), + ), + ); + } + }, + ) + : Align( + alignment: Alignment.bottomRight, + child: GestureDetector( + onTap: + _pickImage, // Call `_pickImage` on tap + child: CircleAvatar( + radius: 15, + backgroundColor: Colors.white, + child: Icon( + Icons.camera_alt, + size: 15, + color: Colors.grey, + ), + ), + ), ), + ), + if (_isLoading) + Positioned( + child: CircularProgressIndicator( + strokeWidth: 2, + valueColor: + AlwaysStoppedAnimation( + Colors.grey, ), ), - ); - } - }, - ) - : Align( - alignment: Alignment.bottomRight, - child: GestureDetector( - onTap: _pickImage, // Call `_pickImage` on tap - child: CircleAvatar( - radius: 15, - backgroundColor: Colors.white, - child: Icon( - Icons.camera_alt, - size: 15, - color: Colors.grey, ), - ), - ), + ], ), - ), - if (_isLoading) - Positioned( - child: CircularProgressIndicator( - strokeWidth: 2, - valueColor: AlwaysStoppedAnimation( - Colors.grey,), - ), - ), - ], - ), - SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)!.register_name, - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Colors.grey,), - ), - ], - ), - SizedBox(height: 10), - TextFormField( - controller: _usernameController, - focusNode: _focusNodes[0], - decoration: InputDecoration( - // hintText: _showHints[0] ? 'Mohammad Hassan' : null, - hintStyle: TextStyle(color: Colors.grey), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - enabled: false, - ), - ), - SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)!.email_id, - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Colors.grey,), - ), - ], - ), - SizedBox(height: 10), - TextFormField( - controller: _emailController, - focusNode: _focusNodes[1], - decoration: InputDecoration( - // hintText: _showHints[1]? 'mohammad.hassan@fcsc.gov.ae': null, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - enabled: false, - ), - ), - SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)!.full_name, - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Colors.grey,), - ), - ], - ), - SizedBox(height: 10), - TextFormField( - enabled: false, - validator: (value) { - if (value == null || value.isEmpty) { - return 'Required'; - } - - //RegExp(r"^[a-zA-Z\s]+$"); - final nameRegex = RegExp( - r"^[a-zA-Z0-9'\-\u0627\u0639~\u00C0-\u00FF\s]+$",); - if (!nameRegex.hasMatch(value)) { - return 'Invalid Characters'; - } - return null; - }, - controller: _fullNameController, - focusNode: _focusNodes[2], - decoration: InputDecoration( - // hintText: _showHints[2] ? 'Mohammad' : null, - hintStyle: TextStyle(color: Colors.grey), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - // counterText: '', - enabled: !_isProfileCompleted, - ), - maxLength: - 40, // Set the maximum length to 20 characters - maxLengthEnforcement: MaxLengthEnforcement.enforced, - ), - SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Date of Birth*', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Colors.grey,), - ), - ], - ), - SizedBox(height: 10), - TextFormField( - controller: _dateController, - focusNode: _focusNodes[3], - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - // hintText: _showHints[3] ? 'Select your Date of Birth' : null, - hintStyle: TextStyle(color: Colors.grey), - suffixIcon: const Icon(Icons.arrow_drop_down_sharp), - enabled: !_isProfileCompleted, - ), - readOnly: true, - onTap: _pickDate, - validator: _validateDob, - ), - SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - AppLocalizations.of(context)!.region, - style: TextStyle( - fontSize: 16, fontWeight: FontWeight.w500,), - ), - ], - ), - SizedBox(height: 10), - DropdownButtonFormField( - value: _selectedCountry, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - labelText: 'Select', - ), - items: _countries - .map((item) => DropdownMenuItem( - value: item, - child: Text(item), - ),) - .toList(), - onChanged: (String? newValue) { - setState(() { - _selectedCountry = newValue; - }); - }, - validator: _validateDropdown, - ), - SizedBox(height: 20), - if (!_isProfileCompleted) // Conditional rendering - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ + SizedBox(height: 20), Row( + mainAxisAlignment: MainAxisAlignment.start, children: [ - Checkbox( - value: isChecked, - onChanged: (value) { - setState(() { - isChecked = value ?? false; - showError = false; - }); - }, - side: BorderSide( - color: - showError ? Colors.red : Colors.grey, - width: 1.5, - ), - ), - Expanded( - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SizedBox(height: 10), - Text.rich( - TextSpan( - text: AppLocalizations.of(context)! - .agree, - style: - TextStyle(color: Colors.black), - children: [ - TextSpan( - text: AppLocalizations.of( - context,)! - .terms_conditions, - style: TextStyle( - color: Colors.blue, - decoration: - TextDecoration.underline, - ), - recognizer: - TapGestureRecognizer() - ..onTap = () { - // Add action for Terms & Conditions tap - }, - ), - TextSpan( - text: AppLocalizations.of( - context,)! - .t_and, - style: TextStyle( - color: Colors.black,), - ), - TextSpan( - text: AppLocalizations.of( - context,)! - .privacy_policy, - style: TextStyle( - color: Colors.blue, - decoration: - TextDecoration.underline, - ), - recognizer: - TapGestureRecognizer() - ..onTap = () { - // Add action for Privacy Policy tap - }, - ), - TextSpan( - text: AppLocalizations.of( - context,)! - .conditions, - style: TextStyle( - color: Colors.black,), - ), - ], - ), - textAlign: TextAlign.start, - maxLines: 2, - overflow: TextOverflow.visible, - softWrap: true, - ), - ], + Text( + AppLocalizations.of(context)!.register_name, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.grey, ), ), ], ), - if (showError) - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Padding( - padding: - const EdgeInsets.only(left: 10.0), - child: Text( - 'Please agree to terms and conditions', - style: TextStyle( - color: Colors.red[700], - fontSize: 12, - ), - ), + SizedBox(height: 10), + TextFormField( + controller: _usernameController, + focusNode: _focusNodes[0], + decoration: InputDecoration( + // hintText: _showHints[0] ? 'Mohammad Hassan' : null, + hintStyle: TextStyle(color: Colors.grey), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + enabled: false, + ), + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.email_id, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.grey, ), + ), + ], + ), + SizedBox(height: 10), + TextFormField( + controller: _emailController, + focusNode: _focusNodes[1], + decoration: InputDecoration( + // hintText: _showHints[1]? 'mohammad.hassan@fcsc.gov.ae': null, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + enabled: false, + ), + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.full_name, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.grey, + ), + ), + ], + ), + SizedBox(height: 10), + TextFormField( + enabled: false, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Required'; + } + + //RegExp(r"^[a-zA-Z\s]+$"); + final nameRegex = RegExp( + r"^[a-zA-Z0-9'\-\u0627\u0639~\u00C0-\u00FF\s]+$", + ); + if (!nameRegex.hasMatch(value)) { + return 'Invalid Characters'; + } + return null; + }, + controller: _fullNameController, + focusNode: _focusNodes[2], + decoration: InputDecoration( + // hintText: _showHints[2] ? 'Mohammad' : null, + hintStyle: TextStyle(color: Colors.grey), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + // counterText: '', + enabled: !_isProfileCompleted, + ), + maxLength: + 40, // Set the maximum length to 20 characters + maxLengthEnforcement: + MaxLengthEnforcement.enforced, + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.dob, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Colors.grey, + ), + ), + ], + ), + SizedBox(height: 10), + TextFormField( + controller: _dateController, + focusNode: _focusNodes[3], + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + // hintText: _showHints[3] ? 'Select your Date of Birth' : null, + hintStyle: TextStyle(color: Colors.grey), + suffixIcon: + const Icon(Icons.arrow_drop_down_sharp), + enabled: !_isProfileCompleted, + ), + readOnly: true, + onTap: _pickDate, + validator: _validateDob, + ), + SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.region, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + SizedBox(height: 10), + DropdownButtonFormField( + value: _selectedCountry, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + labelText: 'Select', + ), + items: _countries + .map( + (item) => DropdownMenuItem( + value: item, + child: Text(item), + ), + ) + .toList(), + onChanged: (String? newValue) { + setState(() { + _selectedCountry = newValue; + }); + }, + validator: _validateDropdown, + ), + SizedBox(height: 20), + if (!_isProfileCompleted) // Conditional rendering + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Checkbox( + value: isChecked, + onChanged: (value) { + setState(() { + isChecked = value ?? false; + showError = false; + }); + }, + side: BorderSide( + color: showError + ? Colors.red + : Colors.grey, + width: 1.5, + ), + ), + Expanded( + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox(height: 10), + Text.rich( + TextSpan( + text: AppLocalizations.of( + context)! + .agree, + style: TextStyle( + color: Colors.black), + children: [ + TextSpan( + text: AppLocalizations.of( + context, + )! + .terms_conditions, + style: TextStyle( + color: Colors.blue, + decoration: + TextDecoration + .underline, + ), + recognizer: + TapGestureRecognizer() + ..onTap = () { + // Add action for Terms & Conditions tap + }, + ), + TextSpan( + text: AppLocalizations.of( + context, + )! + .t_and, + style: TextStyle( + color: Colors.black, + ), + ), + TextSpan( + text: AppLocalizations.of( + context, + )! + .privacy_policy, + style: TextStyle( + color: Colors.blue, + decoration: + TextDecoration + .underline, + ), + recognizer: + TapGestureRecognizer() + ..onTap = () { + // Add action for Privacy Policy tap + }, + ), + TextSpan( + text: AppLocalizations.of( + context, + )! + .conditions, + style: TextStyle( + color: Colors.black, + ), + ), + ], + ), + textAlign: TextAlign.start, + maxLines: 2, + overflow: TextOverflow.visible, + softWrap: true, + ), + ], + ), + ), + ], + ), + if (showError) + Row( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 10.0), + child: Text( + 'Please agree to terms and conditions', + style: TextStyle( + color: Colors.red[700], + fontSize: 12, + ), + ), + ), + ], + ), ], ), + SizedBox(height: 20), + Center( + child: GestureDetector( + onTap: () { + final email = _emailController.text; + context.go('/createNewPw/$userId/$email?key=editProfile'); + }, + child: Text( + AppLocalizations.of(context)! + .change_password, + style: TextStyle( + color: Colors.blue, + decoration: TextDecoration.underline, + ), + ), + ), + ), + SizedBox(height: 20), + ElevatedButton.icon( + onPressed: () { + showConfirmationDialog(context); + }, + icon: Icon( + Icons.save, + color: Colors.white, + ), + label: Text( + AppLocalizations.of(context)!.save, + style: TextStyle(color: Colors.white), + ), + style: ElevatedButton.styleFrom( + backgroundColor: Color(0xFF92722A), + minimumSize: Size(double.infinity, 50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + ), ], ), - SizedBox(height: 20), - Center( - child: GestureDetector( - onTap: () { - final email = _emailController.text; - context.go('/createNewPw/$userId/$email'); - }, - child: Text( - AppLocalizations.of(context)!.change_password, - style: TextStyle( - color: Colors.blue, - decoration: TextDecoration.underline,), - ), - ), - ), - SizedBox(height: 20), - ElevatedButton.icon( - onPressed: () { - showConfirmationDialog(context); - }, - icon: Icon( - Icons.save, - color: Colors.white, - ), - label: Text( - AppLocalizations.of(context)!.save, - style: TextStyle(color: Colors.white), - ), - style: ElevatedButton.styleFrom( - backgroundColor: Color(0xFF92722A), - minimumSize: Size(double.infinity, 50), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - ), - ), - ], - ), ), ), ), @@ -902,8 +939,6 @@ class _EditProfileState extends State { } } - - class ConfirmationDialog extends StatelessWidget { const ConfirmationDialog({super.key}); @override @@ -936,7 +971,7 @@ class ConfirmationDialog extends StatelessWidget { TextSpan( text: 'Country', style: - TextStyle(fontWeight: FontWeight.w700), // Bold for "name" + TextStyle(fontWeight: FontWeight.w700), // Bold for "name" ), TextSpan( text: ' or ', @@ -944,7 +979,8 @@ class ConfirmationDialog extends StatelessWidget { TextSpan( text: 'Profile Image', style: TextStyle( - fontWeight: FontWeight.w700,), // Bold for "date of birth" + fontWeight: FontWeight.w700, + ), // Bold for "date of birth" ), TextSpan( text: '.', @@ -1006,4 +1042,4 @@ class ConfirmationDialog extends StatelessWidget { ], ); } -} \ No newline at end of file +} diff --git a/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart b/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart index 6394c770..9a51ce96 100644 --- a/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart +++ b/lib/presentation/routes/drawer_routes/custom_drawer_routes.dart @@ -748,14 +748,31 @@ class _BaseScaffoldState extends ConsumerState { ), ListTile( leading: Icon(Icons.book), - title: const Text('User Guide'), + // title: const Text('User Guide'), + title: Text(AppLocalizations.of(context)!.guide_title), onTap: () => context.go('/user-guide'), ), - ListTile( - leading: Icon(Icons.logout), - title: const Text('Logout'), - onTap: () => logout(), - ), + if (userId != 'guest') + ListTile( + leading: Icon(Icons.logout), + // title: const Text('Logout'), + title: Text(AppLocalizations.of(context)!.logout), + onTap: () => logout(), + ), + if (userId == 'guest') + ListTile( + leading: Icon(Icons.login), + // title: const Text('Login'), + title: Text(AppLocalizations.of(context)!.login_title), + onTap: () => context.go('/login'), + ), + if (userId == 'guest') + ListTile( + leading: Icon(Icons.app_registration), + // title: const Text('Register'), + title: Text(AppLocalizations.of(context)!.register_title), + onTap: () => context.go('/register'), + ), ], ), ), diff --git a/pubspec.yaml b/pubspec.yaml index 0506e766..073fd01c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: uae_stat description: "View statistics about the UAE from the Federal Center for Statistics and Competitiveness." publish_to: "none" #version: 0.5.10 -version: 1.0.2+3 +version: 1.0.5+6 environment: sdk: ">=3.2.3 <4.0.0" @@ -115,6 +115,8 @@ flutter: - assets/edit_profile/ - assets/splash_screen/ - assets/app_tour/ + - assets/icons/uae_numbers/bookmarks.png + - assets/icons/uae_numbers/share.png fonts: - family: Segoe