toggle functionality added
This commit is contained in:
parent
1ca776e399
commit
a554a26bc6
@ -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")
|
||||
|
||||
37
lib/config/toggle_lang_service.dart
Normal file
37
lib/config/toggle_lang_service.dart
Normal 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');
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -101,6 +101,7 @@
|
||||
"search": "يبحث",
|
||||
"approved": "تمت الموافقة",
|
||||
|
||||
"profile_updated_successfully": "تم تحديث الملف الشخصي بنجاح",
|
||||
"create_new_password": "إنشاء كلمة مرور جديدة",
|
||||
"different_password":"يجب أن تكون كلمة المرور الجديدة مختلفة عن كلمة المرور المستخدمة سابقًا.",
|
||||
"old_password": "كلمة المرور القديمة",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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');
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
|
||||
@ -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],
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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 = [
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user