From a554a26bc6c2b25f259fd84676aa60cae20aee24 Mon Sep 17 00:00:00 2001 From: venbaittech Date: Tue, 18 Mar 2025 17:58:39 +0530 Subject: [PATCH] toggle functionality added --- android/app/build.gradle | 4 +- lib/config/toggle_lang_service.dart | 37 ++++++ lib/l10n/intl_ar.arb | 1 + lib/l10n/intl_en.arb | 2 + .../UAE_Numbers/uae_numbers.dart | 9 +- .../Screens/charts/screens/chart_screen.dart | 120 +++++++----------- .../Screens/charts/widgets/chart_widget.dart | 4 +- lib/presentation/Screens/profilepage.dart | 13 +- .../routes/auth_routes/login_route.dart | 50 ++++++-- .../tab_routes/home_route.dart | 21 +-- .../drawer_routes/Drawer Items/bookmark.dart | 7 +- .../drawer_routes/Drawer Items/contactUs.dart | 15 +++ .../Drawer Items/edit_profile.dart | 30 ++++- .../drawer_routes/Drawer Items/feedback.dart | 9 ++ .../Drawer Items/manage_users.dart | 9 ++ .../notification/notification.dart | 9 +- .../notification/notification_details.dart | 7 +- pubspec.yaml | 2 +- 18 files changed, 235 insertions(+), 114 deletions(-) create mode 100644 lib/config/toggle_lang_service.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 1ff9ea72..613e27b1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -20,12 +20,12 @@ if (project.hasProperty('google-services.json')) { def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { - flutterVersionCode = "38" + flutterVersionCode = "39" } def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { - flutterVersionName = "1.0.37" + flutterVersionName = "1.0.38" } def keystorePropertiesFile = rootProject.file("key.properties") diff --git a/lib/config/toggle_lang_service.dart b/lib/config/toggle_lang_service.dart new file mode 100644 index 00000000..23eb4017 --- /dev/null +++ b/lib/config/toggle_lang_service.dart @@ -0,0 +1,37 @@ +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:pocketbase/pocketbase.dart'; +import 'package:uae_stat/config/api_config.dart'; + +class UserService { + final _pb = PocketBase(apiUrl); + + Future updateLanguage(String localeCode) async { + try { + final prefs = await SharedPreferences.getInstance(); + final userId = prefs.getString('userId'); + + if (userId == null) { + throw Exception('User ID not found'); + } + // Authenticate as admin + final adminAuth = await _pb.admins + .authWithPassword('pb@venbainfotech.com', 'pb@venbainfotech.com'); + final token = adminAuth.token; + + final headers = { + 'Authorization': 'Bearer $token', + }; + await _pb.collection('users').update( + userId, + body: { + 'language': localeCode, + }, + headers: headers, + ); + + print('Language updated successfully'); + } catch (e) { + print('Error updating language: $e'); + } + } +} diff --git a/lib/l10n/intl_ar.arb b/lib/l10n/intl_ar.arb index 9019afdb..b1abb55b 100644 --- a/lib/l10n/intl_ar.arb +++ b/lib/l10n/intl_ar.arb @@ -101,6 +101,7 @@ "search": "يبحث", "approved": "تمت الموافقة", + "profile_updated_successfully": "تم تحديث الملف الشخصي بنجاح", "create_new_password": "إنشاء كلمة مرور جديدة", "different_password":"يجب أن تكون كلمة المرور الجديدة مختلفة عن كلمة المرور المستخدمة سابقًا.", "old_password": "كلمة المرور القديمة", diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 5debfd51..6bb6d3ee 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -98,6 +98,8 @@ "no_result_found": "No results found", "search": "Search", + + "profile_updated_successfully": "Profile updated successfully", "create_new_password": "Create New Password", "different_password": "Your New Password Must Be Different form Previously Used Password", "old_password": "Old Password", diff --git a/lib/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart b/lib/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart index 277fc97a..87fccb2b 100644 --- a/lib/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart +++ b/lib/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart @@ -4,7 +4,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; +import 'package:pocketbase/pocketbase.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart'; import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; @@ -66,10 +69,13 @@ class _UaenumberWidgetState extends ConsumerState { List filteredData = []; bool isLoading = true; int? expandedIndex = 0; + final _pb = PocketBase(apiUrl); + late UserService _userService; @override void initState() { super.initState(); + _userService = UserService(); final locale = ref.read(localeProvider); fetchData(locale?.languageCode ?? 'en'); _searchController.addListener(() { @@ -180,11 +186,12 @@ class _UaenumberWidgetState extends ConsumerState { } }); - ref.listen(localeProvider, (previous, next) { + ref.listen(localeProvider, (previous, next) async { final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null setState(() { isLoading = true; }); + await _userService.updateLanguage(localeCode); fetchData(localeCode); }); diff --git a/lib/presentation/Screens/charts/screens/chart_screen.dart b/lib/presentation/Screens/charts/screens/chart_screen.dart index ff181998..243d9a1d 100644 --- a/lib/presentation/Screens/charts/screens/chart_screen.dart +++ b/lib/presentation/Screens/charts/screens/chart_screen.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; @@ -13,6 +14,7 @@ import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; import 'package:uae_stat/config/toast_util.dart'; +import 'package:uae_stat/config/toggle_lang_service.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'; @@ -96,10 +98,12 @@ class _ChartScreen1State extends ConsumerState { String? bookmarkId; // Stores the ID of the bookmark record in PocketBase late final Locale locale; late String mainTopic; + late UserService _userService; @override void initState() { super.initState(); + _userService = UserService(); final String bgColor = widget.bgColor; print(' bgColor $bgColor'); checkIfBookmarked(); @@ -1533,6 +1537,8 @@ class _ChartScreen1State extends ConsumerState { } void showRightSideModal(BuildContext context, List filters, List data) { + // Hide system UI (including bottom navigation bar) + SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); print('selectedFiltersStoraged1- $selectedFiltersStorage'); // Initialize selected filters structure from the stored value, if exists @@ -1749,59 +1755,7 @@ 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( @@ -1908,7 +1862,10 @@ class _ChartScreen1State extends ConsumerState { ), ); }, - ); + ).whenComplete(() { + // Restore system UI when modal is dismissed + SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); + }); } void onTabSelected(String tabId) { @@ -2112,12 +2069,14 @@ class _ChartScreen1State extends ConsumerState { } }); - ref.listen(localeProvider, (previous, next) { - final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null + ref.listen(localeProvider, (previous, next) async { + final localeCode = next?.languageCode ?? 'en'; + // Default to 'en' if null setState(() { isLoading = true; print('isLoadingref $isLoading'); }); + await _userService.updateLanguage(localeCode); // fetchChartData(widget.dataSets, localeCode); print('Saving currentTab: $tabWiseKpi before locale change'); @@ -2568,24 +2527,35 @@ class _ChartScreen1State extends ConsumerState { children: [ // ConstrainedBox Container( - height: (chartsData[index] - ['chart_type'] == - 'pie_chart') - ? 500 - : (chartsData[index][ - 'chart_type'] == - 'bar_chart_horizontal') - ? 370 - : (chartsData[index][ - 'chart_type'] == - 'horizontal_rotate') - ? 385 - : (chartsData[index] - [ - 'chart_type'] == - 'fl_stacked_bar') - ? 390 - : 350, + height: (chartsData[index][ + 'chart_height'] == + null || + chartsData[index][ + 'chart_height'] == + 0) + ? 350 + : double.tryParse( + chartsData[index] + ['chart_height'] + .toString()), + // height: (chartsData[index] + // ['chart_type'] == + // 'pie_chart') + // ? 500 + // : (chartsData[index][ + // 'chart_type'] == + // 'bar_chart_horizontal') + // ? 370 + // : (chartsData[index][ + // 'chart_type'] == + // 'horizontal_rotate') + // ? 385 + // : (chartsData[index] + // [ + // 'chart_type'] == + // 'fl_stacked_bar') + // ? 390 + // : 350, // child: buildChart(chartsData[index]), child: ChartWidget( @@ -2694,7 +2664,7 @@ Future shareCurrentPage(BuildContext context, bool _isSharing) async { _isSharing = true; try { final String currentRoute = GoRouterState.of(context).uri.toString(); - final String baseAppLink = 'https://fcsc-da580.web.app'; + final String baseAppLink = 'https://fcsc-a161c.web.app'; final String shareLink = '$baseAppLink$currentRoute'; final String shareText = 'Check this out!'; final String svgAssetPath = 'assets/backgrounds/share/fcsc.svg'; diff --git a/lib/presentation/Screens/charts/widgets/chart_widget.dart b/lib/presentation/Screens/charts/widgets/chart_widget.dart index 83564cf5..aa3275ce 100644 --- a/lib/presentation/Screens/charts/widgets/chart_widget.dart +++ b/lib/presentation/Screens/charts/widgets/chart_widget.dart @@ -591,7 +591,7 @@ class ChartWidget extends StatelessWidget { BoxConstraints(minHeight: 3), // Allow dynamic height child: Padding( padding: const EdgeInsets.only( - left: 2.0, right: 2.0, bottom: 8.0, top: 1.0), + left: 2.0, right: 2.0, bottom: 8.0, top: 30), child: Column( // Change Row to Column crossAxisAlignment: CrossAxisAlignment.start, @@ -2979,7 +2979,7 @@ class ChartWidget extends StatelessWidget { // print("Bottomtiles"); // print(value); return Padding( - padding: const EdgeInsets.only(top: 3.1, left: 20.0), + padding: const EdgeInsets.only(top: 4, left: 20.0), child: SizedBox( width: 40, child: Transform.rotate( diff --git a/lib/presentation/Screens/profilepage.dart b/lib/presentation/Screens/profilepage.dart index 1475ce25..aba6c62d 100644 --- a/lib/presentation/Screens/profilepage.dart +++ b/lib/presentation/Screens/profilepage.dart @@ -358,9 +358,18 @@ class _ProfileScreenState extends ConsumerState { // Send the request final response = await request.send(); print(response); - _resetFormFields(); ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text("Profile updated successfully!"))); + SnackBar(content: Text(AppLocalizations.of(context)!.profile_updated_successfully))); + // **Set Default Locale in Provider** + print('_selectedLanguage $_selectedLanguage'); + preferredLang = _selectedLanguage == 'English' ? 'en' : 'ar'; + if (preferredLang == 'ar') { + ref.read(localeProvider.notifier).setLocale(const Locale('ar')); + } else { + ref.read(localeProvider.notifier).setLocale(const Locale('en')); + } + _resetFormFields(); + // if (role == 'admin') { // context.go('/manageuser'); // } else { diff --git a/lib/presentation/routes/auth_routes/login_route.dart b/lib/presentation/routes/auth_routes/login_route.dart index 27d741ff..8f5376d6 100644 --- a/lib/presentation/routes/auth_routes/login_route.dart +++ b/lib/presentation/routes/auth_routes/login_route.dart @@ -43,6 +43,7 @@ class LoginRoute extends HookConsumerWidget { dynamic userData; String? role; int? loginCount; + dynamic preferredLanguage; final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; // final FirebaseAuth _auth = FirebaseAuth.instance; static final formKey = GlobalKey(); @@ -72,7 +73,7 @@ class LoginRoute extends HookConsumerWidget { final bool? isVerified = userDetailsResponse.data['verified']; final bool? isUserMailVerified = userDetailsResponse.data['user_mail_verify']; - final preferredLanguage = userDetailsResponse.data['language'] ?? ''; + preferredLanguage = userDetailsResponse.data['language'] ?? ''; print('preferredLanguage login $preferredLanguage'); @@ -85,11 +86,11 @@ class LoginRoute extends HookConsumerWidget { } // **Set Default Locale in Provider** - if (preferredLanguage == 'ar') { - ref.read(localeProvider.notifier).setLocale(const Locale('ar')); - } else { - ref.read(localeProvider.notifier).setLocale(const Locale('en')); - } + // if (preferredLanguage == 'ar') { + // ref.read(localeProvider.notifier).setLocale(const Locale('ar')); + // } else { + // ref.read(localeProvider.notifier).setLocale(const Locale('en')); + // } userData = userDetailsResponse; // Check if 'is_profile_completed' is true @@ -193,6 +194,26 @@ class LoginRoute extends HookConsumerWidget { } } + // Function to send the reset password request + Future forgotPasswordMail(String email) async { + final url = + Uri.parse("${pb.baseUrl}api/auth/request-password-reset?email=$email"); + + try { + final response = await http.get(url); + + if (response.statusCode == 200) { + return; // Success, no action needed here + } else { + final errorResponse = json.decode(response.body); + throw Exception( + errorResponse['message'] ?? "Failed to send reset email."); + } + } catch (error) { + throw Exception("Something went wrong. Please try again."); + } + } + // Future authenticateAndStoreData() async { // try { // // Perform authentication @@ -342,13 +363,10 @@ class LoginRoute extends HookConsumerWidget { ); if (email == null) return; if (!context.mounted) return; - await context.loaderWithErrorDialog( - () => ref - .read( - authUseCaseProvider.notifier, - ) - .requestPwReset(email), - ); + + await context.loaderWithErrorDialog(() async { + await forgotPasswordMail(email); + }); if (!context.mounted) return; context.simpleDialog( @@ -497,6 +515,12 @@ class LoginRoute extends HookConsumerWidget { if (isProfileComplete) { print('Redirecting to Home / Intended Path'); + // **Set Default Locale in Provider** + if (preferredLanguage == 'ar') { + ref.read(localeProvider.notifier).setLocale(const Locale('ar')); + } else { + ref.read(localeProvider.notifier).setLocale(const Locale('en')); + } context.go(intendedPath ?? '/myhomepage'); } else { print('Redirecting to Profile Setup'); diff --git a/lib/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart b/lib/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart index ea6106fe..99367785 100644 --- a/lib/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart +++ b/lib/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart @@ -169,6 +169,7 @@ import 'package:pocketbase/pocketbase.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/data/p_auth_repo.dart'; import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; @@ -265,15 +266,15 @@ class _MyHomePageState extends ConsumerState { ), ), child: FittedBox( - fit: BoxFit - .scaleDown, // Prevents wrapping while adjusting text size - child: Text( - context.translate('Log Out', 'تسجيل الخروج'), - style: TextStyle(color: Colors.white, fontSize: 16), - textAlign: TextAlign.center, + fit: BoxFit + .scaleDown, // Prevents wrapping while adjusting text size + child: Text( + context.translate('Log Out', 'تسجيل الخروج'), + style: TextStyle(color: Colors.white, fontSize: 16), + textAlign: TextAlign.center, + ), ), ), - ), ), ], ), @@ -357,7 +358,7 @@ class EconomyStatsState extends ConsumerState { // final _pb = PocketBase('https://pb.venbait.in'); final _pb = PocketBase(apiUrl); bool isLoading = true; - + late UserService _userService; final GlobalKey cardTopicKey = GlobalKey(); final GlobalKey cardsKey = GlobalKey(); late TutorialCoachMark tutorialCoachMark; @@ -1045,6 +1046,7 @@ class EconomyStatsState extends ConsumerState { @override void initState() { super.initState(); + _userService = UserService(); locale = ref.read(localeProvider) ?? const Locale('en'); fetchData(locale?.languageCode ?? 'en'); // _fetchUserData(); @@ -1156,11 +1158,12 @@ class EconomyStatsState extends ConsumerState { } Widget build(BuildContext context) { - ref.listen(localeProvider, (previous, next) { + ref.listen(localeProvider, (previous, next) async { final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null setState(() { isLoading = true; }); + await _userService.updateLanguage(localeCode); fetchData(localeCode); }); diff --git a/lib/presentation/routes/drawer_routes/Drawer Items/bookmark.dart b/lib/presentation/routes/drawer_routes/Drawer Items/bookmark.dart index 6b365650..0081985b 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/bookmark.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/bookmark.dart @@ -8,6 +8,7 @@ import 'package:pocketbase/pocketbase.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/bookmark_asset_path.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart'; @@ -29,10 +30,12 @@ class _BookMarkState extends ConsumerState { int? expandedIndex = 0; // Current selected tab index int selectedTabIndex = 0; + late UserService _userService; @override void initState() { super.initState(); + _userService = UserService(); final locale = ref.read(localeProvider); fetchBookmarks(locale?.languageCode ?? 'en'); } @@ -347,11 +350,13 @@ class _BookMarkState extends ConsumerState { }, ]; - ref.listen(localeProvider, (previous, next) { + ref.listen(localeProvider, (previous, next) async { final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null setState(() { isLoading = true; }); + await _userService.updateLanguage(localeCode); + fetchBookmarks(localeCode); }); diff --git a/lib/presentation/routes/drawer_routes/Drawer Items/contactUs.dart b/lib/presentation/routes/drawer_routes/Drawer Items/contactUs.dart index 2debb486..607d4cde 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/contactUs.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/contactUs.dart @@ -2,8 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/enquiry_asset_icon_path.dart'; +import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -15,6 +17,14 @@ class Contact extends ConsumerStatefulWidget { } class _ContactState extends ConsumerState { + late UserService _userService; + + @override + void initState() { + super.initState(); + _userService = UserService(); + } + @override Widget build(BuildContext context) { final double screenWidth = MediaQuery.of(context).size.width; @@ -26,6 +36,11 @@ class _ContactState extends ConsumerState { } }); + ref.listen(localeProvider, (previous, next) async { + final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null + await _userService.updateLanguage(localeCode); + }); + return BaseScaffold( body: Container( color: Colors.grey[200], 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 965e96b8..e856dbb9 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart @@ -16,8 +16,10 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; import 'package:uae_stat/config/my_theme.dart'; +import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart'; +import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart'; class EditProfile extends ConsumerStatefulWidget { @@ -31,7 +33,7 @@ class _EditProfileState extends ConsumerState { final _pb = PocketBase(apiUrl); // final _pb = PocketBase('http://127.0.0.1:8090'); bool _isProfileCompleted = false; - + int changedPreferredLanguage = 0; // Add focus nodes and hint states final List _focusNodes = List.generate(4, (_) => FocusNode()); final List _showHints = [ @@ -96,11 +98,12 @@ class _EditProfileState extends ConsumerState { bool _isHoveringDropdown = false; bool _isHoveringPreferredLang = false; + late UserService _userService; @override void initState() { super.initState(); - + _userService = UserService(); // Add listeners for focus nodes for (int i = 0; i < _focusNodes.length; i++) { _focusNodes[i].addListener(() { @@ -401,13 +404,23 @@ class _EditProfileState extends ConsumerState { print('ShowConfirmationuser response - $response '); // Handle response if (response.statusCode == 200) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text( + AppLocalizations.of(context)!.profile_updated_successfully))); + if (changedPreferredLanguage == 1) { + print(_selectedLanguage); + preferredLang = _selectedLanguage == 'English' ? 'en' : 'ar'; + if (preferredLang == 'ar') { + ref.read(localeProvider.notifier).setLocale(const Locale('ar')); + } else { + ref.read(localeProvider.notifier).setLocale(const Locale('en')); + } + } _resetFormFields(); setState(() { isLoader = false; }); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Profile updated successfully!')), - ); + // print('ShowConfirmation userData - $userData '); context.go('/myhomepage'); } else { @@ -474,6 +487,12 @@ class _EditProfileState extends ConsumerState { context.push('/internetcheck'); } }); + + ref.listen(localeProvider, (previous, next) async { + final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null + await _userService.updateLanguage(localeCode); + }); + return PopScope( canPop: false, // Allow back navigation only if not login screen onPopInvokedWithResult: (didPop, result) { @@ -942,6 +961,7 @@ class _EditProfileState extends ConsumerState { onChanged: (String? newValue) { setState(() { _selectedLanguage = newValue; + changedPreferredLanguage = 1; }); }, validator: _validatePreferredLang, diff --git a/lib/presentation/routes/drawer_routes/Drawer Items/feedback.dart b/lib/presentation/routes/drawer_routes/Drawer Items/feedback.dart index 48e17de2..3f8ca589 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/feedback.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/feedback.dart @@ -9,10 +9,12 @@ import 'package:pocketbase/pocketbase.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/feedback_asset_path.dart'; import 'package:uae_stat/infrastructure/services/packages/go_router.dart'; +import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; import 'package:uae_stat/presentation/components/my_drawer.dart'; import 'package:mailer/mailer.dart'; import 'package:mailer/smtp_server.dart'; @@ -104,10 +106,12 @@ class _FeedbackFormState extends ConsumerState final RegExp _allowedCharacters = RegExp(r'^[a-zA-Z0-9 .,!?-]*$'); bool _hasError = false; String _errorMessage = ''; + late UserService _userService; @override void initState() { super.initState(); + _userService = UserService(); WidgetsBinding.instance.addObserver(this); _loadFeedbackText(); _feedbackController.addListener(_handleTextChange); @@ -244,6 +248,11 @@ class _FeedbackFormState extends ConsumerState } }); + ref.listen(localeProvider, (previous, next) async { + final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null + await _userService.updateLanguage(localeCode); + }); + final userName = GoRouterState.of(context).extra as String? ?? 'Guest User'; return PopScope( canPop: false, // Allow back navigation only if not login screen diff --git a/lib/presentation/routes/drawer_routes/Drawer Items/manage_users.dart b/lib/presentation/routes/drawer_routes/Drawer Items/manage_users.dart index 8e712ef1..bd6505d0 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/manage_users.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/manage_users.dart @@ -6,7 +6,9 @@ import 'package:intl/intl.dart'; import 'package:pocketbase/pocketbase.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart'; +import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; import 'package:uae_stat/presentation/components/my_bottom_nav_bar.dart'; import 'package:uae_stat/presentation/components/my_drawer.dart'; @@ -26,6 +28,7 @@ class _ManageUserRouterState extends ConsumerState { bool _isAscending = true; List filteredUserData = []; bool isLoading = true; + late UserService _userService; // final List statusOptions = ['Approved', 'Denied', 'Pending']; @@ -45,6 +48,7 @@ class _ManageUserRouterState extends ConsumerState { @override void initState() { super.initState(); + _userService = UserService(); fetchUnverifiedUsers(); } @@ -292,6 +296,11 @@ class _ManageUserRouterState extends ConsumerState { } }); + ref.listen(localeProvider, (previous, next) async { + final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null + await _userService.updateLanguage(localeCode); + }); + final Map statusOptions = { 'Approved': AppLocalizations.of(context)!.approved, 'Denied': AppLocalizations.of(context)!.denied, diff --git a/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification.dart b/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification.dart index c1970296..682e17f8 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification.dart @@ -8,6 +8,7 @@ import 'package:pocketbase/pocketbase.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; import '../../custom_drawer_routes.dart'; @@ -30,6 +31,7 @@ class _NotificationPageState extends ConsumerState { int selectedTabIndex = 0; late final Locale locale; dynamic userID; + late UserService _userService; // Tab categories // final List tabs = [ @@ -45,6 +47,7 @@ class _NotificationPageState extends ConsumerState { void initState() { super.initState(); locale = ref.read(localeProvider) ?? const Locale('en'); + _userService = UserService(); _fetchUserData(); fetchNotifications(locale?.languageCode ?? 'en'); } @@ -106,10 +109,11 @@ class _NotificationPageState extends ConsumerState { jsonDecode(response.body); // Decode JSON if (jsonResponse['message'] == 'Success') { - setState(() { + setState(() async { notifications = List>.from( jsonResponse['data']); // Assign decoded data print('notifications $notifications'); + await Future.delayed(Duration(seconds: 5)); isLoading = false; }); } else { @@ -141,11 +145,12 @@ class _NotificationPageState extends ConsumerState { } }); - ref.listen(localeProvider, (previous, next) { + ref.listen(localeProvider, (previous, next) async { final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null setState(() { isLoading = true; }); + await _userService.updateLanguage(localeCode); fetchNotifications(localeCode); }); final List> tabs = [ diff --git a/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification_details.dart b/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification_details.dart index a23b4b43..c8a74f98 100644 --- a/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification_details.dart +++ b/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification_details.dart @@ -4,8 +4,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import 'package:pocketbase/pocketbase.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:uae_stat/config/api_config.dart'; import 'package:uae_stat/config/connectivity_provider.dart'; +import 'package:uae_stat/config/toggle_lang_service.dart'; import 'package:uae_stat/domain/use_cases/language.dart'; import 'package:uae_stat/presentation/components/indicators/locale_provider.dart'; import '../../custom_drawer_routes.dart'; @@ -38,6 +40,7 @@ class _NotificationDetailsState extends ConsumerState { final _pb = PocketBase(apiUrl); Map? notification; bool isLoading = true; + late UserService _userService; // Current selected tab index int selectedTabIndex = 0; @@ -49,6 +52,7 @@ class _NotificationDetailsState extends ConsumerState { super.initState(); print(widget.id); locale = ref.read(localeProvider) ?? const Locale('en'); + _userService = UserService(); fetchNotifications(locale?.languageCode ?? 'en'); } @@ -116,11 +120,12 @@ class _NotificationDetailsState extends ConsumerState { } }); - ref.listen(localeProvider, (previous, next) { + ref.listen(localeProvider, (previous, next) async { final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null setState(() { isLoading = true; }); + await _userService.updateLanguage(localeCode); fetchNotifications(localeCode); }); diff --git a/pubspec.yaml b/pubspec.yaml index f40460d0..97db1e92 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: uae_stat description: "View statistics about the UAE from the Federal Center for Statistics and Competitiveness." publish_to: "none" -version: 1.0.37+38 +version: 1.0.38+39 environment: sdk: ">=3.2.3 <4.0.0"