1752 lines
65 KiB
Plaintext
Executable File
1752 lines
65 KiB
Plaintext
Executable File
sessioncheck
|
||
import 'package:flutter/material.dart';
|
||
import 'package:go_router/go_router.dart';
|
||
import 'package:uae_stat/infrastructure/data/p_auth_repo.dart';
|
||
import 'package:uae_stat/domain/entities/session_entity.dart';
|
||
import 'package:url_launcher/url_launcher.dart';
|
||
|
||
class SessionCheckScreen extends StatefulWidget {
|
||
@override
|
||
_SessionCheckScreenState createState() => _SessionCheckScreenState();
|
||
}
|
||
|
||
class _SessionCheckScreenState extends State<SessionCheckScreen> {
|
||
final PAuthRepo _authRepo = PAuthRepo();
|
||
|
||
String get playStoreUrl => "https://play.google.com/store/apps/details?id=ae.gov.fcsc.stats";
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||
_checkSession();
|
||
});
|
||
}
|
||
|
||
Future<void> _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;
|
||
|
||
print('fetchLocallyStored $session');
|
||
print('navigating to intended path: $intendedPath');
|
||
|
||
// First if: Check if app data exists (indicating app setup)
|
||
if (session != null) {
|
||
// Second if: Check if user is logged in (session is valid)
|
||
if (session.freshness != SessionFreshness.expired) {
|
||
// User is logged in, check for shared intent path
|
||
if (intendedPath != null) {
|
||
print('navigating to intended path: $intendedPath');
|
||
if (mounted) {
|
||
context.go(intendedPath);
|
||
}
|
||
} else {
|
||
print('myhomepage');
|
||
if (mounted) {
|
||
context.go('/myhomepage'); // Redirect to home
|
||
}
|
||
}
|
||
} else {
|
||
// 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);
|
||
}
|
||
}
|
||
} else {
|
||
// No session data, redirect to Play Store
|
||
print('no session data, redirecting to play store');
|
||
if (mounted) {
|
||
_redirectToPlayStore();
|
||
}
|
||
}
|
||
}
|
||
|
||
Future<void> _redirectToPlayStore() async {
|
||
final Uri url = Uri.parse(playStoreUrl);
|
||
|
||
if (await canLaunchUrl(url)) {
|
||
await launchUrl(url, mode: LaunchMode.externalApplication);
|
||
}
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return SizedBox.shrink();
|
||
}
|
||
}
|
||
|
||
|
||
// import 'dart:math';
|
||
//
|
||
// import 'package:flutter/material.dart';
|
||
// import 'package:go_router/go_router.dart';
|
||
// import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||
// import 'package:uae_stat/infrastructure/data/p_auth_repo.dart';
|
||
// import 'package:url_launcher/url_launcher.dart';
|
||
//
|
||
// class AuthRepository {
|
||
// final FlutterSecureStorage _secureStorage = const FlutterSecureStorage();
|
||
//
|
||
// Future<String?> fetchLocallyStored() async {
|
||
// return await _secureStorage.read(key: "FlutterSecureStorage.session");
|
||
// }
|
||
// }
|
||
//
|
||
// class SessionCheckScreen extends StatefulWidget {
|
||
// const SessionCheckScreen({Key? key}) : super(key: key);
|
||
//
|
||
// @override
|
||
// _SessionCheckScreenState createState() => _SessionCheckScreenState();
|
||
// }
|
||
//
|
||
// class _SessionCheckScreenState extends State<SessionCheckScreen> {
|
||
// final PAuthRepo _pAuthRepo = PAuthRepo();
|
||
// final AuthRepository _authRepo = AuthRepository();
|
||
// final String playStoreUrl = "https://play.google.com/store/apps/details?id=ae.gov.fcsc.stats";
|
||
//
|
||
// @override
|
||
// void initState() {
|
||
// super.initState();
|
||
// WidgetsBinding.instance.addPostFrameCallback((_) {
|
||
// _checkSessionAndHandleLink();
|
||
// });
|
||
// }
|
||
//
|
||
// Future<void> _checkSessionAndHandleLink() async {
|
||
// try {
|
||
// final session = await _authRepo.fetchLocallyStored();
|
||
//
|
||
// // Check if user is not logged in
|
||
// if (session == null || session.isEmpty) {
|
||
// _handleUnauthenticatedUser();
|
||
// return;
|
||
// }
|
||
//
|
||
// // User is authenticated, process the shared link
|
||
// final GoRouterState state = GoRouterState.of(context);
|
||
// final String? sharedLink = state.uri.toString().isNotEmpty && state.uri.path != '/'
|
||
// ? state.uri.toString()
|
||
// : null;
|
||
//
|
||
// print(sharedLink);
|
||
//
|
||
// if (sharedLink != null) {
|
||
// // Validate if the link is a valid app route
|
||
// final Uri parsedUri = Uri.parse(sharedLink);
|
||
// final String path = parsedUri.path;
|
||
//
|
||
// if (mounted) {
|
||
// GoRouter.of(context).go(path);
|
||
// }
|
||
// } else {
|
||
// // Default route for authenticated users with no specific link
|
||
// if (mounted) {
|
||
// GoRouter.of(context).go('/myhomepage');
|
||
// }
|
||
// }
|
||
// } catch (e) {
|
||
// print("Error processing link: $e");
|
||
// _handleUnauthenticatedUser();
|
||
// }
|
||
// }
|
||
//
|
||
// void _handleUnauthenticatedUser() {
|
||
// final GoRouterState state = GoRouterState.of(context);
|
||
// final String? sharedLink = state.uri.toString().isNotEmpty && state.uri.path != '/'
|
||
// ? state.uri.toString()
|
||
// : null;
|
||
//
|
||
// if (sharedLink != null) {
|
||
// // Store the intended destination and redirect to login
|
||
// if (mounted) {
|
||
// GoRouter.of(context).go('/login', extra: {'redirectTo': sharedLink});
|
||
// }
|
||
// } else {
|
||
// // No specific link, just go to login
|
||
// if (mounted) {
|
||
// GoRouter.of(context).go('/login');
|
||
// }
|
||
// }
|
||
// }
|
||
//
|
||
// Future<void> _redirectToPlayStore() async {
|
||
// final Uri url = Uri.parse(playStoreUrl);
|
||
//
|
||
// if (await canLaunchUrl(url)) {
|
||
// await launchUrl(url, mode: LaunchMode.externalApplication);
|
||
// }
|
||
// }
|
||
//
|
||
// @override
|
||
// Widget build(BuildContext context) {
|
||
// return const Scaffold(
|
||
// body: Center(
|
||
// child: CircularProgressIndicator(),
|
||
// ),
|
||
// );
|
||
// }
|
||
// }
|
||
//
|
||
// // import 'package:flutter/material.dart';
|
||
// // import 'package:go_router/go_router.dart';
|
||
// // import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||
// // import 'package:uae_stat/infrastructure/data/p_auth_repo.dart';
|
||
// // import 'package:url_launcher/url_launcher.dart';
|
||
// //
|
||
// // class AuthRepository {
|
||
// // final FlutterSecureStorage _secureStorage = const FlutterSecureStorage();
|
||
// //
|
||
// // Future<String?> fetchLocallyStored() async {
|
||
// // return await _secureStorage.read(key: "FlutterSecureStorage.session");
|
||
// // }
|
||
// // }
|
||
// //
|
||
// // class SessionCheckScreen extends StatefulWidget {
|
||
// // const SessionCheckScreen({Key? key}) : super(key: key);
|
||
// //
|
||
// // @override
|
||
// // _SessionCheckScreenState createState() => _SessionCheckScreenState();
|
||
// // }
|
||
// //
|
||
// // class _SessionCheckScreenState extends State<SessionCheckScreen> {
|
||
// // final PAuthRepo _pAuthRepo = PAuthRepo();
|
||
// // final AuthRepository _authRepo = AuthRepository();
|
||
// // final String playStoreUrl = "https://play.google.com/store/apps/details?id=ae.gov.fcsc.stats";
|
||
// //
|
||
// // @override
|
||
// // void initState() {
|
||
// // super.initState();
|
||
// // WidgetsBinding.instance.addPostFrameCallback((_) {
|
||
// // _checkSessionAndHandleLink();
|
||
// // });
|
||
// // }
|
||
// //
|
||
// // Future<void> _checkSessionAndHandleLink() async {
|
||
// // try {
|
||
// // final session = await _authRepo.fetchLocallyStored();
|
||
// //
|
||
// // // Check if user is not logged in
|
||
// // if (session == null || session.isEmpty) {
|
||
// // _handleUnauthenticatedUser();
|
||
// // return;
|
||
// // }
|
||
// //
|
||
// // // User is authenticated, process the shared link
|
||
// // final GoRouterState state = GoRouterState.of(context);
|
||
// // final String? sharedLink = state.uri.toString().isNotEmpty && state.uri.path != '/'
|
||
// // ? state.uri.toString()
|
||
// // : null;
|
||
// //
|
||
// // if (sharedLink != null) {
|
||
// // // Validate if the link is a valid app route
|
||
// // final Uri parsedUri = Uri.parse(sharedLink);
|
||
// // final String path = parsedUri.path;
|
||
// //
|
||
// // if (mounted) {
|
||
// // GoRouter.of(context).go(path);
|
||
// // }
|
||
// // } else {
|
||
// // // Default route for authenticated users with no specific link
|
||
// // if (mounted) {
|
||
// // GoRouter.of(context).go('/myhomepage');
|
||
// // }
|
||
// // }
|
||
// // } catch (e) {
|
||
// // print("Error processing link: $e");
|
||
// // _handleUnauthenticatedUser();
|
||
// // }
|
||
// // }
|
||
// //
|
||
// // void _handleUnauthenticatedUser() {
|
||
// // final GoRouterState state = GoRouterState.of(context);
|
||
// // final String? sharedLink = state.uri.toString().isNotEmpty && state.uri.path != '/'
|
||
// // ? state.uri.toString()
|
||
// // : null;
|
||
// //
|
||
// // if (sharedLink != null) {
|
||
// // // Store the intended destination and redirect to login
|
||
// // if (mounted) {
|
||
// // GoRouter.of(context).go('/login', extra: {'redirectTo': sharedLink});
|
||
// // }
|
||
// // } else {
|
||
// // // No specific link, just go to login
|
||
// // if (mounted) {
|
||
// // GoRouter.of(context).go('/login');
|
||
// // }
|
||
// // }
|
||
// // }
|
||
// //
|
||
// // Future<void> _redirectToPlayStore() async {
|
||
// // final Uri url = Uri.parse(playStoreUrl);
|
||
// //
|
||
// // if (await canLaunchUrl(url)) {
|
||
// // await launchUrl(url, mode: LaunchMode.externalApplication);
|
||
// // }
|
||
// // }
|
||
// //
|
||
// // @override
|
||
// // Widget build(BuildContext context) {
|
||
// // return const Scaffold(
|
||
// // body: Center(
|
||
// // child: CircularProgressIndicator(),
|
||
// // ),
|
||
// // );
|
||
// // }
|
||
// // }
|
||
|
||
|
||
|
||
|
||
loginroute
|
||
|
||
import 'dart:convert';
|
||
|
||
import 'package:external_repos/external_repos.dart';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter/services.dart';
|
||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||
import 'package:go_router/go_router.dart';
|
||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||
import 'package:shared_preferences/shared_preferences.dart';
|
||
import 'package:the_validator/the_validator.dart';
|
||
import 'package:uae_stat/config/my_theme.dart';
|
||
import 'package:uae_stat/domain/use_cases/auth_use_case.dart';
|
||
import 'package:uae_stat/domain/use_cases/language.dart';
|
||
import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart';
|
||
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart';
|
||
import 'package:uae_stat/presentation/Screens/demo_home.dart';
|
||
import 'package:uae_stat/presentation/components/dialogs.dart';
|
||
import 'package:uae_stat/presentation/components/lang_toggle.dart';
|
||
import 'package:uae_stat/presentation/components/my_bottom_nav_bar.dart';
|
||
import 'package:uae_stat/presentation/components/space.dart';
|
||
import 'package:uae_stat/presentation/components/themed_text_field.dart';
|
||
import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart';
|
||
import 'package:http/http.dart' as http;
|
||
import '../../Screens/auth_verification/registration.dart';
|
||
import 'package:pocketbase/pocketbase.dart';
|
||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||
import 'package:uae_stat/config/api_config.dart';
|
||
|
||
|
||
import '../../components/indicators/locale_provider.dart';
|
||
import '../../components/my_toggle.dart';
|
||
|
||
class LoginRoute extends HookConsumerWidget {
|
||
// final pb = PocketBase('https://pb.venbait.in');
|
||
final pb = PocketBase(apiUrl);
|
||
final FlutterSecureStorage _secureStorage = const FlutterSecureStorage();
|
||
// final _pb = PocketBase('http://127.0.0.1:8090');
|
||
// final bool isLoginScreen; // Pass `true` if this is the login screen
|
||
// LoginRoute({Key? key, required this.isLoginScreen}) : super(key: key);
|
||
LoginRoute({super.key});
|
||
dynamic userData;
|
||
String? role;
|
||
int? loginCount;
|
||
|
||
static final formKey = GlobalKey<FormState>();
|
||
|
||
Future<bool> profileStatus(String userId) async {
|
||
try {
|
||
// Authenticate admin
|
||
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');
|
||
|
||
// Check if user is verified
|
||
role = userDetailsResponse.data['role'];
|
||
final bool? isVerified = userDetailsResponse.data['verified'];
|
||
final bool? isUserMailVerified =
|
||
userDetailsResponse.data['user_mail_verify'];
|
||
|
||
// Check admin and email verification statuses
|
||
if (isVerified == false) {
|
||
throw Exception('Admin not approved');
|
||
}
|
||
if (isUserMailVerified == false) {
|
||
throw Exception('Email not verified');
|
||
}
|
||
userData = userDetailsResponse;
|
||
// Check if 'is_profile_completed' is true
|
||
final bool isProfileCompleted =
|
||
userDetailsResponse.data['is_profile_completed'] ?? false;
|
||
|
||
return isProfileCompleted;
|
||
} catch (e) {
|
||
print('Error fetching user details: $e');
|
||
rethrow;
|
||
}
|
||
}
|
||
|
||
Future<void> saveUserId(String userId, count) async {
|
||
print(count);
|
||
final prefs = await SharedPreferences.getInstance();
|
||
await prefs.setString('userId', userId); // Save userId locally
|
||
await prefs.setString('login_count', count.toString());
|
||
}
|
||
|
||
// Future<void> authenticateAndStoreData() async {
|
||
// try {
|
||
// // Perform authentication
|
||
// final authData = await pb
|
||
// .collection("users")
|
||
// .authWithPassword('pb@venbainfotech.com', 'pb@venbainfotech.com');
|
||
//
|
||
// // Check if authentication is successful
|
||
// if (pb.authStore.isValid) {
|
||
// print("Authentication successful!");
|
||
// print("Token: ${pb.authStore.token}");
|
||
// // print("User ID: ${pb.authStore.record.id}");
|
||
//
|
||
// // Store the token and user ID in local storage
|
||
// await _secureStorage.write(
|
||
// key: "FlutterSecureStorage.session", value: pb.authStore.token);
|
||
// // await _secureStorage.write(
|
||
// // key: "FlutterSecureStorage.userId", value: pb.authStore.record.id);
|
||
//
|
||
// print("Session and User ID stored in local storage.");
|
||
// } else {
|
||
// print("Authentication failed.");
|
||
// }
|
||
// } catch (e) {
|
||
// print("Error during authentication: $e");
|
||
// }
|
||
// }
|
||
|
||
@override
|
||
Widget build(BuildContext context, WidgetRef ref) {
|
||
final hasValidated = useState(false);
|
||
final locale = ref.watch(localeProvider);
|
||
final emailCtl = useTextEditingController();
|
||
final pwCtl = useTextEditingController();
|
||
final forgotPwBtn = TextButton(
|
||
onPressed: () async {
|
||
final forgotPwFormKey = GlobalKey<FormState>();
|
||
final email = await showDialog<String>(
|
||
context: context,
|
||
builder: (dialogCtx) => SizedBox(
|
||
// width: 850, // Increase dialog width
|
||
child: AlertDialog(
|
||
shape: RoundedRectangleBorder(
|
||
borderRadius: BorderRadius.circular(20), // Rounded corners
|
||
),
|
||
elevation: 10,
|
||
shadowColor: Colors.black12,
|
||
title: Text(
|
||
context.translate(
|
||
'Reset Password',
|
||
'إعادة تعيين كلمة المرور',
|
||
),
|
||
style: TextStyle(
|
||
fontSize: locale?.languageCode == 'ar' ? 18 : 20,
|
||
color: Color(0xFF898C81),
|
||
fontWeight: FontWeight.w600),
|
||
),
|
||
content: Form(
|
||
key: forgotPwFormKey,
|
||
child: TextFormField(
|
||
validator: FieldValidator.email(),
|
||
controller: emailCtl,
|
||
decoration: InputDecoration(
|
||
labelText: context.translate(
|
||
'Email address',
|
||
'عنوان البريد الإلكتروني',
|
||
),
|
||
labelStyle: TextStyle(
|
||
fontSize: locale?.languageCode == 'ar' ? 13 : 16,
|
||
color: Color(0xFF898C81), // For label text color
|
||
// fontWeight: FontWeight.w600,
|
||
),
|
||
),
|
||
),
|
||
),
|
||
actions: [
|
||
TextButton(
|
||
onPressed: Navigator.of(dialogCtx, rootNavigator: true).pop,
|
||
style: TextButton.styleFrom(
|
||
// backgroundColor: Colors.white, // Background color
|
||
foregroundColor: Color(0xFF92722A), // Font (text) color
|
||
side: BorderSide(
|
||
color: Color(0xFF92722A)), // Border outline color
|
||
shape: RoundedRectangleBorder(
|
||
borderRadius:
|
||
BorderRadius.circular(8), // Optional: Rounded corners
|
||
),
|
||
padding: EdgeInsets.symmetric(
|
||
horizontal: 16, vertical: 12), // Optional: Padding
|
||
),
|
||
child: Text(
|
||
context.translate(
|
||
'Return',
|
||
'يعود',
|
||
),
|
||
),
|
||
),
|
||
ElevatedButton(
|
||
onPressed: () {
|
||
final isValid = forgotPwFormKey.currentState!.validate();
|
||
if (!isValid) return;
|
||
Navigator.of(dialogCtx, rootNavigator: true).pop(
|
||
emailCtl.text,
|
||
);
|
||
},
|
||
style: ElevatedButton.styleFrom(
|
||
backgroundColor: Color(0xFF92722A),
|
||
foregroundColor: Colors.white,
|
||
padding: EdgeInsets.symmetric(
|
||
horizontal: 15, vertical: 15), // Optional: Adjusts size
|
||
shape: RoundedRectangleBorder(
|
||
// Optional: Adds rounded corners
|
||
borderRadius: BorderRadius.circular(12),
|
||
),
|
||
),
|
||
child: Text(
|
||
context.translate(
|
||
'Send Reset Email',
|
||
'إرسال إعادة تعيين البريد الإلكتروني',
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
);
|
||
if (email == null) return;
|
||
if (!context.mounted) return;
|
||
await context.loaderWithErrorDialog(
|
||
() => ref
|
||
.read(
|
||
authUseCaseProvider.notifier,
|
||
)
|
||
.requestPwReset(email),
|
||
);
|
||
if (!context.mounted) return;
|
||
|
||
context.simpleDialog(
|
||
title: context.translate(
|
||
'Success!',
|
||
'نجاح',
|
||
),
|
||
content: context.translate(
|
||
'An email has been sent to $email with further details.',
|
||
'تم إرسال بريد إلكتروني إلى $email يتضمن المزيد من التفاصيل.',
|
||
),
|
||
);
|
||
|
||
},
|
||
style: TextButton.styleFrom(
|
||
padding: EdgeInsets.zero,
|
||
// maximumSize: Size.zero,
|
||
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
||
visualDensity: VisualDensity.compact,
|
||
overlayColor: Colors.white
|
||
),
|
||
child: Text(
|
||
context.translate(
|
||
'Forgot Password?',
|
||
'هل نسيت كلمة السر؟',
|
||
),
|
||
style: TextStyle(
|
||
fontFamily: context.translate(
|
||
'Roboto',
|
||
'Roboto',
|
||
),
|
||
fontWeight: FontWeight.bold,
|
||
fontSize: locale?.languageCode == 'ar' ? 12 : 14,
|
||
color: Color(0xFF985400),
|
||
),
|
||
),
|
||
);
|
||
final loginBtn = SizedBox(
|
||
width: double.infinity,
|
||
child: ElevatedButton(
|
||
onPressed: () async {
|
||
hasValidated.value=true;
|
||
final isValid = formKey.currentState!.validate();
|
||
if (!isValid) return;
|
||
final session = await context.loaderWithErrorDialog(
|
||
() => ref
|
||
.read(
|
||
authUseCaseProvider.notifier,
|
||
)
|
||
.login(
|
||
emailCtl.text,
|
||
pwCtl.text,
|
||
),
|
||
errorDialogBuilder: (
|
||
error, [
|
||
StackTrace? stackTrace,
|
||
]) {
|
||
if (error == LoginError.invalidEmailPw) {
|
||
return context.simpleDialog(
|
||
title: context.translate(
|
||
'Incorrect Credentials',
|
||
'أوراق غير صحيحة',
|
||
),
|
||
content: context.translate(
|
||
'Your email or password is invalid. Please try again.',
|
||
'بريدك الإلكتروني أو كلمة المرور غير صالحة. حاول مرة اخرى.',
|
||
),
|
||
);
|
||
}
|
||
// if (error == LoginError.emailAddressNotVerified) {
|
||
// return context.simpleDialog(
|
||
// title: context.translate(
|
||
// 'Verification Error',
|
||
// 'خطأ التحقق',
|
||
// ),
|
||
// content: context.translate(
|
||
// '${emailCtl.text} is not a verified email address. Please check your email for a verification link.',
|
||
// '${emailCtl.text} ليس عنوان بريد إلكتروني تم التحقق منه. يرجى التحقق من بريدك الإلكتروني للحصول على رابط التحقق.',
|
||
// ),
|
||
// extraAction: ElevatedButton(
|
||
// onPressed: () async {
|
||
// Navigator.of(
|
||
// context,
|
||
// rootNavigator: true,
|
||
// ).pop();
|
||
// await context.loaderWithErrorDialog(
|
||
// () => ref
|
||
// .read(authUseCaseProvider.notifier)
|
||
// .requestVerificationEmail(emailCtl.text),
|
||
// );
|
||
// if (!context.mounted) return;
|
||
// context.simpleDialog(
|
||
// title: 'Email Re-sent',
|
||
// content:
|
||
// 'We\'ve sent you the verification email at ${emailCtl.text} again.',
|
||
// );
|
||
// },
|
||
// child: Text(
|
||
// context.translate(
|
||
// 'I did not receive an email',
|
||
// 'لم أتلق بريدًا إلكترونيًا',
|
||
// ),
|
||
// ),
|
||
// ),
|
||
// );
|
||
// }
|
||
return context.simpleDialog();
|
||
},
|
||
);
|
||
|
||
if (!context.mounted || session == null) return;
|
||
final userId = session.id;
|
||
if (userId.isNotEmpty) {
|
||
final url =
|
||
Uri.parse('$apiUrl/api/login_success?id=$userId');
|
||
|
||
try {
|
||
final response = await http.get(url);
|
||
|
||
if (response.statusCode == 200) {
|
||
print("Login success API call successful: ${response.body}");
|
||
final count = jsonDecode(response.body);
|
||
loginCount =
|
||
count["login_count"]; // Directly assign it as an int
|
||
print(loginCount);
|
||
} else {
|
||
print(
|
||
"Failed to call login success API. Status code: ${response.statusCode}");
|
||
}
|
||
} catch (e) {
|
||
print("Error calling login success API: $e");
|
||
}
|
||
|
||
await saveUserId(userId, loginCount);
|
||
}
|
||
try {
|
||
final bool isProfileComplete = await profileStatus(userId);
|
||
print("Is Profile Complete: $isProfileComplete");
|
||
|
||
// Extract intendedPath from query parameters (if coming from redirect)
|
||
final String? intendedPath = GoRouterState.of(context).uri.queryParameters['intendedPath'];
|
||
print("Extracted intendedPath after login: $intendedPath");
|
||
|
||
if (!context.mounted) return;
|
||
|
||
if (isProfileComplete) {
|
||
print('Redirecting to Home / Intended Path');
|
||
context.go(intendedPath ?? '/myhomepage');
|
||
} else {
|
||
print('Redirecting to Profile Setup');
|
||
if (userId.isNotEmpty) {
|
||
context.go('/profile/$userId');
|
||
} else {
|
||
print('Error: userId is null or empty.');
|
||
}
|
||
}
|
||
} catch (e) {
|
||
// Handle specific errors based on their message
|
||
if (e.toString().contains('Admin not approved')) {
|
||
context.simpleDialog(
|
||
title: context.translate(
|
||
'Admin Approval Required', 'موافقة المسؤول مطلوبة'),
|
||
content: context.translate(
|
||
'Your account has not been approved by the admin.',
|
||
'لم تتم الموافقة على حسابك من قبل المسؤول.',
|
||
),
|
||
);
|
||
} else if (e.toString().contains('Email not verified')) {
|
||
context.simpleDialog(
|
||
title: context.translate(
|
||
'Email Not Verified', 'البريد الإلكتروني غير مُحقق'),
|
||
content: context.translate(
|
||
'Your email address is not verified. Please check your email.',
|
||
'عنوان بريدك الإلكتروني غير مُحقق. يرجى التحقق من بريدك الإلكتروني.',
|
||
),
|
||
);
|
||
} else {
|
||
print('Unexpected error: $e');
|
||
}
|
||
}
|
||
|
||
// context.go('/${context.language}/${BottomNavBarItem.home.routePath}');
|
||
},
|
||
style: ButtonStyle(
|
||
shape: WidgetStatePropertyAll(
|
||
RoundedRectangleBorder(
|
||
borderRadius: BorderRadius.circular(10),
|
||
),
|
||
),
|
||
padding: const WidgetStatePropertyAll(
|
||
EdgeInsets.symmetric(vertical: 10.5),
|
||
),
|
||
textStyle: WidgetStatePropertyAll(
|
||
TextStyle(
|
||
fontFamily: context.translate(
|
||
'Roboto',
|
||
'Roboto',
|
||
),
|
||
fontSize: locale?.languageCode == 'ar' ? 14 : 16,
|
||
fontWeight: FontWeight.w600,
|
||
),
|
||
),
|
||
backgroundColor: WidgetStatePropertyAll(
|
||
MyTheme.topicColor(IndicatorTopic.social),
|
||
),
|
||
// surfaceTintColor: MaterialStatePropertyAll(
|
||
// MyTheme.economy[800],
|
||
// ),
|
||
foregroundColor: const WidgetStatePropertyAll(
|
||
Colors.white,
|
||
),
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.center,
|
||
children: [
|
||
Text(
|
||
context.translate(
|
||
'Login',
|
||
'تسجيل الدخول',
|
||
),
|
||
style: TextStyle(
|
||
fontFamily: context.translate(
|
||
'Roboto',
|
||
'Roboto',
|
||
),
|
||
fontSize: locale?.languageCode == 'ar' ? 12: 18,
|
||
fontWeight: FontWeight.w500,
|
||
),
|
||
),
|
||
6.horizontalSpace,
|
||
const Icon(
|
||
Icons.chevron_right_outlined,
|
||
color: Colors.white, // Set your desired color here
|
||
)
|
||
],
|
||
),
|
||
),
|
||
);
|
||
final form = Form(
|
||
key: formKey,
|
||
child: Column(
|
||
children: [
|
||
ThemedFormField(
|
||
hintText: context.translate(
|
||
'Email',
|
||
'بريد إلكتروني',
|
||
),
|
||
|
||
validator: (value) {
|
||
final emailRegex =
|
||
r'^[a-zA-Z0-9àèìòùÀÈÌÒÙéàç~!#$%^&*()_+=-{}|;,.?<>]+@[a-zA-Z0-9àèìòùÀÈÌÒÙéàç~!#$%^&*()_+=-{}|;,.?<>]+\.[a-zA-Z]{2,}$';
|
||
if (value == null || value.isEmpty) {
|
||
return context.translate('Required', 'مطلوب');
|
||
}
|
||
else if (!RegExp(emailRegex).hasMatch(value)) {
|
||
return AppLocalizations.of(context)!.invalid_email;
|
||
} return null;
|
||
},
|
||
imgPath: MiscIconAssetPath.person,
|
||
controller: emailCtl,
|
||
),
|
||
15.verticalSpace,
|
||
ThemedFormField(
|
||
validator: (text) {
|
||
if (text == null || text.isEmpty) {
|
||
return context.translate('Required', 'مطلوب');
|
||
} else if (text.length < 8) {
|
||
return AppLocalizations.of(context)!.only8charac;
|
||
}
|
||
return FieldValidator.password(minLength: 8)(text);
|
||
},
|
||
hintText: context.translate(
|
||
'Password',
|
||
'كلمة المرور',
|
||
),
|
||
imgPath: MiscIconAssetPath.lock,
|
||
controller: pwCtl,
|
||
isObscurable: true,
|
||
),
|
||
// 6.verticalSpace,
|
||
Padding(
|
||
padding: EdgeInsets.zero,
|
||
child: Align(
|
||
alignment: AlignmentDirectional.topEnd,
|
||
child: forgotPwBtn,
|
||
),
|
||
),
|
||
10.verticalSpace,
|
||
loginBtn,
|
||
],
|
||
),
|
||
);
|
||
final helloAndPleaseLoginTexts = Column(
|
||
children: [
|
||
Text(
|
||
context.translate(
|
||
'Hello Again!',
|
||
'مرحبا مجددا!',
|
||
),
|
||
style: TextStyle(
|
||
fontFamily: context.translate(
|
||
'Roboto',
|
||
'Roboto',
|
||
),
|
||
fontSize: locale?.languageCode == 'ar' ? 38 : 40,
|
||
fontWeight: FontWeight.w300,
|
||
),
|
||
),
|
||
10.verticalSpace,
|
||
Text(
|
||
context.translate(
|
||
'Please login to access \n UAE’s key official statistics',
|
||
'يرجى تسجيل الدخول للوصول إلى الإحصاءات الرسمية الرئيسية لدولة الإمارات العربية المتحدة',
|
||
),
|
||
textAlign: TextAlign.center,
|
||
style: TextStyle(
|
||
fontFamily: context.translate(
|
||
'Roboto',
|
||
'Roboto',
|
||
),
|
||
fontSize: context.translate(18.0, 14.0),
|
||
color: const Color(0xff898C81),
|
||
fontWeight: FontWeight.w600,
|
||
),
|
||
),
|
||
],
|
||
);
|
||
final dontHaveAnAccountRegisterBtn = TextButton(
|
||
onPressed: () => {context.push('/register')},
|
||
child: Text.rich(
|
||
textAlign: TextAlign.center,
|
||
TextSpan(
|
||
style: TextStyle(
|
||
fontFamily: context.translate(
|
||
'Roboto',
|
||
'Roboto',
|
||
),
|
||
fontSize: locale?.languageCode == 'ar' ? 12 : 14,
|
||
fontWeight: FontWeight.bold,
|
||
),
|
||
children: [
|
||
TextSpan(
|
||
text: context.translate(
|
||
'Don\'t have an account? ',
|
||
'ليس لديك حساب؟',
|
||
),
|
||
style: TextStyle(
|
||
fontSize: locale?.languageCode == 'ar' ? 12 : 14,
|
||
color: Color(0xff898C81),
|
||
),
|
||
),
|
||
const TextSpan(
|
||
text: ' ',
|
||
),
|
||
TextSpan(
|
||
text: context.translate(
|
||
'Register Now',
|
||
'سجل الان',
|
||
),
|
||
style: TextStyle(
|
||
fontSize: locale?.languageCode == 'ar' ? 12 : 14,
|
||
color: Color(0xFF985400),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
);
|
||
// final continueAsGuestBtn = SizedBox(
|
||
// width: double.infinity,
|
||
// child: ElevatedButton(
|
||
// onPressed: () async {
|
||
// final prefs = await SharedPreferences.getInstance();
|
||
// prefs.clear();
|
||
// final userId = 'guest';
|
||
// if (userId.isNotEmpty) {
|
||
// await saveUserId(userId);
|
||
// }
|
||
// context.go('/myhomepage');
|
||
// //context.go('/${context.language}/${BottomNavBarItem.home.routePath}'),
|
||
// },
|
||
// //context.go('/${context.language}/${BottomNavBarItem.home.routePath}'),
|
||
// style: ButtonStyle(
|
||
// shape: WidgetStatePropertyAll(
|
||
// RoundedRectangleBorder(
|
||
// borderRadius: BorderRadius.circular(10),
|
||
// ),
|
||
// ),
|
||
// padding: const WidgetStatePropertyAll(
|
||
// EdgeInsets.symmetric(vertical: 10.5),
|
||
// ),
|
||
// textStyle: WidgetStatePropertyAll(
|
||
// TextStyle(
|
||
// fontFamily: context.translate(
|
||
// 'Roboto',
|
||
// 'NotoKufi',
|
||
// ),
|
||
// fontSize: 16,
|
||
// fontWeight: FontWeight.w600,
|
||
// ),
|
||
// ),
|
||
// backgroundColor: WidgetStatePropertyAll(
|
||
// MyTheme.topicColor(IndicatorTopic.environment),
|
||
// ),
|
||
// foregroundColor: const WidgetStatePropertyAll(
|
||
// Colors.white,
|
||
// ),
|
||
// ),
|
||
// child: Row(
|
||
// mainAxisAlignment: MainAxisAlignment.center,
|
||
// children: [
|
||
// Text(
|
||
// context.translate(
|
||
// 'Continue as Guest',
|
||
// 'استمر كضيف',
|
||
// ),
|
||
// ),
|
||
// 6.horizontalSpace,
|
||
// const Icon(Icons.chevron_right_outlined),
|
||
// ],
|
||
// ),
|
||
// ),
|
||
// );
|
||
final fcscBanner = Image.asset(
|
||
BannerAssetPath.fcsc,
|
||
height: 40,
|
||
);
|
||
final screenWidth = MediaQuery.of(context).size.width;
|
||
final listViewHorizontalPadding =
|
||
screenWidth < 700 ? 30 : 30 + (screenWidth - 700) / 2;
|
||
final scaffoldBody = SingleChildScrollView(
|
||
child: Column(
|
||
children:[
|
||
Padding(
|
||
padding: EdgeInsets.all(16),
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
3.verticalSpace,
|
||
Align(
|
||
alignment: AlignmentDirectional.topEnd,
|
||
child: MyToggle(
|
||
isOn: locale?.languageCode == 'en',
|
||
knobTextWhenOn: 'ع',
|
||
knobTextWhenOff: 'EN',
|
||
pathColorWhenOn: Colors.grey.shade300,
|
||
pathColorWhenOff: Colors.grey.shade300,
|
||
onTap: () {
|
||
final formState = formKey.currentState;
|
||
ref.read(localeProvider.notifier).toggleLocale();
|
||
Future.delayed(Duration(milliseconds: 100), () {
|
||
if (hasValidated.value && formState?.validate() == false) {
|
||
formState?.validate();
|
||
}
|
||
});
|
||
},
|
||
),
|
||
),
|
||
34.verticalSpace,
|
||
helloAndPleaseLoginTexts,
|
||
40.verticalSpace,
|
||
form,
|
||
15.verticalSpace,
|
||
dontHaveAnAccountRegisterBtn,
|
||
// continueAsGuestBtn,
|
||
// Spacer(),
|
||
15.verticalSpace,
|
||
fcscBanner,
|
||
],
|
||
),
|
||
)
|
||
]
|
||
),
|
||
);
|
||
// final bgScaffold = Scaffold(
|
||
// backgroundColor: Colors.white,
|
||
// body: SafeArea(child: scaffoldBody),
|
||
// );
|
||
// return bgScaffold;
|
||
return PopScope(
|
||
canPop: false, // Allow back navigation only if not login screen
|
||
onPopInvokedWithResult: (didPop, result) {
|
||
if (didPop) return;
|
||
SystemNavigator.pop();
|
||
// _showExitConfirmation(context); // Show exit confirmation dialog
|
||
},
|
||
child: Scaffold(
|
||
backgroundColor: Colors.white,
|
||
body: SafeArea(child: scaffoldBody),
|
||
),
|
||
);
|
||
}
|
||
//when the pop up need un comment the code
|
||
// void _showExitConfirmation(BuildContext context) {
|
||
// showDialog(
|
||
// context: context,
|
||
// builder: (context) => AlertDialog(
|
||
// title: Text( context.translate(
|
||
// 'Exit App',
|
||
// 'الخروج من التطبيق',
|
||
// ),style: TextStyle(color: Color(0xFF898C81),fontWeight: FontWeight.w700),),
|
||
// content: Text( context.translate(
|
||
// 'Are you sure you want to exit?',
|
||
// 'هل أنت متأكد أنك تريد الخروج؟',
|
||
// ),
|
||
// style: TextStyle(color:Color(0xFF898C81)),
|
||
// ),
|
||
// actions: [
|
||
// TextButton(
|
||
// onPressed: () => Navigator.of(context).pop(), // Close dialog
|
||
// style: TextButton.styleFrom(
|
||
// foregroundColor: Color(0xFFAA8E83), // Background color
|
||
// // backgroundColor: Colors.white, // Font (text) color
|
||
// side: BorderSide(
|
||
// // color: Color(0xFF92722A)), // Border outline color
|
||
// color: Color(0xFFAA8E83)), // Border outline color
|
||
// shape: RoundedRectangleBorder(
|
||
// borderRadius:
|
||
// BorderRadius.circular(8), // Optional: Rounded corners
|
||
// ),
|
||
// padding: EdgeInsets.symmetric(
|
||
// horizontal: 16, vertical: 12), // Optional: Padding
|
||
// ),
|
||
// child: Text( context.translate(
|
||
// 'Cancel',
|
||
// 'إلغاء',
|
||
// ),),
|
||
// ),
|
||
// TextButton(
|
||
// onPressed: () => SystemNavigator.pop(), // Exit the app
|
||
// style: TextButton.styleFrom(
|
||
// backgroundColor: Color(0xFFAA8E83), // Background color
|
||
// foregroundColor: Colors.white, // Font (text) color
|
||
// side: BorderSide(
|
||
// // color: Color(0xFF92722A)), // Border outline color
|
||
// color: Color(0xFFAA8E83)), // Border outline color
|
||
// shape: RoundedRectangleBorder(
|
||
// borderRadius:
|
||
// BorderRadius.circular(8), // Optional: Rounded corners
|
||
// ),
|
||
// padding: EdgeInsets.symmetric(
|
||
// horizontal: 16, vertical: 12), // Optional: Padding
|
||
// ),
|
||
// child: Text( context.translate(
|
||
// 'Exit',
|
||
// 'خروج',
|
||
// ),),
|
||
// ),
|
||
// ],
|
||
// ),
|
||
// );
|
||
// }
|
||
}
|
||
|
||
murouter
|
||
// import 'package:external_repos/external_repos.dart';
|
||
// import 'package:flutter/material.dart';
|
||
// import 'package:flutter_localizations/flutter_localizations.dart';
|
||
// import 'package:go_router/go_router.dart';
|
||
// import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||
// import 'package:uae_stat/domain/use_cases/auth_use_case.dart';
|
||
// import 'package:uae_stat/domain/use_cases/language.dart';
|
||
// import 'package:uae_stat/domain/use_cases/preferences_use_case.dart';
|
||
// import 'package:uae_stat/infrastructure/services/packages/go_router.dart';
|
||
// import 'package:uae_stat/presentation/components/logged_in_home_scaffold.dart';
|
||
// import 'package:uae_stat/presentation/components/my_bottom_nav_bar.dart';
|
||
// import 'package:uae_stat/presentation/components/my_drawer.dart';
|
||
// import 'package:uae_stat/presentation/routes/auth_routes/login_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/auth_routes/register_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/competitiveness_flow/report_flow/list_reports_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/competitiveness_flow/report_flow/report_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/country_profile_flow/country_statistics_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/country_profile_flow/list_countries_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/list_uae_numbers_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/economy/_aircraft_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/economy/_gdp_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/economy/_hotels_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/economy/_inflation_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/economy/_trade_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/environment/_area_of_national_reserves_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/environment/_oil_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/environment/_water_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/environment/electricity_consumption_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/environment/electricity_production_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/social/_general_education_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/social/_higher_education_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/social/_hospitals_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/social/_labor_force_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/uae_numbers_routes/sub_routes/social/_population_body.dart';
|
||
// import 'package:uae_stat/presentation/routes/drawer_routes/feedback_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/drawer_routes/manage_user_router.dart';
|
||
// import 'package:uae_stat/presentation/routes/drawer_routes/my_favorites_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/drawer_routes/privacy_policy_route.dart';
|
||
// import 'package:uae_stat/presentation/routes/drawer_routes/profile/reset_pw_route.dart';
|
||
//
|
||
// import '../presentation/routes/drawer_routes/profile/profile_route.dart';
|
||
//
|
||
// part 'my_router.g.dart';
|
||
//
|
||
// class _MyRouter {
|
||
// const _MyRouter({
|
||
// required this.isLoggedIn,
|
||
// });
|
||
//
|
||
// final bool isLoggedIn;
|
||
//
|
||
// static FutureOr<String?> rootRedirect(
|
||
// BuildContext context,
|
||
// GoRouterState state,
|
||
// ) {
|
||
// final defaultLanguage = PreferencesUseCase.defaultPrefs.language.name;
|
||
// if (state.fullPath == '/') {
|
||
// return '/$defaultLanguage/home';
|
||
// }
|
||
// final currentLocale = state.pathParameters['locale'];
|
||
// if (currentLocale == null) {
|
||
// return '$defaultLanguage/${state.pathWithParameters}';
|
||
// }
|
||
// return null;
|
||
// }
|
||
//
|
||
// Iterable<GoRoute> get authRoutes => [
|
||
// GoRoute(
|
||
// path: 'Profile',
|
||
// redirect: (context, state) =>
|
||
// isLoggedIn ? null : '${context.language.name}/profile',
|
||
// builder: (context, state) => const ProfileRoute(),
|
||
// ),
|
||
// GoRoute(
|
||
// path: 'login',
|
||
// redirect: (context, state) =>
|
||
// isLoggedIn ? '${context.language.name}/profile' : null,
|
||
// builder: (context, state) => const ProfileRoute(),
|
||
// //builder: (context, state) => const LoginRoute(),
|
||
// ),
|
||
// // GoRoute(
|
||
// // path: 'register',
|
||
// // redirect: (context, state) =>
|
||
// // isLoggedIn ? '${context.language.name}/profile' : null,
|
||
// // builder: (context, state) => const RegisterRoute(),
|
||
// // ),
|
||
// ];
|
||
//
|
||
// static final Iterable<GoRoute> bottomBarRoutes = BottomNavBarItem.values.map(
|
||
// (e) => switch (e) {
|
||
// BottomNavBarItem.home => GoRoute(
|
||
// path: e.routePath,
|
||
// pageBuilder: (context, state) => const NoTransitionPage(
|
||
// child: HomeRoute(),
|
||
// ),
|
||
// ),
|
||
// BottomNavBarItem.uaeNumbers => GoRoute(
|
||
// path: e.routePath,
|
||
// pageBuilder: (context, state) => const NoTransitionPage(
|
||
// child: ListUAENumbersRoute(),
|
||
// ),
|
||
// routes: [
|
||
// ...IndicatorEnum.values.map(
|
||
// (ie) => GoRoute(
|
||
// path: ie.name,
|
||
// builder: (context, state) => switch (ie) {
|
||
// // environment
|
||
// IndicatorEnum.nationalReservesArea =>
|
||
// const AreaOfNationalReservesBody(),
|
||
// IndicatorEnum.crudeOilProduction => const OilBody(),
|
||
// IndicatorEnum.exportOilQuantity => const OilBody(),
|
||
// IndicatorEnum.electricityProduction =>
|
||
// const ElectricityProductionBody(),
|
||
// IndicatorEnum.electricityConsumption =>
|
||
// const ElectricityConsumptionBody(),
|
||
// IndicatorEnum.desalinatedWaterProduction => const WaterBody(),
|
||
// IndicatorEnum.municipalWaste => throw UnimplementedError(),
|
||
// // trade
|
||
// IndicatorEnum.inflationRate => const InflationBody(),
|
||
// IndicatorEnum.gdpConstant => const GdpBody(),
|
||
// IndicatorEnum.gdpGrowthConstant => const GdpBody(),
|
||
// IndicatorEnum.aircraftMovement => const AircraftBody(),
|
||
// IndicatorEnum.tradeValue => const TradeBody(),
|
||
// IndicatorEnum.hotelGuests => const HotelsBody(),
|
||
// // social
|
||
// IndicatorEnum.studentsGeneral => const GeneralEducationBody(),
|
||
// IndicatorEnum.studentsHigher => const HigherEducationBody(),
|
||
// IndicatorEnum.hospitalsGovernment => const HospitalsBody(),
|
||
// IndicatorEnum.hospitalsPrivate => const HospitalsBody(),
|
||
// IndicatorEnum.laborForce => const LaborForceBody(),
|
||
// IndicatorEnum.population => const PopulationBody(),
|
||
// },
|
||
// ),
|
||
// ),
|
||
// ],
|
||
// ),
|
||
// BottomNavBarItem.competitiveness => GoRoute(
|
||
// path: e.routePath,
|
||
// pageBuilder: (context, state) => const NoTransitionPage(
|
||
// child: ListReportsRoute(),
|
||
// ),
|
||
// routes: [
|
||
// GoRoute(
|
||
// path: ':reportCode',
|
||
// builder: (context, state) => ReportRoute(
|
||
// reportCode: state.pathParameters['reportCode'] as String,
|
||
// ),
|
||
// ),
|
||
// ],
|
||
// ),
|
||
// BottomNavBarItem.countryStatistics => GoRoute(
|
||
// path: e.routePath,
|
||
// pageBuilder: (context, state) => const NoTransitionPage(
|
||
// child: ListCountriesRoute(),
|
||
// ),
|
||
// routes: [
|
||
// GoRoute(
|
||
// path: ':alpha2CountryCode',
|
||
// redirect: (context, state) {
|
||
// final code = state.pathParameters['alpha2CountryCode'];
|
||
// if (code == null) return 'country-profile';
|
||
// return null;
|
||
// },
|
||
// builder: (context, state) {
|
||
// final alpha2Code = state.pathParameters['alpha2CountryCode']!;
|
||
// final country = ISOCountry.fromAlpha2(alpha2Code);
|
||
// return CountryProfileRoute(country: country);
|
||
// },
|
||
// ),
|
||
// ],
|
||
// ),
|
||
// },
|
||
// );
|
||
//
|
||
// Iterable<GoRoute> get _drawerRoutes => [
|
||
// GoRoute(
|
||
// path: 'profile',
|
||
// redirect: (context, state) {
|
||
// if (isLoggedIn) return null;
|
||
// return '/${context.language.name}/login';
|
||
// },
|
||
// pageBuilder: (context, state) => const NoTransitionPage(
|
||
// child: ProfileRoute(),
|
||
// ),
|
||
// routes: [
|
||
// GoRoute(
|
||
// path: 'reset-pw',
|
||
// builder: (context, state) => const ResetPwRoute(),
|
||
// ),
|
||
// ],
|
||
// ),
|
||
// ...DrawerItems.values.map(
|
||
// (e) => GoRoute(
|
||
// path: e.routePath,
|
||
// pageBuilder: (context, state) => NoTransitionPage(
|
||
// child: switch (e) {
|
||
// DrawerItems.favorites => const MyFavoritesRoute(),
|
||
// //DrawerItems.feedback => const FeedbackRoute(),
|
||
// DrawerItems.feedback => FeedbackForm(),
|
||
// DrawerItems.privacyPolicy => const PrivacyPolicyRoute(),
|
||
// DrawerItems.manageuser => ManageUserRouter()
|
||
// // DrawerItems.userGuide => const NotificationsRoute(),
|
||
// // DrawerItems.notifications => const UserGuideRoute(),
|
||
// },
|
||
// ),
|
||
// ),
|
||
// ),
|
||
// ];
|
||
// //
|
||
// ShellRoute get inAppRoutes => ShellRoute(
|
||
// builder: (context, state, child) => LoggedInHomeScaffold(
|
||
// body: child,
|
||
// ),
|
||
// routes: [
|
||
// ...bottomBarRoutes,
|
||
// ..._drawerRoutes,
|
||
// ],
|
||
// );
|
||
// }
|
||
// //
|
||
// String? _pathCache;
|
||
//
|
||
// @riverpod
|
||
// Future<GoRouter> router(RouterRef ref) async {
|
||
// final routerKey = GlobalKey<NavigatorState>(
|
||
// debugLabel: 'routerKey',
|
||
// );
|
||
// final isLoggedIn = await ref.watch(
|
||
// authUseCaseProvider.future.select(
|
||
// (session) async => (await session) != null,
|
||
// ),
|
||
// );
|
||
// final language = await ref.watch(
|
||
// preferencesUseCaseProvider.future.select(
|
||
// (asyncPrefs) async => (await asyncPrefs).language,
|
||
// ),
|
||
// );
|
||
// final myRouter = _MyRouter(
|
||
// isLoggedIn: isLoggedIn,
|
||
// );
|
||
// final router = GoRouter(
|
||
// navigatorKey: routerKey,
|
||
// initialLocation: _pathCache ?? '/$language/home',
|
||
// routes: <RouteBase>[
|
||
// GoRoute(
|
||
// redirect: _MyRouter.rootRedirect,
|
||
// path: '/:locale',
|
||
// routes: [
|
||
// myRouter.inAppRoutes,
|
||
// // ...myRouter.authRoutes,
|
||
// ]
|
||
// .map(
|
||
// (e) => ShellRoute(
|
||
// builder: (context, state, child) {
|
||
// final goRouterState = GoRouterState.of(context);
|
||
// final locale = goRouterState.pathParameters['locale']!;
|
||
// final language = LanguageLocale.fromName(locale);
|
||
// return Localizations.override(
|
||
// context: context,
|
||
// delegates: GlobalMaterialLocalizations.delegates,
|
||
// locale: Locale(
|
||
// switch (language) {
|
||
// LanguageLocale.enUS => 'en',
|
||
// LanguageLocale.arAE => 'ar',
|
||
// },
|
||
// ),
|
||
// child: Directionality(
|
||
// textDirection: switch (language) {
|
||
// LanguageLocale.enUS => TextDirection.ltr,
|
||
// LanguageLocale.arAE => TextDirection.rtl,
|
||
// },
|
||
// child: child,
|
||
// ),
|
||
// );
|
||
// },
|
||
// routes: [e],
|
||
// ),
|
||
// )
|
||
// .toList(),
|
||
// ),
|
||
// ],
|
||
// );
|
||
// ref.onDispose(
|
||
// () {
|
||
// _pathCache =
|
||
// ref.state.valueOrNull?.routeInformationProvider.value.uri.toString();
|
||
// router.dispose();
|
||
// },
|
||
// );
|
||
//
|
||
// return router;
|
||
// }
|
||
|
||
import 'dart:convert';
|
||
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||
import 'package:go_router/go_router.dart';
|
||
import 'package:uae_stat/config/sessionCheckScreen.dart';
|
||
import 'package:uae_stat/domain/entities/session_entity.dart';
|
||
import 'package:uae_stat/infrastructure/data/p_auth_repo.dart';
|
||
import 'package:uae_stat/presentation/Screens/Bottom%20Navigation%20Pages/UAE_Numbers/Social/marriages.dart';
|
||
import 'package:uae_stat/presentation/Screens/auth_verification/privacy_policy.dart';
|
||
import 'package:uae_stat/presentation/Screens/auth_verification/registration.dart';
|
||
import 'package:uae_stat/presentation/Screens/auth_verification/terms&conditions.dart';
|
||
import 'package:uae_stat/presentation/Screens/charts/chart.dart';
|
||
import 'package:uae_stat/presentation/Screens/charts/screens/chart_screen.dart';
|
||
import 'package:uae_stat/presentation/Screens/demo_home2.dart';
|
||
import 'package:uae_stat/presentation/Screens/online_offline_verification/internet_check.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/contactUs.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/notification/notification.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/AboutTheApp/AboutFCSC.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/AboutTheApp/getStarted.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/AppFeatures.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/ChangeMyPassword.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/EditMyProfile.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/howUseTheApp.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/purpose.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/stayUpdate.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/KeyFeatures/useTheApp.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/aboutApp.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/user_guide/userguide.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
|
||
|
||
import 'package:uae_stat/presentation/Screens/Bottom Navigation Pages/UAE_Numbers/uae_numbers.dart';
|
||
import 'package:uae_stat/presentation/Screens/Bottom Navigation Pages/Competitiveness/competitiveness.dart';
|
||
import 'package:uae_stat/presentation/Screens/Bottom Navigation Pages/Country_Profile/country_profile.dart';
|
||
|
||
import '../domain/use_cases/preferences_use_case.dart';
|
||
import '../presentation/Screens/auth_verification/changepassword.dart';
|
||
import '../presentation/Screens/auth_verification/confirm_password.dart';
|
||
import '../presentation/Screens/auth_verification/create_new_pw.dart';
|
||
import '../presentation/Screens/auth_verification/otp_verification.dart';
|
||
import '../presentation/Screens/demo_home.dart';
|
||
import '../presentation/Screens/profilepage.dart';
|
||
import '../presentation/routes/auth_routes/login_route.dart';
|
||
import '../presentation/routes/bottom_bar_routes/tab_routes/home_route.dart';
|
||
import 'package:uae_stat/presentation/routes/drawer_routes/Drawer%20Items/bookmark.dart';
|
||
import '../presentation/routes/drawer_routes/Drawer Items/edit_profile.dart';
|
||
import '../presentation/routes/drawer_routes/Drawer Items/feedback.dart';
|
||
import '../presentation/routes/drawer_routes/Drawer Items/user_guide/faq_page.dart';
|
||
import '../presentation/routes/drawer_routes/Drawer Items/user_guide/features.dart';
|
||
import '../presentation/routes/drawer_routes/Drawer Items/manage_users.dart';
|
||
|
||
final FlutterSecureStorage _secureStorage = const FlutterSecureStorage();
|
||
|
||
// Future<String?> _checkSession() async {
|
||
// print('_checkSession');
|
||
// await Future.delayed(Duration(seconds: 2)); // Optional splash effect
|
||
//
|
||
// String? sessionToken =
|
||
// await _secureStorage.read(key: "FlutterSecureStorage.session");
|
||
// print('sessionToken $sessionToken');
|
||
//
|
||
// if (sessionToken != null && sessionToken.isNotEmpty) {
|
||
// print('_checkSession home');
|
||
// return "/myhomepage"; // Redirect to home page if session is valid
|
||
// } else {
|
||
// print('_checkSession login');
|
||
// return "/login"; // Redirect to login page if session is invalid
|
||
// }
|
||
// }
|
||
|
||
final GoRouter router = GoRouter(
|
||
initialLocation: '/',
|
||
routes: [
|
||
GoRoute(
|
||
path: '/',
|
||
//builder: (context, state) => MyHomePage(),
|
||
builder: (context, state) => SessionCheckScreen(),
|
||
|
||
),
|
||
// GoRoute(
|
||
// path: '/',
|
||
// redirect: (context, state) async => await _checkSession(),
|
||
// ),
|
||
GoRoute(
|
||
path: '/internetcheck',
|
||
builder: (context, state) => InternetCheck(),
|
||
),
|
||
GoRoute(
|
||
path: '/login',
|
||
builder: (context, state) => LoginRoute(),
|
||
//builder: (context, state) => LoginRoute(),
|
||
),
|
||
GoRoute(
|
||
path: '/myhomepage',
|
||
builder: (context, state) => MyHomePage(),
|
||
),
|
||
GoRoute(
|
||
path: '/register',
|
||
builder: (context, state) => RegisterScreen(),
|
||
),
|
||
// GoRoute(
|
||
// path: '/DemoHome/:dataSets',
|
||
// builder: (context, state) {
|
||
// final dataSets = state.pathParameters['dataSets']!;
|
||
// print('Router $dataSets');
|
||
// return ChartPage(dataSets: dataSets);
|
||
// },
|
||
// ),
|
||
// GoRoute(
|
||
// path: '/Chart/:dataSets',
|
||
// builder: (context, state) {
|
||
// final dataSets = state.pathParameters['dataSets']!;
|
||
// print('Router $dataSets');
|
||
// return ChartScreen(dataSets: dataSets);
|
||
// },
|
||
// ),
|
||
GoRoute(
|
||
path: '/chartScreen/:dataSets',
|
||
builder: (context, state) {
|
||
// Retrieve path parameter
|
||
final dataSets = state.pathParameters['dataSets']!;
|
||
// Retrieve query parameter
|
||
final bgColor = state.uri.queryParameters['bgColor'] ??
|
||
'0xFFFFFFFF'; // Default white
|
||
final mainTopic = state.uri.queryParameters['mainTopic'] ?? '';
|
||
final title = state.uri.queryParameters['title'] ?? '';
|
||
final key = state.uri.queryParameters['key'] ?? '';
|
||
final kpi = state.uri.queryParameters['kpi'] ?? ''; // Get kpi
|
||
|
||
// Parse filter_data as a JSON list
|
||
// Parse filter_data as a JSON list
|
||
List<Map<String, dynamic>> filterData = [];
|
||
|
||
if (state.uri.queryParameters.containsKey('filter_data') &&
|
||
state.uri.queryParameters['filter_data']!.isNotEmpty) {
|
||
try {
|
||
filterData = List<Map<String, dynamic>>.from(
|
||
jsonDecode(state.uri.queryParameters['filter_data']!)
|
||
);
|
||
} catch (e) {
|
||
print('Error parsing filter_data: $e');
|
||
filterData = []; // Assign an empty list to prevent null issues
|
||
}
|
||
} else {
|
||
filterData = []; // Ensure it's a valid list
|
||
}
|
||
|
||
|
||
|
||
print('Router dataSets: $dataSets');
|
||
print('Router bgColor: $bgColor');
|
||
print('Router mainTopic: $mainTopic');
|
||
print('Router title: $title');
|
||
print('Router filter: $filterData');
|
||
|
||
// Pass both values to the screen
|
||
return ChartScreen1(
|
||
dataSets: dataSets,
|
||
bgColor: bgColor,
|
||
mainTopic: mainTopic,
|
||
title: title,
|
||
keyParam: key,
|
||
kpi: kpi,
|
||
filter_data: filterData,
|
||
);
|
||
},
|
||
),
|
||
GoRoute(
|
||
path: '/mailverification',
|
||
builder: (context, state) => EmailVerificationScreen(
|
||
email: '',
|
||
userId: '',
|
||
otp: '',
|
||
otpId: '',
|
||
sendVerificationCode: (String) {},
|
||
),
|
||
),
|
||
GoRoute(
|
||
path: '/changepassword/:userId',
|
||
builder: (context, state) {
|
||
final userId = state.pathParameters['userId']!;
|
||
return Changepassword(userId: userId);
|
||
},
|
||
),
|
||
GoRoute(
|
||
path: '/createNewPw/:userId/:email',
|
||
builder: (context, state) {
|
||
final userId = state.pathParameters['userId']!;
|
||
final email = state.pathParameters['email']!;
|
||
final key = state.uri.queryParameters['key'] ?? '';
|
||
|
||
return CreateNewPw(userId: userId, email: email, keyParam: key);
|
||
},
|
||
),
|
||
GoRoute(
|
||
path: '/confirmpasswd',
|
||
builder: (context, state) => ConfirmPassword(
|
||
email: '',
|
||
userId: '',
|
||
),
|
||
),
|
||
GoRoute(
|
||
path: '/terms&conditions',
|
||
builder: (context, state) => TermsOfUse(),
|
||
//builder: (context, state) => LoginRoute(),
|
||
),
|
||
GoRoute(
|
||
path: '/privacy_policy',
|
||
builder: (context, state) => PrivacyPolicy(),
|
||
//builder: (context, state) => LoginRoute(),
|
||
),
|
||
|
||
// Drawer Routers
|
||
GoRoute(
|
||
path: '/feedback',
|
||
builder: (context, state) => FeedbackForm(),
|
||
),
|
||
//Sub route
|
||
GoRoute(
|
||
path: '/profile/:userId',
|
||
builder: (context, state) {
|
||
final userId = state.pathParameters['userId']!;
|
||
return ProfileScreen(userId: userId);
|
||
},
|
||
),
|
||
GoRoute(
|
||
path: '/notification',
|
||
builder: (context, state) {
|
||
// final userId = state.pathParameters['userId']!;
|
||
return NotificationPage();
|
||
},
|
||
),
|
||
GoRoute(
|
||
path: '/user-guide',
|
||
builder: (context, state) => Userguide(),
|
||
routes: <RouteBase>[
|
||
GoRoute(
|
||
path: '/features',
|
||
name: 'features',
|
||
builder: (context, state) => UsingFeatures(),
|
||
routes: <RouteBase>[
|
||
GoRoute(
|
||
path: 'whoUseApp',
|
||
name: 'whoUseApp',
|
||
builder: (context, state) => WhoUseTheApp(),
|
||
),
|
||
GoRoute(
|
||
path: 'howUseApp',
|
||
name: 'howUseApp',
|
||
builder: (context, state) => HowUseTheApp(),
|
||
),
|
||
GoRoute(
|
||
path: 'purpose',
|
||
name: 'purpose',
|
||
builder: (context, state) => Purpose(),
|
||
),
|
||
GoRoute(
|
||
path: 'stayUpdated',
|
||
name: 'stayUpdated',
|
||
builder: (context, state) => StayUpdate(),
|
||
),
|
||
GoRoute(
|
||
path: 'changeMyPassword',
|
||
name: 'changeMyPassword',
|
||
builder: (context, state) => ChangeMyPassword(),
|
||
),
|
||
GoRoute(
|
||
path: 'appFeatures',
|
||
name: 'appFeatures',
|
||
builder: (context, state) => AppFeatures(),
|
||
),
|
||
GoRoute(
|
||
path: 'editMyProfile',
|
||
name: 'editMyProfile',
|
||
builder: (context, state) => EditMyProfile(),
|
||
),
|
||
],
|
||
),
|
||
GoRoute(
|
||
path: 'aboutApp',
|
||
builder: (context, state) => aboutTheApp(),
|
||
routes: <RouteBase>[
|
||
GoRoute(
|
||
path: 'aboutFCSC',
|
||
name: 'aboutFCSC',
|
||
builder: (context, state) => aboutFCSC(),
|
||
),
|
||
GoRoute(
|
||
path: 'getStarted',
|
||
name: 'getStarted',
|
||
builder: (context, state) => GetStarted(),
|
||
),
|
||
]),
|
||
GoRoute(
|
||
path: '/faq',
|
||
name: 'faq',
|
||
builder: (context, state) => FAQPage(),
|
||
),
|
||
],
|
||
),
|
||
// GoRoute(
|
||
// path: '/manageuser',
|
||
// builder: (context, state) {
|
||
// // Retrieve the title from extra or query params
|
||
// final title = state.extra as String? ?? 'Manage users';
|
||
// return ManageUserRouter(title: title);
|
||
// },
|
||
// ),
|
||
GoRoute(
|
||
path: '/editProfile',
|
||
builder: (context, state) => EditProfile(),
|
||
),
|
||
GoRoute(
|
||
path: '/bookmark',
|
||
builder: (context, state) => BookMark(),
|
||
),
|
||
GoRoute(
|
||
path: '/manageuser',
|
||
builder: (context, state) => ManageUserRouter(),
|
||
),
|
||
|
||
// Bottom Navigation Routes
|
||
// GoRoute(
|
||
// path: '/uaenumbers',
|
||
// builder: (context, state) => UaeNumbers(),
|
||
// ),
|
||
GoRoute(path: '/uaenumbers', builder: (context, state) => UaeNumbers()),
|
||
|
||
GoRoute(
|
||
path: '/competitiveness',
|
||
builder: (context, state) => Competitiveness(),
|
||
),
|
||
|
||
GoRoute(
|
||
path: '/countryprofile',
|
||
builder: (context, state) => CountryProfile(),
|
||
),
|
||
|
||
GoRoute(
|
||
path: '/marriages',
|
||
builder: (context, state) => Marriages(),
|
||
),
|
||
|
||
GoRoute(
|
||
path: '/contact',
|
||
builder: (context, state) => Contact(),
|
||
),
|
||
],
|
||
redirect: (context, state) async {
|
||
if (state.uri.path == '/SessionCheckScreen' || state.uri.path == '/login') {
|
||
return null;
|
||
}
|
||
|
||
final session = await PAuthRepo().fetchLocallyStored();
|
||
|
||
if (session == null || session.freshness == SessionFreshness.expired) {
|
||
print('Session expired, redirecting to login with intendedPath: ${state.uri.path}');
|
||
return '/login${state.uri.path != '/' ? '?intendedPath=${state.uri.path}' : ''}';
|
||
}
|
||
return null;
|
||
}
|
||
);
|