toggle functionality added

This commit is contained in:
venbaittech 2025-03-18 17:58:39 +05:30
parent 1ca776e399
commit a554a26bc6
18 changed files with 235 additions and 114 deletions

View File

@ -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")

View File

@ -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<void> 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');
}
}
}

View File

@ -101,6 +101,7 @@
"search": "يبحث",
"approved": "تمت الموافقة",
"profile_updated_successfully": "تم تحديث الملف الشخصي بنجاح",
"create_new_password": "إنشاء كلمة مرور جديدة",
"different_password":"يجب أن تكون كلمة المرور الجديدة مختلفة عن كلمة المرور المستخدمة سابقًا.",
"old_password": "كلمة المرور القديمة",

View File

@ -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",

View File

@ -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<uaenumberWidget> {
List<dynamic> 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<uaenumberWidget> {
}
});
ref.listen<Locale?>(localeProvider, (previous, next) {
ref.listen<Locale?>(localeProvider, (previous, next) async {
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
setState(() {
isLoading = true;
});
await _userService.updateLanguage(localeCode);
fetchData(localeCode);
});

View File

@ -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<ChartScreen1> {
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<ChartScreen1> {
}
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<ChartScreen1> {
},
),
),
// 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<ChartScreen1> {
),
);
},
);
).whenComplete(() {
// Restore system UI when modal is dismissed
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
});
}
void onTabSelected(String tabId) {
@ -2112,12 +2069,14 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
}
});
ref.listen<Locale?>(localeProvider, (previous, next) {
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
ref.listen<Locale?>(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<ChartScreen1> {
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<void> 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';

View File

@ -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(

View File

@ -358,9 +358,18 @@ class _ProfileScreenState extends ConsumerState<ProfileScreen> {
// 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 {

View File

@ -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<FormState>();
@ -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<void> 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<void> 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');

View File

@ -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<MyHomePage> {
),
),
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<EconomyStatsWidget> {
// 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<EconomyStatsWidget> {
@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<EconomyStatsWidget> {
}
Widget build(BuildContext context) {
ref.listen<Locale?>(localeProvider, (previous, next) {
ref.listen<Locale?>(localeProvider, (previous, next) async {
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
setState(() {
isLoading = true;
});
await _userService.updateLanguage(localeCode);
fetchData(localeCode);
});

View File

@ -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<BookMark> {
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<BookMark> {
},
];
ref.listen<Locale?>(localeProvider, (previous, next) {
ref.listen<Locale?>(localeProvider, (previous, next) async {
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
setState(() {
isLoading = true;
});
await _userService.updateLanguage(localeCode);
fetchBookmarks(localeCode);
});

View File

@ -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<Contact> {
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<Contact> {
}
});
ref.listen<Locale?>(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],

View File

@ -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<EditProfile> {
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<FocusNode> _focusNodes = List.generate(4, (_) => FocusNode());
final List<bool> _showHints = [
@ -96,11 +98,12 @@ class _EditProfileState extends ConsumerState<EditProfile> {
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<EditProfile> {
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<EditProfile> {
context.push('/internetcheck');
}
});
ref.listen<Locale?>(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<EditProfile> {
onChanged: (String? newValue) {
setState(() {
_selectedLanguage = newValue;
changedPreferredLanguage = 1;
});
},
validator: _validatePreferredLang,

View File

@ -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<FeedbackForm>
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<FeedbackForm>
}
});
ref.listen<Locale?>(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

View File

@ -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<ManageUserRouter> {
bool _isAscending = true;
List<User> filteredUserData = [];
bool isLoading = true;
late UserService _userService;
// final List<String> statusOptions = ['Approved', 'Denied', 'Pending'];
@ -45,6 +48,7 @@ class _ManageUserRouterState extends ConsumerState<ManageUserRouter> {
@override
void initState() {
super.initState();
_userService = UserService();
fetchUnverifiedUsers();
}
@ -292,6 +296,11 @@ class _ManageUserRouterState extends ConsumerState<ManageUserRouter> {
}
});
ref.listen<Locale?>(localeProvider, (previous, next) async {
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
await _userService.updateLanguage(localeCode);
});
final Map<String, String> statusOptions = {
'Approved': AppLocalizations.of(context)!.approved,
'Denied': AppLocalizations.of(context)!.denied,

View File

@ -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<NotificationPage> {
int selectedTabIndex = 0;
late final Locale locale;
dynamic userID;
late UserService _userService;
// Tab categories
// final List<String> tabs = [
@ -45,6 +47,7 @@ class _NotificationPageState extends ConsumerState<NotificationPage> {
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<NotificationPage> {
jsonDecode(response.body); // Decode JSON
if (jsonResponse['message'] == 'Success') {
setState(() {
setState(() async {
notifications = List<Map<String, dynamic>>.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<NotificationPage> {
}
});
ref.listen<Locale?>(localeProvider, (previous, next) {
ref.listen<Locale?>(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<Map<String, dynamic>> tabs = [

View File

@ -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<NotificationDetails> {
final _pb = PocketBase(apiUrl);
Map<String, dynamic>? notification;
bool isLoading = true;
late UserService _userService;
// Current selected tab index
int selectedTabIndex = 0;
@ -49,6 +52,7 @@ class _NotificationDetailsState extends ConsumerState<NotificationDetails> {
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<NotificationDetails> {
}
});
ref.listen<Locale?>(localeProvider, (previous, next) {
ref.listen<Locale?>(localeProvider, (previous, next) async {
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
setState(() {
isLoading = true;
});
await _userService.updateLanguage(localeCode);
fetchNotifications(localeCode);
});

View File

@ -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"