diff --git a/android/app/build.gradle b/android/app/build.gradle
index 613e27b1..73ce6d94 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 = "39"
+ flutterVersionCode = "40"
}
def flutterVersionName = localProperties.getProperty("flutter.versionName")
if (flutterVersionName == null) {
- flutterVersionName = "1.0.38"
+ flutterVersionName = "1.0.39"
}
def keystorePropertiesFile = rootProject.file("key.properties")
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index ee29d442..7c97326e 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -33,8 +33,10 @@
-
-
+
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 0954646c..dcc28aec 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -63,6 +63,10 @@
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
+ FirebaseDynamicLinksCustomDomains
+
+ https://fcsc-a161c.web.app
+
UIStatusBarHidden
diff --git a/lib/config/sessionCheckScreen.dart b/lib/config/sessionCheckScreen.dart
index 77d757fa..777aae4c 100644
--- a/lib/config/sessionCheckScreen.dart
+++ b/lib/config/sessionCheckScreen.dart
@@ -1,34 +1,84 @@
import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.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/api_config.dart';
import 'package:uae_stat/infrastructure/data/p_auth_repo.dart';
import 'package:uae_stat/domain/entities/session_entity.dart';
+import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
import 'package:url_launcher/url_launcher.dart';
-class SessionCheckScreen extends StatefulWidget {
+class SessionCheckScreen extends ConsumerStatefulWidget {
@override
_SessionCheckScreenState createState() => _SessionCheckScreenState();
}
-class _SessionCheckScreenState extends State {
+class _SessionCheckScreenState extends ConsumerState {
+ final pb = PocketBase(apiUrl);
final PAuthRepo _authRepo = PAuthRepo();
+ dynamic preferredLanguage;
+ bool _isLoading = true;
- String get playStoreUrl => "https://play.google.com/store/apps/details?id=ae.gov.fcsc.frontend";
+ String get playStoreUrl =>
+ "https://play.google.com/store/apps/details?id=ae.gov.fcsc.frontend";
@override
void initState() {
super.initState();
- WidgetsBinding.instance.addPostFrameCallback((_) {
+ WidgetsBinding.instance.addPostFrameCallback((_) async {
+ await userDetails();
_checkSession();
});
}
+ Future userDetails() async {
+ try {
+ final prefs = await SharedPreferences.getInstance();
+ final userId = prefs.getString('userId');
+
+ // Authenticate admin d
+ final adminAuth = await pb.admins.authWithPassword(
+ 'pb@venbainfotech.com',
+ 'pb@venbainfotech.com',
+ );
+ final String adminToken = adminAuth.token;
+ print('adminToken: $adminToken');
+
+ // Fetch user details
+ final userDetailsResponse = await pb.collection('users').getOne(
+ userId!,
+ headers: {
+ 'Authorization': 'Bearer $adminToken',
+ },
+ );
+
+ print('userDetailsLogin: $userDetailsResponse');
+
+ preferredLanguage = userDetailsResponse.data['language'] ?? '';
+
+ print('preferredLanguage login $preferredLanguage');
+
+ // **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'));
+ }
+ } catch (e) {
+ print('Error fetching user details: $e');
+ rethrow;
+ }
+ }
+
Future _checkSession() async {
await Future.delayed(Duration(seconds: 2)); // Optional splash delay
final SessionEntity? session = await _authRepo.fetchLocallyStored();
final GoRouterState state = GoRouterState.of(context);
- final String? intendedPath = state.uri.toString().isNotEmpty && state.uri.path != '/'
- ? state.uri.path
- : null;
+ final String? intendedPath =
+ state.uri.toString().isNotEmpty && state.uri.path != '/'
+ ? state.uri.path
+ : null;
print('fetchLocallyStored $session');
print('navigating to intended path: $intendedPath');
@@ -53,7 +103,9 @@ class _SessionCheckScreenState extends State {
// User is not logged in, redirect to login with intended path if present
print('session expired, redirecting to login');
if (mounted) {
- context.go('/login', extra: intendedPath != null ? {'intendedPath': intendedPath} : null);
+ context.go('/login',
+ extra:
+ intendedPath != null ? {'intendedPath': intendedPath} : null);
}
}
} else {
@@ -63,6 +115,9 @@ class _SessionCheckScreenState extends State {
_redirectToPlayStore();
}
}
+ setState(() {
+ _isLoading = false; // Stop showing splash
+ });
}
Future _redirectToPlayStore() async {
@@ -75,10 +130,30 @@ class _SessionCheckScreenState extends State {
@override
Widget build(BuildContext context) {
- return SizedBox.shrink();
+ return _isLoading
+ ? SplashScreen() // Show splash while loading
+ : SizedBox.shrink();
}
}
+class SplashScreen extends StatelessWidget {
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ backgroundColor: Colors.white,
+ body: Center(
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Image.asset('assets/images/logo.png', width: 150), // App Logo
+ // SizedBox(height: 20),
+ // CircularProgressIndicator(), // Loading indicator
+ ],
+ ),
+ ),
+ );
+ }
+}
// import 'dart:math';
//
@@ -296,4 +371,4 @@ class _SessionCheckScreenState extends State {
// // ),
// // );
// // }
-// // }
\ No newline at end of file
+// // }
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 87fccb2b..8438fb8b 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
@@ -262,7 +262,7 @@ class _UaenumberWidgetState extends ConsumerState {
// ),
border: InputBorder.none,
contentPadding:
- EdgeInsets.symmetric(vertical: 0.5, horizontal: 18.0),
+ EdgeInsets.symmetric(vertical: 9, horizontal: 18.0),
),
),
),
diff --git a/lib/presentation/Screens/charts/widgets/chart_widget.dart b/lib/presentation/Screens/charts/widgets/chart_widget.dart
index aa3275ce..5baa6805 100644
--- a/lib/presentation/Screens/charts/widgets/chart_widget.dart
+++ b/lib/presentation/Screens/charts/widgets/chart_widget.dart
@@ -47,6 +47,29 @@ class ChartWidget extends StatelessWidget {
],
};
+ final Map> colorMapForFour = {
+ "ECONOMY": [
+ Color(0xFF648CBA),
+ Color(0xFF90B0D5),
+ Color(0xFF98BCE5),
+ Color(0xFFA7B5C5),
+ Color(0xFFBED3EC),
+ ],
+ "SOCIAL": [
+ Color(0xFFD9BB99),
+ Color(0xFF87766E),
+ Color(0xFFC6A885),
+ Color(0xFFA28565),
+ Color(0xFFBFB29B),
+ ],
+ "ENVIRONMENT": [
+ Color(0xFF376C79),
+ Color(0xFF578D9C),
+ Color(0xFF7DAFBC),
+ Color(0xFF86C7D9),
+ ],
+ };
+
final Map> colorMapForThree = {
"ECONOMY": [
Color(0xFF648CBA),
@@ -116,6 +139,17 @@ class ChartWidget extends StatelessWidget {
return colorMapForThree[key] ?? [Colors.grey];
}
+ List get uniqueColorsForFour {
+ final Map translations = {
+ 'اقتصاد': 'ECONOMY',
+ 'اجتماعي': 'SOCIAL',
+ 'بيئة': 'ENVIRONMENT',
+ };
+
+ String key = translations[chartHeader] ?? chartHeader;
+ return colorMapForFour[key] ?? [Colors.grey];
+ }
+
String capitalizeAndSplit(String input) {
return input
.split('_')
@@ -1009,6 +1043,7 @@ class ChartWidget extends StatelessWidget {
titlesData: titlesData1(uniqueXValuesProcessed),
borderData: borderData(),
lineBarsData: lineBars,
+ // minY: 10000,
// minX: uniqueXValues.reduce((a, b) => a < b ? a : b),
// maxX: uniqueXValues.reduce((a, b) => a > b ? a : b),
// minX: uniqueXValuesProcessed.reduce((a, b) => a < b ? a : b),
@@ -2391,7 +2426,7 @@ class ChartWidget extends StatelessWidget {
width: 120,
child: Text(
title,
- textAlign: TextAlign.end,
+ textAlign: TextAlign.right,
style: const TextStyle(fontSize: 12),
softWrap: true,
maxLines: 2,
@@ -2979,7 +3014,7 @@ class ChartWidget extends StatelessWidget {
// print("Bottomtiles");
// print(value);
return Padding(
- padding: const EdgeInsets.only(top: 4, left: 20.0),
+ padding: const EdgeInsets.only(top: 10, left: 20.0),
child: SizedBox(
width: 40,
child: Transform.rotate(
@@ -3320,6 +3355,10 @@ class ChartWidget extends StatelessWidget {
barColor =
uniqueColorsForThree[colorIndex % uniqueColorsForThree.length];
colorIndex++;
+ } else if (chartData['dataset'] == 'oil_and_gas') {
+ barColor =
+ uniqueColorsForFour[colorIndex % uniqueColorsForFour.length];
+ colorIndex++;
} else {
barColor = uniqueColors[colorIndex % uniqueColors.length];
colorIndex++;
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 e856dbb9..b694110f 100644
--- a/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart
+++ b/lib/presentation/routes/drawer_routes/Drawer Items/edit_profile.dart
@@ -491,6 +491,11 @@ class _EditProfileState extends ConsumerState {
ref.listen(localeProvider, (previous, next) async {
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
await _userService.updateLanguage(localeCode);
+ setState(() {
+ isLoader = true;
+ });
+
+ await _fetchUserData();
});
return PopScope(
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 bd6505d0..1be79d0e 100644
--- a/lib/presentation/routes/drawer_routes/Drawer Items/manage_users.dart
+++ b/lib/presentation/routes/drawer_routes/Drawer Items/manage_users.dart
@@ -416,7 +416,7 @@ class _ManageUserRouterState extends ConsumerState {
// ),
border: InputBorder.none,
contentPadding: EdgeInsets.symmetric(
- vertical: 0.5, horizontal: 18.0),
+ vertical: 9, horizontal: 18.0),
),
onChanged: filterUsers,
),
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 682e17f8..99d280aa 100644
--- a/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification.dart
+++ b/lib/presentation/routes/drawer_routes/Drawer Items/notification/notification.dart
@@ -109,11 +109,10 @@ class _NotificationPageState extends ConsumerState {
jsonDecode(response.body); // Decode JSON
if (jsonResponse['message'] == 'Success') {
- setState(() async {
+ setState(() {
notifications = List