diff --git a/.env b/.env index f5f3ebc..5f1f339 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ -API_URL=https://app.nhanceindia.in/zenith/employeeRest/ -API_URL_Enrollment=https://app.nhanceindia.in/enrolment/employeeRest/ -TICKET_API_URL=https://app.nhanceindia.in/zenith/api -ticketToken=3YTSia2mRoZ7A4zvBgkqbGPrCd6Ewp8IDOuyjXhVFsl1nxWNcQJ95MeUftKH -BASE_HREF=/app/ -ENV=production +API_URL=https://venbait.in/nhance/dev/employeeRest/ +chatbot_Url=https://venbait.in/nhance/dev/chatbot +API_URL_Enrollment=https://venbait.in/enrollment/employeeRest/ +TICKET_API_URL=https://venbait.in/nhance/dev/api +BASE_HREF=/nhance/app/dev/ +ENV=development diff --git a/.env.development b/.env.development index 19126bb..5f1f339 100644 --- a/.env.development +++ b/.env.development @@ -1,6 +1,6 @@ -API_URL=https://app.nhanceindia.in/zenith/employeeRest/ -API_URL_Enrollment=https://app.nhanceindia.in/enrolment/employeeRest/ -TICKET_API_URL=https://app.nhanceindia.in/zenith/api -ticketToken=3YTSia2mRoZ7A4zvBgkqbGPrCd6Ewp8IDOuyjXhVFsl1nxWNcQJ95MeUftKH -BASE_HREF=/app/ -ENV=production \ No newline at end of file +API_URL=https://venbait.in/nhance/dev/employeeRest/ +chatbot_Url=https://venbait.in/nhance/dev/chatbot +API_URL_Enrollment=https://venbait.in/enrollment/employeeRest/ +TICKET_API_URL=https://venbait.in/nhance/dev/api +BASE_HREF=/nhance/app/dev/ +ENV=development diff --git a/.env.production b/.env.production index f5f3ebc..b341532 100644 --- a/.env.production +++ b/.env.production @@ -1,6 +1,6 @@ API_URL=https://app.nhanceindia.in/zenith/employeeRest/ API_URL_Enrollment=https://app.nhanceindia.in/enrolment/employeeRest/ TICKET_API_URL=https://app.nhanceindia.in/zenith/api -ticketToken=3YTSia2mRoZ7A4zvBgkqbGPrCd6Ewp8IDOuyjXhVFsl1nxWNcQJ95MeUftKH +chatbot_Url=https://app.nhanceindia.in/zenith/chatbot BASE_HREF=/app/ ENV=production diff --git a/.env.test b/.env.test index f5f3ebc..3c01a91 100644 --- a/.env.test +++ b/.env.test @@ -1,6 +1,6 @@ API_URL=https://app.nhanceindia.in/zenith/employeeRest/ API_URL_Enrollment=https://app.nhanceindia.in/enrolment/employeeRest/ TICKET_API_URL=https://app.nhanceindia.in/zenith/api -ticketToken=3YTSia2mRoZ7A4zvBgkqbGPrCd6Ewp8IDOuyjXhVFsl1nxWNcQJ95MeUftKH +chatbot_Url=https://app.nhanceindia.in/zenith/chatbot BASE_HREF=/app/ -ENV=production +ENV=production \ No newline at end of file diff --git a/.env.uat b/.env.uat index f5f3ebc..3c01a91 100644 --- a/.env.uat +++ b/.env.uat @@ -1,6 +1,6 @@ API_URL=https://app.nhanceindia.in/zenith/employeeRest/ API_URL_Enrollment=https://app.nhanceindia.in/enrolment/employeeRest/ TICKET_API_URL=https://app.nhanceindia.in/zenith/api -ticketToken=3YTSia2mRoZ7A4zvBgkqbGPrCd6Ewp8IDOuyjXhVFsl1nxWNcQJ95MeUftKH +chatbot_Url=https://app.nhanceindia.in/zenith/chatbot BASE_HREF=/app/ -ENV=production +ENV=production \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 52b8692..58ba877 100755 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -19,12 +19,12 @@ if (project.hasProperty('google-services.json')) { def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { - flutterVersionCode = '24' + flutterVersionCode = '27' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { - flutterVersionName = '1.0.24' + flutterVersionName = '1.0.27' } def keystoreProperties = new Properties() diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 32057cf..83dad03 100755 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,10 +2,10 @@ - BGTaskSchedulerPermittedIdentifiers - - be.tramckrijte.workmanager.backgroundtask - + BGTaskSchedulerPermittedIdentifiers + + be.tramckrijte.workmanager.backgroundtask + CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion @@ -26,15 +26,6 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - UIBackgroundModes - - processing - CFBundleURLTypes @@ -58,14 +49,23 @@ $(FLUTTER_BUILD_NUMBER) FirebaseAppDelegateProxyEnabled + ITSEncryptionExportComplianceCode + LSApplicationQueriesSchemes tel LSRequiresIPhoneOS + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSFaceIDUsageDescription We use Face ID to protect your data in the app. + NSPhotoLibraryUsageDescription + This app requires photo library access to let you select and upload photos. UIApplicationSupportsIndirectInputEvents UIBackgroundModes @@ -79,16 +79,10 @@ Main UISupportedInterfaceOrientations - UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight UTExportedTypeDeclarations diff --git a/lib/customAppBar/customAppBar.dart b/lib/customAppBar/customAppBar.dart index 5f360d3..30fa214 100755 --- a/lib/customAppBar/customAppBar.dart +++ b/lib/customAppBar/customAppBar.dart @@ -1,11 +1,18 @@ import 'package:flutter/material.dart'; import 'package:adaptive_navbar/adaptive_navbar.dart'; +import 'package:go_router/go_router.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:nhance_app_pwa/customAppBar/responsive.dart'; +import '../pages/postEnrollment/service/api_service.dart'; +import '../pages/service/SessionManager.dart'; +import '../pages/service/popup_helper.dart'; + class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { @override Size get preferredSize => Size.fromHeight(kToolbarHeight); + late ApiService apiService; + final session = SessionManager(); Future logout(BuildContext context) async { final prefs = await SharedPreferences.getInstance(); @@ -13,12 +20,14 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { if (token != null && token.isNotEmpty) { await prefs.clear(); - Navigator.pushNamed(context, 'phone'); + context.go('/phone'); + // Navigator.pushNamed(context, 'phone'); } } @override Widget build(BuildContext context) { + apiService = ApiService(context); final sw = MediaQuery.of(context).size.width; final isPoliciesPage = Uri.base.fragment == 'policies'; return ClipRRect( @@ -76,25 +85,36 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { NavBarItem( text: "Home", onTap: () { - Navigator.pushNamed(context, 'home'); + context.push('/home'); }, ), NavBarItem( - text: "Claim", + text: "Claims", onTap: () { - Navigator.pushNamed(context, 'claims'); + context.push('/claims'); }, ), NavBarItem( text: "Help", onTap: () { - Navigator.pushNamed(context, 'help'); + context.push('/help'); + }, + ), + NavBarItem( + text: "Wellness", + onTap: () { + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); }, ), NavBarItem( text: "Profile", onTap: () { - Navigator.pushNamed(context, 'profile'); + context.push('/profile'); }, ), ], diff --git a/lib/customAppBar/enrollmentAppBar.dart b/lib/customAppBar/enrollmentAppBar.dart index f3593a8..6fcc8aa 100755 --- a/lib/customAppBar/enrollmentAppBar.dart +++ b/lib/customAppBar/enrollmentAppBar.dart @@ -1,11 +1,20 @@ +import 'dart:convert'; +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:adaptive_navbar/adaptive_navbar.dart'; +import 'package:go_router/go_router.dart'; +import 'package:http/http.dart' as http; import 'package:nhance_app_pwa/customAppBar/responsive.dart'; import 'package:nhance_app_pwa/customAppBar/toastHelper.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../models/environment.dart'; import '../models/platform_helper_mobile.dart' if (dart.library.html) '../models/platform_helper_other.dart'; +import '../pages/postEnrollment/service/api_service.dart'; +import '../pages/service/SessionManager.dart'; +import '../pages/service/popup_helper.dart'; class CustomAppBar extends StatefulWidget implements PreferredSizeWidget { @override @@ -21,10 +30,13 @@ class _CustomAppBarState extends State { dynamic empStatus; dynamic _postToken; bool isTokenAvailable = false; + late ApiService apiService; + final session = SessionManager(); @override void initState() { super.initState(); + apiService = ApiService(context); getEmpStatus(); } @@ -44,6 +56,61 @@ class _CustomAppBarState extends State { }); } + Future checkLoginPin() async { + print('checkLoginPin'); + try { + final SharedPreferences prefs = await SharedPreferences.getInstance(); + final empMobileNo = prefs.getString('empMobileNo'); + final empEmailid = prefs.getString('empEmailid'); + print('empMobileNo $empMobileNo'); + print('empEmailid $empEmailid'); + + var params = {}; + if (empMobileNo != null && empMobileNo.isNotEmpty) { + params = {'mobile_number': empMobileNo}; + } else if (empEmailid != null && empEmailid.isNotEmpty) { + params = {'email_id': empEmailid}; + } + + print('params $params'); + + final response = await http.post( + Uri.parse(Environment.apiUrlEnrollment + 'checkMpin'), + body: json.encode(params), + headers: { + HttpHeaders.contentTypeHeader: 'application/json', + }, + ); + + if (response.statusCode == 200) { + Map data = json.decode(response.body); + + if (data['status'] == 'success') { + if (data['data'] != null) { + prefs.setString('mpinText', data['data']); + } + if (data['Mpin'] != null) { + prefs.setString('mpin', data['Mpin']); + } + if (data['is_biometric_enabled'] != null) { + prefs.setString('is_biometric_enabled', data['is_biometric_enabled']); + } + if (data['is_mpin_skipped'] != null) { + prefs.setString('is_mpin_skipped', data['is_mpin_skipped']); + return data['is_mpin_skipped'].toString(); + } + } + } else { + print('❌ API failed: ${response.statusCode}'); + return null; + } + } catch (e) { + print('❌ Error: $e'); + return null; + } + return null; + } + Future logout(BuildContext context) async { // final prefs = await SharedPreferences.getInstance(); // final String? token = prefs.getString('token'); @@ -52,35 +119,56 @@ class _CustomAppBarState extends State { // await prefs.clear(); // Navigator.pushNamed(context, 'login'); // } + final SharedPreferences prefs = await SharedPreferences.getInstance(); + String? mobileNumber = prefs.getString('empMobileNo'); + String? mailID = prefs.getString('empEmailid'); + final isMpinSkipped = await checkLoginPin(); + print('isMpinSkipped $isMpinSkipped'); + // bool? biometricStatus = prefs.getBool('biometricStatus') ?? false; + // int? skipStatus = prefs.getInt('skipStatus') ?? 1; + // Clear all keys + await SessionManager().clear(); + // await prefs.clear(); + print('Local Storage Clear'); + + // html.window.localStorage.clear(); + // Re-set the mobile_number key if (isMobilePlatform()) { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - - // Get the value of the mobile_number key - String? mobileNumber = prefs.getString('empMobileNo'); - String? mailID = prefs.getString('empEmailid'); - - // Clear all keys - await prefs.clear(); - - // Re-set the mobile_number key if (mobileNumber != null) { await prefs.setString('empMobileNo', mobileNumber); + print('empMobileNo $mobileNumber'); + // await prefs.setBool('biometricStatus', biometricStatus!); + // await prefs.setInt('skipStatus', skipStatus!); } - if (mailID != null) { await prefs.setString('empEmailid', mailID); + print('empEmailid $mailID'); + // await prefs.setBool('biometricStatus', biometricStatus!); + // await prefs.setInt('skipStatus', skipStatus!); } + if (isMpinSkipped != null) { + await prefs.setString('is_mpin_skipped', isMpinSkipped!); + print('isMpinSkipped $isMpinSkipped'); + } + if (isMpinSkipped != null && isMpinSkipped == '0') { + print('pinPage'); + // return; + context.go('/pinPage'); + } else { + print('login'); + context.go('/login'); + } + } else { + await prefs.clear(); ToastHelper.showSuccessToast(context, 'logout'); // Navigate to login page - Navigator.pushNamed(context, 'login'); - } else { - final prefs = await SharedPreferences.getInstance(); - await prefs.clear(); - Navigator.pushNamed(context, 'login'); + context.go('/login'); } } + + @override Widget build(BuildContext context) { final sw = MediaQuery.of(context).size.width; @@ -158,25 +246,36 @@ class _CustomAppBarState extends State { NavBarItem( text: "Home", onTap: () { - Navigator.pushNamed(context, 'home'); + context.push('/home'); }, ), NavBarItem( - text: "Claim", + text: "Claims", onTap: () { - Navigator.pushNamed(context, 'claims'); + context.push('/claims'); }, ), NavBarItem( text: "Help", onTap: () { - Navigator.pushNamed(context, 'help'); + context.push('/help'); + }, + ), + NavBarItem( + text: "Wellness", + onTap: () { + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); }, ), NavBarItem( text: "Profile", onTap: () { - Navigator.pushNamed(context, 'profile'); + context.push('/profile'); }, ), ], diff --git a/lib/main.dart b/lib/main.dart index 4469857..2d03313 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,14 +3,13 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:nhance_app_pwa/customAppBar/toastHelper.dart'; import 'package:nhance_app_pwa/pages/email_verify.dart'; import 'package:nhance_app_pwa/pages/enrollment/addons.dart'; import 'package:nhance_app_pwa/pages/enrollment/empDetails.dart'; import 'package:nhance_app_pwa/pages/enrollment/empReview.dart'; - import 'package:nhance_app_pwa/pages/login.dart'; -import 'package:nhance_app_pwa/pages/postEnrollment/botman_widget.dart'; -import 'package:nhance_app_pwa/pages/postEnrollment/chatbot.dart'; +import 'package:nhance_app_pwa/pages/postEnrollment/botman_chat.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/claimprocess.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/claims.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/generalexclusionsdeductibles.dart'; @@ -21,27 +20,114 @@ import 'package:nhance_app_pwa/pages/postEnrollment/policies.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/privacypolicy.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/profile.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/raisedTicketList.dart'; +import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/termsofuse.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/tickets.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/tickettracklist.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/wellness.dart'; +import 'package:nhance_app_pwa/pages/service/SessionManager.dart'; +import 'package:nhance_app_pwa/pages/service/TokenService.dart'; +import 'package:nhance_app_pwa/pages/service/data_manager.dart'; import 'package:nhance_app_pwa/pages/session/SetPinBiometric.dart'; import 'package:nhance_app_pwa/pages/session/changePin.dart'; import 'package:nhance_app_pwa/pages/session/settingUpPinAndBiometric.dart'; + import 'package:nhance_app_pwa/pages/verify.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'models/environment.dart'; import 'package:flutter/foundation.dart'; +import 'package:go_router/go_router.dart'; // import 'dart:html' as html; -void clearLocalStorageOnAppStart() async { - if (kIsWeb) { - // Clear localStorage every time the app starts - // html.window.localStorage.clear(); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.clear(); +// === Splash (only for mobile) === +class SplashScreen extends StatefulWidget { + const SplashScreen({super.key}); + + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + @override + void initState() { + super.initState(); + _navigate(); } + + Future _navigate() async { + await Future.delayed(const Duration(seconds: 3)); + final prefs = await SharedPreferences.getInstance(); + final isMpinSkipped = prefs.getString('is_mpin_skipped'); + + if (isMpinSkipped == '0') { + if (mounted) context.go('/pinPage'); + } else { + if (mounted) context.go('/login'); + } + + + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + color: const Color(0x98FFFCE5), + child: Center( + child: Image.asset('assets/nhance-loader.gif', height: 60, width: 60), + ), + ), + ); + } +} + + +/// Middleware logic for tokens + mpin +Future tokenRedirectLogic( + BuildContext context, GoRouterState state) async { + print('ABCDEFGH'); + const allowedWithoutToken = [ + '/login', + '/verify', + '/mailVerify', + '/pinPage', + '/splash', + ]; + + final location = state.uri.toString(); + + // ✅ Allow login, verify, splash without token + if (allowedWithoutToken.contains(location)) return null; + + // ✅ Check if token exists + // final hasToken = await TokenService.hasValidToken(); + // if (!hasToken) return '/login'; + final hasToken = await TokenService.hasValidToken(); + print('hasToken : $hasToken'); + if (!hasToken) { + print('!!!!hasToken : $hasToken'); + await SessionManager().clear(); + // Show toast once + WidgetsBinding.instance.addPostFrameCallback((_) { + ToastHelper.showErrorToast(context, 'Session expired. Please login again.'); + }); + return '/login'; + } + + // ✅ Restore session (decode JWT etc.) + await SessionManager().restoreSession(); + + // ✅ Mobile mpin check + // if (!kIsWeb) { + // final prefs = await SharedPreferences.getInstance(); + // final isMpinSkipped = prefs.getString('is_mpin_skipped'); + // if (isMpinSkipped == '0' && state.uri.toString() != '/pinPage') { + // return '/pinPage'; + // } + // } + + return null; // no redirect } Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { @@ -50,20 +136,16 @@ Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { } Future main() async { - // clearLocalStorageOnAppStart(); - // html.window.onBeforeUnload.listen((event) { - // html.window.localStorage.clear(); // ✅ Clears local storage - // }); WidgetsFlutterBinding.ensureInitialized(); // final SharedPreferences prefs = await SharedPreferences.getInstance(); // prefs.clear(); if (kIsWeb) { await Firebase.initializeApp( options: const FirebaseOptions( - // apiKey: 'AIzaSyC4yHbCX4mQu0jO81pJrDwxKLQlTQWofrc', - // appId: '1:1084115316849:android:68b14c4ff37f4bbc6c6bd0', - // messagingSenderId: '1084115316849', - // projectId: 'nhance-ee8d1' + // apiKey: 'AIzaSyC4yHbCX4mQu0jO81pJrDwxKLQlTQWofrc', + // appId: '1:1084115316849:android:68b14c4ff37f4bbc6c6bd0', + // messagingSenderId: '1084115316849', + // projectId: 'nhance-ee8d1' apiKey: "AIzaSyC4yHbCX4mQu0jO81pJrDwxKLQlTQWofrc", authDomain: "nhance-ee8d1.firebaseapp.com", projectId: "nhance-ee8d1", @@ -82,7 +164,7 @@ Future main() async { FirebaseMessaging messaging = FirebaseMessaging.instance; // NotificationSettings settings = await messaging.requestPermission(); NotificationSettings settings = - await FirebaseMessaging.instance.requestPermission( + await FirebaseMessaging.instance.requestPermission( alert: true, badge: true, sound: true, @@ -100,142 +182,159 @@ Future main() async { await dotenv.load(fileName: Environment.fileName); - // ✅ Get prefs + // Initialize prefs before router final prefs = await SharedPreferences.getInstance(); - // ✅ Decide initialRoute - String initialRoute = 'login'; - if (!kIsWeb) { - if (prefs.containsKey('is_mpin_skipped')) { - final isMpinSkipped = prefs.getString('is_mpin_skipped'); - if (isMpinSkipped == '0') { - initialRoute = 'pinPage'; - } - } - } + // ✅ Initial route for mobile vs web + final initialLocation = kIsWeb ? '/login' : '/splash'; - runApp(MyApp(initialRoute: initialRoute)); + // === GoRouter Setup === + final router = GoRouter( + initialLocation: initialLocation, + routes: [ + GoRoute(path: '/splash', builder: (context, state) => const SplashScreen()), + GoRoute(path: '/login', builder: (context, state) => login()), + GoRoute( + path: '/verify', + builder: (context, state) { + final extras = state.extra as Map?; + + return MyVerify( + verificationId: extras?['verificationId'] ?? '', + mobileNumber: extras?['mobileNumber'] ?? '', + resendToken: extras?['resendToken'], + onResendCode: extras?['onResendCode'], + ); + }, + ), + // GoRoute( + // path: '/chatbot', + // builder: (context, state) { + // final extras = state.extra as Map?; + // return ChatbotWebViewPage( + // client_branch_id: extras?['client_branch_id'] ?? "", + // empCodeString: extras?['empCodeString'] ?? "", + // empName: extras?['empName'] ?? "", + // empPrimaryId: extras?['empPrimaryId'] ?? "", + // client_id: extras?['client_id'] ?? "", + // ); + // }, + // ), + + GoRoute( + path: '/mailVerify', + builder: (context, state) { + final data = state.extra as Map; + final type = data['type'] as String; + final value = data['value'] as String; + + return MyEmailVerify(type: type, value: value); + }, + ), + + // GoRoute( + // path: '/mailVerify', + // builder: (context, state) { + // final email = state.extra as String; + // return MyEmailVerify(email: email); + // }, + // ), + // GoRoute(path: '/mailVerify', builder: (context, state) => MyEmailVerify(email: '')), + GoRoute(path: '/pinPage', builder: (context, state) => pinPage()), + GoRoute(path: '/pinSettingPage', builder: (context, state) => pinSettingPage()), + GoRoute( + path: '/changePin', + builder: (context, state) => changePin(), + ), + GoRoute(path: '/home', builder: (context, state) => Home()), + GoRoute(path: '/profile', builder: (context, state) => profile()), + GoRoute(path: '/help', builder: (context, state) => help()), + GoRoute(path: '/claimprocess', builder: (context, state) => claimprocess()), + GoRoute(path: '/wellness', builder: (context, state) => wellness()), + GoRoute(path: '/privacypolicy', builder: (context, state) => privacypolicy()), + GoRoute(path: '/termsofuse', builder: (context, state) => termsofuse()), + GoRoute(path: '/generalExclusionsDeductibles', builder: (context, state) => generalExclusionsDeductibles()), + GoRoute(path: '/raisedTicketHistory', builder: (context, state) => raisedTicketHistory()), + GoRoute(path: '/tickets', builder: (context, state) => tickets()), + GoRoute( + path: '/policies', + builder: (context, state) { + final arguments = state.extra as Map?; // 👈 receive here + return policies(arguments: arguments); + }, + ), + GoRoute( + path: '/claims', + builder: (context, state) { + final int tabIndex = state.extra as int? ?? 1 ; // default to 0 + return claims(initialTab: tabIndex); + }, + ), + GoRoute( + path: '/planclaimsform', + builder: (context, state) { + final details = state.extra as Map?; + return planclaimsform(details: details); + }, + ), + GoRoute( + path: '/tickettracklist', + builder: (context, state) { + final ticketID = state.extra as String; // cast to correct type + return tickettracklist(ticketID: ticketID); + }, + ), + GoRoute(path: '/empDetails',builder:(context,state) => empDetails(),), + GoRoute(path: '/addOnsDetails', builder: (context, state) => addOnsDetails()), + GoRoute(path: '/empReviewDetails', builder: (context, state) => empReviewDetails()), + ], + + // ✅ Middleware hook + redirect: (context, state) async => + await tokenRedirectLogic(context, state), + ); +// ✅ Load API data once at startup +// runApp( +// Builder( +// builder: (context) { +// final apiService = ApiService(context); // ✅ context is available here +// DataManager().init(apiService); +// DataManager().loadAdvertisementImages(); // load once +// +// return MyApp(router: router); +// }, +// ), +// ); + runApp(MyApp(router: router)); } -class MyApp extends StatelessWidget { - final String initialRoute; +class MyApp extends StatefulWidget { + final GoRouter router; // ✅ define router as a field - const MyApp({super.key, required this.initialRoute}); + const MyApp({super.key, required this.router}); @override - Widget build(BuildContext context) { - return MaterialApp( - // initialRoute: 'login', - initialRoute: initialRoute, - debugShowCheckedModeBanner: false, - routes: { - 'splash': (context) => SplashScreen(), - 'login': (context) => login(), - 'mailVerify': (context) => MyEmailVerify( - email: '', - ), - 'verify': (context) => MyVerify( - verificationId: '', - mobileNumber: '', - resendToken: null, - onResendCode: (String, int) {}, - ), - 'pinSettingPage': (context) => pinSettingPage(), - 'pinPage': (context) => pinPage(), - 'changePin': (context) => changePin(), - 'home': (context) => Home(), - 'policies': (context) => policies(), - 'claims': (context) => claims(), - 'help': (context) => help(), - 'claimprocess': (context) => claimprocess(), - 'profile': (context) => profile(), - 'wellness': (context) => wellness(), - 'planclaimsform': (context) => planclaimsform(), - 'tickettracklist': (context) => tickettracklist( - ticketID: "", - ), - 'privacypolicy': (context) => privacypolicy(), - 'termsofuse': (context) => termsofuse(), - 'generalExclusionsDeductibles': (context) => - generalExclusionsDeductibles(), - // 'home': (context) => kIsWeb ? Home() : BotmanScaffold(currentRoute: 'home', child: Home()), - // 'policies': (context) => kIsWeb ? policies() : BotmanScaffold(currentRoute: 'policies', child: policies()), - // 'claims': (context) => kIsWeb ? claims() : BotmanScaffold(currentRoute: 'claims', child: claims()), - // 'help': (context) => kIsWeb ? help() : BotmanScaffold(currentRoute: 'help', child: help()), - // 'claimprocess': (context) => kIsWeb ? claimprocess() : BotmanScaffold(currentRoute: 'claimprocess', child: claimprocess()), - // 'profile': (context) => kIsWeb ? profile() : BotmanScaffold(currentRoute: 'profile', child: profile()), - // 'wellness': (context) => kIsWeb ? wellness() : BotmanScaffold(currentRoute: 'wellness', child: wellness()), - // 'planclaimsform': (context) => kIsWeb ? planclaimsform() : BotmanScaffold(currentRoute: 'planclaimsform', child: planclaimsform()), - // 'claimtracklist': (context) => kIsWeb ? claimtracklist() : BotmanScaffold(currentRoute: 'claimtracklist', child: claimtracklist()), - // 'privacypolicy': (context) => kIsWeb ? claimtracklist() : BotmanScaffold(currentRoute: 'privacypolicy', child: claimtracklist()), - // 'termsofuse': (context) => kIsWeb ? termsofuse() : BotmanScaffold(currentRoute: 'termsofuse', child: termsofuse()), - // 'generalExclusionsDeductibles': (context) => kIsWeb ? generalExclusionsDeductibles() : BotmanScaffold(currentRoute: 'generalExclusionsDeductibles', child: generalExclusionsDeductibles()), - 'chatbot': (context) => chatbot(), - 'empDetails': (context) => empDetails(), - 'addOnsDetails': (context) => addOnsDetails(), - 'empReviewDetails': (context) => empReviewDetails(), - 'tickets': (context) => tickets(), - 'raisedTicketHistory': (context) => raisedTicketHistory(), - }, - ); - } + State createState() => _MyAppState(); } -// Lightweight splash screen to show during app startup -class SplashScreen extends StatelessWidget { +class _MyAppState extends State { @override - Widget build(BuildContext context) { - // Simulate a brief delay before redirecting to the login screen - Future.delayed(Duration(seconds: 2), () { - Navigator.pushReplacementNamed(context, 'login'); + void initState() { + super.initState(); + + WidgetsBinding.instance.addPostFrameCallback((_) { + final apiService = ApiService(context); + DataManager().init(apiService); + DataManager().loadAdvertisementImages(); }); - return Scaffold( - body: Container( - color: Color(0x98FFFCE5), // Semi-transparent background - child: Center( - child: // Your GIF loader widget - Image.asset( - height: 60, - width: 60, - 'assets/nhance-loader.gif'), // Adjust path to your GIF loader - ), - ), + } + + @override + Widget build(BuildContext context) { + return MaterialApp.router( + routerConfig: widget.router, // ✅ this now works + debugShowCheckedModeBanner: false, ); } } - -// class BotmanScaffold extends StatelessWidget { -// final Widget child; -// final String currentRoute; -// -// const BotmanScaffold({ -// required this.child, -// required this.currentRoute, -// super.key, -// }); -// -// bool get _showBotman { -// const excludedRoutes = ['login', 'splash', 'mailVerify', 'verify']; -// return !excludedRoutes.contains(currentRoute); -// } -// -// @override -// Widget build(BuildContext context) { -// return Scaffold( -// body: Stack( -// children: [ -// child, -// if (_showBotman) -// const Positioned( -// bottom: 50, -// right: 0, -// width: 75, -// height: 75, -// child: BotmanWidget(), -// ), -// ], -// ), -// ); -// } -// } diff --git a/lib/models/environment.dart b/lib/models/environment.dart index b265adf..541b7e7 100755 --- a/lib/models/environment.dart +++ b/lib/models/environment.dart @@ -26,7 +26,7 @@ class Environment { } static String get chatBotUrl { - return dotenv.env['CHAT_BOT_URL'] ?? 'CHAT_BOT_URL not found!'; + return dotenv.env['chatbot_Url'] ?? 'CHAT_BOT_URL not found!'; } static String get baseHref { diff --git a/lib/pages/config/SessionNotifier.dart b/lib/pages/config/SessionNotifier.dart new file mode 100644 index 0000000..37f9901 --- /dev/null +++ b/lib/pages/config/SessionNotifier.dart @@ -0,0 +1,12 @@ +// import 'dart:async'; +// import 'package:flutter/material.dart'; +// +// import '../service/SessionManager.dart'; +// +// class SessionNotifier extends ChangeNotifier { +// SessionNotifier() { +// SessionManager().sessionStream.listen((_) { +// notifyListeners(); +// }); +// } +// } diff --git a/lib/pages/config/gorouter.dart b/lib/pages/config/gorouter.dart new file mode 100644 index 0000000..b04fc61 --- /dev/null +++ b/lib/pages/config/gorouter.dart @@ -0,0 +1,378 @@ +// import 'package:flutter/foundation.dart'; +// import 'package:flutter/material.dart'; +// import 'package:go_router/go_router.dart'; +// import 'package:shared_preferences/shared_preferences.dart'; +// import '../../main.dart'; +// import '../email_verify.dart'; +// import '../enrollment/addons.dart'; +// import '../enrollment/empDetails.dart'; +// import '../enrollment/empReview.dart'; +// import '../login.dart'; +// import '../postEnrollment/chatbot.dart'; +// import '../postEnrollment/claimprocess.dart'; +// import '../postEnrollment/claims.dart'; +// import '../postEnrollment/generalexclusionsdeductibles.dart'; +// import '../postEnrollment/help.dart'; +// import '../postEnrollment/home.dart'; +// import '../postEnrollment/planclaimsform.dart'; +// import '../postEnrollment/policies.dart'; +// import '../postEnrollment/privacypolicy.dart'; +// import '../postEnrollment/profile.dart'; +// import '../postEnrollment/raisedTicketList.dart'; +// import '../service/SessionManager.dart'; +// import 'SessionNotifier.dart'; +// import 'splashScreen.dart'; +// import '../postEnrollment/termsofuse.dart'; +// import '../postEnrollment/tickets.dart'; +// import '../postEnrollment/tickettracklist.dart'; +// import '../postEnrollment/wellness.dart'; +// import '../service/TokenService.dart'; +// import '../session/SetPinBiometric.dart'; +// import '../session/changePin.dart'; +// import '../session/settingUpPinAndBiometric.dart'; +// import '../verify.dart'; +// +// class AppRouter { +// // static final SessionNotifier sessionNotifier = SessionNotifier(); +// static GoRouter createRouter() { +// return GoRouter( +// initialLocation: kIsWeb ? '/login' : '/splash', +// debugLogDiagnostics: true, +// // refreshListenable: sessionNotifier, +// redirect: (BuildContext context, GoRouterState state) { +// const allowedWithoutToken = [ +// '/login', +// '/verify', +// '/mailVerify', +// '/pinPage', +// '/splash', +// ]; +// +// final location = state.uri.toString(); +// if (allowedWithoutToken.contains(location)) return null; +// +// // final hasToken = TokenService.hasValidTokenSync(); +// // if (!hasToken) return '/login'; +// +// // if (!kIsWeb && +// // SessionManager().prefs?.getString('is_mpin_skipped') == '0' && +// // location != '/pinPage') { +// // return '/pinPage'; +// // } +// +// return null; +// }, +// +// +// +// routes: [ +// // if (!kIsWeb) +// // GoRoute( +// // path: '/splash', +// // builder: (context, state) => SplashScreen(), +// // ), +// GoRoute( +// path: '/login', +// builder: (context, state) => login(), +// ), +// GoRoute( +// path: '/mailVerify', +// builder: (context, state) { +// final email = state.extra as String; +// return MyEmailVerify(email: email); +// }, +// ), +// GoRoute( +// path: '/verify', +// builder: (context, state) { +// final args = state.extra as Map; +// return MyVerify( +// verificationId: args['verificationId'] as String, +// mobileNumber: args['mobileNumber'] as String, +// resendToken: args['resendToken'], +// onResendCode: args['onResendCode'] as Function(String, int?), +// ); +// }, +// ), +// GoRoute( +// path: '/mailVerify', +// builder: (context, state) => MyVerify( +// verificationId: '', +// mobileNumber: '', +// resendToken: null, +// onResendCode: (String, int) {}, +// ), +// ), +// GoRoute( +// path: '/home', +// builder: (context, state) => Home(), +// ), +// GoRoute( +// path: '/pinSettingPage', +// builder: (context, state) => pinSettingPage(), +// ), +// GoRoute( +// path: '/pinPage', +// builder: (context, state) => pinPage(), +// ), +// GoRoute( +// path: '/changePin', +// builder: (context, state) => changePin(), +// ), +// GoRoute( +// path: '/claimprocess', +// builder: (context, state) => claimprocess(), +// ), +// GoRoute( +// path: '/policies', +// builder: (context, state) => policies(), +// ), +// GoRoute( +// path: '/claims', +// builder: (context, state) => claims(), +// ), +// GoRoute( +// path: '/profile', +// builder: (context, state) => profile(), +// ), +// GoRoute( +// path: '/help', +// builder: (context, state) => help(), +// ), +// GoRoute( +// path: '/wellness', +// builder: (context, state) => wellness(), +// ), +// GoRoute( +// path: '/planclaimsform', +// builder: (context, state) => planclaimsform(), +// ), +// GoRoute( +// path: '/privacypolicy', +// builder: (context, state) => privacypolicy(), +// ), +// GoRoute( +// path: '/termsofuse', +// builder: (context, state) => termsofuse(), +// ), +// GoRoute( +// path: '/generalExclusionsDeductibles', +// builder: (context, state) => generalExclusionsDeductibles(), +// ), +// GoRoute( +// path: '/chatbot()', +// builder: (context, state) => chatbot(), +// ), +// GoRoute( +// path: '/chatbot()', +// builder: (context, state) => chatbot(), +// ), +// GoRoute( +// path: '/tickettracklist', +// builder: (context, state) => tickettracklist( +// ticketID: "", +// ), +// ), +// GoRoute( +// path: '/empDetails()', +// builder: (context, state) => empDetails(), +// ), +// GoRoute( +// path: '/addOnsDetails()', +// builder: (context, state) => addOnsDetails(), +// ), +// GoRoute( +// path: '/empReviewDetails()', +// builder: (context, state) => empReviewDetails(), +// ), +// GoRoute( +// path: '/tickets()', +// builder: (context, state) => tickets(), +// ), +// GoRoute( +// path: '/raisedTicketHistory()', +// builder: (context, state) => raisedTicketHistory(), +// ), +// ], +// ); +// } +// } +// +// // +// // class AppRouter { +// // static GoRouter createRouter() { +// // return GoRouter( +// // initialLocation: kIsWeb ? null : '/splash', // 👈 null means use browser URL +// // debugLogDiagnostics: true, +// // redirect: (context, state) async { +// // const allowedWithoutToken = [ +// // '/splash', +// // '/pinPage', +// // '/mailVerify', +// // '/verify', +// // '/login', +// // ]; +// // +// // final location = state.matchedLocation; +// // +// // // ✅ allow these without token +// // if (allowedWithoutToken.contains(location)) { +// // return null; +// // } +// // +// // // ✅ Restore session on refresh (web & mobile) +// // await SessionManager().restoreSession(); +// // final hasToken = await TokenService.hasValidToken(); +// // +// // if (!hasToken) { +// // await SessionManager().clear(); +// // return '/login'; +// // } +// // +// // // ✅ Mobile pin logic +// // if (!kIsWeb) { +// // final prefs = await SharedPreferences.getInstance(); +// // if (prefs.containsKey('is_mpin_skipped')) { +// // final isMpinSkipped = prefs.getString('is_mpin_skipped'); +// // if (isMpinSkipped == '0' && location != '/pinPage') { +// // return '/pinPage'; +// // } +// // } +// // } +// // +// // return null; // stay on same page +// // }, +// // +// // routes: [ +// // if (!kIsWeb) +// // GoRoute( +// // path: '/splash', +// // builder: (context, state) => SplashScreen(), +// // ), +// // GoRoute( +// // path: '/login', +// // builder: (context, state) => login(), +// // ), +// // GoRoute( +// // path: '/mailVerify', +// // builder: (context, state) { +// // final email = state.extra as String; +// // return MyEmailVerify(email: email); +// // }, +// // ), +// // GoRoute( +// // path: '/verify', +// // builder: (context, state) { +// // final args = state.extra as Map; +// // return MyVerify( +// // verificationId: args['verificationId'] as String, +// // mobileNumber: args['mobileNumber'] as String, +// // resendToken: args['resendToken'], +// // onResendCode: args['onResendCode'] as Function(String, int?), +// // ); +// // }, +// // ), +// // GoRoute( +// // path: '/mailVerify', +// // builder: (context, state) => MyVerify( +// // verificationId: '', +// // mobileNumber: '', +// // resendToken: null, +// // onResendCode: (String, int) {}, +// // ), +// // ), +// // GoRoute( +// // path: '/home', +// // builder: (context, state) => Home(), +// // ), +// // GoRoute( +// // path: '/pinSettingPage', +// // builder: (context, state) => pinSettingPage(), +// // ), +// // GoRoute( +// // path: '/pinPage', +// // builder: (context, state) => pinPage(), +// // ), +// // GoRoute( +// // path: '/changePin', +// // builder: (context, state) => changePin(), +// // ), +// // GoRoute( +// // path: '/claimprocess', +// // builder: (context, state) => claimprocess(), +// // ), +// // GoRoute( +// // path: '/policies', +// // builder: (context, state) => policies(), +// // ), +// // GoRoute( +// // path: '/claims', +// // builder: (context, state) => claims(), +// // ), +// // GoRoute( +// // path: '/profile', +// // builder: (context, state) => profile(), +// // ), +// // GoRoute( +// // path: '/help', +// // builder: (context, state) => help(), +// // ), +// // GoRoute( +// // path: '/wellness', +// // builder: (context, state) => wellness(), +// // ), +// // GoRoute( +// // path: '/planclaimsform', +// // builder: (context, state) => planclaimsform(), +// // ), +// // GoRoute( +// // path: '/privacypolicy', +// // builder: (context, state) => privacypolicy(), +// // ), +// // GoRoute( +// // path: '/termsofuse', +// // builder: (context, state) => termsofuse(), +// // ), +// // GoRoute( +// // path: '/generalExclusionsDeductibles', +// // builder: (context, state) => generalExclusionsDeductibles(), +// // ), +// // GoRoute( +// // path: '/chatbot()', +// // builder: (context, state) => chatbot(), +// // ), +// // GoRoute( +// // path: '/chatbot()', +// // builder: (context, state) => chatbot(), +// // ), +// // GoRoute( +// // path: '/tickettracklist', +// // builder: (context, state) => tickettracklist( +// // ticketID: "", +// // ), +// // ), +// // GoRoute( +// // path: '/empDetails()', +// // builder: (context, state) => empDetails(), +// // ), +// // GoRoute( +// // path: '/addOnsDetails()', +// // builder: (context, state) => addOnsDetails(), +// // ), +// // GoRoute( +// // path: '/empReviewDetails()', +// // builder: (context, state) => empReviewDetails(), +// // ), +// // GoRoute( +// // path: '/tickets()', +// // builder: (context, state) => tickets(), +// // ), +// // GoRoute( +// // path: '/raisedTicketHistory()', +// // builder: (context, state) => raisedTicketHistory(), +// // ), +// // ], +// // ); +// // } +// // } +// // diff --git a/lib/pages/config/splashScreen.dart b/lib/pages/config/splashScreen.dart new file mode 100644 index 0000000..5167e56 --- /dev/null +++ b/lib/pages/config/splashScreen.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flutter/foundation.dart'; + +class SplashScreen extends StatefulWidget { + const SplashScreen({super.key}); + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + @override + void initState() { + super.initState(); + _navigate(); + } + + Future _navigate() async { + await Future.delayed(const Duration(seconds: 2)); + + final prefs = await SharedPreferences.getInstance(); + String nextRoute = '/login'; + + if (!kIsWeb) { + if (prefs.containsKey('is_mpin_skipped')) { + final isMpinSkipped = prefs.getString('is_mpin_skipped'); + if (isMpinSkipped == '0') { + nextRoute = '/pinPage'; + } else { + nextRoute = '/login'; + } + } + } + + + + if (mounted) { + context.go(nextRoute); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Image.asset('assets/nhance-loader.gif', width: 120, height: 120), + ), + ); + } +} diff --git a/lib/pages/email_verify.dart b/lib/pages/email_verify.dart index be54ec8..f8194cf 100755 --- a/lib/pages/email_verify.dart +++ b/lib/pages/email_verify.dart @@ -2,8 +2,11 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; +import 'package:nhance_app_pwa/pages/service/SessionManager.dart'; +import 'package:nhance_app_pwa/pages/service/TokenService.dart'; import 'package:pinput/pinput.dart'; import 'dart:async'; import 'package:flutter/gestures.dart'; @@ -26,12 +29,10 @@ if (dart.library.html) '../pages/helpers/html_web.dart'; // import '../pages/helpers/html_stub.dart' if (dart.library.html) 'html_web.dart'; class MyEmailVerify extends StatefulWidget { - final String email; + final String type; // 'email' or 'mobile' + final String value; - const MyEmailVerify({ - Key? key, - required this.email, - }) : super(key: key); + const MyEmailVerify({super.key, required this.type, required this.value}); @override State createState() => _MyEmailVerifyState(); @@ -57,12 +58,13 @@ class _MyEmailVerifyState extends State { dynamic empPrimaryId; dynamic gpaEmpName; dynamic client_id; - dynamic _token; + dynamic _preToken; dynamic _postToken; dynamic clientName; dynamic clientLogo; dynamic emp_status; - dynamic fCMToken; + String? fcmToken; + String? apnsToken; late String verificationId; final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; final FirebaseAuth _auth = FirebaseAuth.instance; @@ -71,6 +73,7 @@ class _MyEmailVerifyState extends State { late String _verificationId; dynamic empMobileNo; dynamic empEmailid; + late SessionManager session; @override void initState() { @@ -86,30 +89,81 @@ class _MyEmailVerifyState extends State { } Future initNotification() async { - await _firebaseMessaging.requestPermission(); - fCMToken = await _firebaseMessaging.getToken(); - print('Token : $fCMToken'); - sendDeviceToken(fCMToken); - FirebaseMessaging.onBackgroundMessage(handleBackgroundMessage); + try { + // Request permission + NotificationSettings settings = + await _firebaseMessaging.requestPermission( + alert: true, + badge: true, + sound: true, + ); + print('🔔 Permission: ${settings.authorizationStatus}'); + + if (Platform.isIOS || Platform.isMacOS) { + // Get APNS token + apnsToken = await _firebaseMessaging.getAPNSToken(); + print('📱 APNS Token (iOS): $apnsToken'); + + // Retry if null + if (apnsToken == null) { + await Future.delayed(const Duration(seconds: 3)); + apnsToken = await _firebaseMessaging.getAPNSToken(); + print('🔁 Retried APNS Token: $apnsToken'); + } + + if (apnsToken != null) { + await sendDeviceToken(apnsToken!); + } + } else if (Platform.isAndroid) { + // Get FCM token + fcmToken = await _firebaseMessaging.getToken(); + print('🔥 FCM Token (Android): $fcmToken'); + + if (fcmToken != null) { + await sendDeviceToken(fcmToken!); + } + } + + // Background handler + FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); + + // Foreground listener + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + print('💬 Message: ${message.notification?.title}'); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(message.notification?.title ?? 'New Notification')), + ); + }); + } catch (e) { + print('❌ Notification init error: $e'); + } } - Future handleBackgroundMessage(RemoteMessage message) async { - print('Title ${message.notification?.title}'); - print('Body ${message.notification?.body}'); - print('Playload ${message.data}'); - } + // Future initNotification() async { + // await _firebaseMessaging.requestPermission(); + // fCMToken = await _firebaseMessaging.getToken(); + // print('Token : $fCMToken'); + // sendDeviceToken(fCMToken); + // FirebaseMessaging.onBackgroundMessage(handleBackgroundMessage); + // } + // + // Future handleBackgroundMessage(RemoteMessage message) async { + // print('Title ${message.notification?.title}'); + // print('Body ${message.notification?.body}'); + // print('Playload ${message.data}'); + // } - void sendDeviceToken(deviceToken) async { + Future sendDeviceToken(deviceToken) async { // Retrieve the passed mobile number value - + final session = SessionManager(); try { final response = await http.post( Uri.parse(Environment.apiUrl + 'storeFireBase'), body: json - .encode({'email_id': widget.email, 'firebase_token': deviceToken}), + .encode({'mobile': session.mobileNo, 'firebase_token': deviceToken}), headers: { HttpHeaders.contentTypeHeader: 'application/json', - 'Authorization': 'Bearer $_token', + 'Authorization': 'Bearer $_preToken', }, ); @@ -147,11 +201,15 @@ class _MyEmailVerifyState extends State { void verifyOTP(String otp) async { try { - print('EMAIL PARAMS : ${widget.email} - OTP : $otp'); + // print('EMAIL PARAMS : ${widget.email} - OTP : $otp'); + final Map payload = (widget.type == 'mobile') + ? {'otp': _otpController.text,'mobile_number': widget.value} + : {'otp': _otpController.text, 'email_id': widget.value}; + final response = await http.post( Uri.parse(Environment.apiUrlEnrollment + 'getVerifiedUserData'), body: - json.encode({'email_id': widget.email, 'otp': _otpController.text}), + json.encode(payload), headers: { HttpHeaders.contentTypeHeader: 'application/json', }, @@ -163,14 +221,39 @@ class _MyEmailVerifyState extends State { }); Map data = json.decode(response.body); print('data: $data'); - _token = data['data']; + + /// Check API response status first + if (data['status'] == 'Invalid OTP') { + final SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.clear(); + ToastHelper.showErrorToast(context, data['message'] ?? 'Invalid OTP'); + print('API error → ${data['message']}'); + return; // stop execution + } + + // --- Extract tokens safely --- + String? preToken; + if (data['data'] is String) { + preToken = data['data']; + } + + String? postToken; + if (data['post_enrollment'] != null && data['post_enrollment']['data'] is String) { + postToken = data['post_enrollment']['data']; + } + + // Save tokens + await TokenService.saveTokens(preToken: preToken, postToken: postToken); + print('Tokens saved → preToken: $preToken, postToken: $postToken'); + + _preToken = preToken; String status = data['status']; // Directly access the post_enrollment data Map post = data['post_enrollment']; print('post: $post'); - _postToken = post['data']; + _postToken = postToken; String postStatus = post['status']; if (postStatus == 'success') { @@ -216,11 +299,11 @@ class _MyEmailVerifyState extends State { } void loginUser({ - required String gpaEmpName, - required String empPrimaryId, - required String empCodeString, - required String client_id, - required String empClientBranchId, + required dynamic gpaEmpName, + required dynamic empPrimaryId, + required dynamic empCodeString, + required dynamic client_id, + required dynamic empClientBranchId, }) { HtmlHelper.saveLoginData({ 'gpaEmpName': gpaEmpName, @@ -238,33 +321,37 @@ class _MyEmailVerifyState extends State { if (postStatus == 'success') { final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('_postToken', post['data']); + // prefs.setString('_postToken', post['data']); - // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(post['data']); - print('PostdecodedToken : $decodedToken'); - empClientBranchId = decodedToken['client_branch_id']; - prefs.setString('empClientBranchId', empClientBranchId); - empCodeString = decodedToken['emp_code'].toString(); - prefs.setString('empCode', empCodeString); - empPrimaryId = decodedToken['id']; - prefs.setString('empPrimaryId', empPrimaryId); - gpaEmpName = decodedToken['name'].toString(); - prefs.setString('gpaEmpName', gpaEmpName); - client_id = decodedToken['client_id']; - prefs.setString('client_id', client_id); - emp_status = decodedToken['emp_status']; - prefs.setString('emp_status', emp_status); - // getClientLogoAndDetails(); + await SessionManager().initializeFromPostToken(post['data']); + + session = await SessionManager(); + + // // Decode the JWT token received from the API response + // Map? decodedToken = Jwt.parseJwt(post['data']); + // print('PostdecodedToken : $decodedToken'); + // empClientBranchId = decodedToken['client_branch_id']; + // prefs.setString('empClientBranchId', empClientBranchId); + // empCodeString = decodedToken['emp_code'].toString(); + // prefs.setString('empCode', empCodeString); + // empPrimaryId = decodedToken['id']; + // prefs.setString('empPrimaryId', empPrimaryId); + // gpaEmpName = decodedToken['name'].toString(); + // prefs.setString('gpaEmpName', gpaEmpName); + // client_id = decodedToken['client_id']; + // prefs.setString('client_id', client_id); + // emp_status = decodedToken['emp_status']; + // prefs.setString('emp_status', emp_status); + // // getClientLogoAndDetails(); print('Successfully Login'); loginUser( - gpaEmpName: gpaEmpName, - empPrimaryId: empPrimaryId, - empCodeString: empCodeString, - client_id: client_id, - empClientBranchId: empClientBranchId, + gpaEmpName: session.gpaEmpName, + empPrimaryId: session.empPrimaryId, + empCodeString: session.empCodeString, + client_id: session.client_id, + empClientBranchId: session.empClientBranchId, ); // if (kIsWeb) { @@ -290,24 +377,26 @@ class _MyEmailVerifyState extends State { if (status == 'success') { final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('enrollToken', data['data']); + // prefs.setString('enrollToken', data['data']); + await SessionManager().initializeFromPreToken(data['data']); + session = await SessionManager(); // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(data['data']); - print('enrolldecodedToken : $decodedToken'); - enrollmentEmpClientBranchId = decodedToken['client_branch_id']; - prefs.setString( - 'enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); - enrollmentEmpCodeString = decodedToken['emp_code'].toString(); - prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); - enrollmentEmpPrimaryId = decodedToken['id']; - prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); - enrollmentGpaEmpName = decodedToken['name'].toString(); - prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); - enrollmentClient_id = decodedToken['client_id']; - prefs.setString('enrollmentClient_id', enrollmentClient_id); - enrollmentEmp_status = decodedToken['emp_status']; - prefs.setString('enrollmentEmp_status', enrollmentEmp_status); + // Map? decodedToken = Jwt.parseJwt(data['data']); + // print('enrolldecodedToken : $decodedToken'); + // enrollmentEmpClientBranchId = decodedToken['client_branch_id']; + // prefs.setString( + // 'enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); + // enrollmentEmpCodeString = decodedToken['emp_code'].toString(); + // prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); + // enrollmentEmpPrimaryId = decodedToken['id']; + // prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); + // enrollmentGpaEmpName = decodedToken['name'].toString(); + // prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); + // enrollmentClient_id = decodedToken['client_id']; + // prefs.setString('enrollmentClient_id', enrollmentClient_id); + // enrollmentEmp_status = decodedToken['emp_status']; + // prefs.setString('enrollmentEmp_status', enrollmentEmp_status); getClientLogoAndDetails(); } // @@ -329,25 +418,32 @@ class _MyEmailVerifyState extends State { // print('Successfully Login'); // } - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final _postToken = prefs.getString('_postToken'); + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // final _postToken = prefs.getString('_postToken'); // int skipStatus = prefs.getInt('skipStatus') ?? 1; // final mpinText = prefs.getString('mpinText'); - print(isMobilePlatform()); + // print(isMobilePlatform()); if (isMobilePlatform()) { // if (prefs.containsKey('mpin') && mpinText == 'Mpin - exist') { if (_postToken != null && _postToken.isNotEmpty) { final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('empEmailid', widget.email); + if(widget.type == 'mobile'){ + prefs.setString('empMobileNo', widget.value); + } else { + prefs.setString('empEmailid', widget.value); + } await initNotification(); checkLoginPin(context); } // } } else { if (_postToken != null && _postToken.isNotEmpty) { + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('empEmailid', widget.email); ToastHelper.showSuccessToast(context, 'Successfully Login'); // if (emp_status == 'enrolled' || emp_status == 'active') { - Navigator.pushReplacementNamed(context, 'home'); + context.go('/home'); + // Navigator.pushReplacementNamed(context, 'home'); // } else { // Navigator.pushReplacementNamed(context, 'empDetails'); // } @@ -357,48 +453,55 @@ class _MyEmailVerifyState extends State { void enrollmentSuccessData(data) async { final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('enrollToken', data['data']); + // prefs.setString('enrollToken', data['data']); + await SessionManager().initializeFromPreToken(data['data']); - // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(data['data']); - print('decodedToken : $decodedToken'); - enrollmentEmpClientBranchId = decodedToken['client_branch_id']; - prefs.setString('enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); - enrollmentEmpCodeString = decodedToken['emp_code'].toString(); - prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); - enrollmentEmpPrimaryId = decodedToken['id']; - prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); - enrollmentGpaEmpName = decodedToken['name'].toString(); - prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); - enrollmentClient_id = decodedToken['client_id']; - prefs.setString('enrollmentClient_id', enrollmentClient_id); - enrollmentEmp_status = decodedToken['emp_status']; - prefs.setString('enrollmentEmp_status', enrollmentEmp_status); + session = await SessionManager(); + // // Decode the JWT token received from the API response + // Map? decodedToken = Jwt.parseJwt(data['data']); + // print('decodedToken : $decodedToken'); + // enrollmentEmpClientBranchId = decodedToken['client_branch_id']; + // prefs.setString('enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); + // enrollmentEmpCodeString = decodedToken['emp_code'].toString(); + // prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); + // enrollmentEmpPrimaryId = decodedToken['id']; + // prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); + // enrollmentGpaEmpName = decodedToken['name'].toString(); + // prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); + // enrollmentClient_id = decodedToken['client_id']; + // prefs.setString('enrollmentClient_id', enrollmentClient_id); + // enrollmentEmp_status = decodedToken['emp_status']; + // prefs.setString('enrollmentEmp_status', enrollmentEmp_status); getClientLogoAndDetails(); print('Successfully Login'); // Redirect to another page - final enrollToken = prefs.getString('enrollToken'); + // final enrollToken = prefs.getString('enrollToken'); // int skipStatus = prefs.getInt('skipStatus') ?? 1; // final mpinText = prefs.getString('mpinText'); print(isMobilePlatform()); if (isMobilePlatform()) { // if (prefs.containsKey('mpin') && mpinText == 'Mpin - exist') { - if (enrollToken != null && enrollToken.isNotEmpty) { + if (_preToken != null && _preToken.isNotEmpty) { final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('empEmailid', widget.email); + if(widget.type == 'mobile'){ + prefs.setString('empMobileNo', widget.value); + } else { + prefs.setString('empEmailid', widget.value); + } await initNotification(); checkLoginPin(context); } // } } else { - if (enrollToken != null && enrollToken.isNotEmpty) { + if (_preToken != null && _preToken.isNotEmpty) { ToastHelper.showSuccessToast(context, 'Successfully Login'); // if (emp_status == 'enrolled' || emp_status == 'active') { // Navigator.pushReplacementNamed(context, 'home'); // } else { - Navigator.pushReplacementNamed(context, 'empDetails'); + context.go('/empDetails'); + // Navigator.pushReplacementNamed(context, 'empDetails'); // } } } @@ -406,6 +509,7 @@ class _MyEmailVerifyState extends State { void _resendOTP() { setState(() { + _otpController.text = ''; _secondsRemaining = 60; _isTimerRunning = true; }); @@ -416,9 +520,17 @@ class _MyEmailVerifyState extends State { Future verifyMobileAndEmailNumber() async { try { // var enteredMobileNumber = mobileController.text; + final Map payload = (widget.type == 'mobile') + ? {'mobile_number': widget.value} + : {'email': widget.value}; + + String apiEndpoint = (widget.type == 'mobile') + ? Environment.apiUrlEnrollment + 'verifyEmployeeNumber' + : Environment.apiUrlEnrollment + 'verifyEmployeeEmailId'; + final response = await http.post( - Uri.parse(Environment.apiUrl + 'verifyEmployeeEmailId'), - body: json.encode({'email': widget.email}), + Uri.parse(apiEndpoint), + body: json.encode(payload), headers: { HttpHeaders.contentTypeHeader: 'application/json', }, @@ -429,8 +541,14 @@ class _MyEmailVerifyState extends State { bool userVerification = data['data']['user_verification']; String message = data['data']['message']; if (userVerification) { - ToastHelper.showSuccessToast( - context, 'Verification code sent to ${widget.email}'); + if(widget.type == 'mobile'){ + ToastHelper.showSuccessToast( + context, 'Verification code sent to ${widget.value}'); + } else { + ToastHelper.showSuccessToast( + context, 'Verification code sent to ${widget.value}'); + } + } else { ToastHelper.showErrorToast(context, message); print('Invalid mobile number'); @@ -491,19 +609,32 @@ class _MyEmailVerifyState extends State { prefs.setString('is_mpin_skipped', data['is_mpin_skipped']); } - if (data['is_mpin_skipped'] != null && - data['is_mpin_skipped'] == '0') { - Navigator.pushReplacementNamed(context, 'pinPage'); + if (_postToken != null && _postToken.isNotEmpty) { + ToastHelper.showSuccessToast(context, 'Successfully Login'); + context.go('/home'); + // Navigator.pushReplacementNamed(context, 'home'); } else { - if (_postToken != null && _postToken.isNotEmpty) { - ToastHelper.showSuccessToast(context, 'Successfully Login'); - Navigator.pushReplacementNamed(context, 'home'); - } else { - Navigator.pushReplacementNamed(context, 'empDetails'); - } + context.go('/empDetails'); + // Navigator.pushReplacementNamed(context, 'empDetails'); } + + // if (data['is_mpin_skipped'] != null && + // data['is_mpin_skipped'] == '0') { + // context.go('/pinPage'); + // // Navigator.pushReplacementNamed(context, 'pinPage'); + // } else { + // if (_postToken != null && _postToken.isNotEmpty) { + // ToastHelper.showSuccessToast(context, 'Successfully Login'); + // context.go('/home'); + // // Navigator.pushReplacementNamed(context, 'home'); + // } else { + // context.go('/empDetails'); + // // Navigator.pushReplacementNamed(context, 'empDetails'); + // } + // } } else { - Navigator.pushReplacementNamed(context, 'pinSettingPage'); + context.go('/pinSettingPage'); + // Navigator.pushReplacementNamed(context, 'pinSettingPage'); } } else { ToastHelper.showErrorToast(context, 'Something went wrong'); @@ -516,14 +647,13 @@ class _MyEmailVerifyState extends State { } Future getClientLogoAndDetails() async { - var url = Uri.parse(Environment.apiUrlEnrollment + - 'getClientDetails?client_id=$enrollmentClient_id&emp_code=$enrollmentEmpCodeString&client_branch_id=$enrollmentEmpClientBranchId'); + var url = Uri.parse(Environment.apiUrlEnrollment + 'getClientDetails?post_client_id=${session.client_id}&post_branch_id=${session.empClientBranchId}&pre_client_id=${session.enrollmentClient_id}&pre_branch_id=${session.enrollmentEmpClientBranchId}'); try { var response = await http.get( url, headers: { 'Authorization': - 'Bearer $_token', // Add token to the Authorization header + 'Bearer $_preToken', // Add token to the Authorization header }, ); if (response.statusCode == 200) { @@ -620,7 +750,8 @@ class _MyEmailVerifyState extends State { return WillPopScope( onWillPop: () async { - Navigator.pushReplacementNamed(context, 'login'); + context.go('/login'); + // Navigator.pushReplacementNamed(context, 'login'); return false; }, child: Scaffold( @@ -676,10 +807,9 @@ class _MyEmailVerifyState extends State { cursor: SystemMouseCursors.click, child: GestureDetector( onTap: () { - // Add your navigation logic here - // For example, you can use Navigator.push to navigate to another page - Navigator.pushNamed( - context, 'hrLogin'); + context.go('/hrLogin'); + // Navigator.pushNamed( + // context, 'hrLogin'); }, child: Row( mainAxisAlignment: MainAxisAlignment @@ -803,24 +933,27 @@ class _MyEmailVerifyState extends State { textAlign: TextAlign.center, text: TextSpan( text: - "Please enter the one-time usage code sent to your mobile number ${widget.email}", + "Please enter the one-time usage code sent to your ", style: TextStyle( fontSize: 12, height: 1.5, color: Color(0xFF000000)), children: [ TextSpan( - text: " (Change Email)", + text: widget.type == 'mobile' ? 'mobile number ${widget.value}' : 'Email Id ${widget.value}', + ), + TextSpan( + text: widget.type == 'mobile' ? ' (Change Mobile)' : ' (Change Email)', style: TextStyle( fontSize: 12, color: Color( - 0xFFE26728)), // Change color as desired - recognizer: - TapGestureRecognizer() + 0xFFE26728) + ), // Change color as desired + recognizer: TapGestureRecognizer() ..onTap = () { - // Navigate to the page where the user can change the phone number - Navigator.pushNamed( - context, 'login'); + context.go('/login'); + // Navigator.pushNamed( + // context, 'login'); }, ), ], @@ -1105,4 +1238,13 @@ class _MyEmailVerifyState extends State { )), ))); } +} + +// ✅ Must be outside any class — this fixes your error +@pragma('vm:entry-point') +Future firebaseMessagingBackgroundHandler(RemoteMessage message) async { + print('📨 Handling background message: ${message.messageId}'); + print('Title: ${message.notification?.title}'); + print('Body: ${message.notification?.body}'); + print('Data: ${message.data}'); } \ No newline at end of file diff --git a/lib/pages/enrollment/addons.dart b/lib/pages/enrollment/addons.dart index cdcef70..8c2a189 100755 --- a/lib/pages/enrollment/addons.dart +++ b/lib/pages/enrollment/addons.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:nhance_app_pwa/pages/enrollment/service/api_service.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -17,6 +18,8 @@ import 'package:intl/intl.dart'; import 'package:url_launcher/url_launcher.dart'; import '../postEnrollment/chatbot.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; class addOnsDetails extends StatefulWidget { const addOnsDetails({Key? key}) : super(key: key); @@ -38,7 +41,7 @@ class _addOnsDetailsState extends State { bool isChecked = false; bool disclaimeStatus = false; bool _addOnsDependentSwitcher = - false; + false; // bool isPremiumSummery = false; bool _topUpSiSwitcher = false; bool _topUpParentSiSwitcher = false; @@ -153,10 +156,11 @@ class _addOnsDetailsState extends State { dynamic gpaTotalAmt; dynamic gmcTotalAmt; List> allDisclaimer = - []; // Declare this to store all disclaimers + []; // Declare this to store all disclaimers late List checkboxValues; bool isTokenAvailable = false; bool isEnrollCompletedStatus = false; + final session = SessionManager(); @override void initState() { @@ -184,9 +188,9 @@ class _addOnsDetailsState extends State { } Future getTokenStatus() async { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - setState(() { - isTokenAvailable = prefs.getString('_postToken') != null; + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + setState(() async { + isTokenAvailable = (await TokenService.getPostToken())?.isNotEmpty ?? false; }); } @@ -209,22 +213,18 @@ class _addOnsDetailsState extends State { } Future _loadToken() async { + print('_loadToken'); final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('enrollToken'); + final String? token = await TokenService.getPreToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); - // Decode th e JWT token received from the API response Map? decodedToken = Jwt.parseJwt(token); selfEmpStatus = prefs.getString('selfEmpStatus'); - enrollmentEmpClientBranchId = - prefs.getString('enrollmentEmpClientBranchId'); - enrollmentEmpCodeString = prefs.getString('enrollmentEmpCodeString'); - enrollmentEmpPrimaryId = prefs.getString('enrollmentEmpPrimaryId'); - enrollmentGpaEmpName = prefs.getString('enrollmentGpaEmpName'); - enrollmentClient_id = prefs.getString('enrollmentClient_id'); + enrollmentEmpClientBranchId = session.enrollmentEmpClientBranchId; + enrollmentEmpCodeString = session.enrollmentEmpCodeString; + enrollmentEmpPrimaryId = session.enrollmentEmpPrimaryId; + enrollmentGpaEmpName = session.enrollmentGpaEmpName; + enrollmentClient_id = session.enrollmentClient_id; // Call the API when the page enters if (prefs.containsKey('clientLogo') && prefs.containsKey('clientName')) { @@ -240,13 +240,49 @@ class _addOnsDetailsState extends State { fetchRelationshipList(); getGpaEmpPolicyDetails(enrollmentEmpPrimaryId); getGmcEmpPolicyDetails(enrollmentEmpPrimaryId); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } + // Future _loadToken() async { + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // final String? token = prefs.getString('enrollToken'); + // if (token != null && token.isNotEmpty) { + // setState(() { + // _token = token; + // }); + // // Decode th e JWT token received from the API response + // Map? decodedToken = Jwt.parseJwt(token); + // + // selfEmpStatus = prefs.getString('selfEmpStatus'); + // enrollmentEmpClientBranchId = + // prefs.getString('enrollmentEmpClientBranchId'); + // enrollmentEmpCodeString = prefs.getString('enrollmentEmpCodeString'); + // enrollmentEmpPrimaryId = prefs.getString('enrollmentEmpPrimaryId'); + // enrollmentGpaEmpName = prefs.getString('enrollmentGpaEmpName'); + // enrollmentClient_id = prefs.getString('enrollmentClient_id'); + // + // // Call the API when the page enters + // if (prefs.containsKey('clientLogo') && prefs.containsKey('clientName')) { + // clientLogo = prefs.getString('clientLogo'); + // clientName = prefs.getString('clientName'); + // addon_subheading = prefs.getString('addon_subheading'); + // } else { + // getClientLogoAndDetails(); + // } + // getGmcSiTopUp(); + // getGmcSiParentTopUp(); + // getGmcDependentAddOns(); + // fetchRelationshipList(); + // getGpaEmpPolicyDetails(enrollmentEmpPrimaryId); + // getGmcEmpPolicyDetails(enrollmentEmpPrimaryId); + // } else { + // // Token is empty or null, handle accordingly (e.g., navigate to login screen) + // ToastHelper.showErrorToast(context, 'Session Out'); + // context.go('/login'); + // // Navigator.pushReplacementNamed(context, 'login'); + // } + // } + Future getClientLogoAndDetails() async { try { if (enrollmentClient_id == null || @@ -315,11 +351,11 @@ class _addOnsDetailsState extends State { newEntries.addAll( List>.from( disclaimer.map((text) => { - 'id': allDisclaimer.length + newEntries.length + 1, - 'text': text, - 'checked': false, - 'type': item['type'] - }), + 'id': allDisclaimer.length + newEntries.length + 1, + 'text': text, + 'checked': false, + 'type': item['type'] + }), ), ); } else { @@ -390,11 +426,11 @@ class _addOnsDetailsState extends State { newEntries.addAll( List>.from( disclaimer.map((text) => { - 'id': allDisclaimer.length + newEntries.length + 1, - 'text': text, - 'checked': false, - 'type': item['type'] - }), + 'id': allDisclaimer.length + newEntries.length + 1, + 'text': text, + 'checked': false, + 'type': item['type'] + }), ), ); } else { @@ -448,42 +484,42 @@ class _addOnsDetailsState extends State { if (topUpSiPolicies.isNotEmpty) { // setState(() { topUpClientPolicyId = - await topUpSiPolicies['gmc_si_topup']['client_policy_id']; + await topUpSiPolicies['gmc_si_topup']['client_policy_id']; topUpSlabRates = await topUpSiPolicies['gmc_si_topup']['SlabRates']; topUpPolicyName = - await topUpSiPolicies['gmc_si_topup']['policy_name']; + await topUpSiPolicies['gmc_si_topup']['policy_name']; topUpPolicyType = await topUpSiPolicies['gmc_si_topup']['type']; topUpFamilyFloater = await topUpSiPolicies['gmc_si_topup'] - ['policy_terms']['family_floater']; + ['policy_terms']['family_floater']; topUpMappedFamilyFloatersSi = await topUpSiPolicies['gmc_si_topup'] - ['family_floaters_of_only_si_array']; + ['family_floaters_of_only_si_array']; topUpECardDownload = - topUpSiPolicies['gmc_si_topup']['eCardDownload']; + topUpSiPolicies['gmc_si_topup']['eCardDownload']; String intOpenForEnrollment = - topUpSiPolicies['gmc_si_topup']['OpenForEnrollment']; + topUpSiPolicies['gmc_si_topup']['OpenForEnrollment']; topUpOpenForEnrollment = int.parse(intOpenForEnrollment); topUpTypeName = topUpSiPolicies['gmc_si_topup']['type']; topUpSiValue = await topUpSiPolicies['gmc_si_topup'] - ['family_floaters_of_only_si_value']; + ['family_floaters_of_only_si_value']; topUpSiSelectedSI = - topUpSiValue != 0 ? topUpSiValue.toString() : null; + topUpSiValue != 0 ? topUpSiValue.toString() : null; if (topUpSiSelectedSI != null) { setState(() { _topUpSiSwitcher = true; topUpSiPremiumValue = (topUpSiPolicies['gmc_si_topup'] - ['family_floaters_of_only_si_premium_value'] as double) + ['family_floaters_of_only_si_premium_value'] as double) .toInt(); topUpSiPremiumGst = (topUpSiPolicies['gmc_si_topup'] - ['family_floaters_of_only_si_gst_value'] as double) + ['family_floaters_of_only_si_gst_value'] as double) .toInt(); topUpSiTotalAmt = topUpSiPremiumValue + topUpSiPremiumGst; @@ -531,54 +567,54 @@ class _addOnsDetailsState extends State { if (topUpSiParentPolicies.isNotEmpty) { // setState(() { topUpParentClientPolicyId = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['client_policy_id']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['client_policy_id']; topUpParentSlabRates = - await topUpSiParentPolicies['gmc_si_parent_topup']['SlabRates']; + await topUpSiParentPolicies['gmc_si_parent_topup']['SlabRates']; topUpParentPolicyName = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['policy_name']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['policy_name']; topUpParentPolicyType = - await topUpSiParentPolicies['gmc_si_parent_topup']['type']; + await topUpSiParentPolicies['gmc_si_parent_topup']['type']; topUpParentFamilyFloater = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['policy_terms']['family_floater']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['policy_terms']['family_floater']; topUpParentMappedFamilyFloatersSi = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['family_floaters_of_only_si_array']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['family_floaters_of_only_si_array']; topUpParentECardDownload = - topUpSiParentPolicies['gmc_si_parent_topup']['eCardDownload']; + topUpSiParentPolicies['gmc_si_parent_topup']['eCardDownload']; String intOpenForEnrollment = - topUpSiParentPolicies['gmc_si_parent_topup'] - ['OpenForEnrollment']; + topUpSiParentPolicies['gmc_si_parent_topup'] + ['OpenForEnrollment']; topUpParentOpenForEnrollment = int.parse(intOpenForEnrollment); topUpParentTypeName = - topUpSiParentPolicies['gmc_si_parent_topup']['type']; + topUpSiParentPolicies['gmc_si_parent_topup']['type']; topUpParentSiValue = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['family_floaters_of_only_si_value']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['family_floaters_of_only_si_value']; topUpParentSiSelectedSI = - topUpParentSiValue != 0 ? topUpParentSiValue.toString() : null; + topUpParentSiValue != 0 ? topUpParentSiValue.toString() : null; if (topUpParentSiSelectedSI != null) { setState(() { _topUpParentSiSwitcher = true; topUpParentSiPremiumValue = (topUpSiParentPolicies['gmc_si_parent_topup'] - ['family_floaters_of_only_si_premium_value'] - as double) + ['family_floaters_of_only_si_premium_value'] + as double) .toInt(); topUpParentSiPremiumGst = (topUpSiParentPolicies['gmc_si_parent_topup'] - ['family_floaters_of_only_si_gst_value'] as double) + ['family_floaters_of_only_si_gst_value'] as double) .toInt(); topUpParentSiTotalAmt = @@ -627,40 +663,40 @@ class _addOnsDetailsState extends State { if (addOnsDependentPolicies.isNotEmpty) { // setState(() { addOnsDependentClientPolicyId = - addOnsDependentPolicies['gmc_dependent_addon'] - ['client_policy_id']; + addOnsDependentPolicies['gmc_dependent_addon'] + ['client_policy_id']; print('1 $addOnsDependentClientPolicyId'); addOnsDependentSlabRates = - await addOnsDependentPolicies['gmc_dependent_addon'] - ['SlabRates']; + await addOnsDependentPolicies['gmc_dependent_addon'] + ['SlabRates']; print('2 $addOnsDependentSlabRates'); addOnsDependentPolicyName = - await addOnsDependentPolicies['gmc_dependent_addon'] - ['policy_name']; + await addOnsDependentPolicies['gmc_dependent_addon'] + ['policy_name']; print('3 $addOnsDependentPolicyName'); addOnsDependentPolicyType = - await addOnsDependentPolicies['gmc_dependent_addon']['type']; + await addOnsDependentPolicies['gmc_dependent_addon']['type']; print('4 $addOnsDependentPolicyType'); addOnsDependentFamilyFloater = - await addOnsDependentPolicies['gmc_dependent_addon'] - ['policy_terms']['family_floater']; + await addOnsDependentPolicies['gmc_dependent_addon'] + ['policy_terms']['family_floater']; print('5 $addOnsDependentFamilyFloater'); setState(() { addOnsDependentMappedFamilyFloatersDependent = - addOnsDependentPolicies['gmc_dependent_addon'] - ['family_floaters_of_dependent_and_si_array']; + addOnsDependentPolicies['gmc_dependent_addon'] + ['family_floaters_of_dependent_and_si_array']; print('6 $addOnsDependentMappedFamilyFloatersDependent'); String intOpenForEnrollment = - addOnsDependentPolicies['gmc_dependent_addon'] - ['OpenForEnrollment']; + addOnsDependentPolicies['gmc_dependent_addon'] + ['OpenForEnrollment']; print('7 $intOpenForEnrollment'); addOnsDependentOpenForEnrollment = int.parse(intOpenForEnrollment); print('8 $addOnsDependentOpenForEnrollment'); addOnsdependentValue = - addOnsDependentPolicies['gmc_dependent_addon'] - ['family_floaters_of_dependent_and_si_value']; + addOnsDependentPolicies['gmc_dependent_addon'] + ['family_floaters_of_dependent_and_si_value']; print('9 $addOnsdependentValue'); // final checkValue = addOnsdependentValue + // addOnsDependentPolicies['gmc_dependent_addon'] @@ -687,24 +723,24 @@ class _addOnsDetailsState extends State { _addOnsDependentSwitcher = true; } addOnDependentPremiumValue = (addOnsDependentPolicies[ - 'gmc_dependent_addon'] - ['family_floaters_of_dependent_and_si_premium_value'] - as double) + 'gmc_dependent_addon'] + ['family_floaters_of_dependent_and_si_premium_value'] + as double) .toInt(); ; addOnsDependentPremiumGst = (addOnsDependentPolicies['gmc_dependent_addon'] - ['family_floaters_of_dependent_and_gst_value'] - as double) + ['family_floaters_of_dependent_and_gst_value'] + as double) .toInt(); addOnsDependentTotalAmt = addOnDependentPremiumValue + addOnsDependentPremiumGst; addOnsDependentECardDownload = - addOnsDependentPolicies['gmc_dependent_addon'] - ['eCardDownload']; + addOnsDependentPolicies['gmc_dependent_addon'] + ['eCardDownload']; addOnsDependentIsPremiumSummery = addOnsDependentPolicies['gmc_dependent_addon']['is_premium_summery']; print('addOnsDependentIsPremiumSummery $addOnsDependentIsPremiumSummery'); @@ -758,9 +794,9 @@ class _addOnsDetailsState extends State { Future _selectDate(BuildContext context, formType) async { var ageValidation = formType['age_validation']; int min = - int.parse(ageValidation['min']); // Parsing the string to an integer + int.parse(ageValidation['min']); // Parsing the string to an integer int max = - int.parse(ageValidation['max']); // Parsing the string to an integer + int.parse(ageValidation['max']); // Parsing the string to an integer late DateTime minDate; late DateTime maxDate; @@ -915,7 +951,7 @@ class _addOnsDetailsState extends State { // Iterate through familyMembers list and send each member's data to the API final response = - await apiService.sendAddonsGmcDependentToAPI(selectedValues); + await apiService.sendAddonsGmcDependentToAPI(selectedValues); if (response['status'] == 'success') { // Member saved successfully @@ -974,7 +1010,7 @@ class _addOnsDetailsState extends State { } final response = - await apiService.sendAddonsGmcSiToAPI(selectedValues); + await apiService.sendAddonsGmcSiToAPI(selectedValues); if (response['status'] == 'success') { // Member saved successfully @@ -1033,7 +1069,7 @@ class _addOnsDetailsState extends State { } final response = - await apiService.sendAddonsGmcParentSiToAPI(selectedValues); + await apiService.sendAddonsGmcParentSiToAPI(selectedValues); if (response['status'] == 'success') { // Member saved successfully @@ -1181,7 +1217,7 @@ class _addOnsDetailsState extends State { // Iterate through familyMembers list and send each member's data to the API final response = - await apiService.topUpParentSiCalculationToAPI(calculation); + await apiService.topUpParentSiCalculationToAPI(calculation); if (response['status'] == 'success') { List? topUpEmpArray; @@ -1239,7 +1275,7 @@ class _addOnsDetailsState extends State { // Iterate through familyMembers list and send each member's data to the API final response = - await apiService.addOnsDependentCalculationToAPI(calculation); + await apiService.addOnsDependentCalculationToAPI(calculation); if (response['status'] == 'success') { List? addOnsEmpArray; @@ -1350,7 +1386,8 @@ class _addOnsDetailsState extends State { Navigator.pushNamed(context, 'empDetails', arguments: {'mobile': mobileNo}); } else { - Navigator.pushNamed(context, 'empDetails'); + context.go('/empDetails'); + // Navigator.pushNamed(context, 'empDetails'); } } @@ -1394,6 +1431,17 @@ class _addOnsDetailsState extends State { setState(() { isEnrollCompletedStatus = true; }); + + // Wait 3 seconds, then navigate to home page + Future.delayed(const Duration(seconds: 3), () { + if(isTokenAvailable) { + context.go('/home'); + // Navigator.pushNamed(context, 'home'); + } else { + context.go('/empDetails'); + // Navigator.pushNamed(context, 'empDetails'); + } + }); // showDialog( // context: context, // builder: (BuildContext context) { @@ -1450,7 +1498,7 @@ class _addOnsDetailsState extends State { ), ), onPressed: () { - Navigator.of(context).pop(); + context.pop(); }, ), ], @@ -1488,10 +1536,109 @@ class _addOnsDetailsState extends State { return total; } + void _showExitConfirmation(BuildContext context) { + double myheight = MediaQuery.of(context).size.height; + showDialog( + context: context, + barrierDismissible: false, // User must tap a button to dismiss dialog + builder: (dialogContext) => AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), // Rounded corners + ), + backgroundColor: Colors.white, + contentPadding: EdgeInsets.zero, + title: Text( + 'Log Out Confirmation', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + content: Padding( + padding: const EdgeInsets.all(20.0), + child: Text( + 'Are you sure you want to log out?', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 18, + color: Color(0xFF898C81), + ), + ), + ), + actions: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, // Space buttons evenly + children: [ + SizedBox( + width: + MediaQuery.of(context).size.width * 0.3, // Set button width + child: TextButton( + onPressed: () => Navigator.pop(dialogContext), + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + side: BorderSide( + color: Color(0xFFE26728), // Border color + width: 1, + ), + ), + child: Text( + 'Cancel', + style: GoogleFonts.poppins( + color: Color(0xFFE26728), + fontSize: 16, + ), + ), + ), + ), + SizedBox( + width: + MediaQuery.of(context).size.width * 0.3, // Set button width + child: TextButton( + onPressed: () => TokenService().logout(context), + style: TextButton.styleFrom( + backgroundColor: Color(0xFFE26728), // Background color + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + ), + child: FittedBox( + fit: BoxFit + .scaleDown, // Prevents wrapping while adjusting text size + child: Text( + 'Log Out', + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 16, + ), + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + SizedBox(height: 10), // Add spacing below buttons + ], + ), + ); + } + @override Widget build(BuildContext context) { if (gpaDataIsEmpty == 0 && gmcDataIsEmpty == 0) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/empDetails'); + }, + child: Scaffold( appBar: CustomAppBar(), body: Center( child: Container( @@ -1505,7 +1652,8 @@ class _addOnsDetailsState extends State { ), ), ), - ); + ) + ); } else { List familyFloaterContainers = []; if (addOnsDependentMappedFamilyFloatersDependent != null) { @@ -1569,7 +1717,7 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 18 : 16, + Responsive.isDesktop(context) ? 18 : 16, fontWeight: FontWeight.w600, ), ), @@ -1578,7 +1726,7 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 18 : 14, + Responsive.isDesktop(context) ? 18 : 14, ), ), ], @@ -1608,9 +1756,9 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) - ? 16 - : 15, + Responsive.isDesktop(context) + ? 16 + : 15, color: Color( 0xFFE26728), // Add underline decoration ), @@ -1625,13 +1773,13 @@ class _addOnsDetailsState extends State { if (addOnsDependentECardDownload == null) Expanded( flex: (isValueExist && - floaterData['relationship'] != 'Self') + floaterData['relationship'] != 'Self') ? Responsive.isDesktop(context) - ? 1 - : 2 + ? 1 + : 2 : Responsive.isDesktop(context) - ? 2 - : 4, + ? 2 + : 4, child: Container( alignment: Alignment.topRight, child: Column( @@ -1736,7 +1884,7 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 22 : 18, + Responsive.isDesktop(context) ? 22 : 18, fontWeight: FontWeight.w500, ), ), @@ -1754,7 +1902,13 @@ class _addOnsDetailsState extends State { } } - return isEnrollCompletedStatus == true ? Scaffold( + return isEnrollCompletedStatus == true ? PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + _showExitConfirmation(context); + }, + child: Scaffold( backgroundColor: const Color(0xFFF2F6FA), // Matches your light gray background appBar: CustomAppBar(), body: Center( @@ -1819,21 +1973,25 @@ class _addOnsDetailsState extends State { : null, bottomNavigationBar: Responsive.isDesktop(context) ? null - : isTokenAvailable - ? CustomBottomNavigationBar( + : CustomBottomNavigationBar( onTabChanged: (index) { // Add your navigation logic here // For example: if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); + // Navigator.pushNamed(context, 'home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); + // Navigator.pushNamed(context, 'claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.go('/profile'); + // Navigator.pushNamed(context, 'profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.go('/help'); + // Navigator.pushNamed(context, 'help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + context.go('/wellness'); + // Navigator.pushNamed(context, 'wellness'); } }, icons: [ @@ -1845,27 +2003,32 @@ class _addOnsDetailsState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "wellness", ], initialIndex: 0, // Initial index of the bottom navigation bar - ) - : null, - ) : Scaffold( + ), + ) ) : PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/empDetails'); + }, + child: Scaffold( appBar: CustomAppBar(), body: Stack(children: [ SingleChildScrollView( child: Container( padding: Responsive.isDesktop(context) ? EdgeInsets.symmetric( - horizontal: MediaQuery.of(context).size.width * - 0.2, // 30% of screen width as horizontal padding - vertical: MediaQuery.of(context).size.height * - 0.03, // 5% of screen height as vertical padding - ) + horizontal: MediaQuery.of(context).size.width * + 0.2, // 30% of screen width as horizontal padding + vertical: MediaQuery.of(context).size.height * + 0.03, // 5% of screen height as vertical padding + ) : EdgeInsets.all(10), color: Color(0xFFEFF3F6), child: Column( @@ -1878,12 +2041,12 @@ class _addOnsDetailsState extends State { height: 80, padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 20, bottom: 20, left: 30, right: 30) + top: 20, bottom: 20, left: 30, right: 30) : EdgeInsets.only( - top: 12, - bottom: 12, - left: 10, - right: 10), // Add padding to the container + top: 12, + bottom: 12, + left: 10, + right: 10), // Add padding to the container child: Row( children: [ Expanded( @@ -1932,7 +2095,7 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 20 : 18, + Responsive.isDesktop(context) ? 20 : 18, fontWeight: FontWeight.w600, ), ), @@ -1979,21 +2142,21 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Text( 'Add-On Coverage', textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 20 - : 18, + Responsive.isDesktop( + context) + ? 20 + : 18, fontWeight: - FontWeight.w600, + FontWeight.w600, color: Color(0xFF181818)), ), Text( @@ -2001,10 +2164,10 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 15, + Responsive.isDesktop( + context) + ? 18 + : 15, color: Color(0xFF181818), ), ), @@ -2030,51 +2193,51 @@ class _addOnsDetailsState extends State { children: [ Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Expanded( flex: Responsive.isDesktop( - context) + context) ? 6 : 8, child: Container( alignment: - Alignment.centerLeft, + Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment - .start, + MainAxisAlignment + .start, crossAxisAlignment: - CrossAxisAlignment - .start, + CrossAxisAlignment + .start, children: [ Text( Responsive.isDesktop( - context) + context) ? addOnsDependentPolicyName : addOnsDependentPolicyType, textAlign: - TextAlign.left, + TextAlign.left, style: GoogleFonts .poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 20 : 16, fontWeight: - FontWeight.w600, + FontWeight.w600, ), ), Text( '', textAlign: - TextAlign.left, + TextAlign.left, style: GoogleFonts .poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 18 : 14, ), @@ -2088,25 +2251,25 @@ class _addOnsDetailsState extends State { child: Container( width: 50, alignment: - Alignment.center, + Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ IgnorePointer( ignoring: (addOnsDependentOpenForEnrollment == - 0 || + 0 || (addOnsDependentOpenForEnrollment != - 0 && + 0 && addOnsDependentECardDownload != null)), child: - DropdownButtonFormField< - String>( + DropdownButtonFormField< + String>( onChanged: (value) { setState(() { @@ -2119,35 +2282,35 @@ class _addOnsDetailsState extends State { // 'Edit'); }, decoration: - InputDecoration( + InputDecoration( border: - OutlineInputBorder(), + OutlineInputBorder(), hintText: - 'Sum Insured', + 'Sum Insured', labelText: - 'Sum Insured', + 'Sum Insured', contentPadding: - EdgeInsets.symmetric( - vertical: - 5, - horizontal: - 5), + EdgeInsets.symmetric( + vertical: + 5, + horizontal: + 5), ), value: - addOnsSelectedDependent, + addOnsSelectedDependent, items: (addOnsDependentSlabRates ?? - []) + []) .map>( (addOn) { - return DropdownMenuItem< - String>( - value: addOn[ - 'si'] - .toString(), - child: Text( - '₹ ${addOn['si']}'), - ); - }).toList(), + return DropdownMenuItem< + String>( + value: addOn[ + 'si'] + .toString(), + child: Text( + '₹ ${addOn['si']}'), + ); + }).toList(), ), ) ], @@ -2156,31 +2319,31 @@ class _addOnsDetailsState extends State { flex: 3, child: Container( alignment: - Alignment.centerRight, + Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.end, + MainAxisAlignment.end, crossAxisAlignment: - CrossAxisAlignment - .end, + CrossAxisAlignment + .end, children: [ Switch( value: - _addOnsDependentSwitcher, + _addOnsDependentSwitcher, onChanged: (addOnsDependentOpenForEnrollment == - 0 || - (addOnsDependentOpenForEnrollment != - 0 && - addOnsDependentECardDownload != - null)) + 0 || + (addOnsDependentOpenForEnrollment != + 0 && + addOnsDependentECardDownload != + null)) ? null : (value) { - setState(() { - _addOnsDependentSwitcher = - value; - // Add your logic here based on the toggle state - }); - }, + setState(() { + _addOnsDependentSwitcher = + value; + // Add your logic here based on the toggle state + }); + }, activeColor: Colors .green, // Color when the switch is ON inactiveTrackColor: Colors @@ -2201,25 +2364,25 @@ class _addOnsDetailsState extends State { child: Container( width: 50, alignment: - Alignment.center, + Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ IgnorePointer( ignoring: (addOnsDependentOpenForEnrollment == - 0 || + 0 || (addOnsDependentOpenForEnrollment != - 0 && + 0 && addOnsDependentECardDownload != null)), child: - DropdownButtonFormField< - String>( + DropdownButtonFormField< + String>( onChanged: (value) { setState(() { @@ -2232,35 +2395,35 @@ class _addOnsDetailsState extends State { // 'Edit'); }, decoration: - InputDecoration( + InputDecoration( border: - OutlineInputBorder(), + OutlineInputBorder(), hintText: - 'Sum Insured', + 'Sum Insured', labelText: - 'Sum Insured', + 'Sum Insured', contentPadding: - EdgeInsets.symmetric( - vertical: - 5, - horizontal: - 5), + EdgeInsets.symmetric( + vertical: + 5, + horizontal: + 5), ), value: - addOnsSelectedDependent, + addOnsSelectedDependent, items: (addOnsDependentSlabRates ?? - []) + []) .map>( (addOn) { - return DropdownMenuItem< - String>( - value: addOn[ - 'si'] - .toString(), - child: Text( - '₹ ${addOn['si']}'), - ); - }).toList(), + return DropdownMenuItem< + String>( + value: addOn[ + 'si'] + .toString(), + child: Text( + '₹ ${addOn['si']}'), + ); + }).toList(), ), ) ], @@ -2278,40 +2441,40 @@ class _addOnsDetailsState extends State { _addOnsDependentSwitcher && addOnsDependentIsPremiumSummery == '1') Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Expanded( flex: 5, child: Container( alignment: - Alignment.center, + Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ Text( 'Additional Premium', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 20, fontWeight: - FontWeight - .w500, + FontWeight + .w500, ), ), Text( addOnDependentPremiumValue != - null + null ? '₹ $addOnDependentPremiumValue/Year' : 'N/A', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 18, @@ -2323,34 +2486,34 @@ class _addOnsDetailsState extends State { flex: 2, child: Container( alignment: - Alignment.center, + Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ Text( 'GST', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 20, fontWeight: - FontWeight - .w500, + FontWeight + .w500, ), ), Text( addOnsDependentPremiumGst != - null + null ? '₹ $addOnsDependentPremiumGst/-' : 'N/A', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 18, @@ -2362,34 +2525,34 @@ class _addOnsDetailsState extends State { flex: 5, child: Container( alignment: - Alignment.center, + Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ Text( 'Total Payable', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 20, fontWeight: - FontWeight - .w500, + FontWeight + .w500, ), ), Text( addOnsDependentTotalAmt != - null + null ? '₹ $addOnsDependentTotalAmt/-' : 'N/A', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 18, @@ -2404,201 +2567,201 @@ class _addOnsDetailsState extends State { Container( child: Column( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ - Row( - crossAxisAlignment: + Row( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - 'Additional Premium', - textAlign: + children: [ + Text( + 'Additional Premium', + textAlign: TextAlign .start, - style: GoogleFonts - .poppins( - fontSize: + style: GoogleFonts + .poppins( + fontSize: 18, - fontWeight: + fontWeight: FontWeight .w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerRight, - child: Column( - mainAxisAlignment: + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - addOnDependentPremiumValue != + children: [ + Text( + addOnDependentPremiumValue != null - ? '₹ $addOnDependentPremiumValue/Year' - : 'N/A', - textAlign: + ? '₹ $addOnDependentPremiumValue/Year' + : 'N/A', + textAlign: TextAlign .start, - style: GoogleFonts - .poppins( - fontSize: + style: GoogleFonts + .poppins( + fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - 'GST', - textAlign: + children: [ + Text( + 'GST', + textAlign: TextAlign .start, - style: GoogleFonts - .poppins( - fontSize: + style: GoogleFonts + .poppins( + fontSize: 18, - fontWeight: + fontWeight: FontWeight .w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerRight, - child: Column( - mainAxisAlignment: + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - addOnsDependentPremiumGst != + children: [ + Text( + addOnsDependentPremiumGst != null - ? '₹ $addOnsDependentPremiumGst/-' - : 'N/A', - textAlign: + ? '₹ $addOnsDependentPremiumGst/-' + : 'N/A', + textAlign: TextAlign .start, - style: GoogleFonts - .poppins( - fontSize: + style: GoogleFonts + .poppins( + fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - 'Total Payable', - textAlign: + children: [ + Text( + 'Total Payable', + textAlign: TextAlign .start, - style: GoogleFonts - .poppins( - fontSize: + style: GoogleFonts + .poppins( + fontSize: 18, - fontWeight: + fontWeight: FontWeight .w500, - ), - ), - ], - ))), - Expanded( - flex: 5, - child: Container( - alignment: Alignment - .centerRight, - child: Column( - mainAxisAlignment: + ), + ), + ], + ))), + Expanded( + flex: 5, + child: Container( + alignment: Alignment + .centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - addOnsDependentTotalAmt != + children: [ + Text( + addOnsDependentTotalAmt != null - ? '₹ $addOnsDependentTotalAmt/-' - : 'N/A', - textAlign: + ? '₹ $addOnsDependentTotalAmt/-' + : 'N/A', + textAlign: TextAlign .start, - style: GoogleFonts - .poppins( - fontSize: + style: GoogleFonts + .poppins( + fontSize: 16, - ), - ), - ], - ))), - ], - ), - ])) + ), + ), + ], + ))), + ], + ), + ])) ], )), SizedBox(height: 15), @@ -2615,58 +2778,58 @@ class _addOnsDetailsState extends State { : EdgeInsets.all(10), child: Column( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Expanded( flex: - Responsive.isDesktop(context) - ? 6 - : 8, + Responsive.isDesktop(context) + ? 6 + : 8, child: Container( alignment: - Alignment.centerLeft, + Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment - .start, + CrossAxisAlignment + .start, children: [ Text( Responsive.isDesktop( - context) + context) ? topUpPolicyName : topUpPolicyType, textAlign: - TextAlign.left, + TextAlign.left, style: - GoogleFonts.poppins( + GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 20 : 16, fontWeight: - FontWeight.w600, + FontWeight.w600, ), ), Text( '', textAlign: - TextAlign.left, + TextAlign.left, style: - GoogleFonts.poppins( + GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 20 : 16, fontWeight: - FontWeight.w600, + FontWeight.w600, ), ), ], @@ -2680,22 +2843,22 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ IgnorePointer( ignoring: (topUpOpenForEnrollment == - 0 || + 0 || (topUpOpenForEnrollment != - 0 && + 0 && topUpECardDownload != null)), child: - DropdownButtonFormField< - String>( + DropdownButtonFormField< + String>( onChanged: (value) { setState(() { topUpSiSelectedSI = @@ -2707,37 +2870,37 @@ class _addOnsDetailsState extends State { // 'Edit'); }, decoration: - InputDecoration( + InputDecoration( border: - OutlineInputBorder(), + OutlineInputBorder(), hintText: - 'Sum Insured', + 'Sum Insured', labelText: - 'Sum Insured', + 'Sum Insured', contentPadding: - EdgeInsets.symmetric( - vertical: - 5, - horizontal: - 5), + EdgeInsets.symmetric( + vertical: + 5, + horizontal: + 5), ), value: - topUpSiSelectedSI, + topUpSiSelectedSI, items: (topUpSlabRates ?? - []) + []) .map< - DropdownMenuItem< - String>>( + DropdownMenuItem< + String>>( (addOn) { - return DropdownMenuItem< - String>( - value: addOn[ - 'si'] - .toString(), - child: Text( - '₹ ${addOn['si']}'), - ); - }).toList(), + return DropdownMenuItem< + String>( + value: addOn[ + 'si'] + .toString(), + child: Text( + '₹ ${addOn['si']}'), + ); + }).toList(), ), ) ], @@ -2746,29 +2909,29 @@ class _addOnsDetailsState extends State { flex: 3, child: Container( alignment: - Alignment.centerRight, + Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.end, + MainAxisAlignment.end, crossAxisAlignment: - CrossAxisAlignment.end, + CrossAxisAlignment.end, children: [ Switch( value: _topUpSiSwitcher, onChanged: (topUpOpenForEnrollment == - 0 || - (topUpOpenForEnrollment != - 0 && - topUpECardDownload != - null)) + 0 || + (topUpOpenForEnrollment != + 0 && + topUpECardDownload != + null)) ? null : (value) { - setState(() { - _topUpSiSwitcher = - value; - // Add your logic here based on the toggle state - }); - }, + setState(() { + _topUpSiSwitcher = + value; + // Add your logic here based on the toggle state + }); + }, activeColor: Colors .green, // Color when the switch is ON inactiveTrackColor: Colors @@ -2791,22 +2954,22 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ IgnorePointer( ignoring: (topUpOpenForEnrollment == - 0 || + 0 || (topUpOpenForEnrollment != - 0 && + 0 && topUpECardDownload != null)), child: - DropdownButtonFormField< - String>( + DropdownButtonFormField< + String>( onChanged: (value) { setState(() { topUpSiSelectedSI = @@ -2818,37 +2981,37 @@ class _addOnsDetailsState extends State { // 'Edit'); }, decoration: - InputDecoration( + InputDecoration( border: - OutlineInputBorder(), + OutlineInputBorder(), hintText: - 'Sum Insured', + 'Sum Insured', labelText: - 'Sum Insured', + 'Sum Insured', contentPadding: - EdgeInsets.symmetric( - vertical: - 5, - horizontal: - 5), + EdgeInsets.symmetric( + vertical: + 5, + horizontal: + 5), ), value: - topUpSiSelectedSI, + topUpSiSelectedSI, items: (topUpSlabRates ?? - []) + []) .map< - DropdownMenuItem< - String>>( + DropdownMenuItem< + String>>( (addOn) { - return DropdownMenuItem< - String>( - value: addOn[ - 'si'] - .toString(), - child: Text( - '₹ ${addOn['si']}'), - ); - }).toList(), + return DropdownMenuItem< + String>( + value: addOn[ + 'si'] + .toString(), + child: Text( + '₹ ${addOn['si']}'), + ); + }).toList(), ), ) ], @@ -2861,36 +3024,36 @@ class _addOnsDetailsState extends State { true) // Add space between rows Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Expanded( flex: 12, child: Column( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: - topUpMappedFamilyFloatersSi - .where((item) => - item[ - 'is_value_exist'] == - true) - .map((item) { + topUpMappedFamilyFloatersSi + .where((item) => + item[ + 'is_value_exist'] == + true) + .map((item) { Map data = - item['data']; + item['data']; String formattedDate = - formatDate(data['dob']); + formatDate(data['dob']); return Row( crossAxisAlignment: - CrossAxisAlignment - .start, + CrossAxisAlignment + .start, children: [ Icon(Icons.arrow_right, color: Color( 0xFFE26728)), // Arrow icon SizedBox( width: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 10 : 5), // Space between icon and text Expanded( @@ -2899,8 +3062,8 @@ class _addOnsDetailsState extends State { style: GoogleFonts .poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 18 : 14, color: Color( @@ -2921,7 +3084,7 @@ class _addOnsDetailsState extends State { _topUpSiSwitcher == true && topUpSiPremiumSummery == '1') Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Expanded( flex: 5, @@ -2929,30 +3092,30 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ Text( 'Additional Premium', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 20, fontWeight: - FontWeight.w500, + FontWeight.w500, ), ), Text( topUpSiPremiumValue != - null + null ? '₹ $topUpSiPremiumValue/Year' : 'N/A', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 18, @@ -2966,30 +3129,30 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ Text( 'GST', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 20, fontWeight: - FontWeight.w500, + FontWeight.w500, ), ), Text( topUpSiPremiumGst != - null + null ? '₹ $topUpSiPremiumGst/-' : 'N/A', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 18, @@ -3003,30 +3166,30 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ Text( 'Total Payable', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 20, fontWeight: - FontWeight.w500, + FontWeight.w500, ), ), Text( topUpSiTotalAmt != - null + null ? '₹ $topUpSiTotalAmt/-' : 'N/A', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 18, @@ -3041,201 +3204,201 @@ class _addOnsDetailsState extends State { Container( child: Column( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ - Row( - crossAxisAlignment: + Row( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - 'Additional Premium', - textAlign: + children: [ + Text( + 'Additional Premium', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 18, - fontWeight: + fontSize: 18, + fontWeight: FontWeight .w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerRight, - child: Column( - mainAxisAlignment: + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - topUpSiPremiumValue != + children: [ + Text( + topUpSiPremiumValue != null - ? '₹ $topUpSiPremiumValue/Year' - : 'N/A', - textAlign: + ? '₹ $topUpSiPremiumValue/Year' + : 'N/A', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - 'GST', - textAlign: + children: [ + Text( + 'GST', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 18, - fontWeight: + fontSize: 18, + fontWeight: FontWeight .w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerRight, - child: Column( - mainAxisAlignment: + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - topUpSiPremiumGst != + children: [ + Text( + topUpSiPremiumGst != null - ? '₹ $topUpSiPremiumGst/-' - : 'N/A', - textAlign: + ? '₹ $topUpSiPremiumGst/-' + : 'N/A', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - 'Total Payable', - textAlign: + children: [ + Text( + 'Total Payable', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 18, - fontWeight: + fontSize: 18, + fontWeight: FontWeight .w500, - ), - ), - ], - ))), - Expanded( - flex: 5, - child: Container( - alignment: Alignment - .centerRight, - child: Column( - mainAxisAlignment: + ), + ), + ], + ))), + Expanded( + flex: 5, + child: Container( + alignment: Alignment + .centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - topUpSiTotalAmt != + children: [ + Text( + topUpSiTotalAmt != null - ? '₹ $topUpSiTotalAmt/-' - : 'N/A', - textAlign: + ? '₹ $topUpSiTotalAmt/-' + : 'N/A', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - ])) + fontSize: 16, + ), + ), + ], + ))), + ], + ), + ])) ], ), ), @@ -3253,54 +3416,54 @@ class _addOnsDetailsState extends State { : EdgeInsets.all(10), child: Column( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Expanded( flex: - Responsive.isDesktop(context) - ? 6 - : 8, + Responsive.isDesktop(context) + ? 6 + : 8, child: Container( alignment: - Alignment.centerLeft, + Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment - .start, + CrossAxisAlignment + .start, children: [ Text( Responsive.isDesktop( - context) + context) ? topUpParentPolicyName : topUpParentPolicyType, textAlign: - TextAlign.left, + TextAlign.left, style: - GoogleFonts.poppins( + GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 20 : 16, fontWeight: - FontWeight.w600, + FontWeight.w600, ), ), Text( '', textAlign: - TextAlign.left, + TextAlign.left, style: - GoogleFonts.poppins( + GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 18 : 14, ), @@ -3316,22 +3479,22 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ IgnorePointer( ignoring: (topUpParentOpenForEnrollment == - 0 || + 0 || (topUpParentOpenForEnrollment != - 0 && + 0 && topUpParentECardDownload != null)), child: - DropdownButtonFormField< - String>( + DropdownButtonFormField< + String>( onChanged: (value) { setState(() { topUpParentSiSelectedSI = @@ -3343,37 +3506,37 @@ class _addOnsDetailsState extends State { // 'Edit'); }, decoration: - InputDecoration( + InputDecoration( border: - OutlineInputBorder(), + OutlineInputBorder(), hintText: - 'Sum Insured', + 'Sum Insured', labelText: - 'Sum Insured', + 'Sum Insured', contentPadding: - EdgeInsets.symmetric( - vertical: - 5, - horizontal: - 5), + EdgeInsets.symmetric( + vertical: + 5, + horizontal: + 5), ), value: - topUpParentSiSelectedSI, + topUpParentSiSelectedSI, items: (topUpParentSlabRates ?? - []) + []) .map< - DropdownMenuItem< - String>>( + DropdownMenuItem< + String>>( (addOn) { - return DropdownMenuItem< - String>( - value: addOn[ - 'si'] - .toString(), - child: Text( - '₹ ${addOn['si']}'), - ); - }).toList(), + return DropdownMenuItem< + String>( + value: addOn[ + 'si'] + .toString(), + child: Text( + '₹ ${addOn['si']}'), + ); + }).toList(), ), ) ], @@ -3382,30 +3545,30 @@ class _addOnsDetailsState extends State { flex: 3, child: Container( alignment: - Alignment.centerRight, + Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.end, + MainAxisAlignment.end, crossAxisAlignment: - CrossAxisAlignment.end, + CrossAxisAlignment.end, children: [ Switch( value: - _topUpParentSiSwitcher, + _topUpParentSiSwitcher, onChanged: (topUpParentOpenForEnrollment == - 0 || - (topUpParentOpenForEnrollment != - 0 && - topUpParentECardDownload != - null)) + 0 || + (topUpParentOpenForEnrollment != + 0 && + topUpParentECardDownload != + null)) ? null : (value) { - setState(() { - _topUpParentSiSwitcher = - value; - // Add your logic here based on the toggle state - }); - }, + setState(() { + _topUpParentSiSwitcher = + value; + // Add your logic here based on the toggle state + }); + }, activeColor: Colors .green, // Color when the switch is ON inactiveTrackColor: Colors @@ -3428,22 +3591,22 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ IgnorePointer( ignoring: (topUpParentOpenForEnrollment == - 0 || + 0 || (topUpParentOpenForEnrollment != - 0 && + 0 && topUpParentECardDownload != null)), child: - DropdownButtonFormField< - String>( + DropdownButtonFormField< + String>( onChanged: (value) { setState(() { topUpParentSiSelectedSI = @@ -3455,37 +3618,37 @@ class _addOnsDetailsState extends State { // 'Edit'); }, decoration: - InputDecoration( + InputDecoration( border: - OutlineInputBorder(), + OutlineInputBorder(), hintText: - 'Sum Insured', + 'Sum Insured', labelText: - 'Sum Insured', + 'Sum Insured', contentPadding: - EdgeInsets.symmetric( - vertical: - 5, - horizontal: - 5), + EdgeInsets.symmetric( + vertical: + 5, + horizontal: + 5), ), value: - topUpParentSiSelectedSI, + topUpParentSiSelectedSI, items: (topUpParentSlabRates ?? - []) + []) .map< - DropdownMenuItem< - String>>( + DropdownMenuItem< + String>>( (addOn) { - return DropdownMenuItem< - String>( - value: addOn[ - 'si'] - .toString(), - child: Text( - '₹ ${addOn['si']}'), - ); - }).toList(), + return DropdownMenuItem< + String>( + value: addOn[ + 'si'] + .toString(), + child: Text( + '₹ ${addOn['si']}'), + ); + }).toList(), ), ) ], @@ -3498,36 +3661,36 @@ class _addOnsDetailsState extends State { true) // Add space between rows Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Expanded( flex: 12, child: Column( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: - topUpParentMappedFamilyFloatersSi - .where((item) => - item[ - 'is_value_exist'] == - true) - .map((item) { + topUpParentMappedFamilyFloatersSi + .where((item) => + item[ + 'is_value_exist'] == + true) + .map((item) { Map data = - item['data']; + item['data']; String formattedDate = - formatDate(data['dob']); + formatDate(data['dob']); return Row( crossAxisAlignment: - CrossAxisAlignment - .start, + CrossAxisAlignment + .start, children: [ Icon(Icons.arrow_right, color: Color( 0xFFE26728)), // Arrow icon SizedBox( width: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 10 : 5), // Space between icon and text Expanded( @@ -3536,8 +3699,8 @@ class _addOnsDetailsState extends State { style: GoogleFonts .poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 18 : 14, color: Color( @@ -3558,7 +3721,7 @@ class _addOnsDetailsState extends State { _topUpParentSiSwitcher == true && topUpParenIsPremiumSummery == '1') Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Expanded( flex: 5, @@ -3566,30 +3729,30 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ Text( 'Additional Premium', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 20, fontWeight: - FontWeight.w500, + FontWeight.w500, ), ), Text( topUpParentSiPremiumValue != - null + null ? '₹ $topUpParentSiPremiumValue/Year' : 'N/A', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 18, @@ -3603,30 +3766,30 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ Text( 'GST', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 20, fontWeight: - FontWeight.w500, + FontWeight.w500, ), ), Text( topUpParentSiPremiumGst != - null + null ? '₹ $topUpParentSiPremiumGst/-' : 'N/A', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 18, @@ -3640,30 +3803,30 @@ class _addOnsDetailsState extends State { alignment: Alignment.center, child: Column( mainAxisAlignment: - MainAxisAlignment - .center, + MainAxisAlignment + .center, crossAxisAlignment: - CrossAxisAlignment - .center, + CrossAxisAlignment + .center, children: [ Text( 'Total Payable', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 20, fontWeight: - FontWeight.w500, + FontWeight.w500, ), ), Text( topUpParentSiTotalAmt != - null + null ? '₹ $topUpParentSiTotalAmt/-' : 'N/A', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts .poppins( fontSize: 18, @@ -3678,201 +3841,201 @@ class _addOnsDetailsState extends State { Container( child: Column( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ - Row( - crossAxisAlignment: + Row( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - 'Additional Premium', - textAlign: + children: [ + Text( + 'Additional Premium', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 18, - fontWeight: + fontSize: 18, + fontWeight: FontWeight .w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerRight, - child: Column( - mainAxisAlignment: + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - topUpParentSiPremiumValue != + children: [ + Text( + topUpParentSiPremiumValue != null - ? '₹ $topUpParentSiPremiumValue/Year' - : 'N/A', - textAlign: + ? '₹ $topUpParentSiPremiumValue/Year' + : 'N/A', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - 'GST', - textAlign: + children: [ + Text( + 'GST', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 18, - fontWeight: + fontSize: 18, + fontWeight: FontWeight .w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerRight, - child: Column( - mainAxisAlignment: + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - topUpParentSiPremiumGst != + children: [ + Text( + topUpParentSiPremiumGst != null - ? '₹ $topUpParentSiPremiumGst/-' - : 'N/A', - textAlign: + ? '₹ $topUpParentSiPremiumGst/-' + : 'N/A', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - 'Total Payable', - textAlign: + children: [ + Text( + 'Total Payable', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 18, - fontWeight: + fontSize: 18, + fontWeight: FontWeight .w500, - ), - ), - ], - ))), - Expanded( - flex: 5, - child: Container( - alignment: Alignment - .centerRight, - child: Column( - mainAxisAlignment: + ), + ), + ], + ))), + Expanded( + flex: 5, + child: Container( + alignment: Alignment + .centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment .center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment .center, - children: [ - Text( - topUpParentSiTotalAmt != + children: [ + Text( + topUpParentSiTotalAmt != null - ? '₹ $topUpParentSiTotalAmt/-' - : 'N/A', - textAlign: + ? '₹ $topUpParentSiTotalAmt/-' + : 'N/A', + textAlign: TextAlign .start, - style: + style: GoogleFonts .poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - ])) + fontSize: 16, + ), + ), + ], + ))), + ], + ), + ])) ], ), ), @@ -3903,19 +4066,19 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Text( 'Premium Summary', textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 16, + Responsive.isDesktop( + context) + ? 18 + : 16, color: Color(0xFF181818), fontWeight: FontWeight.w600, ), @@ -3950,80 +4113,80 @@ class _addOnsDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( 'Policy ', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 16 - : 14, + : 13, fontWeight: - FontWeight - .bold), + FontWeight + .bold), ), ), ), TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( 'Additional Premium', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 16 - : 14, + : 13, fontWeight: - FontWeight - .bold), + FontWeight + .bold), ), ), ), TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( 'GST', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 16 - : 14, + : 13, fontWeight: - FontWeight - .bold), + FontWeight + .bold), ), ), ), TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( 'Total', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 16 - : 14, + : 13, fontWeight: - FontWeight - .bold), + FontWeight + .bold), ), ), ), @@ -4054,19 +4217,19 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Text( 'Total Payable', textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 20 - : 16, + Responsive.isDesktop( + context) + ? 20 + : 16, color: Color(0xFF181818), fontWeight: FontWeight.w600, ), @@ -4079,19 +4242,19 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.end, + MainAxisAlignment.end, crossAxisAlignment: - CrossAxisAlignment.end, + CrossAxisAlignment.end, children: [ Text( '₹${allTotalSum()}/Year', textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 16, + Responsive.isDesktop( + context) + ? 18 + : 16, color: Color(0xFFE26728), fontWeight: FontWeight.w500, ), @@ -4104,138 +4267,81 @@ class _addOnsDetailsState extends State { SizedBox(height: 10), Container( + alignment: Alignment.topLeft, child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start , // Aligns top children: [ + Checkbox( + value: isChecked, + onChanged: (bool? value) { + setState(() { + isChecked = value!; + }); + }, + activeColor: const Color(0xFFE26728), + ), Expanded( - flex: 1, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Checkbox( - value: isChecked, - onChanged: (bool? value) { - setState(() { - isChecked = value!; - }); - }, - activeColor: - Color(0xFFE26728), - ), - ], - ))), - Expanded( - flex: 11, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: - MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.end, - children: [ - Text( - 'I declare that the information I have provided is true and accurate to the best of my knowledge', - textAlign: - Responsive.isDesktop( - context) - ? TextAlign.left - : TextAlign.start, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 18 - : 15, - color: Color(0xFF292929), - ), - ), - ], - ))), + child: Text( + 'I declare that the information I have provided is true and accurate to the best of my knowledge', + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 18 : 15, + color: const Color(0xFF292929), + ), + ), + ), ], ), ), SizedBox( height: - Responsive.isDesktop(context) ? 15 : 0), + Responsive.isDesktop(context) ? 15 : 10), Container( - // padding: EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: allDisclaimer.isEmpty ? [] // If allDisclaimer is empty, show nothing : allDisclaimer.map((entry) { - int id = - entry['id']; // ID of disclaimer - String disclaimer = - entry['text']; // Disclaimer text - bool isChecked = - entry['checked']; // Checked state + int id = entry['id']; // ID of disclaimer + String disclaimer = entry['text']; // Disclaimer text + bool isChecked = entry['checked']; // Checked state - return Row( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Expanded( - flex: 1, - child: Container( - alignment: - Alignment.centerLeft, - child: Checkbox( - value: - isChecked, // Bind to the checked value - onChanged: (bool? value) { - setState(() { - // Update the checked status - allDisclaimer - .firstWhere( - (item) => - item['id'] == id, - )['checked'] = value!; - print(allDisclaimer); - }); - }, - activeColor: Color( - 0xFFE26728), // Custom color - ), - ), + return Padding( + padding: const EdgeInsets.only(bottom: 12.0), // spacing between disclaimers + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, // Align top + children: [ + Checkbox( + value: isChecked, // Bind to the checked value + onChanged: (bool? value) { + setState(() { + // Update the checked status + allDisclaimer.firstWhere( + (item) => item['id'] == id, + )['checked'] = value!; + print(allDisclaimer); + }); + }, + activeColor: const Color(0xFFE26728), // Custom color + ), + Expanded( + child: Text( + disclaimer, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) ? 18 : 15, + color: const Color(0xFF292929), ), - Expanded( - flex: 11, - child: Container( - alignment: - Alignment.centerLeft, - child: Text( - disclaimer, - textAlign: - Responsive.isDesktop( - context) - ? TextAlign.left - : TextAlign.start, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 18 - : 15, - color: Color(0xFF292929), - ), - ), - ), - ), - ], - ); - }).toList(), + ), + ), + ], + ), + ); + }).toList(), ), ), SizedBox( height: - Responsive.isDesktop(context) ? 15 : 0), + Responsive.isDesktop(context) ? 15 : 0), Container( child: Row( children: [ @@ -4249,8 +4355,9 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerLeft, child: ElevatedButton( onPressed: () { - Navigator.pushNamed( - context, 'empDetails'); + context.go('/empDetails'); + // Navigator.pushNamed( + // context, 'empDetails'); }, child: Text( 'Back', @@ -4261,7 +4368,7 @@ class _addOnsDetailsState extends State { backgroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: - BorderRadius.circular(5), + BorderRadius.circular(5), side: BorderSide( color: Color(0xFFE26728)), ), @@ -4285,10 +4392,10 @@ class _addOnsDetailsState extends State { ), style: ElevatedButton.styleFrom( backgroundColor: - Color(0xFFE26728), + Color(0xFFE26728), shape: RoundedRectangleBorder( borderRadius: - BorderRadius.circular(5), + BorderRadius.circular(5), ), ), ), @@ -4308,12 +4415,12 @@ class _addOnsDetailsState extends State { height: 75, padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 20, bottom: 20, left: 30, right: 30) + top: 20, bottom: 20, left: 30, right: 30) : EdgeInsets.only( - top: 10, - bottom: 10, - left: 10, - right: 10), // Add padding to the container + top: 10, + bottom: 10, + left: 10, + right: 10), // Add padding to the container child: Row( children: [ Expanded( @@ -4349,37 +4456,38 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerRight, child: ElevatedButton( onPressed: - addOnsDependentMappedFamilyFloatersDependent != - null || - topUpMappedFamilyFloatersSi != - null || - topUpParentMappedFamilyFloatersSi != - null - ? () { - if (_topUpSiSwitcher == false) { - removeAddonsGmcSiToAPI(); - } else { - checkSiTopUp(); - } + addOnsDependentMappedFamilyFloatersDependent != + null || + topUpMappedFamilyFloatersSi != + null || + topUpParentMappedFamilyFloatersSi != + null + ? () { + if (_topUpSiSwitcher == false) { + removeAddonsGmcSiToAPI(); + } else { + checkSiTopUp(); + } - if (_topUpParentSiSwitcher == - false) { - removeAddonsGmcParentSiToAPI(); - } else { - checkSiParentTopUp(); - } + if (_topUpParentSiSwitcher == + false) { + removeAddonsGmcParentSiToAPI(); + } else { + checkSiParentTopUp(); + } - if (_addOnsDependentSwitcher == - false) { - removeAddonsGmcDependentToAPI(); - } else { - checkDependentTopUp(); - sendAddonsGmcDependentToAPI(); - } - Navigator.pushNamed(context, - 'empReviewDetails'); - } - : null, + if (_addOnsDependentSwitcher == + false) { + removeAddonsGmcDependentToAPI(); + } else { + checkDependentTopUp(); + sendAddonsGmcDependentToAPI(); + } + context.go('/empReviewDetails'); + // Navigator.pushNamed(context, + // 'empReviewDetails'); + } + : null, child: Text( 'Continue ', style: GoogleFonts.poppins( @@ -4407,10 +4515,10 @@ class _addOnsDetailsState extends State { color: Color(0x98FFFCE5), // Semi-transparent background child: Center( child: // Your GIF loader widget - Image.asset( - height: 60, - width: 60, - 'assets/nhance-loader.gif'), // Adjust path to your GIF loader + Image.asset( + height: 60, + width: 60, + 'assets/nhance-loader.gif'), // Adjust path to your GIF loader ), ), if (Responsive.isDesktop(context) || @@ -4437,46 +4545,50 @@ class _addOnsDetailsState extends State { floatingActionButtonLocation: Responsive.isDesktop(context) ? null : isTokenAvailable - ? FloatingActionButtonLocation.miniEndFloat - : null, + ? FloatingActionButtonLocation.miniEndFloat + : null, bottomNavigationBar: Responsive.isDesktop(context) ? null : isTokenAvailable - ? CustomBottomNavigationBar( - onTabChanged: (index) { - // Add your navigation logic here - // For example: - if (index == 0) { - Navigator.pushNamed(context, 'home'); - } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); - } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); - } else if (index == 3) { - Navigator.pushNamed(context, 'help'); - } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); - } - }, - icons: [ - Icons.home_outlined, - Icons.sticky_note_2_outlined, - Icons.person_outline_outlined, - Icons.headset_mic_outlined, - Icons.health_and_safety_outlined, - ], - labels: [ - "Home", - "Claim", - "Profile", - "Help", - "wellness", - ], - initialIndex: - 0, // Initial index of the bottom navigation bar - ) - : null, - ); + ? CustomBottomNavigationBar( + onTabChanged: (index) { + // Add your navigation logic here + // For example: + if (index == 0) { + context.go('/home'); + // Navigator.pushNamed(context, 'home'); + } else if (index == 1) { + context.go('/claims'); + // Navigator.pushNamed(context, 'claims'); + } else if (index == 2) { + context.go('/profile'); + // Navigator.pushNamed(context, 'profile'); + } else if (index == 3) { + context.go('/help'); + // Navigator.pushNamed(context, 'help'); + } else if (index == 4) { + context.go('/wellness'); + // Navigator.pushNamed(context, 'wellness'); + } + }, + icons: [ + Icons.home_outlined, + Icons.sticky_note_2_outlined, + Icons.person_outline_outlined, + Icons.headset_mic_outlined, + Icons.health_and_safety_outlined, + ], + labels: [ + "Home", + "Claims", + "Profile", + "Help", + "wellness", + ], + initialIndex: + 0, // Initial index of the bottom navigation bar + ) : null, + ) ); } } @@ -4495,7 +4607,7 @@ class _addOnsDetailsState extends State { selectedRelationships = relationshipOptions .where( (option) => option['dependent'] == floaterData['form_type'], - ) + ) .toList(); if (action == 'Add') { @@ -4513,7 +4625,7 @@ class _addOnsDetailsState extends State { selectedRelationships.removeWhere((relationship) => getTrueDataObjects.any((dataObject) => - dataObject['relationship'] == + dataObject['relationship'] == relationship['relationship_name'])); } } @@ -4556,9 +4668,9 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text(popupName ?? '', style: GoogleFonts.poppins( @@ -4582,7 +4694,7 @@ class _addOnsDetailsState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ DropdownButtonFormField( decoration: InputDecoration( @@ -4602,7 +4714,7 @@ class _addOnsDetailsState extends State { .map((relationship) { final String relationshipName = relationship[ - 'relationship_name'] ?? + 'relationship_name'] ?? ''; return DropdownMenuItem( value: relationshipName, @@ -4620,7 +4732,7 @@ class _addOnsDetailsState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Container( child: TextFormField( @@ -4631,9 +4743,9 @@ class _addOnsDetailsState extends State { hintText: 'Member Full Name', labelText: 'Member Full Name', contentPadding: - EdgeInsets.symmetric( - vertical: 10, - horizontal: 15), + EdgeInsets.symmetric( + vertical: 10, + horizontal: 15), ), validator: (value) { if (value == null || @@ -4674,7 +4786,7 @@ class _addOnsDetailsState extends State { }, ), contentPadding: - EdgeInsets.symmetric( + EdgeInsets.symmetric( vertical: 10, horizontal: 15, ), @@ -4697,7 +4809,8 @@ class _addOnsDetailsState extends State { onPressed: () { // Close the dialog without sending data cancelPopUp(); - Navigator.of(context).pop(); + context.pop(); + // Navigator.of(context).pop(); }, child: Text( 'Cancel', @@ -4708,7 +4821,7 @@ class _addOnsDetailsState extends State { backgroundColor: Color(0xFFE26728), shape: RoundedRectangleBorder( borderRadius: - BorderRadius.circular(5), + BorderRadius.circular(5), ), ), ), @@ -4721,7 +4834,7 @@ class _addOnsDetailsState extends State { onPressed: () { // Check if any of the fields are empty if (_relationShipController - .text.isEmpty || + .text.isEmpty || _memberNameController .text.isEmpty || _dobController.text.isEmpty) { @@ -4731,9 +4844,9 @@ class _addOnsDetailsState extends State { // Create a map to hold the form data Map formData = { 'relationship': - _relationShipController.text, + _relationShipController.text, 'memberName': - _memberNameController.text, + _memberNameController.text, 'dateOfBirth': _dobController.text, // Add more form fields as needed }; @@ -4743,7 +4856,9 @@ class _addOnsDetailsState extends State { formData, floaterData, action); // Close the dialog - Navigator.of(context).pop(); + + context.pop(); + // Navigator.of(context).pop(); } }, child: Text( @@ -4755,7 +4870,7 @@ class _addOnsDetailsState extends State { backgroundColor: Color(0xFFE26728), shape: RoundedRectangleBorder( borderRadius: - BorderRadius.circular(5), + BorderRadius.circular(5), ), ), ), @@ -4790,7 +4905,7 @@ class _addOnsDetailsState extends State { gmcECardDownload = item['eCardDownload']; gmcGstValue = item['family_floaters_of_dependent_and_gst_value']; gmcSiPremiumValue = - item['family_floaters_of_dependent_and_si_premium_value']; + item['family_floaters_of_dependent_and_si_premium_value']; gmcTotalableValue = gmcGstValue + gmcSiPremiumValue; gmcIsValueValid = (gmcSiPremiumValue != 0 && gmcGstValue != 0); // gmcSumInsured = item['Policy_Terms']['sum_insured']; @@ -4811,244 +4926,244 @@ class _addOnsDetailsState extends State { Widget card = getTrueObjects.length > 0 ? Card( - elevation: 0, - color: Colors.white, - child: Padding( - padding: Responsive.isDesktop(context) - ? EdgeInsets.all(30) - : EdgeInsets.all(10), - child: Column( - children: [ - Container( - decoration: BoxDecoration( - color: Color( - 0xFFFFF1DD), // Set background color for the container - borderRadius: BorderRadius.circular( - 5), // Set border radius for the container - ), - padding: Responsive.isDesktop(context) - ? EdgeInsets.only( - top: 15, bottom: 15, left: 25, right: 25) - : EdgeInsets.only( - top: 10, bottom: 10, left: 10, right: 10), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: Responsive.isDesktop(context) ? 9 : 7, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, + elevation: 0, + color: Colors.white, + child: Padding( + padding: Responsive.isDesktop(context) + ? EdgeInsets.all(30) + : EdgeInsets.all(10), + child: Column( + children: [ + Container( + decoration: BoxDecoration( + color: Color( + 0xFFFFF1DD), // Set background color for the container + borderRadius: BorderRadius.circular( + 5), // Set border radius for the container + ), + padding: Responsive.isDesktop(context) + ? EdgeInsets.only( + top: 15, bottom: 15, left: 25, right: 25) + : EdgeInsets.only( + top: 10, bottom: 10, left: 10, right: 10), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: Responsive.isDesktop(context) ? 9 : 7, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + '', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 18 + : 13, + ), + ), + Row( children: [ Text( - '', + Responsive.isDesktop(context) + ? gmcPolicyName + : gmcPolicyType, textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) - ? 18 - : 13, - ), - ), - Row( - children: [ - Text( - Responsive.isDesktop(context) - ? gmcPolicyName - : gmcPolicyType, - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 20 - : 14, - fontWeight: FontWeight.w600, - ), - ), - if (item['eCardDownload'] != null) - GestureDetector( - onTap: () async { - _launchURL( - item['eCardDownload']); - }, - child: MouseRegion( - cursor: - SystemMouseCursors.click, - child: Icon( - Icons.file_download, - color: Color(0xFFE26728), - size: 25, - ), - ), - ), - ], - ), - ], - ))), - Expanded( - flex: Responsive.isDesktop(context) ? 3 : 5, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Text( - gmcFloaterTextHeading ?? '', - textAlign: TextAlign.right, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 18 - : 13, - ), - ), - Text( - '₹ ${gmcSumInsured != null ? gmcSumInsured : 'NA'}', - textAlign: TextAlign.right, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 20 - : 14, + Responsive.isDesktop(context) + ? 20 + : 14, fontWeight: FontWeight.w600, ), ), + if (item['eCardDownload'] != null) + GestureDetector( + onTap: () async { + _launchURL( + item['eCardDownload']); + }, + child: MouseRegion( + cursor: + SystemMouseCursors.click, + child: Icon( + Icons.file_download, + color: Color(0xFFE26728), + size: 25, + ), + ), + ), ], - ))), - ], - ), - ), - SizedBox(height: 15), - Container( - padding: Responsive.isDesktop(context) - ? EdgeInsets.only( - top: 0, bottom: 0, left: 15, right: 15) - : EdgeInsets.only( - top: 0, bottom: 0, left: 5, right: 5), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: gmcMappedFamilyFloaters - .where((item) => item['is_value_exist'] == true) - .map((item) { - Map data = item['data']; - String formattedDate = formatDate(data['dob']); - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Icon(Icons.arrow_right, - color: Color(0xFFE26728)), // Arrow icon - SizedBox( - width: Responsive.isDesktop(context) - ? 10 - : 5), // Space between icon and text - Expanded( - child: Text( - '${data['name']} ~ ${data['relationship']} ~ DOB : $formattedDate', - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) ? 18 : 14, - color: Color(0xFF232526), ), - ), - ), - ], - ); - }).toList(), - ), - ), - if (Responsive.isDesktop(context) && gmcIsValueValid) - Row( + ], + ))), + Expanded( + flex: Responsive.isDesktop(context) ? 3 : 5, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + gmcFloaterTextHeading ?? '', + textAlign: TextAlign.right, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 18 + : 13, + ), + ), + Text( + '₹ ${gmcSumInsured != null ? gmcSumInsured : 'NA'}', + textAlign: TextAlign.right, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 20 + : 14, + fontWeight: FontWeight.w600, + ), + ), + ], + ))), + ], + ), + ), + SizedBox(height: 15), + Container( + padding: Responsive.isDesktop(context) + ? EdgeInsets.only( + top: 0, bottom: 0, left: 15, right: 15) + : EdgeInsets.only( + top: 0, bottom: 0, left: 5, right: 5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: gmcMappedFamilyFloaters + .where((item) => item['is_value_exist'] == true) + .map((item) { + Map data = item['data']; + String formattedDate = formatDate(data['dob']); + return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Icon(Icons.arrow_right, + color: Color(0xFFE26728)), // Arrow icon + SizedBox( + width: Responsive.isDesktop(context) + ? 10 + : 5), // Space between icon and text Expanded( - flex: 5, - child: Container( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Text( - 'Additional Premium', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 20, - fontWeight: FontWeight.w500, - ), - ), - Text( - (gmcSiPremiumValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - ), - ), - ], - ))), - Expanded( - flex: 2, - child: Container( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Text( - 'GST', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 20, - fontWeight: FontWeight.w500, - ), - ), - Text( - (gmcGstValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - ), - ), - ], - ))), - Expanded( - flex: 5, - child: Container( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Text( - 'Total Payable', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 20, - fontWeight: FontWeight.w500, - ), - ), - Text( - (gmcTotalableValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - ), - ), - ], - ))), + child: Text( + '${data['name']} ~ ${data['relationship']} ~ DOB : $formattedDate', + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) ? 18 : 14, + color: Color(0xFF232526), + ), + ), + ), ], - ), - if (!Responsive.isDesktop(context) && gmcIsValueValid) - Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ + ); + }).toList(), + ), + ), + if (Responsive.isDesktop(context) && gmcIsValueValid) + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 5, + child: Container( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + 'Additional Premium', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), + Text( + (gmcSiPremiumValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + ), + ), + ], + ))), + Expanded( + flex: 2, + child: Container( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + 'GST', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), + Text( + (gmcGstValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + ), + ), + ], + ))), + Expanded( + flex: 5, + child: Container( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + 'Total Payable', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), + Text( + (gmcTotalableValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + ), + ), + ], + ))), + ], + ), + if (!Responsive.isDesktop(context) && gmcIsValueValid) + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -5058,9 +5173,9 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( 'Additional Premium', @@ -5078,9 +5193,9 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( (gmcSiPremiumValue ?? '') @@ -5103,9 +5218,9 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( 'GST', @@ -5123,9 +5238,9 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( (gmcGstValue ?? '').toString(), @@ -5147,9 +5262,9 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( 'Total Payable', @@ -5167,9 +5282,9 @@ class _addOnsDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( (gmcTotalableValue ?? '') @@ -5184,9 +5299,9 @@ class _addOnsDetailsState extends State { ], ), ])) - ], - ), - )) + ], + ), + )) : SizedBox(height: 0); cards.add(card); @@ -5304,7 +5419,7 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 18 : 13, + Responsive.isDesktop(context) ? 18 : 13, ), ), Row( @@ -5316,7 +5431,7 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 20 : 14, + Responsive.isDesktop(context) ? 20 : 14, fontWeight: FontWeight.w600, ), ), @@ -5353,7 +5468,7 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 18 : 13, + Responsive.isDesktop(context) ? 18 : 13, ), ), Text( @@ -5361,7 +5476,7 @@ class _addOnsDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 20 : 14, + Responsive.isDesktop(context) ? 20 : 14, fontWeight: FontWeight.w600, ), ), @@ -5462,133 +5577,133 @@ class _addOnsDetailsState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Additional Premium', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + 'Additional Premium', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gpaSiPremiumValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + (gpaSiPremiumValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'GST', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + 'GST', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gpaGstValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + (gpaGstValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Total Payable', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 5, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + 'Total Payable', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 5, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gpaTotalableValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - ])) + children: [ + Text( + (gpaTotalableValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + ])) ], ), ), @@ -5604,7 +5719,7 @@ class _addOnsDetailsState extends State { double total = policies .where((policy) => policy is Map) .map((policy) => - (policy["si_gst_value"] ?? 0) + (policy["si_premium_value"] ?? 0)) + (policy["si_gst_value"] ?? 0) + (policy["si_premium_value"] ?? 0)) .fold(0.0, (sum, value) => sum + value); print('Calculated gpaTotalAmt: $total'); // Debug print @@ -5620,65 +5735,65 @@ class _addOnsDetailsState extends State { print('gpaTotalAmt $gpaTotalAmt'); return (policies as List) .where((policy) => policy is Map) // Ensure each item is a Map + dynamic>) // Ensure each item is a Map .map((policy) { - var siGstValue = policy["si_gst_value"] ?? 0; - var siPremiumValue = policy["si_premium_value"] ?? 0; + var siGstValue = policy["si_gst_value"] ?? 0; + var siPremiumValue = policy["si_premium_value"] ?? 0; - if (siGstValue == 0 || siPremiumValue == 0) - return null; // Skip invalid policies + if (siGstValue == 0 || siPremiumValue == 0) + return null; // Skip invalid policies - return TableRow( - children: [ - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - Responsive.isDesktop(context) - ? (policy["Policy_Name"] ?? 'Default Policy Name') - : policy['type'], - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + return TableRow( + children: [ + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + Responsive.isDesktop(context) + ? (policy["Policy_Name"] ?? 'Default Policy Name') + : policy['type'], + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${policy["si_premium_value"]}/Year', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${policy["si_premium_value"]}/Year', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${policy["si_gst_value"]}/-', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${policy["si_gst_value"]}/-', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${(policy["si_premium_value"] ?? 0) + (policy["si_gst_value"] ?? 0)}/-', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${(policy["si_premium_value"] ?? 0) + (policy["si_gst_value"] ?? 0)}/-', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - ], - ); - }) + ), + ), + ], + ); + }) .whereType() // Filter out null values .toList(); } @@ -5687,8 +5802,8 @@ class _addOnsDetailsState extends State { double total = policies .where((policy) => policy is Map) .map((policy) => - (policy["family_floaters_of_dependent_and_gst_value"] ?? 0) + - (policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0)) + (policy["family_floaters_of_dependent_and_gst_value"] ?? 0) + + (policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0)) .fold(0.0, (sum, value) => sum + value); print('Calculated gmcTotalAmt: $total'); // Debug print @@ -5706,68 +5821,68 @@ class _addOnsDetailsState extends State { print('gmcTotalAmt $gmcTotalAmt'); return (policies as List) .where((policy) => policy is Map) // Ensure each item is a Map + dynamic>) // Ensure each item is a Map .map((policy) { - var siGstValue = - policy["family_floaters_of_dependent_and_gst_value"] ?? 0; - var siPremiumValue = - policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0; + var siGstValue = + policy["family_floaters_of_dependent_and_gst_value"] ?? 0; + var siPremiumValue = + policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0; - if (siGstValue == 0 || siPremiumValue == 0) - return null; // Skip invalid policies + if (siGstValue == 0 || siPremiumValue == 0) + return null; // Skip invalid policies - return TableRow( - children: [ - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - Responsive.isDesktop(context) - ? (policy["Policy_Name"] ?? 'Default Policy Name') - : policy['type'], - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + return TableRow( + children: [ + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + Responsive.isDesktop(context) + ? (policy["Policy_Name"] ?? 'Default Policy Name') + : policy['type'], + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${policy["family_floaters_of_dependent_and_si_premium_value"]}/Year', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${policy["family_floaters_of_dependent_and_si_premium_value"]}/Year', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${policy["family_floaters_of_dependent_and_gst_value"]}/-', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${policy["family_floaters_of_dependent_and_gst_value"]}/-', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${(policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0) + (policy["family_floaters_of_dependent_and_gst_value"] ?? 0)}/-', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${(policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0) + (policy["family_floaters_of_dependent_and_gst_value"] ?? 0)}/-', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - ], - ); - }) + ), + ), + ], + ); + }) .whereType() // Filter out null values .toList(); } -} +} \ No newline at end of file diff --git a/lib/pages/enrollment/empDetails.dart b/lib/pages/enrollment/empDetails.dart index 039648e..606328c 100755 --- a/lib/pages/enrollment/empDetails.dart +++ b/lib/pages/enrollment/empDetails.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:nhance_app_pwa/customAppBar/enrollmentAppBar.dart'; import 'package:nhance_app_pwa/pages/enrollment/service/api_service.dart'; @@ -16,6 +17,8 @@ import 'package:intl/intl.dart'; import 'dart:async'; import 'package:url_launcher/url_launcher.dart'; import '../postEnrollment/chatbot.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; class empDetails extends StatefulWidget { const empDetails({Key? key}) : super(key: key); @@ -100,6 +103,7 @@ class _empDetailsState extends State { dynamic empRefId; dynamic enrollmentEmpClientBranchId; bool isTokenAvailable = false; + final session = SessionManager(); @override void initState() { @@ -128,32 +132,27 @@ class _empDetailsState extends State { } Future getTokenStatus() async { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - setState(() { - isTokenAvailable = prefs.getString('_postToken') != null; + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + setState(() async { + isTokenAvailable = (await TokenService.getPostToken())?.isNotEmpty ?? false; + print('isTokenAvailable $isTokenAvailable'); }); } Future _loadToken() async { print('_loadToken'); final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('enrollToken'); + final String? token = await TokenService.getPreToken(); + print(token); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); - // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(token); - print('decodedToken : $decodedToken'); - enrollmentEmpClientBranchId = - prefs.getString('enrollmentEmpClientBranchId'); - enrollmentEmpCodeString = prefs.getString('enrollmentEmpCodeString'); - print( - 'enrollmentEmpCodeString : $enrollmentEmpCodeString'); // Check if emp_code is correct - enrollmentEmpPrimaryId = prefs.getString('enrollmentEmpPrimaryId'); - enrollmentGpaEmpName = prefs.getString('enrollmentGpaEmpName'); - enrollmentClient_id = prefs.getString('enrollmentClient_id'); + // Decode the JWT token received from the API response + enrollmentEmpClientBranchId = session.enrollmentEmpClientBranchId; + enrollmentEmpCodeString = session.enrollmentEmpCodeString; + print('enrollmentEmpCodeString : $enrollmentEmpCodeString'); // Check if emp_code is correct + enrollmentEmpPrimaryId =session.enrollmentEmpPrimaryId; + enrollmentGpaEmpName = session.enrollmentGpaEmpName; + enrollmentClient_id = session.enrollmentClient_id; selfEmpStatus = prefs.getString('selfEmpStatus'); print('client_id : $enrollmentClient_id'); @@ -169,13 +168,52 @@ class _empDetailsState extends State { getGpaEmpPolicyDetails(enrollmentEmpPrimaryId); getGmcEmpPolicyDetails(enrollmentEmpPrimaryId); fetchRelationshipList(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } + // Future _loadToken() async { + // print('_loadToken'); + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // final String? token = prefs.getString('enrollToken'); + // if (token != null && token.isNotEmpty) { + // setState(() { + // _token = token; + // }); + // + // // Decode the JWT token received from the API response + // Map? decodedToken = Jwt.parseJwt(token); + // print('decodedToken : $decodedToken'); + // enrollmentEmpClientBranchId = + // prefs.getString('enrollmentEmpClientBranchId'); + // enrollmentEmpCodeString = prefs.getString('enrollmentEmpCodeString'); + // print( + // 'enrollmentEmpCodeString : $enrollmentEmpCodeString'); // Check if emp_code is correct + // enrollmentEmpPrimaryId = prefs.getString('enrollmentEmpPrimaryId'); + // enrollmentGpaEmpName = prefs.getString('enrollmentGpaEmpName'); + // enrollmentClient_id = prefs.getString('enrollmentClient_id'); + // selfEmpStatus = prefs.getString('selfEmpStatus'); + // print('client_id : $enrollmentClient_id'); + // + // if (prefs.containsKey('clientLogo') && prefs.containsKey('clientName')) { + // clientLogo = prefs.getString('clientLogo'); + // clientName = prefs.getString('clientName'); + // } else { + // getClientLogoAndDetails(); + // } + // + // // Call the API when the page enters + // getSelfEmployeeProfile(); + // getGpaEmpPolicyDetails(enrollmentEmpPrimaryId); + // getGmcEmpPolicyDetails(enrollmentEmpPrimaryId); + // fetchRelationshipList(); + // } else { + // // Token is empty or null, handle accordingly (e.g., navigate to login screen) + // ToastHelper.showErrorToast(context, 'Session Out'); + // context.go('/login'); + // // Navigator.pushReplacementNamed(context, 'login'); + // } + // } + Future getClientLogoAndDetails() async { try { if (enrollmentClient_id == null || @@ -505,7 +543,7 @@ class _empDetailsState extends State { // Prepare the API request final response = - await apiService.saveFamilyMemberDetailsToApi(formDataList); + await apiService.saveFamilyMemberDetailsToApi(formDataList); // Check the response if (response['status'] == 'success') { @@ -536,22 +574,121 @@ class _empDetailsState extends State { _dobController.clear(); } + void _showExitConfirmation(BuildContext context) { + double myheight = MediaQuery.of(context).size.height; + showDialog( + context: context, + barrierDismissible: false, // User must tap a button to dismiss dialog + builder: (dialogContext) => AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), // Rounded corners + ), + backgroundColor: Colors.white, + contentPadding: EdgeInsets.zero, + title: Text( + 'Log Out Confirmation', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + content: Padding( + padding: const EdgeInsets.all(20.0), + child: Text( + 'Are you sure you want to log out?', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 18, + color: Color(0xFF898C81), + ), + ), + ), + actions: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, // Space buttons evenly + children: [ + SizedBox( + width: + MediaQuery.of(context).size.width * 0.3, // Set button width + child: TextButton( + onPressed: () => Navigator.pop(dialogContext), + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + side: BorderSide( + color: Color(0xFFE26728), // Border color + width: 1, + ), + ), + child: Text( + 'Cancel', + style: GoogleFonts.poppins( + color: Color(0xFFE26728), + fontSize: 16, + ), + ), + ), + ), + SizedBox( + width: + MediaQuery.of(context).size.width * 0.3, // Set button width + child: TextButton( + onPressed: () => TokenService().logout(context), + style: TextButton.styleFrom( + backgroundColor: Color(0xFFE26728), // Background color + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + ), + child: FittedBox( + fit: BoxFit + .scaleDown, // Prevents wrapping while adjusting text size + child: Text( + 'Log Out', + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 16, + ), + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + SizedBox(height: 10), // Add spacing below buttons + ], + ), + ); + } + @override Widget build(BuildContext context) { if (gpaDataIsEmpty == 0 && gmcDataIsEmpty == 0) { print('body if'); print(gpaPolicies); - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + _showExitConfirmation(context); + }, + child: Scaffold( appBar: CustomAppBar(), body: SingleChildScrollView( child: Container( padding: Responsive.isDesktop(context) ? EdgeInsets.symmetric( - horizontal: MediaQuery.of(context).size.width * - 0.2, // 30% of screen width as horizontal padding - vertical: MediaQuery.of(context).size.height * - 0.03, // 5% of screen height as vertical padding - ) + horizontal: MediaQuery.of(context).size.width * + 0.2, // 30% of screen width as horizontal padding + vertical: MediaQuery.of(context).size.height * + 0.03, // 5% of screen height as vertical padding + ) : EdgeInsets.all(10), color: Color(0xFFEFF3F6), child: Column( @@ -564,12 +701,12 @@ class _empDetailsState extends State { height: 75, padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 20, bottom: 20, left: 30, right: 30) + top: 20, bottom: 20, left: 30, right: 30) : EdgeInsets.only( - top: 12, - bottom: 12, - left: 10, - right: 10), // Add padding to the container + top: 12, + bottom: 12, + left: 10, + right: 10), // Add padding to the container child: Row( children: [ Expanded( @@ -589,13 +726,13 @@ class _empDetailsState extends State { return Center( child: CircularProgressIndicator( value: - loadingProgress.expectedTotalBytes != - null - ? loadingProgress - .cumulativeBytesLoaded / - loadingProgress - .expectedTotalBytes! - : null, + loadingProgress.expectedTotalBytes != + null + ? loadingProgress + .cumulativeBytesLoaded / + loadingProgress + .expectedTotalBytes! + : null, ), ); }, @@ -618,7 +755,7 @@ class _empDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 20 : 18, + Responsive.isDesktop(context) ? 20 : 18, fontWeight: FontWeight.w600, ), ), @@ -636,9 +773,9 @@ class _empDetailsState extends State { height: MediaQuery.of(context).size.height, padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 20, bottom: 20, left: 30, right: 30) + top: 20, bottom: 20, left: 30, right: 30) : EdgeInsets.only( - top: 12, bottom: 12, left: 10, right: 10), + top: 12, bottom: 12, left: 10, right: 10), child: Center( child: Text( 'No Active Current policies ', @@ -656,9 +793,15 @@ class _empDetailsState extends State { ], ), ), - )); + ))); } else { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + _showExitConfirmation(context); + }, + child: Scaffold( backgroundColor: Color(0xFFFFFFFF), appBar: CustomAppBar(), body: Stack(children: [ @@ -666,11 +809,11 @@ class _empDetailsState extends State { child: Container( padding: Responsive.isDesktop(context) ? EdgeInsets.symmetric( - horizontal: MediaQuery.of(context).size.width * - 0.2, // 30% of screen width as horizontal padding - vertical: MediaQuery.of(context).size.height * - 0.03, // 5% of screen height as vertical padding - ) + horizontal: MediaQuery.of(context).size.width * + 0.2, // 30% of screen width as horizontal padding + vertical: MediaQuery.of(context).size.height * + 0.03, // 5% of screen height as vertical padding + ) : EdgeInsets.all(10), color: Color(0xFFEFF3F6), child: Column( @@ -683,12 +826,12 @@ class _empDetailsState extends State { height: 80, padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 20, bottom: 20, left: 30, right: 30) + top: 20, bottom: 20, left: 30, right: 30) : EdgeInsets.only( - top: 12, - bottom: 12, - left: 10, - right: 10), // Add padding to the container + top: 12, + bottom: 12, + left: 10, + right: 10), // Add padding to the container child: Row( children: [ Expanded( @@ -708,13 +851,13 @@ class _empDetailsState extends State { return Center( child: CircularProgressIndicator( value: - loadingProgress.expectedTotalBytes != - null - ? loadingProgress - .cumulativeBytesLoaded / - loadingProgress - .expectedTotalBytes! - : null, + loadingProgress.expectedTotalBytes != + null + ? loadingProgress + .cumulativeBytesLoaded / + loadingProgress + .expectedTotalBytes! + : null, ), ); }, @@ -737,7 +880,7 @@ class _empDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 20 : 18, + Responsive.isDesktop(context) ? 20 : 18, fontWeight: FontWeight.w600, ), ), @@ -772,12 +915,12 @@ class _empDetailsState extends State { height: 75, padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 20, bottom: 20, left: 30, right: 30) + top: 20, bottom: 20, left: 30, right: 30) : EdgeInsets.only( - top: 10, - bottom: 10, - left: 10, - right: 10), // Add padding to the container + top: 10, + bottom: 10, + left: 10, + right: 10), // Add padding to the container child: Row( children: [ Expanded( @@ -788,8 +931,9 @@ class _empDetailsState extends State { alignment: Alignment.centerRight, child: ElevatedButton( onPressed: () { - Navigator.pushNamed( - context, 'addOnsDetails'); + context.go('/addOnsDetails'); + // Navigator.pushNamed( + // context, 'addOnsDetails'); }, child: Text( 'Continue', @@ -818,10 +962,10 @@ class _empDetailsState extends State { color: Color(0x98FFFCE5), // Semi-transparent background child: Center( child: // Your GIF loader widget - Image.asset( - height: 60, - width: 60, - 'assets/nhance-loader.gif'), // Adjust path to your GIF loader + Image.asset( + height: 60, + width: 60, + 'assets/nhance-loader.gif'), // Adjust path to your GIF loader ), ), if (Responsive.isDesktop(context) || @@ -848,45 +992,49 @@ class _empDetailsState extends State { floatingActionButtonLocation: Responsive.isDesktop(context) ? null : isTokenAvailable - ? FloatingActionButtonLocation.miniEndFloat - : null, + ? FloatingActionButtonLocation.miniEndFloat + : null, bottomNavigationBar: Responsive.isDesktop(context) ? null : isTokenAvailable - ? CustomBottomNavigationBar( - onTabChanged: (index) { - // For example: - if (index == 0) { - Navigator.pushNamed(context, 'home'); - } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); - } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); - } else if (index == 3) { - Navigator.pushNamed(context, 'help'); - } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); - } - }, - icons: [ - Icons.home_outlined, - Icons.sticky_note_2_outlined, - Icons.person_outline_outlined, - Icons.headset_mic_outlined, - Icons.health_and_safety_outlined, - ], - labels: [ - "Home", - "Claim", - "Profile", - "Help", - "Wellness", - ], - initialIndex: - 0, // Initial index of the bottom navigation bar - ) - : null, - ); + ? CustomBottomNavigationBar( + onTabChanged: (index) { + // For example: + if (index == 0) { + context.go('/home'); + // Navigator.pushNamed(context, 'home'); + } else if (index == 1) { + context.go('/claims'); + // Navigator.pushNamed(context, 'claims'); + } else if (index == 2) { + context.go('/profile'); + // Navigator.pushNamed(context, 'profile'); + } else if (index == 3) { + context.go('/help'); + // Navigator.pushNamed(context, 'help'); + } else if (index == 4) { + context.go('/wellness'); + // Navigator.pushNamed(context, 'wellness'); + } + }, + icons: [ + Icons.home_outlined, + Icons.sticky_note_2_outlined, + Icons.person_outline_outlined, + Icons.headset_mic_outlined, + Icons.health_and_safety_outlined, + ], + labels: [ + "Home", + "Claims", + "Profile", + "Help", + "Wellness", + ], + initialIndex: + 0, // Initial index of the bottom navigation bar + ) : null, + )); } } @@ -914,7 +1062,7 @@ class _empDetailsState extends State { selectedRelationships = relationshipOptions .where( (option) => option['dependent'] == floaterData['form_type'], - ) + ) .toList(); // Set the dropdown value based on the form_type @@ -946,7 +1094,7 @@ class _empDetailsState extends State { selectedRelationships.removeWhere((relationship) => getTrueDataObjects.any((dataObject) => - dataObject['relationship'] == + dataObject['relationship'] == relationship['relationship_name'])); print(selectedRelationships); @@ -992,9 +1140,9 @@ class _empDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text(popupName ?? '', style: GoogleFonts.poppins( @@ -1018,7 +1166,7 @@ class _empDetailsState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ DropdownButtonFormField( decoration: InputDecoration( @@ -1040,7 +1188,7 @@ class _empDetailsState extends State { .map((relationship) { final String relationshipName = relationship[ - 'relationship_name'] ?? + 'relationship_name'] ?? ''; return DropdownMenuItem( value: relationshipName, @@ -1058,7 +1206,7 @@ class _empDetailsState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Container( child: TextFormField( @@ -1069,9 +1217,9 @@ class _empDetailsState extends State { hintText: 'Member Full Name', labelText: 'Member Full Name', contentPadding: - EdgeInsets.symmetric( - vertical: 10, - horizontal: 15), + EdgeInsets.symmetric( + vertical: 10, + horizontal: 15), ), validator: (value) { if (value == null || @@ -1112,7 +1260,7 @@ class _empDetailsState extends State { }, ), contentPadding: - EdgeInsets.symmetric( + EdgeInsets.symmetric( vertical: 10, horizontal: 15, ), @@ -1135,7 +1283,8 @@ class _empDetailsState extends State { onPressed: () { // Close the dialog without sending data cancelPopUp(); - Navigator.of(context).pop(); + context.pop(); + // Navigator.of(context).pop(); }, child: Text( 'Cancel', @@ -1146,7 +1295,7 @@ class _empDetailsState extends State { backgroundColor: Color(0xFFE26728), shape: RoundedRectangleBorder( borderRadius: - BorderRadius.circular(5), + BorderRadius.circular(5), ), ), ), @@ -1158,7 +1307,7 @@ class _empDetailsState extends State { child: ElevatedButton( onPressed: () { if (_relationShipController - .text.isEmpty || + .text.isEmpty || _memberNameController .text.isEmpty || _dobController.text.isEmpty) { @@ -1168,11 +1317,11 @@ class _empDetailsState extends State { } else { Map formData = { 'relationship': - _relationShipController.text, + _relationShipController.text, 'memberName': - _memberNameController.text, + _memberNameController.text, 'dateOfBirth': - _dobController.text, + _dobController.text, // Add more form fields as needed }; @@ -1185,7 +1334,8 @@ class _empDetailsState extends State { gmcSumInsured); // Close the dialog - Navigator.of(context).pop(); + context.pop(); + // Navigator.of(context).pop(); } }, child: Text( @@ -1197,7 +1347,7 @@ class _empDetailsState extends State { backgroundColor: Color(0xFFE26728), shape: RoundedRectangleBorder( borderRadius: - BorderRadius.circular(5), + BorderRadius.circular(5), ), ), ), @@ -1252,9 +1402,9 @@ class _empDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text('Member Details', style: GoogleFonts.poppins( @@ -1379,7 +1529,7 @@ class _empDetailsState extends State { child: TextFormField( readOnly: true, initialValue: - selfGender == 'M' ? 'Male' : 'Female', + selfGender == 'M' ? 'Male' : 'Female', decoration: InputDecoration( border: OutlineInputBorder(), hintText: 'Gender', @@ -1500,7 +1650,7 @@ class _empDetailsState extends State { TextFormField( readOnly: true, initialValue: - selfGender == 'M' ? 'Male' : 'Female', + selfGender == 'M' ? 'Male' : 'Female', decoration: InputDecoration( border: OutlineInputBorder(), hintText: 'Gender', @@ -1543,7 +1693,8 @@ class _empDetailsState extends State { alignment: Alignment.centerRight, child: ElevatedButton( onPressed: () { - Navigator.of(context).pop(); + context.pop(); + // Navigator.of(context).pop(); }, child: Text( 'Close', @@ -1554,7 +1705,7 @@ class _empDetailsState extends State { backgroundColor: Color(0xFFE26728), shape: RoundedRectangleBorder( borderRadius: - BorderRadius.circular(5), + BorderRadius.circular(5), ), ), ), @@ -1702,7 +1853,7 @@ class _empDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 16 : 15, + Responsive.isDesktop(context) ? 16 : 15, color: Color(0xFFE26728), ), ), @@ -1750,37 +1901,37 @@ class _empDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 18 : 13, + Responsive.isDesktop(context) ? 18 : 13, ), ), Row( children: [ !Responsive.isDesktop(context) ? Tooltip( - message: gpaPolicyType ?? 'NA', - child: Text( - gpaPolicyType ?? 'NA', - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 20 - : 14, - fontWeight: FontWeight.w600, - ), - ), - ) + message: gpaPolicyType ?? 'NA', + child: Text( + gpaPolicyType ?? 'NA', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 20 + : 14, + fontWeight: FontWeight.w600, + ), + ), + ) : Text( - gpaPolicyName ?? 'NA', - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 20 - : 14, - fontWeight: FontWeight.w600, - ), - ), + gpaPolicyName ?? 'NA', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 20 + : 14, + fontWeight: FontWeight.w600, + ), + ), if (item['eCardDownload'] != null) GestureDetector( onTap: () async { @@ -1814,7 +1965,7 @@ class _empDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 18 : 13, + Responsive.isDesktop(context) ? 18 : 13, ), ), Text( @@ -1822,7 +1973,7 @@ class _empDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 20 : 14, + Responsive.isDesktop(context) ? 20 : 14, fontWeight: FontWeight.w600, ), ), @@ -1923,133 +2074,133 @@ class _empDetailsState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Additional Premium', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + 'Additional Premium', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gpaSiPremiumValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + (gpaSiPremiumValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'GST', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + 'GST', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gpaGstValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + (gpaGstValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Total Payable', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 5, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + 'Total Payable', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 5, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gpaTotalableValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - ])) + children: [ + Text( + (gpaTotalableValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + ])) ], ), ), @@ -2083,7 +2234,7 @@ class _empDetailsState extends State { gmcGstValue = item['family_floaters_of_dependent_and_gst_value']; print('gmcGstValue $gmcGstValue'); gmcSiPremiumValue = - item['family_floaters_of_dependent_and_si_premium_value']; + item['family_floaters_of_dependent_and_si_premium_value']; print('gmcSiPremiumValue $gmcSiPremiumValue'); gmcTotalableValue = gmcGstValue + gmcSiPremiumValue; gmcIsValueValid = (gmcSiPremiumValue != 0 && gmcGstValue != 0); @@ -2221,13 +2372,13 @@ class _empDetailsState extends State { if (gmcECardDownload == null) Expanded( flex: (isValueExist && - floaterData['relationship'] != 'Self') + floaterData['relationship'] != 'Self') ? Responsive.isDesktop(context) - ? 1 - : 2 + ? 1 + : 2 : Responsive.isDesktop(context) - ? 2 - : 4, + ? 2 + : 4, child: Container( alignment: Alignment.topRight, child: Column( @@ -2332,7 +2483,7 @@ class _empDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 22 : 18, + Responsive.isDesktop(context) ? 22 : 18, fontWeight: FontWeight.w500, ), ), @@ -2367,9 +2518,9 @@ class _empDetailsState extends State { ), padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 15, bottom: 15, left: 25, right: 25) + top: 15, bottom: 15, left: 25, right: 25) : EdgeInsets.only( - top: 10, bottom: 10, left: 10, right: 10), + top: 10, bottom: 10, left: 10, right: 10), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -2399,9 +2550,9 @@ class _empDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) - ? 20 - : 14, + Responsive.isDesktop(context) + ? 20 + : 14, fontWeight: FontWeight.w600, ), ), @@ -2458,7 +2609,7 @@ class _empDetailsState extends State { SizedBox(height: 10), Container( padding: - EdgeInsets.only(top: 0, bottom: 0, left: 10, right: 10), + EdgeInsets.only(top: 0, bottom: 0, left: 10, right: 10), child: Text(gmcFloaterTextDescription, style: GoogleFonts.poppins( fontSize: Responsive.isDesktop(context) ? 14 : 11, @@ -2475,9 +2626,9 @@ class _empDetailsState extends State { ), padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 15, bottom: 15, left: 25, right: 25) + top: 15, bottom: 15, left: 25, right: 25) : EdgeInsets.only( - top: 10, bottom: 10, left: 10, right: 10), + top: 10, bottom: 10, left: 10, right: 10), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -2516,7 +2667,7 @@ class _empDetailsState extends State { SizedBox(height: 15), Container( padding: - EdgeInsets.only(top: 0, bottom: 0, left: 15, right: 15), + EdgeInsets.only(top: 0, bottom: 0, left: 15, right: 15), child: Text('Please review your enrolled dependents.', style: GoogleFonts.poppins( fontSize: Responsive.isDesktop(context) ? 18 : 16, @@ -2614,139 +2765,139 @@ class _empDetailsState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Additional Premium', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: + children: [ + Text( + 'Additional Premium', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gmcSiPremiumValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Text( + (gmcSiPremiumValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'GST', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: + children: [ + Text( + 'GST', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gmcGstValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: + children: [ + Text( + (gmcGstValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Total Payable', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 5, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: + children: [ + Text( + 'Total Payable', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 5, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gmcTotalableValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - ])) + children: [ + Text( + (gmcTotalableValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + ])) ], ), )); @@ -2756,4 +2907,4 @@ class _empDetailsState extends State { return cards; } -} +} \ No newline at end of file diff --git a/lib/pages/enrollment/empReview.dart b/lib/pages/enrollment/empReview.dart index e3430c5..78c3588 100755 --- a/lib/pages/enrollment/empReview.dart +++ b/lib/pages/enrollment/empReview.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:nhance_app_pwa/customAppBar/enrollmentAppBar.dart'; @@ -16,6 +17,8 @@ import '../../customAppBar/responsive.dart'; import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; import '../postEnrollment/chatbot.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; class empReviewDetails extends StatefulWidget { const empReviewDetails({Key? key}) : super(key: key); @@ -39,7 +42,7 @@ class _empReviewDetailsState extends State { bool topUpSiIsChecked = false; // Declare the _isSwitched variable here bool topUpParentIsChecked = false; // Declare the _isSwitched variable here bool addOnsDependentIsChecked = - false; // Declare the _isSwitched variable here + false; // Declare the _isSwitched variable here dynamic _token; dynamic enrollmentEmpCodeString; @@ -165,10 +168,11 @@ class _empReviewDetailsState extends State { bool gpahasPremiumSummary = false; bool gmchasPremiumSummary = false; List> allDisclaimer = - []; // Declare this to store all disclaimers + []; // Declare this to store all disclaimers late List checkboxValues; bool isTokenAvailable = false; bool isEnrollCompletedStatus = false; + final session = SessionManager(); @override void initState() { @@ -186,9 +190,9 @@ class _empReviewDetailsState extends State { } Future getTokenStatus() async { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - setState(() { - isTokenAvailable = prefs.getString('_postToken') != null; + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + setState(() async { + isTokenAvailable = (await TokenService.getPostToken())?.isNotEmpty ?? false; }); } @@ -208,20 +212,17 @@ class _empReviewDetailsState extends State { } Future _loadToken() async { + print('_loadToken'); final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('enrollToken'); + final String? token = await TokenService.getPreToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); selfEmpStatus = prefs.getString('selfEmpStatus'); - enrollmentEmpClientBranchId = - prefs.getString('enrollmentEmpClientBranchId'); - enrollmentEmpCodeString = prefs.getString('enrollmentEmpCodeString'); + enrollmentEmpClientBranchId = session.enrollmentEmpClientBranchId; + enrollmentEmpCodeString =session.enrollmentEmpCodeString; print(enrollmentEmpCodeString); // Check if emp_code is correct - enrollmentEmpPrimaryId = prefs.getString('enrollmentEmpPrimaryId'); - enrollmentGpaEmpName = prefs.getString('enrollmentGpaEmpName'); - enrollmentClient_id = prefs.getString('enrollmentClient_id'); + enrollmentEmpPrimaryId = session.enrollmentEmpPrimaryId; + enrollmentGpaEmpName = session.enrollmentGpaEmpName; + enrollmentClient_id = session.enrollmentClient_id; print(enrollmentClient_id); // Call the API when the page enters @@ -238,13 +239,48 @@ class _empReviewDetailsState extends State { getGmcEmpPolicyDetails(enrollmentEmpPrimaryId); primarySummary(); _sortDisclaimerByTypeOrder(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } + // Future _loadToken() async { + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // final String? token = prefs.getString('enrollToken'); + // if (token != null && token.isNotEmpty) { + // setState(() { + // _token = token; + // }); + // selfEmpStatus = prefs.getString('selfEmpStatus'); + // enrollmentEmpClientBranchId = + // prefs.getString('enrollmentEmpClientBranchId'); + // enrollmentEmpCodeString = prefs.getString('enrollmentEmpCodeString'); + // print(enrollmentEmpCodeString); // Check if emp_code is correct + // enrollmentEmpPrimaryId = prefs.getString('enrollmentEmpPrimaryId'); + // enrollmentGpaEmpName = prefs.getString('enrollmentGpaEmpName'); + // enrollmentClient_id = prefs.getString('enrollmentClient_id'); + // print(enrollmentClient_id); + // + // // Call the API when the page enters + // if (prefs.containsKey('clientLogo') && prefs.containsKey('clientName')) { + // clientLogo = prefs.getString('clientLogo'); + // clientName = prefs.getString('clientName'); + // } else { + // getClientLogoAndDetails(); + // } + // getGmcSiTopUp(); + // getGmcSiParentTopUp(); + // getGmcDependentAddOns(); + // getGpaEmpPolicyDetails(enrollmentEmpPrimaryId); + // getGmcEmpPolicyDetails(enrollmentEmpPrimaryId); + // primarySummary(); + // _sortDisclaimerByTypeOrder(); + // } else { + // // Token is empty or null, handle accordingly (e.g., navigate to login screen) + // ToastHelper.showErrorToast(context, 'Session Out'); + // context.go('/login'); + // // Navigator.pushReplacementNamed(context, 'login'); + // } + // } + void primarySummary() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); if (prefs.containsKey('siData')) { @@ -275,7 +311,7 @@ class _empReviewDetailsState extends State { Map firstSiParentData = siParentDataList.first; // Get the value of topUpSiPremiumValue topUpParentSiPremiumValue = - firstSiParentData['topUpParentSiPremiumValue']; + firstSiParentData['topUpParentSiPremiumValue']; topUpParentSiPremiumGst = firstSiParentData['topUpParentSiPremiumGst']; topUpParentSiTotalAmt = firstSiParentData['topUpParentSiTotalAmt']; } @@ -294,13 +330,13 @@ class _empReviewDetailsState extends State { // Get the value of topUpSiPremiumValue print('150000000000'); addOnDependentPremiumValue = - firstDependentListData['addOnDependentPremiumValue']; + firstDependentListData['addOnDependentPremiumValue']; print(addOnDependentPremiumValue); addOnsDependentPremiumGst = - firstDependentListData['addOnsDependentPremiumGst']; + firstDependentListData['addOnsDependentPremiumGst']; print(addOnsDependentPremiumGst); addOnsDependentTotalAmt = - firstDependentListData['addOnsDependentTotalAmt']; + firstDependentListData['addOnsDependentTotalAmt']; print(addOnsDependentTotalAmt); } } @@ -415,11 +451,11 @@ class _empReviewDetailsState extends State { newEntries.addAll( List>.from( disclaimer.map((text) => { - 'id': allDisclaimer.length + newEntries.length + 1, - 'text': text, - 'checked': false, - 'type': item['type'] - }), + 'id': allDisclaimer.length + newEntries.length + 1, + 'text': text, + 'checked': false, + 'type': item['type'] + }), ), ); } else { @@ -499,11 +535,11 @@ class _empReviewDetailsState extends State { newEntries.addAll( List>.from( disclaimer.map((text) => { - 'id': allDisclaimer.length + newEntries.length + 1, - 'text': text, - 'checked': false, - 'type': item['type'] - }), + 'id': allDisclaimer.length + newEntries.length + 1, + 'text': text, + 'checked': false, + 'type': item['type'] + }), ), ); } else { @@ -557,10 +593,10 @@ class _empReviewDetailsState extends State { if (topUpSiPolicies.isNotEmpty) { // setState(() { topUpClientPolicyId = - topUpSiPolicies['gmc_si_topup']['client_policy_id']; + topUpSiPolicies['gmc_si_topup']['client_policy_id']; topUpSumInsured = topUpSiPolicies['gmc_si_topup'] - ['family_floaters_of_only_si_value']; + ['family_floaters_of_only_si_value']; print(topUpSumInsured); if (topUpSumInsured == 0) { @@ -570,25 +606,25 @@ class _empReviewDetailsState extends State { } topUpOpenForEnrollment = - topUpSiPolicies['gmc_si_topup']['OpenForEnrollment']; + topUpSiPolicies['gmc_si_topup']['OpenForEnrollment']; topUpPolicyName = - await topUpSiPolicies['gmc_si_topup']['policy_name']; + await topUpSiPolicies['gmc_si_topup']['policy_name']; topUpPolicyType = await topUpSiPolicies['gmc_si_topup']['type']; topUpMappedFamilyFloatersSiArray = topUpSiPolicies['gmc_si_topup'] - ['family_floaters_of_only_si_array']; + ['family_floaters_of_only_si_array']; print('topUpMappedFamilyFloatersSiArray'); print(topUpMappedFamilyFloatersSiArray); topUpTypeName = topUpSiPolicies['gmc_si_topup']['type']; topUpFloaterTextHeading = - topUpSiPolicies['gmc_si_topup']['floter_text_heading']; + topUpSiPolicies['gmc_si_topup']['floter_text_heading']; topUpECardDownload = - topUpSiPolicies['gmc_si_topup']['eCardDownload']; + topUpSiPolicies['gmc_si_topup']['eCardDownload']; setState(() { topUpIsPremiumSummary = topUpSiPolicies['gmc_si_topup']['is_premium_summery']; @@ -600,7 +636,7 @@ class _empReviewDetailsState extends State { // } topUpDisclaimer = - await topUpSiPolicies['gmc_si_topup']['disclaimer']; + await topUpSiPolicies['gmc_si_topup']['disclaimer']; if (topUpOpenForEnrollment == '1' && activeSiData == 1) { if (topUpDisclaimer != null && topUpDisclaimer.isNotEmpty) { @@ -620,11 +656,11 @@ class _empReviewDetailsState extends State { newEntries.addAll( List>.from( topUpDisclaimer.map((text) => { - 'id': allDisclaimer.length + newEntries.length + 1, - 'text': text, - 'checked': false, - 'type': topUpTypeName - }), + 'id': allDisclaimer.length + newEntries.length + 1, + 'text': text, + 'checked': false, + 'type': topUpTypeName + }), ), ); } else { @@ -684,36 +720,36 @@ class _empReviewDetailsState extends State { }); if (topUpSiParentPolicies.isNotEmpty) { topUpParentClientPolicyId = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['client_policy_id']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['client_policy_id']; topUpParentSlabRates = - await topUpSiParentPolicies['gmc_si_parent_topup']['SlabRates']; + await topUpSiParentPolicies['gmc_si_parent_topup']['SlabRates']; print('topUpParentSlabRates'); print(topUpParentSlabRates); topUpParentPolicyName = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['policy_name']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['policy_name']; topUpParentPolicyType = - await topUpSiParentPolicies['gmc_si_parent_topup']['type']; + await topUpSiParentPolicies['gmc_si_parent_topup']['type']; topUpParentFamilyFloater = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['policy_terms']['family_floater']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['policy_terms']['family_floater']; print('topUpParentFamilyFloater'); print(topUpParentFamilyFloater); topUpParentMappedFamilyFloatersSi = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['family_floaters_of_only_si_array']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['family_floaters_of_only_si_array']; print('topUpParentMappedFamilyFloatersSi'); print(topUpParentMappedFamilyFloatersSi); print('topUpECardDownload'); topUpParentECardDownload = - topUpSiParentPolicies['gmc_si_parent_topup']['eCardDownload']; + topUpSiParentPolicies['gmc_si_parent_topup']['eCardDownload']; setState(() { topUpParentIsPremiumSummary = topUpSiParentPolicies['gmc_si_parent_topup']['is_premium_summery']; @@ -731,15 +767,15 @@ class _empReviewDetailsState extends State { // print(topUpParentOpenForEnrollment); topUpParentTypeName = - topUpSiParentPolicies['gmc_si_parent_topup']['type']; + topUpSiParentPolicies['gmc_si_parent_topup']['type']; topUpParentFloterTextHeading = - topUpSiParentPolicies['gmc_si_parent_topup'] - ['floter_text_heading']; + topUpSiParentPolicies['gmc_si_parent_topup'] + ['floter_text_heading']; topUpParentSiValue = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['family_floaters_of_only_si_value']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['family_floaters_of_only_si_value']; if (topUpParentSiValue == 0) { showHideTopUpParentCard = 0; @@ -748,12 +784,12 @@ class _empReviewDetailsState extends State { } topUpParentOpenForEnrollment = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['OpenForEnrollment']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['OpenForEnrollment']; topUpParentDisclaimer = - await topUpSiParentPolicies['gmc_si_parent_topup'] - ['disclaimer']; + await topUpSiParentPolicies['gmc_si_parent_topup'] + ['disclaimer']; if (topUpParentOpenForEnrollment == '1' && activeSiParentData == 1) { @@ -775,11 +811,11 @@ class _empReviewDetailsState extends State { newEntries.addAll( List>.from( topUpParentDisclaimer.map((text) => { - 'id': allDisclaimer.length + newEntries.length + 1, - 'text': text, - 'checked': false, - 'type': topUpParentTypeName - }), + 'id': allDisclaimer.length + newEntries.length + 1, + 'text': text, + 'checked': false, + 'type': topUpParentTypeName + }), ), ); } else { @@ -834,18 +870,18 @@ class _empReviewDetailsState extends State { print(addOnsDependentPolicies); if (addOnsDependentPolicies.isNotEmpty) { addOnsDependentClientPolicyId = - addOnsDependentPolicies['gmc_dependent_addon'] - ['client_policy_id']; + addOnsDependentPolicies['gmc_dependent_addon'] + ['client_policy_id']; print(addOnsDependentClientPolicyId); addOnsDependentSumInsured = int.parse( addOnsDependentPolicies['gmc_dependent_addon'] - ['family_floaters_of_dependent_and_si_value'] + ['family_floaters_of_dependent_and_si_value'] .toString()); print('addOnsDependentSumInsured $addOnsDependentSumInsured'); var value = int.parse(addOnsDependentPolicies['gmc_dependent_addon'] - ['family_floaters_of_dependent_and_si_premium_value'] + ['family_floaters_of_dependent_and_si_premium_value'] .toString()); print(value); @@ -864,34 +900,34 @@ class _empReviewDetailsState extends State { // } addOnsDependentPolicyName = - addOnsDependentPolicies['gmc_dependent_addon']['policy_name']; + addOnsDependentPolicies['gmc_dependent_addon']['policy_name']; print(addOnsDependentPolicyName); addOnsDependentPolicyType = - addOnsDependentPolicies['gmc_dependent_addon']['type']; + addOnsDependentPolicies['gmc_dependent_addon']['type']; print(addOnsDependentPolicyType); addOnsDependentMappedFamilyFloatersArray = - await addOnsDependentPolicies['gmc_dependent_addon'] - ['family_floaters_of_dependent_and_si_array']; + await addOnsDependentPolicies['gmc_dependent_addon'] + ['family_floaters_of_dependent_and_si_array']; print('addOnsDependentMappedFamilyFloatersArray'); print(addOnsDependentMappedFamilyFloatersArray); addOnsFloaterTextHeading = - addOnsDependentPolicies['gmc_dependent_addon'] - ['floter_text_heading']; + addOnsDependentPolicies['gmc_dependent_addon'] + ['floter_text_heading']; addOnsDependentECardDownload = - addOnsDependentPolicies['gmc_dependent_addon']['eCardDownload']; + addOnsDependentPolicies['gmc_dependent_addon']['eCardDownload']; addOnsDependentDisclaimer = - await addOnsDependentPolicies['gmc_dependent_addon'] - ['disclaimer']; + await addOnsDependentPolicies['gmc_dependent_addon'] + ['disclaimer']; print( 'addOnsDependentOpenForEnrollment $addOnsDependentDisclaimer'); addOnsDependentOpenForEnrollment = - await addOnsDependentPolicies['gmc_dependent_addon'] - ['OpenForEnrollment']; + await addOnsDependentPolicies['gmc_dependent_addon'] + ['OpenForEnrollment']; setState(() { addOnsDependentIsPremiumSummary = addOnsDependentPolicies['gmc_dependent_addon']['is_premium_summery']; @@ -924,11 +960,11 @@ class _empReviewDetailsState extends State { newEntries.addAll( List>.from( addOnsDependentDisclaimer.map((text) => { - 'id': allDisclaimer.length + newEntries.length + 1, - 'text': text, - 'checked': false, - 'type': addOnsDependentPolicyType - }), + 'id': allDisclaimer.length + newEntries.length + 1, + 'text': text, + 'checked': false, + 'type': addOnsDependentPolicyType + }), ), ); } else { @@ -1085,9 +1121,11 @@ class _empReviewDetailsState extends State { // Wait 3 seconds, then navigate to home page Future.delayed(const Duration(seconds: 3), () { if(isTokenAvailable) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); + // Navigator.pushNamed(context, 'home'); } else { - Navigator.pushNamed(context, 'empDetails'); + context.go('/empDetails'); + // Navigator.pushNamed(context, 'empDetails'); } }); @@ -1147,6 +1185,7 @@ class _empReviewDetailsState extends State { ), ), onPressed: () { + context.pop(); Navigator.of(context).pop(); }, ), @@ -1223,11 +1262,110 @@ class _empReviewDetailsState extends State { return total; } + void _showExitConfirmation(BuildContext context) { + double myheight = MediaQuery.of(context).size.height; + showDialog( + context: context, + barrierDismissible: false, // User must tap a button to dismiss dialog + builder: (dialogContext) => AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), // Rounded corners + ), + backgroundColor: Colors.white, + contentPadding: EdgeInsets.zero, + title: Text( + 'Log Out Confirmation', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + content: Padding( + padding: const EdgeInsets.all(20.0), + child: Text( + 'Are you sure you want to log out?', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 18, + color: Color(0xFF898C81), + ), + ), + ), + actions: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, // Space buttons evenly + children: [ + SizedBox( + width: + MediaQuery.of(context).size.width * 0.3, // Set button width + child: TextButton( + onPressed: () => Navigator.pop(dialogContext), + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + side: BorderSide( + color: Color(0xFFE26728), // Border color + width: 1, + ), + ), + child: Text( + 'Cancel', + style: GoogleFonts.poppins( + color: Color(0xFFE26728), + fontSize: 16, + ), + ), + ), + ), + SizedBox( + width: + MediaQuery.of(context).size.width * 0.3, // Set button width + child: TextButton( + onPressed: () => TokenService().logout(context), + style: TextButton.styleFrom( + backgroundColor: Color(0xFFE26728), // Background color + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + ), + child: FittedBox( + fit: BoxFit + .scaleDown, // Prevents wrapping while adjusting text size + child: Text( + 'Log Out', + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 16, + ), + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + SizedBox(height: 10), // Add spacing below buttons + ], + ), + ); + } + @override Widget build(BuildContext context) { if ((gpaMappedFamilyFloaters == [] && gpaMappedFamilyFloaters == null) && (gmcMappedFamilyFloaters == [] && gmcMappedFamilyFloaters == null)) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/addOnsDetails'); + }, + child: Scaffold( appBar: CustomAppBar(), body: SingleChildScrollView( child: Container( @@ -1244,9 +1382,16 @@ class _empReviewDetailsState extends State { ], ), ), - )); + )) + ); } else { - return isEnrollCompletedStatus == true ? Scaffold( + return isEnrollCompletedStatus == true ? PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + _showExitConfirmation(context); + }, + child: Scaffold( backgroundColor: const Color(0xFFF2F6FA), // Matches your light gray background appBar: CustomAppBar(), body: Center( @@ -1306,9 +1451,11 @@ class _empReviewDetailsState extends State { child: ElevatedButton( onPressed: () => { if(isTokenAvailable) { - Navigator.pushNamed(context, 'home') + context.go('/home') + // Navigator.pushNamed(context, 'home') } else { - Navigator.pushNamed(context, 'empDetails') + context.go('/empDetails') + // Navigator.pushNamed(context, 'empDetails') } }, @@ -1338,21 +1485,25 @@ class _empReviewDetailsState extends State { : null, bottomNavigationBar: Responsive.isDesktop(context) ? null - : isTokenAvailable - ? CustomBottomNavigationBar( + : CustomBottomNavigationBar( onTabChanged: (index) { // Add your navigation logic here // For example: if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); + // Navigator.pushNamed(context, 'home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); + // Navigator.pushNamed(context, 'claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.go('/profile'); + // Navigator.pushNamed(context, 'profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.go('/help'); + // Navigator.pushNamed(context, 'help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + context.go('/wellness'); + // Navigator.pushNamed(context, 'wellness'); } }, icons: [ @@ -1364,16 +1515,21 @@ class _empReviewDetailsState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "wellness", ], initialIndex: 0, // Initial index of the bottom navigation bar - ) - : null, - ) : Scaffold( + ), + )) : PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/addOnsDetails'); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -1381,11 +1537,11 @@ class _empReviewDetailsState extends State { child: Container( padding: Responsive.isDesktop(context) ? EdgeInsets.symmetric( - horizontal: MediaQuery.of(context).size.width * - 0.2, // 30% of screen width as horizontal padding - vertical: MediaQuery.of(context).size.height * - 0.03, // 5% of screen height as vertical padding - ) + horizontal: MediaQuery.of(context).size.width * + 0.2, // 30% of screen width as horizontal padding + vertical: MediaQuery.of(context).size.height * + 0.03, // 5% of screen height as vertical padding + ) : EdgeInsets.all(10), color: Color(0xFFEFF3F6), child: Column( @@ -1398,12 +1554,12 @@ class _empReviewDetailsState extends State { height: 80, padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 20, bottom: 20, left: 30, right: 30) + top: 20, bottom: 20, left: 30, right: 30) : EdgeInsets.only( - top: 12, - bottom: 12, - left: 10, - right: 10), // Add padding to the container + top: 12, + bottom: 12, + left: 10, + right: 10), // Add padding to the container child: Row( children: [ Expanded( @@ -1452,7 +1608,7 @@ class _empReviewDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 20 : 18, + Responsive.isDesktop(context) ? 20 : 18, fontWeight: FontWeight.w600, ), ), @@ -1463,100 +1619,100 @@ class _empReviewDetailsState extends State { ), SizedBox(height: 16), if(gpahasPremiumSummary == true || gmchasPremiumSummary == true || topUpIsPremiumSummary == '1' || topUpParentIsPremiumSummary == '1' || addOnsDependentIsPremiumSummary == '1') - Card( - elevation: 0, - color: Colors.white, - child: Container( - width: double.infinity, - padding: Responsive.isDesktop(context) - ? EdgeInsets.all(30) - : EdgeInsets.all( - 10), // Add padding to the container - child: Column(children: [ - Row( - children: [ - Expanded( - flex: 12, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - 'Review', - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 20 - : 18, - color: Color(0xFF181818), - fontWeight: FontWeight.w600, + Card( + elevation: 0, + color: Colors.white, + child: Container( + width: double.infinity, + padding: Responsive.isDesktop(context) + ? EdgeInsets.all(30) + : EdgeInsets.all( + 10), // Add padding to the container + child: Column(children: [ + Row( + children: [ + Expanded( + flex: 12, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + 'Review', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 20 + : 18, + color: Color(0xFF181818), + fontWeight: FontWeight.w600, + ), ), - ), - ], - ))), - ], - ), + ], + ))), + ], + ), - Row( - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - 'Total Payable', - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 18 - : 16, - color: Color(0xFF181818), + Row( + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + 'Total Payable', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 18 + : 16, + color: Color(0xFF181818), + ), ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - '₹${allTotalSum()}/Year', - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 22 - : 18, - color: Color(0xFFE26728), - fontWeight: FontWeight.w500, + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + '₹${allTotalSum()}/Year', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 22 + : 18, + color: Color(0xFFE26728), + fontWeight: FontWeight.w500, + ), ), - ), - ], - ))), - ], - ), - ])), - ), + ], + ))), + ], + ), + ])), + ), if(gpahasPremiumSummary == true || gmchasPremiumSummary == true || topUpIsPremiumSummary == '1' || topUpParentIsPremiumSummary == '1' || addOnsDependentIsPremiumSummary == '1') - SizedBox(height: 16), + SizedBox(height: 16), if (gpaPolicies != null && gpaPolicies.length > 0) Column( crossAxisAlignment: CrossAxisAlignment.stretch, @@ -1593,19 +1749,19 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Text( 'Add Ons', textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 16, + Responsive.isDesktop( + context) + ? 18 + : 16, color: Color(0xFF181818), fontWeight: FontWeight.w600, ), @@ -1625,15 +1781,15 @@ class _empReviewDetailsState extends State { ), padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 15, - bottom: 15, - left: 25, - right: 25) + top: 15, + bottom: 15, + left: 25, + right: 25) : EdgeInsets.only( - top: 10, - bottom: 10, - left: 10, - right: 10), + top: 10, + bottom: 10, + left: 10, + right: 10), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -1645,38 +1801,38 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Text( '', textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 14, + Responsive.isDesktop( + context) + ? 18 + : 14, ), ), Row( children: [ Text( Responsive.isDesktop( - context) + context) ? addOnsDependentPolicyName : addOnsDependentPolicyType, textAlign: TextAlign.left, style: - GoogleFonts.poppins( + GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 20 : 16, fontWeight: - FontWeight.w600, + FontWeight.w600, ), ), if (addOnsDependentECardDownload != @@ -1688,8 +1844,8 @@ class _empReviewDetailsState extends State { }, child: MouseRegion( cursor: - SystemMouseCursors - .click, + SystemMouseCursors + .click, child: Icon( Icons.file_download, color: Color( @@ -1710,9 +1866,9 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.end, + MainAxisAlignment.end, crossAxisAlignment: - CrossAxisAlignment.end, + CrossAxisAlignment.end, children: [ Text( addOnsFloaterTextHeading ?? @@ -1720,10 +1876,10 @@ class _empReviewDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 14, + Responsive.isDesktop( + context) + ? 18 + : 14, ), ), Text( @@ -1731,10 +1887,10 @@ class _empReviewDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 20 - : 16, + Responsive.isDesktop( + context) + ? 20 + : 16, fontWeight: FontWeight.w600, ), ), @@ -1747,20 +1903,20 @@ class _empReviewDetailsState extends State { Container( padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 0, bottom: 0, left: 15, right: 15) + top: 0, bottom: 0, left: 15, right: 15) : EdgeInsets.only( - top: 0, bottom: 0, left: 5, right: 5), + top: 0, bottom: 0, left: 5, right: 5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: - addOnsDependentMappedFamilyFloatersArray - .where((item) => - item['is_value_exist'] == true) - .map((item) { + addOnsDependentMappedFamilyFloatersArray + .where((item) => + item['is_value_exist'] == true) + .map((item) { Map data = item['data']; return Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Icon(Icons.arrow_right, color: Color( @@ -1774,9 +1930,9 @@ class _empReviewDetailsState extends State { '${data['name']} - ${data['relationship']} - ${data['dob']}', style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) - ? 18 - : 14, + Responsive.isDesktop(context) + ? 18 + : 14, color: Color(0xFF232526), ), ), @@ -1810,19 +1966,19 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Text( 'Add Ons', textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 16, + Responsive.isDesktop( + context) + ? 18 + : 16, color: Color(0xFF181818), fontWeight: FontWeight.w600, ), @@ -1842,15 +1998,15 @@ class _empReviewDetailsState extends State { ), padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 15, - bottom: 15, - left: 25, - right: 25) + top: 15, + bottom: 15, + left: 25, + right: 25) : EdgeInsets.only( - top: 10, - bottom: 10, - left: 10, - right: 10), + top: 10, + bottom: 10, + left: 10, + right: 10), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -1862,38 +2018,38 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Text( '', textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 13, + Responsive.isDesktop( + context) + ? 18 + : 13, ), ), Row( children: [ Text( Responsive.isDesktop( - context) + context) ? topUpPolicyName : topUpPolicyType, textAlign: TextAlign.left, style: - GoogleFonts.poppins( + GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 20 : 14, fontWeight: - FontWeight.w600, + FontWeight.w600, ), ), if (topUpECardDownload != @@ -1905,8 +2061,8 @@ class _empReviewDetailsState extends State { }, child: MouseRegion( cursor: - SystemMouseCursors - .click, + SystemMouseCursors + .click, child: Icon( Icons.file_download, color: Color( @@ -1927,19 +2083,19 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.end, + MainAxisAlignment.end, crossAxisAlignment: - CrossAxisAlignment.end, + CrossAxisAlignment.end, children: [ Text( topUpFloaterTextHeading ?? '', textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 13, + Responsive.isDesktop( + context) + ? 18 + : 13, ), ), Text( @@ -1947,10 +2103,10 @@ class _empReviewDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 20 - : 14, + Responsive.isDesktop( + context) + ? 20 + : 14, fontWeight: FontWeight.w600, ), ), @@ -1963,21 +2119,21 @@ class _empReviewDetailsState extends State { Container( padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 0, bottom: 0, left: 15, right: 15) + top: 0, bottom: 0, left: 15, right: 15) : EdgeInsets.only( - top: 0, bottom: 0, left: 5, right: 5), + top: 0, bottom: 0, left: 5, right: 5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: topUpMappedFamilyFloatersSiArray .where((item) => - item['is_value_exist'] == true) + item['is_value_exist'] == true) .map((item) { Map data = item['data']; String formattedDate = - formatDate(data['dob']); + formatDate(data['dob']); return Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Icon(Icons.arrow_right, color: Color( @@ -1991,9 +2147,9 @@ class _empReviewDetailsState extends State { '${data['name']} ~ ${data['relationship']} ~ DOB : $formattedDate', style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) - ? 18 - : 14, + Responsive.isDesktop(context) + ? 18 + : 14, color: Color(0xFF232526), ), ), @@ -2027,19 +2183,19 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Text( 'Add Ons', textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 16, + Responsive.isDesktop( + context) + ? 18 + : 16, color: Color(0xFF181818), fontWeight: FontWeight.w600, ), @@ -2059,15 +2215,15 @@ class _empReviewDetailsState extends State { ), padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 15, - bottom: 15, - left: 25, - right: 25) + top: 15, + bottom: 15, + left: 25, + right: 25) : EdgeInsets.only( - top: 10, - bottom: 10, - left: 10, - right: 10), + top: 10, + bottom: 10, + left: 10, + right: 10), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -2079,19 +2235,19 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.start, + MainAxisAlignment.start, crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Text( '', textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 13, + Responsive.isDesktop( + context) + ? 18 + : 13, ), ), Container( @@ -2101,20 +2257,20 @@ class _empReviewDetailsState extends State { Flexible( child: Text( Responsive.isDesktop( - context) + context) ? topUpParentPolicyName : topUpParentPolicyType, textAlign: - TextAlign.left, + TextAlign.left, style: GoogleFonts .poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 20 : 14, fontWeight: - FontWeight.w600, + FontWeight.w600, ), softWrap: true, overflow: TextOverflow @@ -2130,8 +2286,8 @@ class _empReviewDetailsState extends State { }, child: MouseRegion( cursor: - SystemMouseCursors - .click, + SystemMouseCursors + .click, child: Icon( Icons .file_download, @@ -2154,9 +2310,9 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.end, + MainAxisAlignment.end, crossAxisAlignment: - CrossAxisAlignment.end, + CrossAxisAlignment.end, children: [ Text( topUpParentFloterTextHeading ?? @@ -2164,10 +2320,10 @@ class _empReviewDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 18 - : 13, + Responsive.isDesktop( + context) + ? 18 + : 13, ), ), Text( @@ -2175,10 +2331,10 @@ class _empReviewDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop( - context) - ? 20 - : 14, + Responsive.isDesktop( + context) + ? 20 + : 14, fontWeight: FontWeight.w600, ), ), @@ -2191,21 +2347,21 @@ class _empReviewDetailsState extends State { Container( padding: Responsive.isDesktop(context) ? EdgeInsets.only( - top: 0, bottom: 0, left: 15, right: 15) + top: 0, bottom: 0, left: 15, right: 15) : EdgeInsets.only( - top: 0, bottom: 0, left: 5, right: 5), + top: 0, bottom: 0, left: 5, right: 5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: topUpParentMappedFamilyFloatersSi .where((item) => - item['is_value_exist'] == true) + item['is_value_exist'] == true) .map((item) { Map data = item['data']; String formattedDate = - formatDate(data['dob']); + formatDate(data['dob']); return Row( crossAxisAlignment: - CrossAxisAlignment.start, + CrossAxisAlignment.start, children: [ Icon(Icons.arrow_right, color: Color( @@ -2219,9 +2375,9 @@ class _empReviewDetailsState extends State { '${data['name']} ~ ${data['relationship']} ~ DOB : $formattedDate', style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) - ? 18 - : 14, + Responsive.isDesktop(context) + ? 18 + : 14, color: Color(0xFF232526), ), ), @@ -2245,38 +2401,38 @@ class _empReviewDetailsState extends State { child: Column( children: [ if(gpahasPremiumSummary == true || gmchasPremiumSummary == true || topUpIsPremiumSummary == '1' || topUpParentIsPremiumSummary == '1' || addOnsDependentIsPremiumSummary == '1') - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 12, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - 'Premium Summary', - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 18 - : 16, - color: Color(0xFF181818), - fontWeight: FontWeight.w600, + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 12, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + 'Premium Summary', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop( + context) + ? 18 + : 16, + color: Color(0xFF181818), + fontWeight: FontWeight.w600, + ), ), - ), - ], - ))), - ], + ], + ))), + ], + ), ), - ), SizedBox(height: 15), Container( child: Row( @@ -2298,86 +2454,86 @@ class _empReviewDetailsState extends State { }, children: [ if(gpahasPremiumSummary == true || gmchasPremiumSummary == true || topUpIsPremiumSummary == '1' || topUpParentIsPremiumSummary == '1' || addOnsDependentIsPremiumSummary == '1') - TableRow( - children: [ - TableCell( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: Text( - 'Policy ', - textAlign: - TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive - .isDesktop( - context) - ? 16 - : 14, - fontWeight: - FontWeight.bold), + TableRow( + children: [ + TableCell( + child: Padding( + padding: + EdgeInsets.all(8.0), + child: Text( + 'Policy ', + textAlign: + TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive + .isDesktop( + context) + ? 16 + : 14, + fontWeight: + FontWeight.bold), + ), ), ), - ), - TableCell( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: Text( - 'Additional Premium', - textAlign: - TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive - .isDesktop( - context) - ? 16 - : 14, - fontWeight: - FontWeight.bold), + TableCell( + child: Padding( + padding: + EdgeInsets.all(8.0), + child: Text( + 'Additional Premium', + textAlign: + TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive + .isDesktop( + context) + ? 16 + : 14, + fontWeight: + FontWeight.bold), + ), ), ), - ), - TableCell( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: Text( - 'GST', - textAlign: - TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive - .isDesktop( - context) - ? 16 - : 14, - fontWeight: - FontWeight.bold), + TableCell( + child: Padding( + padding: + EdgeInsets.all(8.0), + child: Text( + 'GST', + textAlign: + TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive + .isDesktop( + context) + ? 16 + : 14, + fontWeight: + FontWeight.bold), + ), ), ), - ), - TableCell( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: Text( - 'Total', - textAlign: - TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive - .isDesktop( - context) - ? 16 - : 14, - fontWeight: - FontWeight.bold), + TableCell( + child: Padding( + padding: + EdgeInsets.all(8.0), + child: Text( + 'Total', + textAlign: + TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive + .isDesktop( + context) + ? 16 + : 14, + fontWeight: + FontWeight.bold), + ), ), ), - ), - ], - ), + ], + ), if (gpaPolicies != null && gpaPolicies.length > 0) ...gpaBuildPolicyRows( @@ -2392,19 +2548,19 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( (Responsive.isDesktop( - context) + context) ? (topUpPolicyName ?? - 'Default Top Up Name') + 'Default Top Up Name') : 'GMC - Top Up'), textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2413,18 +2569,18 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( '₹$topUpSiPremiumValue/Year', textAlign: Responsive - .isDesktop( - context) + .isDesktop( + context) ? TextAlign.start : TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2433,18 +2589,18 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( '₹$topUpSiPremiumGst/-', textAlign: Responsive - .isDesktop( - context) + .isDesktop( + context) ? TextAlign.start : TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2453,18 +2609,18 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( '₹$topUpSiTotalAmt/Year', textAlign: Responsive - .isDesktop( - context) + .isDesktop( + context) ? TextAlign.start : TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2478,19 +2634,19 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( (Responsive.isDesktop( - context) + context) ? (topUpParentPolicyName ?? - 'Default Parent Top Up Name') + 'Default Parent Top Up Name') : 'GMC - Parents Top Up'), textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2499,18 +2655,18 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( '₹$topUpParentSiPremiumValue/Year', textAlign: Responsive - .isDesktop( - context) + .isDesktop( + context) ? TextAlign.start : TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2519,18 +2675,18 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( '₹$topUpParentSiPremiumGst/-', textAlign: Responsive - .isDesktop( - context) + .isDesktop( + context) ? TextAlign.start : TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2539,18 +2695,18 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( '₹$topUpParentSiTotalAmt/Year', textAlign: Responsive - .isDesktop( - context) + .isDesktop( + context) ? TextAlign.start : TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2564,19 +2720,19 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( Responsive.isDesktop( - context) + context) ? (addOnsDependentPolicyName ?? - 'Default Add Dependent Up Name') + 'Default Add Dependent Up Name') : 'GMC - Dependent', textAlign: - TextAlign.start, + TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2585,18 +2741,18 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( '₹$addOnDependentPremiumValue/Year', textAlign: Responsive - .isDesktop( - context) + .isDesktop( + context) ? TextAlign.start : TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2605,18 +2761,18 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( '₹$addOnsDependentPremiumGst/-', textAlign: Responsive - .isDesktop( - context) + .isDesktop( + context) ? TextAlign.start : TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2625,18 +2781,18 @@ class _empReviewDetailsState extends State { TableCell( child: Padding( padding: - EdgeInsets.all(8.0), + EdgeInsets.all(8.0), child: Text( '₹$addOnsDependentTotalAmt/Year', textAlign: Responsive - .isDesktop( - context) + .isDesktop( + context) ? TextAlign.start : TextAlign.start, style: GoogleFonts.poppins( fontSize: Responsive - .isDesktop( - context) + .isDesktop( + context) ? 14 : 12), ), @@ -2652,188 +2808,139 @@ class _empReviewDetailsState extends State { ), SizedBox(height:10), if(gpahasPremiumSummary == true || gmchasPremiumSummary == true || topUpIsPremiumSummary == '1' || topUpParentIsPremiumSummary == '1' || addOnsDependentIsPremiumSummary == '1') - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - 'Total Payable', - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 20 - : 16, - color: Color(0xFF181818), - fontWeight: FontWeight.w600, + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + 'Total Payable', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop( + context) + ? 20 + : 16, + color: Color(0xFF181818), + fontWeight: FontWeight.w600, + ), ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: - MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.end, - children: [ - Text( - '₹${allTotalSum()}/Year', - textAlign: TextAlign.right, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 18 - : 16, - color: Color(0xFFE26728), - fontWeight: FontWeight.w500, + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Text( + '₹${allTotalSum()}/Year', + textAlign: TextAlign.right, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop( + context) + ? 18 + : 16, + color: Color(0xFFE26728), + fontWeight: FontWeight.w500, + ), ), - ), - ], - ))) - ], + ], + ))) + ], + ), ), - ), SizedBox(height: 15), Container( + alignment: Alignment.topLeft, child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start , // Aligns top children: [ + Checkbox( + value: isChecked, + onChanged: (bool? value) { + setState(() { + isChecked = value!; + }); + }, + activeColor: const Color(0xFFE26728), + ), Expanded( - flex: 1, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Checkbox( - value: isChecked, - onChanged: (bool? value) { - setState(() { - isChecked = value!; - }); - }, - activeColor: Color(0xFFE26728), - ), - ], - ))), - Expanded( - flex: 11, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: - MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.end, - children: [ - Text( - 'I declare that the information I have provided is true and accurate to the best of my knowledge', - textAlign: Responsive.isDesktop( - context) - ? TextAlign.left - : TextAlign.start, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 18 - : 15, - color: Color(0xFF292929), - ), - ), - ], - ))), + child: Text( + 'I declare that the information I have provided is true and accurate to the best of my knowledge', + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 18 : 15, + color: const Color(0xFF292929), + ), + ), + ), ], ), ), - SizedBox(height: 10), + SizedBox( + height: + Responsive.isDesktop(context) ? 15 : 10), Container( - // padding: EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: allDisclaimer.isEmpty ? [] // If allDisclaimer is empty, show nothing : allDisclaimer.map((entry) { - int id = - entry['id']; // ID of disclaimer - String disclaimer = - entry['text']; // Disclaimer text - bool isChecked = - entry['checked']; // Checked state + int id = entry['id']; // ID of disclaimer + String disclaimer = entry['text']; // Disclaimer text + bool isChecked = entry['checked']; // Checked state - return Row( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Expanded( - flex: 1, - child: Container( - alignment: Alignment.centerLeft, - child: Checkbox( - value: - isChecked, // Bind to the checked value - onChanged: (bool? value) { - setState(() { - // Update the checked status - allDisclaimer.firstWhere( - (item) => - item['id'] == id, - )['checked'] = value!; - print(allDisclaimer); - }); - }, - activeColor: Color( - 0xFFE26728), // Custom color - ), - ), + return Padding( + padding: const EdgeInsets.only(bottom: 12.0), // spacing between disclaimers + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, // Align top + children: [ + Checkbox( + value: isChecked, // Bind to the checked value + onChanged: (bool? value) { + setState(() { + // Update the checked status + allDisclaimer.firstWhere( + (item) => item['id'] == id, + )['checked'] = value!; + print(allDisclaimer); + }); + }, + activeColor: const Color(0xFFE26728), // Custom color + ), + Expanded( + child: Text( + disclaimer, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) ? 18 : 15, + color: const Color(0xFF292929), ), - Expanded( - flex: 11, - child: Container( - alignment: Alignment.centerLeft, - child: Text( - disclaimer, - textAlign: - Responsive.isDesktop( - context) - ? TextAlign.left - : TextAlign.start, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 18 - : 15, - color: Color(0xFF292929), - ), - ), - ), - ), - ], - ); - }).toList(), + ), + ), + ], + ), + ); + }).toList(), ), ), + SizedBox( height: Responsive.isDesktop(context) ? 15 : 0), Container( @@ -2851,13 +2958,14 @@ class _empReviewDetailsState extends State { onPressed: () async { // Remove siData, siParentData, and dependentData from local storage final SharedPreferences prefs = - await SharedPreferences - .getInstance(); + await SharedPreferences + .getInstance(); prefs.remove('siData'); prefs.remove('siParentData'); prefs.remove('dependentData'); - Navigator.pushNamed( - context, 'addOnsDetails'); + context.go('/addOnsDetails'); + // Navigator.pushNamed( + // context, 'addOnsDetails'); }, child: Text( 'Back', @@ -2868,7 +2976,7 @@ class _empReviewDetailsState extends State { backgroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: - BorderRadius.circular(5), + BorderRadius.circular(5), side: BorderSide( color: Color(0xFFE26728)), ), @@ -2894,7 +3002,7 @@ class _empReviewDetailsState extends State { backgroundColor: Color(0xFFE26728), shape: RoundedRectangleBorder( borderRadius: - BorderRadius.circular(5), + BorderRadius.circular(5), ), ), ), @@ -2915,10 +3023,10 @@ class _empReviewDetailsState extends State { color: Color(0x98FFFCE5), // Semi-transparent background child: Center( child: // Your GIF loader widget - Image.asset( - height: 60, - width: 60, - 'assets/nhance-loader.gif'), // Adjust path to your GIF loader + Image.asset( + height: 60, + width: 60, + 'assets/nhance-loader.gif'), // Adjust path to your GIF loader ), ), if (Responsive.isDesktop(context) || @@ -2945,46 +3053,50 @@ class _empReviewDetailsState extends State { floatingActionButtonLocation: Responsive.isDesktop(context) ? null : isTokenAvailable - ? FloatingActionButtonLocation.miniEndFloat - : null, + ? FloatingActionButtonLocation.miniEndFloat + : null, bottomNavigationBar: Responsive.isDesktop(context) ? null : isTokenAvailable - ? CustomBottomNavigationBar( - onTabChanged: (index) { - // Add your navigation logic here - // For example: - if (index == 0) { - Navigator.pushNamed(context, 'home'); - } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); - } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); - } else if (index == 3) { - Navigator.pushNamed(context, 'help'); - } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); - } - }, - icons: [ - Icons.home_outlined, - Icons.sticky_note_2_outlined, - Icons.person_outline_outlined, - Icons.headset_mic_outlined, - Icons.health_and_safety_outlined, - ], - labels: [ - "Home", - "Claim", - "Profile", - "Help", - "wellness", - ], - initialIndex: - 0, // Initial index of the bottom navigation bar - ) - : null, - ); + ? CustomBottomNavigationBar( + onTabChanged: (index) { + // Add your navigation logic here + // For example: + if (index == 0) { + context.go('/home'); + // Navigator.pushNamed(context, 'home'); + } else if (index == 1) { + context.go('/claims'); + // Navigator.pushNamed(context, 'claims'); + } else if (index == 2) { + context.go('/profile'); + // Navigator.pushNamed(context, 'profile'); + } else if (index == 3) { + context.go('/help'); + // Navigator.pushNamed(context, 'help'); + } else if (index == 4) { + context.go('/wellness'); + // Navigator.pushNamed(context, 'wellness'); + } + }, + icons: [ + Icons.home_outlined, + Icons.sticky_note_2_outlined, + Icons.person_outline_outlined, + Icons.headset_mic_outlined, + Icons.health_and_safety_outlined, + ], + labels: [ + "Home", + "Claims", + "Profile", + "Help", + "wellness", + ], + initialIndex: + 0, // Initial index of the bottom navigation bar + ) : null, + )); } } @@ -3120,7 +3232,7 @@ class _empReviewDetailsState extends State { textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 20 : 14, + Responsive.isDesktop(context) ? 20 : 14, fontWeight: FontWeight.w600, ), ), @@ -3157,7 +3269,7 @@ class _empReviewDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 18 : 13, + Responsive.isDesktop(context) ? 18 : 13, ), ), Text( @@ -3165,7 +3277,7 @@ class _empReviewDetailsState extends State { textAlign: TextAlign.right, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) ? 20 : 14, + Responsive.isDesktop(context) ? 20 : 14, fontWeight: FontWeight.w600, ), ), @@ -3266,134 +3378,134 @@ class _empReviewDetailsState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Additional Premium', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + 'Additional Premium', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gpaSiPremiumValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + (gpaSiPremiumValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'GST', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: + children: [ + Text( + 'GST', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - (gpaGstValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), + children: [ + Text( + (gpaGstValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), if(gpahasPremiumSummary == true || gmchasPremiumSummary == true || topUpIsPremiumSummary == '1' || topUpParentIsPremiumSummary == '1' || addOnsDependentIsPremiumSummary == '1') - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Text( - 'Total Payable', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - fontWeight: FontWeight.w500, - ), - ), - ], - ))), - Expanded( - flex: 5, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Text( - (gpaTotalableValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 16, - ), - ), - ], - ))), - ], - ), - ])) + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + 'Total Payable', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ))), + Expanded( + flex: 5, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + (gpaTotalableValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 16, + ), + ), + ], + ))), + ], + ), + ])) ], ), ), @@ -3418,7 +3530,7 @@ class _empReviewDetailsState extends State { gmcECardDownload = item['eCardDownload']; gmcGstValue = item['family_floaters_of_dependent_and_gst_value']; gmcSiPremiumValue = - item['family_floaters_of_dependent_and_si_premium_value']; + item['family_floaters_of_dependent_and_si_premium_value']; gmcTotalableValue = gmcGstValue + gmcSiPremiumValue; gmcIsValueValid = (gmcSiPremiumValue != 0 && gmcGstValue != 0); setState(() { @@ -3453,244 +3565,244 @@ class _empReviewDetailsState extends State { Widget card = getTrueObjects.length > 0 ? Card( - elevation: 0, - color: Colors.white, - child: Padding( - padding: Responsive.isDesktop(context) - ? EdgeInsets.all(30) - : EdgeInsets.all(10), - child: Column( - children: [ - Container( - decoration: BoxDecoration( - color: Color( - 0xFFFFF1DD), // Set background color for the container - borderRadius: BorderRadius.circular( - 5), // Set border radius for the container - ), - padding: Responsive.isDesktop(context) - ? EdgeInsets.only( - top: 15, bottom: 15, left: 25, right: 25) - : EdgeInsets.only( - top: 10, bottom: 10, left: 10, right: 10), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: Responsive.isDesktop(context) ? 9 : 7, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, + elevation: 0, + color: Colors.white, + child: Padding( + padding: Responsive.isDesktop(context) + ? EdgeInsets.all(30) + : EdgeInsets.all(10), + child: Column( + children: [ + Container( + decoration: BoxDecoration( + color: Color( + 0xFFFFF1DD), // Set background color for the container + borderRadius: BorderRadius.circular( + 5), // Set border radius for the container + ), + padding: Responsive.isDesktop(context) + ? EdgeInsets.only( + top: 15, bottom: 15, left: 25, right: 25) + : EdgeInsets.only( + top: 10, bottom: 10, left: 10, right: 10), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: Responsive.isDesktop(context) ? 9 : 7, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + '', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 18 + : 13, + ), + ), + Row( children: [ Text( - '', + Responsive.isDesktop(context) + ? gmcPolicyName + : gmcPolicyType, textAlign: TextAlign.left, style: GoogleFonts.poppins( fontSize: - Responsive.isDesktop(context) - ? 18 - : 13, - ), - ), - Row( - children: [ - Text( - Responsive.isDesktop(context) - ? gmcPolicyName - : gmcPolicyType, - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 20 - : 14, - fontWeight: FontWeight.w600, - ), - ), - if (item['eCardDownload'] != null) - GestureDetector( - onTap: () async { - _launchURL( - item['eCardDownload']); - }, - child: MouseRegion( - cursor: - SystemMouseCursors.click, - child: Icon( - Icons.file_download, - color: Color(0xFFE26728), - size: 25, - ), - ), - ), - ], - ), - ], - ))), - Expanded( - flex: Responsive.isDesktop(context) ? 3 : 5, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Text( - gmcFloaterTextHeading ?? '', - textAlign: TextAlign.right, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 18 - : 13, - ), - ), - Text( - '₹ ${gmcSumInsured != null ? gmcSumInsured : 'NA'}', - textAlign: TextAlign.right, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 20 - : 14, + Responsive.isDesktop(context) + ? 20 + : 14, fontWeight: FontWeight.w600, ), ), + if (item['eCardDownload'] != null) + GestureDetector( + onTap: () async { + _launchURL( + item['eCardDownload']); + }, + child: MouseRegion( + cursor: + SystemMouseCursors.click, + child: Icon( + Icons.file_download, + color: Color(0xFFE26728), + size: 25, + ), + ), + ), ], - ))), - ], - ), - ), - SizedBox(height: 15), - Container( - padding: Responsive.isDesktop(context) - ? EdgeInsets.only( - top: 0, bottom: 0, left: 15, right: 15) - : EdgeInsets.only( - top: 0, bottom: 0, left: 5, right: 5), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: gmcMappedFamilyFloaters - .where((item) => item['is_value_exist'] == true) - .map((item) { - Map data = item['data']; - String formattedDate = formatDate(data['dob']); - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Icon(Icons.arrow_right, - color: Color(0xFFE26728)), // Arrow icon - SizedBox( - width: Responsive.isDesktop(context) - ? 10 - : 5), // Space between icon and text - Expanded( - child: Text( - '${data['name']} ~ ${data['relationship']} ~ DOB : $formattedDate', - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) ? 18 : 14, - color: Color(0xFF232526), ), - ), - ), - ], - ); - }).toList(), - ), - ), - if (Responsive.isDesktop(context) && gmcIsValueValid && gmcIsPremiumSummery == '1') - Row( + ], + ))), + Expanded( + flex: Responsive.isDesktop(context) ? 3 : 5, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + gmcFloaterTextHeading ?? '', + textAlign: TextAlign.right, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 18 + : 13, + ), + ), + Text( + '₹ ${gmcSumInsured != null ? gmcSumInsured : 'NA'}', + textAlign: TextAlign.right, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) + ? 20 + : 14, + fontWeight: FontWeight.w600, + ), + ), + ], + ))), + ], + ), + ), + SizedBox(height: 15), + Container( + padding: Responsive.isDesktop(context) + ? EdgeInsets.only( + top: 0, bottom: 0, left: 15, right: 15) + : EdgeInsets.only( + top: 0, bottom: 0, left: 5, right: 5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: gmcMappedFamilyFloaters + .where((item) => item['is_value_exist'] == true) + .map((item) { + Map data = item['data']; + String formattedDate = formatDate(data['dob']); + return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Icon(Icons.arrow_right, + color: Color(0xFFE26728)), // Arrow icon + SizedBox( + width: Responsive.isDesktop(context) + ? 10 + : 5), // Space between icon and text Expanded( - flex: 5, - child: Container( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Text( - 'Additional Premium', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 20, - fontWeight: FontWeight.w500, - ), - ), - Text( - (gmcSiPremiumValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - ), - ), - ], - ))), - Expanded( - flex: 2, - child: Container( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Text( - 'GST', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 20, - fontWeight: FontWeight.w500, - ), - ), - Text( - (gmcGstValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - ), - ), - ], - ))), - Expanded( - flex: 5, - child: Container( - alignment: Alignment.center, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Text( - 'Total Payable', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 20, - fontWeight: FontWeight.w500, - ), - ), - Text( - (gmcTotalableValue ?? '').toString(), - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: 18, - ), - ), - ], - ))), + child: Text( + '${data['name']} ~ ${data['relationship']} ~ DOB : $formattedDate', + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop(context) ? 18 : 14, + color: Color(0xFF232526), + ), + ), + ), ], - ), - if (!Responsive.isDesktop(context) && gmcIsValueValid && gmcIsPremiumSummery == '1') - Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ + ); + }).toList(), + ), + ), + if (Responsive.isDesktop(context) && gmcIsValueValid && gmcIsPremiumSummery == '1') + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 5, + child: Container( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + 'Additional Premium', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), + Text( + (gmcSiPremiumValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + ), + ), + ], + ))), + Expanded( + flex: 2, + child: Container( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + 'GST', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), + Text( + (gmcGstValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + ), + ), + ], + ))), + Expanded( + flex: 5, + child: Container( + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Text( + 'Total Payable', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), + Text( + (gmcTotalableValue ?? '').toString(), + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: 18, + ), + ), + ], + ))), + ], + ), + if (!Responsive.isDesktop(context) && gmcIsValueValid && gmcIsPremiumSummery == '1') + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -3700,9 +3812,9 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( 'Additional Premium', @@ -3720,9 +3832,9 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( (gmcSiPremiumValue ?? '') @@ -3745,9 +3857,9 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( 'GST', @@ -3765,9 +3877,9 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( (gmcGstValue ?? '').toString(), @@ -3789,9 +3901,9 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerLeft, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( 'Total Payable', @@ -3809,9 +3921,9 @@ class _empReviewDetailsState extends State { alignment: Alignment.centerRight, child: Column( mainAxisAlignment: - MainAxisAlignment.center, + MainAxisAlignment.center, crossAxisAlignment: - CrossAxisAlignment.center, + CrossAxisAlignment.center, children: [ Text( (gmcTotalableValue ?? '') @@ -3826,9 +3938,9 @@ class _empReviewDetailsState extends State { ], ), ])) - ], - ), - )) + ], + ), + )) : SizedBox(height: 0); cards.add(card); @@ -3841,7 +3953,7 @@ class _empReviewDetailsState extends State { double total = policies .where((policy) => policy is Map) .map((policy) => - (policy["si_gst_value"] ?? 0) + (policy["si_premium_value"] ?? 0)) + (policy["si_gst_value"] ?? 0) + (policy["si_premium_value"] ?? 0)) .fold(0.0, (sum, value) => sum + value); print('Calculated gpaTotalAmt: $total'); // Debug print @@ -3852,8 +3964,8 @@ class _empReviewDetailsState extends State { double total = policies .where((policy) => policy is Map) .map((policy) => - (policy["family_floaters_of_dependent_and_gst_value"] ?? 0) + - (policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0)) + (policy["family_floaters_of_dependent_and_gst_value"] ?? 0) + + (policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0)) .fold(0.0, (sum, value) => sum + value); print('Calculated gmcTotalAmt: $total'); // Debug print @@ -3869,66 +3981,66 @@ class _empReviewDetailsState extends State { print('gpaTotalAmt $gpaTotalAmt'); return (policies as List) .where((policy) => policy is Map) // Ensure each item is a Map + dynamic>) // Ensure each item is a Map .map((policy) { - var siGstValue = policy["si_gst_value"] ?? 0; - var siPremiumValue = policy["si_premium_value"] ?? 0; - dynamic si_is_premium_summery = policy['is_premium_summery']; + var siGstValue = policy["si_gst_value"] ?? 0; + var siPremiumValue = policy["si_premium_value"] ?? 0; + dynamic si_is_premium_summery = policy['is_premium_summery']; - if (siGstValue == 0 || siPremiumValue == 0) - return null; // Skip invalid policies + if (siGstValue == 0 || siPremiumValue == 0) + return null; // Skip invalid policies - return TableRow( - children: [ - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - Responsive.isDesktop(context) - ? (policy["Policy_Name"] ?? 'Default Policy Name') - : policy['type'], - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + return TableRow( + children: [ + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + Responsive.isDesktop(context) + ? (policy["Policy_Name"] ?? 'Default Policy Name') + : policy['type'], + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${policy["si_premium_value"]}/Year', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${policy["si_premium_value"]}/Year', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${policy["si_gst_value"]}/-', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${policy["si_gst_value"]}/-', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${(policy["si_premium_value"] ?? 0) + (policy["si_gst_value"] ?? 0)}/-', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${(policy["si_premium_value"] ?? 0) + (policy["si_gst_value"] ?? 0)}/-', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - ], - ); - }) + ), + ), + ], + ); + }) .whereType() // Filter out null values .toList(); } @@ -3944,68 +4056,68 @@ class _empReviewDetailsState extends State { print('gmcTotalAmt $gmcTotalAmt'); return (policies as List) .where((policy) => policy is Map) // Ensure each item is a Map + dynamic>) // Ensure each item is a Map .map((policy) { - var siGstValue = - policy["family_floaters_of_dependent_and_gst_value"] ?? 0; - var siPremiumValue = - policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0; + var siGstValue = + policy["family_floaters_of_dependent_and_gst_value"] ?? 0; + var siPremiumValue = + policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0; - if (siGstValue == 0 || siPremiumValue == 0) - return null; // Skip invalid policies + if (siGstValue == 0 || siPremiumValue == 0) + return null; // Skip invalid policies - return TableRow( - children: [ - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - Responsive.isDesktop(context) - ? (policy["Policy_Name"] ?? 'Default Policy Name') - : policy['type'], - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + return TableRow( + children: [ + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + Responsive.isDesktop(context) + ? (policy["Policy_Name"] ?? 'Default Policy Name') + : policy['type'], + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${policy["family_floaters_of_dependent_and_si_premium_value"]}/Year', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${policy["family_floaters_of_dependent_and_si_premium_value"]}/Year', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${policy["family_floaters_of_dependent_and_gst_value"]}/-', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${policy["family_floaters_of_dependent_and_gst_value"]}/-', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - TableCell( - child: Padding( - padding: EdgeInsets.all(8.0), - child: Text( - '₹${(policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0) + (policy["family_floaters_of_dependent_and_gst_value"] ?? 0)}/-', - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive.isDesktop(context) ? 14 : 12), - ), - ), + ), + ), + TableCell( + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + '₹${(policy["family_floaters_of_dependent_and_si_premium_value"] ?? 0) + (policy["family_floaters_of_dependent_and_gst_value"] ?? 0)}/-', + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12), ), - ], - ); - }) + ), + ), + ], + ); + }) .whereType() // Filter out null values .toList(); } -} +} \ No newline at end of file diff --git a/lib/pages/enrollment/service/api_service.dart b/lib/pages/enrollment/service/api_service.dart index bc7674e..4e3d35c 100755 --- a/lib/pages/enrollment/service/api_service.dart +++ b/lib/pages/enrollment/service/api_service.dart @@ -5,11 +5,11 @@ import 'dart:convert'; import '../../../customAppBar/toastHelper.dart'; import '../../../models/environment.dart'; +import '../../service/TokenService.dart'; class ApiService { final BuildContext context; String? _token; - String? _hrtoken; bool _isSessionOutToastShown = false; // Flag to track toast message ApiService(this.context) { @@ -17,10 +17,7 @@ class ApiService { } Future _initializeToken() async { - final prefs = await SharedPreferences.getInstance(); - _token = prefs.getString('enrollToken') ?? ''; - final hrprefs = await SharedPreferences.getInstance(); - _hrtoken = hrprefs.getString('hrtoken') ?? ''; + _token = await TokenService.getPreToken(); } Future> getClientLogoAndDetailsToApi( @@ -394,35 +391,35 @@ class ApiService { //HR API STARTS - Future> getCashDepositDetailsToApi( - String clintID, String empRefId) async { - print(_hrtoken); - if (_hrtoken == null) { - await _initializeToken(); - } - final url = Uri.parse( - '${Environment.apiUrlEnrollment}getCashDepositData?client_id=$clintID&client_branch_id=$empRefId'); - final headers = { - 'Authorization': 'Bearer $_hrtoken' ?? '', - }; - final response = await _makeGetRequest(url, headers); - return response; - } - - Future> getEmployeeAndDependenceToApi( - String clintID, String getPolicyNo, String empRefId) async { - print(_hrtoken); - if (_hrtoken == null) { - await _initializeToken(); - } - final url = Uri.parse( - '${Environment.apiUrlEnrollment}getEmployeeAndDependenceByClientId?client_id=$clintID&client_policy_id=$getPolicyNo&client_branch_id=$empRefId'); - final headers = { - 'Authorization': 'Bearer $_hrtoken' ?? '', - }; - final response = await _makeGetRequest(url, headers); - return response; - } + // Future> getCashDepositDetailsToApi( + // String clintID, String empRefId) async { + // print(_hrtoken); + // if (_hrtoken == null) { + // await _initializeToken(); + // } + // final url = Uri.parse( + // '${Environment.apiUrlEnrollment}getCashDepositData?client_id=$clintID&client_branch_id=$empRefId'); + // final headers = { + // 'Authorization': 'Bearer $_hrtoken' ?? '', + // }; + // final response = await _makeGetRequest(url, headers); + // return response; + // } + // + // Future> getEmployeeAndDependenceToApi( + // String clintID, String getPolicyNo, String empRefId) async { + // print(_hrtoken); + // if (_hrtoken == null) { + // await _initializeToken(); + // } + // final url = Uri.parse( + // '${Environment.apiUrlEnrollment}getEmployeeAndDependenceByClientId?client_id=$clintID&client_policy_id=$getPolicyNo&client_branch_id=$empRefId'); + // final headers = { + // 'Authorization': 'Bearer $_hrtoken' ?? '', + // }; + // final response = await _makeGetRequest(url, headers); + // return response; + // } // Future> getTrackClaimsList( // String empMobileNo, String empCode) async { diff --git a/lib/pages/login.dart b/lib/pages/login.dart index f40ecc5..609ca0c 100755 --- a/lib/pages/login.dart +++ b/lib/pages/login.dart @@ -3,6 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:nhance_app_pwa/pages/email_verify.dart'; import 'package:nhance_app_pwa/pages/verify.dart'; @@ -112,7 +113,8 @@ class _loginState extends State { } if (data['is_mpin_skipped'] != null && data['is_mpin_skipped'] == '0') { - Navigator.pushReplacementNamed(context, 'pinPage'); + context.go('/pinPage'); + // Navigator.pushReplacementNamed(context, 'pinPage'); } } else { @@ -131,11 +133,11 @@ class _loginState extends State { void toggleField() async{ // final SharedPreferences prefs = await SharedPreferences.getInstance(); - // if(isEmailFieldVisible){ - // prefs.remove('empMobileNo'); - // }else{ - // prefs.getString('empEmailid'); - // } + if(isEmailFieldVisible){ + mobileController.text = ''; + } else{ + emailController.text = ''; + } setState(() { isEmailFieldVisible = !isEmailFieldVisible; }); @@ -175,24 +177,32 @@ class _loginState extends State { await SharedPreferences.getInstance(); // var enteredMobileNumber = mobileController.text; // prefs.setString('empMobileNo', enteredMobileNumber); + ToastHelper.showSuccessToast( + context, 'Verification code sent to ${emailController.text}'); if (isEmailFieldVisible) { print('isEmailFieldVisible $isEmailFieldVisible'); // prefs.setString('empEmail', emailController.text); print('${emailController.text}'); - ToastHelper.showSuccessToast( - context, 'Verification code sent to ${emailController.text}'); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => MyEmailVerify( - email: emailController.text, // Pass the phone number - ), - ), + context.push( + '/mailVerify', + extra: { + 'type': 'email', + 'value': emailController.text.trim(), + }, ); } else { - _verifyPhoneNumber(); + // _verifyPhoneNumber(); + context.push( + '/mailVerify', + extra: { + 'type': 'mobile', + 'value': mobileController.text.trim(), + }, + ); } - + setState(() { + _isLoading = false; + }); // ToastHelper.showSuccessToast(context, message); } else { setState(() { @@ -218,130 +228,150 @@ class _loginState extends State { } } - Future _verifyPhoneNumber() async { - var enteredMobileNumber = mobileController.text; - var countryCode = countryController.text; - print('${countryCode + enteredMobileNumber}'); - await _auth.verifyPhoneNumber( - phoneNumber: '${countryCode + enteredMobileNumber}', - timeout: const Duration(seconds: 60), - verificationCompleted: (PhoneAuthCredential credential) async { - await _auth.signInWithCredential(credential); - // ToastHelper.showSuccessToast(context, 'Verified Successfully!'); - // setState(() { - // _isLoading = false; - // }); - }, - verificationFailed: (FirebaseAuthException e) { - print('Verification Failed: ${e.code} - ${e.message}'); - String errorMessage; - if (e.code == 'invalid-app-credential') { - errorMessage = 'Invalid Credential. Please try again.'; - } else if (e.code == 'invalid-phone-number') { - errorMessage = 'The provided phone number is not valid.'; - } else if (e.code == 'too-many-requests') { - errorMessage = 'Too many requests. Try again later.'; - } else { - errorMessage = 'Verification Failed: ${e.message}'; - } - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(errorMessage), - duration: Duration(seconds: 2), - ), - ); - - ToastHelper.showSuccessToast(context, errorMessage); - setState(() { - _isLoading = false; - }); - }, - codeSent: (String verificationId, int? resendToken) async { - setState(() { - _verificationId = verificationId; - _resendToken = resendToken; - }); - - // When getting the verificationId - SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('verificationId', _verificationId); - - - ToastHelper.showSuccessToast( - context, 'Verification code sent to ${enteredMobileNumber}'); - - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => MyVerify( - verificationId: _verificationId, - mobileNumber: enteredMobileNumber, - resendToken: _resendToken, - onResendCode: _resendCode, // Pass the phone number - ), - ), - ); - setState(() { - _isLoading = false; - }); - }, - codeAutoRetrievalTimeout: (String verificationId) async{ - setState(() { - _verificationId = verificationId; - }); - final prefs = await SharedPreferences.getInstance(); - await prefs.setString('verificationId', verificationId); - ToastHelper.showSuccessToast(context, 'Code auto-retrieval timed out.'); - setState(() { - _isLoading = false; - }); - }, - ); - } - - void _resendCode(String mobileNumber, int? resendToken) async { - await _auth.verifyPhoneNumber( - phoneNumber: '${countryController.text + mobileNumber}', - timeout: const Duration(seconds: 60), - forceResendingToken: resendToken, - verificationCompleted: (PhoneAuthCredential credential) async { - await _auth.signInWithCredential(credential); - }, - verificationFailed: (FirebaseAuthException e) { - if (e.code == 'invalid-phone-number') { - print('The provided phone number is not valid.'); - } - }, - codeSent: (String verificationId, int? resendToken) async{ - final prefs = await SharedPreferences.getInstance(); - await prefs.setString('verificationId', verificationId); - setState(() { - _verificationId = verificationId; - _resendToken = resendToken; - }); - ToastHelper.showSuccessToast( - context, 'Verification code resent to ${mobileNumber}'); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => MyVerify( - verificationId: _verificationId, - mobileNumber: mobileNumber, - resendToken: _resendToken, - onResendCode: _resendCode, - ), - ), - ); - }, - codeAutoRetrievalTimeout: (String verificationId) async{ - final prefs = await SharedPreferences.getInstance(); - await prefs.setString('verificationId', verificationId); - setState(() { - _verificationId = verificationId; - }); - }, - ); - } + // Future _verifyPhoneNumber() async { + // var enteredMobileNumber = mobileController.text; + // var countryCode = countryController.text; + // print('${countryCode + enteredMobileNumber}'); + // await _auth.verifyPhoneNumber( + // phoneNumber: '${countryCode + enteredMobileNumber}', + // timeout: const Duration(seconds: 60), + // verificationCompleted: (PhoneAuthCredential credential) async { + // await _auth.signInWithCredential(credential); + // // ToastHelper.showSuccessToast(context, 'Verified Successfully!'); + // // setState(() { + // // _isLoading = false; + // // }); + // }, + // verificationFailed: (FirebaseAuthException e) { + // print('Verification Failed: ${e.code} - ${e.message}'); + // String errorMessage; + // if (e.code == 'invalid-app-credential') { + // errorMessage = 'Invalid Credential. Please try again.'; + // } else if (e.code == 'invalid-phone-number') { + // errorMessage = 'The provided phone number is not valid.'; + // } else if (e.code == 'too-many-requests') { + // errorMessage = 'Too many requests. Try again later.'; + // } else { + // errorMessage = 'Verification Failed: ${e.message}'; + // } + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // content: Text(errorMessage), + // duration: Duration(seconds: 2), + // ), + // ); + // + // ToastHelper.showSuccessToast(context, errorMessage); + // setState(() { + // _isLoading = false; + // }); + // }, + // codeSent: (String verificationId, int? resendToken) async { + // setState(() { + // _verificationId = verificationId; + // _resendToken = resendToken; + // }); + // + // // When getting the verificationId + // SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('verificationId', _verificationId); + // + // + // ToastHelper.showSuccessToast( + // context, 'Verification code sent to ${enteredMobileNumber}'); + // + // context.go( + // '/verify', + // extra: { + // 'verificationId': _verificationId, + // 'mobileNumber': enteredMobileNumber, + // 'resendToken': _resendToken, + // 'onResendCode': _resendCode, + // }, + // ); + // + // // Navigator.push( + // // context, + // // MaterialPageRoute( + // // builder: (context) => MyVerify( + // // verificationId: _verificationId, + // // mobileNumber: enteredMobileNumber, + // // resendToken: _resendToken, + // // onResendCode: _resendCode, // Pass the phone number + // // ), + // // ), + // // ); + // setState(() { + // _isLoading = false; + // }); + // }, + // codeAutoRetrievalTimeout: (String verificationId) async{ + // setState(() { + // _verificationId = verificationId; + // }); + // final prefs = await SharedPreferences.getInstance(); + // await prefs.setString('verificationId', verificationId); + // ToastHelper.showSuccessToast(context, 'Code auto-retrieval timed out.'); + // setState(() { + // _isLoading = false; + // }); + // }, + // ); + // } + // + // void _resendCode(String mobileNumber, int? resendToken) async { + // await _auth.verifyPhoneNumber( + // phoneNumber: '${countryController.text + mobileNumber}', + // timeout: const Duration(seconds: 60), + // forceResendingToken: resendToken, + // verificationCompleted: (PhoneAuthCredential credential) async { + // await _auth.signInWithCredential(credential); + // }, + // verificationFailed: (FirebaseAuthException e) { + // if (e.code == 'invalid-phone-number') { + // print('The provided phone number is not valid.'); + // } + // }, + // codeSent: (String verificationId, int? resendToken) async{ + // final prefs = await SharedPreferences.getInstance(); + // await prefs.setString('verificationId', verificationId); + // setState(() { + // _verificationId = verificationId; + // _resendToken = resendToken; + // }); + // ToastHelper.showSuccessToast( + // context, 'Verification code resent to ${mobileNumber}'); + // context.push( + // '/verify', + // extra: { + // 'verificationId': _verificationId, + // 'mobileNumber': mobileNumber, + // 'resendToken': _resendToken, + // 'onResendCode': _resendCode, + // }, + // ); + // + // // Navigator.push( + // // context, + // // MaterialPageRoute( + // // builder: (context) => MyVerify( + // // verificationId: _verificationId, + // // mobileNumber: mobileNumber, + // // resendToken: _resendToken, + // // onResendCode: _resendCode, + // // ), + // // ), + // // ); + // }, + // codeAutoRetrievalTimeout: (String verificationId) async{ + // final prefs = await SharedPreferences.getInstance(); + // await prefs.setString('verificationId', verificationId); + // setState(() { + // _verificationId = verificationId; + // }); + // }, + // ); + // } @override Widget build(BuildContext context) { @@ -910,9 +940,10 @@ class _loginState extends State { .click, child: GestureDetector( onTap: () { - Navigator.pushNamed( - context, - 'privacypolicy'); + context.go('/privacypolicy'); + // Navigator.pushNamed( + // context, + // 'privacypolicy'); }, child: Text( 'privacy policy ', @@ -942,9 +973,10 @@ class _loginState extends State { .click, child: GestureDetector( onTap: () { - Navigator.pushNamed( - context, - 'termsofuse'); + context.go('/termsofuse'); + // Navigator.pushNamed( + // context, + // 'termsofuse'); }, child: Text( 'terms of use', diff --git a/lib/pages/postEnrollment/botman_chat.dart b/lib/pages/postEnrollment/botman_chat.dart index 49f5622..fd2789e 100644 --- a/lib/pages/postEnrollment/botman_chat.dart +++ b/lib/pages/postEnrollment/botman_chat.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:nhance_app_pwa/models/environment.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -24,20 +25,28 @@ class ChatbotWebViewPage extends StatefulWidget { class _ChatbotWebViewPageState extends State { late final WebViewController _controller; + late final String chatbotDomain; + late final String initialUrl; @override void initState() { super.initState(); + final chatbotURL = Environment.chatBotUrl; + print('chatbotURL $chatbotURL'); - final url = Uri.parse( - 'https://venbait.in/nhance/dev/chatbot' + initialUrl = Uri.parse( + '$chatbotURL' '?employee_id=${widget.empPrimaryId}' '&emp_code=${widget.empCodeString}' '&origin=mob' - '&name=${widget.empName}' + '&name=${Uri.encodeComponent(widget.empName)}' '&client_id=${widget.client_id}' '&client_branch_id=${widget.client_branch_id}', - ); + ).toString(); + + // Extract the domain for comparison + final uri = Uri.parse(chatbotURL); + chatbotDomain = '${uri.scheme}://${uri.host}'; _controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) @@ -45,19 +54,32 @@ class _ChatbotWebViewPageState extends State { ..setNavigationDelegate( NavigationDelegate( onNavigationRequest: (NavigationRequest request) { - debugPrint("Clicked URL: ${request.url}"); - _launchInExternalBrowser(Uri.parse(request.url)); - return NavigationDecision.prevent; // prevent WebView navigation + debugPrint("Navigation requested: ${request.url}"); + debugPrint("Is main frame: ${request.isMainFrame}"); + + // Allow navigation within the chatbot domain + if (request.url.startsWith(chatbotDomain)) { + return NavigationDecision.navigate; + } else { + // Open external links in browser + _launchInExternalBrowser(Uri.parse(request.url)); + return NavigationDecision.prevent; + } }, onWebResourceError: (error) { debugPrint("WebView error: ${error.description}"); }, + onPageStarted: (String url) { + debugPrint("Page started loading: $url"); + }, + onPageFinished: (String url) { + debugPrint("Page finished loading: $url"); + }, ), ) - ..loadRequest(url); + ..loadRequest(Uri.parse(initialUrl)); } - /// Launch URL in external browser (Chrome or default) Future _launchInExternalBrowser(Uri url) async { if (await canLaunchUrl(url)) { await launchUrl(url, mode: LaunchMode.externalApplication); @@ -73,4 +95,4 @@ class _ChatbotWebViewPageState extends State { body: WebViewWidget(controller: _controller), ); } -} +} \ No newline at end of file diff --git a/lib/pages/postEnrollment/botman_ios_chat.dart b/lib/pages/postEnrollment/botman_ios_chat.dart deleted file mode 100644 index 096678d..0000000 --- a/lib/pages/postEnrollment/botman_ios_chat.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_inappwebview/flutter_inappwebview.dart'; - -class MyWebViewPage extends StatefulWidget { - final String url; - - const MyWebViewPage({Key? key, required this.url}) : super(key: key); - - @override - _MyWebViewPageState createState() => _MyWebViewPageState(); -} - -class _MyWebViewPageState extends State { - InAppWebViewController? webViewController; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text("Web View")), - body: InAppWebView( - initialUrlRequest: URLRequest( - url: WebUri(widget.url), - ), - onWebViewCreated: (controller) { - webViewController = controller; - }, - ), - ); - } -} diff --git a/lib/pages/postEnrollment/botman_widget.dart b/lib/pages/postEnrollment/botman_widget.dart deleted file mode 100644 index d861b2a..0000000 --- a/lib/pages/postEnrollment/botman_widget.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -class BotmanWidget extends StatefulWidget { - const BotmanWidget({super.key}); - - @override - State createState() => _BotmanWidgetState(); -} - -class _BotmanWidgetState extends State { - late final WebViewController _controller; - - @override - void initState() { - super.initState(); - _controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..loadHtmlString(_htmlWithBotman); - } - - void openBotman() { - _controller.runJavaScript("openBotmanFromFlutter();"); - } - - - final String _htmlWithBotman = ''' - - - - - - - - - - -'''; - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - WebViewWidget(controller: _controller), - Positioned( - right: 0, - bottom: 0, - child: FloatingActionButton( - onPressed: openBotman, - backgroundColor: Colors.blue, - child: const Icon(Icons.chat), - ), - ) - ], - ); - } -} diff --git a/lib/pages/postEnrollment/botman_widget_app.dart b/lib/pages/postEnrollment/botman_widget_app.dart deleted file mode 100644 index 3408d83..0000000 --- a/lib/pages/postEnrollment/botman_widget_app.dart +++ /dev/null @@ -1,353 +0,0 @@ -// import 'dart:io'; -// import 'dart:math'; -// import 'package:flutter/material.dart'; -// import 'package:webview_flutter/webview_flutter.dart'; -// import 'package:webview_flutter_android/webview_flutter_android.dart'; -// import 'package:flutter/services.dart' show rootBundle; -// -// class ChatPage extends StatefulWidget { -// -// final String employeeId; -// final String empCode; -// final String clientId; -// final String clientBranchId; -// final String empName; -// -// const ChatPage({ -// super.key, -// required this.employeeId, -// required this.empCode, -// required this.clientId, -// required this.clientBranchId, -// required this.empName, -// }); -// -// @override -// State createState() => _ChatPageState(); -// } -// -// class _ChatPageState extends State { -// late final WebViewController _controller; -// -// @override -// void initState() { -// super.initState(); -// print('param check'); -// print(widget.empName); -// print(widget.empCode); -// print(widget.clientBranchId); -// print(widget.clientId); -// print(widget.employeeId); -// -// if (Platform.isAndroid) { -// WebViewPlatform.instance = AndroidWebViewPlatform(); -// } -// -// _controller = WebViewController() -// ..setJavaScriptMode(JavaScriptMode.unrestricted) -// ..setNavigationDelegate( -// NavigationDelegate(onPageFinished: (url) { -// _controller.runJavaScript( -// "if(typeof botmanChatWidget !== 'undefined') botmanChatWidget.open();"); -// }), -// ); -// -// _loadBotmanHtml(); -// -// // _controller = WebViewController() -// // ..setJavaScriptMode(JavaScriptMode.unrestricted); -// -// // _loadHtmlAndInitBotman(); -// } -// -// -// String generateSessionId([int length = 15]) { -// const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; -// final random = Random.secure(); -// return List.generate(length, (index) => characters[random.nextInt(characters.length)]).join(); -// } -// -// -// // Future _loadHtmlAndInitBotman() async { -// // final htmlString = await rootBundle.loadString('assets/botman_chat.html'); -// // await _controller.loadHtmlString(htmlString); -// // await Future.delayed(const Duration(milliseconds: 500)); // Wait for widget.js to load -// // -// // final sessionId = generateSessionId(); -// // final safeName = widget.empName.replaceAll("'", "\\'"); // Escape single quotes -// // -// // final js = ''' -// // initBotman({ -// // employee_id: '${widget.employeeId}', -// // session_id: '$sessionId', -// // origin: 'mobile', -// // emp_code: '${widget.empCode}', -// // client_id: '${widget.clientId}', -// // client_branch_id: '${widget.clientBranchId}', -// // emp_name: '$safeName' -// // }); -// // '''; -// // -// // print(js); // ✅ Debug output -// // await _controller.runJavaScript(js); -// // } -// -// -// -// Future _loadBotmanHtml() async { -// final htmlContent = await rootBundle.loadString('assets/botman_chat.html'); -// // Inject localStorage values first -// await _controller.runJavaScript(''' -// localStorage.setItem('empPrimaryId', '12563'); -// localStorage.setItem('empCode', 'HERO00571'); -// localStorage.setItem('client_id', '3843'); -// localStorage.setItem('empClientBranchId', '1793'); -// localStorage.setItem('_postToken', 'XYZ123ABC'); -// localStorage.setItem('gpaEmpName', 'Vishal Vinod Menon G'); -// '''); -// _controller.loadHtmlString(htmlContent); -// } -// -// @override -// Widget build(BuildContext context) { -// return Scaffold( -// appBar: AppBar(title: const Text("Ask ILA")), -// body: WebViewWidget(controller: _controller), -// ); -// } -// } -// -// import 'dart:convert'; -// import 'dart:io'; -// import 'dart:math'; -// import 'package:flutter/material.dart'; -// import 'package:flutter/services.dart' show rootBundle; -// import 'package:nhance_app_pwa/customAppBar/customAppBar.dart'; -// import 'package:webview_flutter/webview_flutter.dart'; -// import 'package:webview_flutter_android/webview_flutter_android.dart'; -// -// class ChatPage extends StatefulWidget { -// final String employeeId; -// final String empCode; -// final String clientId; -// final String clientBranchId; -// final String empName; -// -// const ChatPage({ -// super.key, -// required this.employeeId, -// required this.empCode, -// required this.clientId, -// required this.clientBranchId, -// required this.empName, -// }); -// -// @override -// State createState() => _ChatPageState(); -// } -// -// class _ChatPageState extends State { -// late final WebViewController _controller; -// -// @override -// void initState() { -// super.initState(); -// if (Platform.isAndroid) { -// WebViewPlatform.instance = AndroidWebViewPlatform(); -// } -// -// _controller = WebViewController() -// ..setJavaScriptMode(JavaScriptMode.unrestricted); -// -// _loadHtmlWithBase64Injection(); -// } -// -// String generateSessionId([int length = 15]) { -// const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; -// final random = Random.secure(); -// return List.generate(length, (index) => characters[random.nextInt(characters.length)]).join(); -// } -// -// Future _loadHtmlWithBase64Injection() async { -// String html = await rootBundle.loadString('assets/botman_chat.html'); -// -// final sessionId = generateSessionId(); -// final empName = widget.empName.replaceAll("'", "\\'"); -// final injectedJS = ''' -// -// -// -// '''; -// -// html = html.replaceFirst('\n', injectedJS); // inject just before -// -// final uri = Uri.dataFromString(html, mimeType: 'text/html', encoding: Encoding.getByName('utf-8')); -// await _controller.loadRequest(uri); -// } -// -// @override -// Widget build(BuildContext context) { -// return Scaffold( -// backgroundColor: Colors.white, -// appBar: CustomAppBar(), -// body: WebViewWidget(controller: _controller), -// ); -// } -// } - -import 'dart:math'; -import 'package:flutter/material.dart'; -import 'package:nhance_app_pwa/customAppBar/customAppBar.dart'; -import 'package:webview_flutter/webview_flutter.dart'; - -class BotmanChatScreen extends StatefulWidget { - - - final String empName; - final String employeeId; - final String sessionId; - final String empCode; - final String clientId; - final String clientBranchId; - - const BotmanChatScreen({ - super.key, - required this.empName, - required this.employeeId, - required this.sessionId, - required this.empCode, - required this.clientId, - required this.clientBranchId, - }); - - @override - State createState() => _BotmanChatScreenState(); -} - -class _BotmanChatScreenState extends State { - late final WebViewController _controller; - - String getInjectedHTML() { - final uid = Random().nextInt(900000) + 100000; - - return ''' - - - - - - - - // - // - - - - - - '''; - } - - @override - void initState() { - super.initState(); - _controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..loadHtmlString(getInjectedHTML()); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - appBar: CustomAppBar(), - body: WebViewWidget(controller: _controller), - ); - } -} diff --git a/lib/pages/postEnrollment/claimprocess.dart b/lib/pages/postEnrollment/claimprocess.dart index 511d70a..e9e4589 100755 --- a/lib/pages/postEnrollment/claimprocess.dart +++ b/lib/pages/postEnrollment/claimprocess.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:jwt_decode/jwt_decode.dart'; import 'package:nhance_app_pwa/customAppBar/customAppBar.dart'; @@ -12,6 +13,9 @@ import '../../customAppBar/customFooter.dart'; import '../../customAppBar/responsive.dart'; import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; +import '../service/popup_helper.dart'; class claimprocess extends StatefulWidget { @@ -39,6 +43,7 @@ class _claimprocessState extends State { dynamic reimbursementHeading; late Map reimbursementContent; late Map reimbursementNotes; + final session = SessionManager(); @override void initState() { @@ -54,28 +59,22 @@ class _claimprocessState extends State { Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); // Decode the JWT token received from the API response Map? decodedToken = Jwt.parseJwt(token); print(decodedToken); - empCodeString = prefs.getString('empCode'); - print(empCodeString); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - client_id = prefs.getString('client_id'); + empCodeString = session.empCodeString; + print(empCodeString); // Check if emp_code is correct + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; print(client_id); getCashlessAndReimbursement(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } + + Future getCashlessAndReimbursement() async { final response = await apiService.getCashlessAndReimbursementToApi(); print('check 1'); @@ -123,7 +122,13 @@ class _claimprocessState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/claims'); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack( @@ -153,7 +158,7 @@ class _claimprocessState extends State { flex: 12, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -175,7 +180,7 @@ class _claimprocessState extends State { CrossAxisAlignment.start, children: [ Text( - 'Health Insurance Claim Process', + 'Health Insurance Claims Process', textAlign: TextAlign.start, style: GoogleFonts.poppins( fontSize: 16, @@ -763,15 +768,20 @@ class _claimprocessState extends State { : CustomBottomNavigationBar( onTabChanged: (index) { if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.go('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.go('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -783,12 +793,13 @@ class _claimprocessState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", ], ), + ) ); } } diff --git a/lib/pages/postEnrollment/claims.dart b/lib/pages/postEnrollment/claims.dart index 4a33dbe..3dced34 100755 --- a/lib/pages/postEnrollment/claims.dart +++ b/lib/pages/postEnrollment/claims.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:jwt_decode/jwt_decode.dart'; @@ -14,10 +15,15 @@ import '../../customAppBar/customFooter.dart'; import '../../customAppBar/responsive.dart'; import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; +import '../service/popup_helper.dart'; import 'claimshistory.dart'; class claims extends StatefulWidget { - const claims({Key? key}) : super(key: key); + final int initialTab; + + const claims({super.key, required this.initialTab}); @override State createState() => _claimsState(); @@ -50,6 +56,7 @@ class _claimsState extends State { int? serviceId; dynamic client_branch_id; dynamic mobileNo; + final session = SessionManager(); List> getDepartmentItems() { return [ @@ -77,33 +84,40 @@ class _claimsState extends State { super.dispose(); } + void didChangeDependencies() { + super.didChangeDependencies(); + dynamic arguments = widget.initialTab; + print('arguments $arguments'); + if (arguments == 0) { + print(arguments); + trackClaimsActive = 0; + yourPlanActive = 1; + isActive = false; + } else if(arguments == 2){ + print(arguments); + trackClaimsActive = 0; + yourPlanActive = 1; + isActive = false; + } else { + print("Arguments are null or not in the expected format"); + } + } + Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); // Decode the JWT token received from the API response - decodedToken = Jwt.parseJwt(token); - print(decodedToken); - mobileNo = decodedToken['mobile']; - client_branch_id = decodedToken['client_branch_id']; - empMobileNo = decodedToken['mobile']; - empName = decodedToken['name']; - empCodeString = prefs.getString('empCode'); + mobileNo = session.mobileNo; + client_branch_id = session.empClientBranchId; + empCodeString = session.empCodeString; + empName = session.gpaEmpName; print(empCodeString); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - client_id = prefs.getString('client_id'); + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; print(client_id); getActiveAndInactivePolicyDetails(); getTrackClaimsList(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - // For now, let's navigate to the login screen - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } @@ -220,18 +234,29 @@ class _claimsState extends State { @override Widget build(BuildContext context) { - dynamic arguments = ModalRoute.of(context)!.settings.arguments; - print('arguments'); - print(arguments); - if (arguments == 0) { - print(arguments); - trackClaimsActive = 0; - yourPlanActive = 1; - isActive = false; - } else { - print("Arguments are null or not in the expected format"); - } - return Scaffold( + // dynamic arguments = ModalRoute.of(context)!.settings.arguments; + // print('arguments'); + // dynamic arguments = widget.initialTab; + // print('arguments $arguments'); + // if (arguments == 0) { + // print(arguments); + // trackClaimsActive = 0; + // yourPlanActive = 1; + // isActive = false; + // } else { + // print("Arguments are null or not in the expected format"); + // } + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + if(widget.initialTab == 2){ + context.go('/home'); + } else { + context.pop(); + } + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -258,7 +283,11 @@ class _claimsState extends State { flex: 12, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'home'); + if(widget.initialTab == 2){ + context.go('/home'); + } else { + context.pop(); + } }, child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -277,7 +306,7 @@ class _claimsState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Claim assistance', + 'Claims assistance', textAlign: TextAlign.start, style: GoogleFonts.poppins( fontSize: 16, @@ -312,7 +341,7 @@ class _claimsState extends State { cursor: SystemMouseCursors.click, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'help'); + context.push('/help'); }, child: Card( elevation: 0, @@ -393,7 +422,7 @@ class _claimsState extends State { cursor: SystemMouseCursors.click, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'claimprocess'); + context.go('/claimprocess'); }, child: Card( elevation: 0, @@ -688,15 +717,20 @@ class _claimsState extends State { // Add your navigation logic here // For example: if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.push('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.push('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.push('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.push('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -708,13 +742,14 @@ class _claimsState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", ], initialIndex: 1, // Initial index of the bottom navigation bar ), + ) ); } @@ -739,8 +774,7 @@ class _claimsState extends State { return GestureDetector( onTap: () { var details = {'claimsDetails': item, 'fromClaimPage': 0}; - Navigator.pushNamed(context, 'planclaimsform', - arguments: details); + context.go('/planclaimsform', extra: details); }, child: MouseRegion( cursor: SystemMouseCursors.click, diff --git a/lib/pages/postEnrollment/claimshistory.dart b/lib/pages/postEnrollment/claimshistory.dart index ef369b1..226ece7 100644 --- a/lib/pages/postEnrollment/claimshistory.dart +++ b/lib/pages/postEnrollment/claimshistory.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -201,7 +202,7 @@ class _ClaimHistoryPopupState extends State { final keyValueWidgetRow = [ _buildKeyValue( - 'Claim Amount', + 'Claims Amount', widget.claimAmount == null || widget.claimAmount!.trim().isEmpty ? 'N/A' : '₹${widget.claimAmount}', @@ -210,14 +211,20 @@ class _ClaimHistoryPopupState extends State { width: Responsive.isDesktop(context) ? 16 : 0, height: Responsive.isDesktop(context) ? 0 : 8), _buildKeyValue( - 'Claim Number', + 'Claims Number', widget.claimNo == null || widget.claimNo!.trim().isEmpty ? 'N/A' : widget.claimNo!, ), ]; - return Container( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.pop(); + }, + child: Container( constraints: BoxConstraints(maxWidth: 800, maxHeight: 800), padding: EdgeInsets.all(20), decoration: BoxDecoration( @@ -234,7 +241,7 @@ class _ClaimHistoryPopupState extends State { child: Align( alignment: Alignment.centerLeft, child: Text( - 'Claim History', + 'Claims History', style: GoogleFonts.poppins( fontSize: Responsive.isDesktop(context) ? 20 : 16, fontWeight: FontWeight.w500, @@ -246,7 +253,7 @@ class _ClaimHistoryPopupState extends State { MouseRegion( cursor: SystemMouseCursors.click, // Show pointer cursor child: GestureDetector( - onTap: () => Navigator.of(context).pop(), + onTap: () => context.pop(), child: Container( height: 30, width: 30, @@ -460,7 +467,7 @@ class _ClaimHistoryPopupState extends State { fit: BoxFit.cover, ), Text( - 'No Claim History', + 'No Claims History', style: TextStyle( fontWeight: FontWeight.w500, fontSize: 15), @@ -496,6 +503,7 @@ class _ClaimHistoryPopupState extends State { ], ), ), + ) ); } diff --git a/lib/pages/postEnrollment/generalexclusionsdeductibles.dart b/lib/pages/postEnrollment/generalexclusionsdeductibles.dart index a6cc7ac..74a3e32 100755 --- a/lib/pages/postEnrollment/generalexclusionsdeductibles.dart +++ b/lib/pages/postEnrollment/generalexclusionsdeductibles.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:jwt_decode/jwt_decode.dart'; import 'package:nhance_app_pwa/customAppBar/customAppBar.dart'; @@ -11,6 +12,9 @@ import '../../customAppBar/customFooter.dart'; import '../../customAppBar/responsive.dart'; import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; +import '../service/popup_helper.dart'; class generalExclusionsDeductibles extends StatefulWidget { const generalExclusionsDeductibles({Key? key}) : super(key: key); @@ -61,6 +65,9 @@ class _generalExclusionsDeductiblesState dynamic type7Heading; late Map type7Content; + final session = SessionManager(); + + @override void initState() { super.initState(); @@ -75,28 +82,22 @@ class _generalExclusionsDeductiblesState Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); // Decode the JWT token received from the API response Map? decodedToken = Jwt.parseJwt(token); print(decodedToken); - empCodeString = prefs.getString('empCode'); + empCodeString = session.empCodeString; print(empCodeString); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - client_id = prefs.getString('client_id'); + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; print(client_id); getCashlessAndReimbursement(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } + + Future getCashlessAndReimbursement() async { final response = await apiService.getCashlessAndReimbursementToApi(); print('check 1'); @@ -161,7 +162,13 @@ class _generalExclusionsDeductiblesState @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.pop(); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack( @@ -191,7 +198,7 @@ class _generalExclusionsDeductiblesState flex: 12, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'claims'); + context.pop(); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -773,15 +780,20 @@ class _generalExclusionsDeductiblesState : CustomBottomNavigationBar( onTabChanged: (index) { if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.go('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.go('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -793,12 +805,13 @@ class _generalExclusionsDeductiblesState ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", ], ), + ) ); } } diff --git a/lib/pages/postEnrollment/help.dart b/lib/pages/postEnrollment/help.dart index 161f329..417039a 100755 --- a/lib/pages/postEnrollment/help.dart +++ b/lib/pages/postEnrollment/help.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:jwt_decode/jwt_decode.dart'; @@ -16,6 +17,10 @@ import '../../customAppBar/customFooter.dart'; import '../../customAppBar/responsive.dart'; import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; +import '../service/data_manager.dart'; +import '../service/popup_helper.dart'; class help extends StatefulWidget { const help({Key? key}) : super(key: key); @@ -56,6 +61,7 @@ class _helpState extends State { List reversedTicketList = []; List reversedClaimsClosedList = []; List trackClaimsClosedList = []; + final Map statusColors = { 'Open': Colors.green, 'In Progress': Colors.blue, @@ -63,6 +69,8 @@ class _helpState extends State { 'Resolved': Colors.yellow, 'Closed': Colors.red, }; + final session = SessionManager(); + final dataManager = DataManager(); void _onTabChanged(int index) { setState(() { @@ -122,48 +130,39 @@ class _helpState extends State { Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); // Decode the JWT token received from the API response Map? decodedToken = Jwt.parseJwt(token); print(decodedToken); - empMobileNo = decodedToken['mobile']; - client_branch_id = decodedToken['client_branch_id']; - empCodeString = prefs.getString('empCode'); + client_branch_id = session.empClientBranchId; + empCodeString = session.empCodeString; print(empCodeString); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - client_id = prefs.getString('client_id'); + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; print(client_id); getSelfEmployeeProfile(); - // getTrackClaimsList(); - // getTicketList(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } Future getSelfEmployeeProfile() async { - print(getSelfEmployeeProfile); - if (client_id == null || empCodeString == null) { - return; - } - setState(() { - isLoading = true; - }); - print('check 1'); - final response = await apiService.getSelfEmployeeProfileDetails( - client_id!, empCodeString!, client_branch_id!); - print('check 1'); - if (response['status'] == 'success') { - print(response); + // print(getSelfEmployeeProfile); + // if (client_id == null || empCodeString == null) { + // return; + // } + // setState(() { + // isLoading = true; + // }); + // print('check 1'); + // final response = await apiService.getSelfEmployeeProfileDetails( + // client_id!, empCodeString!, client_branch_id!); + // print('check 1'); + // if (response['status'] == 'success') { + // print(response); setState(() { - accountManagerDetails = response['AccountManagerDetails']; + // accountManagerDetails = response['AccountManagerDetails']; + final accountManager = dataManager.accountManagerDetails; + accountManagerDetails = accountManager; print('accountManagerDetails'); print(accountManagerDetails); accountManagerEmail = accountManagerDetails['email']; @@ -171,15 +170,15 @@ class _helpState extends State { accountManagerMobileNo = accountManagerDetails['mobile']; print(accountManagerMobileNo); }); - setState(() { - isLoading = false; - }); - } else { - setState(() { - isLoading = false; - }); - print('API request failed with status: ${response['status']}'); - } + // setState(() { + // isLoading = false; + // }); + // } else { + // setState(() { + // isLoading = false; + // }); + // print('API request failed with status: ${response['status']}'); + // } } Future getTrackClaimsList() async { @@ -303,7 +302,13 @@ class _helpState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.pop(); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -333,7 +338,7 @@ class _helpState extends State { flex: 12, child: InkWell( onTap: () { - Navigator.pop(context); + context.pop(); // Navigator.pushNamed(context, 'home'); }, child: Row( @@ -525,7 +530,7 @@ class _helpState extends State { flex: 4, child: ElevatedButton( onPressed: () { - Navigator.pushNamed(context, 'tickets'); + context.go('/tickets'); }, style: ElevatedButton.styleFrom( backgroundColor: Color(0xFFE26728), @@ -544,7 +549,7 @@ class _helpState extends State { flex: 4, child: ElevatedButton( onPressed: () { - Navigator.pushNamed(context, 'raisedTicketHistory'); + context.go('/raisedTicketHistory'); }, style: ElevatedButton.styleFrom( backgroundColor: Color(0xFFE26728), @@ -1030,15 +1035,20 @@ class _helpState extends State { : CustomBottomNavigationBar( onTabChanged: (index) { if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.push('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.push('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.push('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.push('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -1050,13 +1060,14 @@ class _helpState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", ], initialIndex: 3, // Initial index of the bottom navigation bar ), + ) ); } @@ -1344,6 +1355,7 @@ class _helpState extends State { return GestureDetector( onTap: () { + // context.go('/tickettracklist', extra: item); Navigator.pushNamed(context, 'tickettracklist', arguments: item); }, child: MouseRegion( @@ -1547,13 +1559,8 @@ class _helpState extends State { onTap: () { print("Navigating with thz_id: ${item['thz_id']}"); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - tickettracklist(ticketID: item['thz_id']), - ), - ); + context.go('/tickettracklist', extra: item['thz_id']); + // Navigator.pushNamed( // context, diff --git a/lib/pages/postEnrollment/home.dart b/lib/pages/postEnrollment/home.dart index 90c84fc..825cbd7 100755 --- a/lib/pages/postEnrollment/home.dart +++ b/lib/pages/postEnrollment/home.dart @@ -6,6 +6,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_image_slideshow/flutter_image_slideshow.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:jwt_decode/jwt_decode.dart'; @@ -19,9 +20,11 @@ import '../../customAppBar/responsive.dart'; import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; +import '../service/data_manager.dart'; +import '../service/popup_helper.dart'; import 'botman_chat.dart'; -import 'botman_ios_chat.dart'; -import 'botman_widget_app.dart'; import 'chatbot.dart'; // import 'dart:js' as js; // import 'dart:html' as html; @@ -52,6 +55,7 @@ class _HomeState extends State { dynamic empPrimaryId; dynamic client_id; dynamic policyList; + dynamic activePoliciesDetails; dynamic policyDataIsEmpty = 1; dynamic policyHeading; dynamic policyName; @@ -71,6 +75,8 @@ class _HomeState extends State { }); } + final session = SessionManager(); + final dataManager = DataManager(); late final WebViewController _controller; @override @@ -80,6 +86,38 @@ class _HomeState extends State { _loadToken(); checkEnrollToken(); + // 🔹 Load ads + // dataManager.loadAdvertisementImages(); + advertisementImages = DataManager().advertisementImages; + print('starts'); + print(advertisementImages); + print('Ends'); + + // // 🔹 Load policies (Active ones) + activePoliciesDetails = dataManager.loadPolicies( + clientId: session.client_id, + empCode: session.empCodeString, + status: "Active", + clientBranchId: session.empClientBranchId, + mobileNo: session.mobileNo, + ); + + print('activePoliciesDetails'); + print(activePoliciesDetails); + + // 🔹 Load self employee profile + dataManager.loadSelfEmployeeProfile( + clientId: session.client_id!, + empCode: session.empCodeString!, + clientBranchId: session.empClientBranchId!, + ); + print('loadSelfEmployeeProfile'); + + + + + + if (kIsWeb) { openBotmanChat(); @@ -137,7 +175,8 @@ class _HomeState extends State { actions: [ TextButton( onPressed: () { - Navigator.pop(context); // Close dialog + context.pop(); + // Close dialog _dialogShown = false; }, child: Text("Cancel"), @@ -145,7 +184,8 @@ class _HomeState extends State { TextButton( onPressed: () { // Logout logic here - Navigator.pop(context); // Close dialog + context.pop(); + // Close dialog _logoutAndRedirect(); }, child: Text("Logout"), @@ -158,13 +198,15 @@ class _HomeState extends State { void _logoutAndRedirect() { // Clear session if any // Navigate to login page - Navigator.pushReplacementNamed(context, 'login'); + context.go('/login'); } Future checkEnrollToken() async { - SharedPreferences prefs = await SharedPreferences.getInstance(); + final preToken = TokenService.getPreToken(); + print('preToken'); + print(preToken); setState(() { - isTokenAvailable = prefs.getString('enrollToken') != null; + isTokenAvailable = preToken != null; }); } @@ -178,31 +220,21 @@ class _HomeState extends State { Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - - // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(token); - print(decodedToken); - mobileNo = decodedToken['mobile']; - client_branch_id = decodedToken['client_branch_id']; - empCodeString = prefs.getString('empCode'); - empName = prefs.getString('gpaEmpName'); - print(empCodeString); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - client_id = prefs.getString('client_id'); - print(client_id); - getAdvertisementSliderImage(); - getActiveAndInactivePolicyDetails('Active'); - }); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - // For now, let's navigate to the login screen - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); + // Decode the JWT token received from the API response + Map? decodedToken = Jwt.parseJwt(token); + print(decodedToken); + mobileNo = session.mobileNo; + client_branch_id = session.empClientBranchId; + empCodeString = session.empCodeString; + empName = session.gpaEmpName; + print(empCodeString); // Check if emp_code is correct + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; + print(client_id); + // getAdvertisementSliderImage(); + getActiveAndInactivePolicyDetails('Active'); } } @@ -266,19 +298,33 @@ class _HomeState extends State { double numValue = double.parse(value); if (numValue >= 10000000) { - // 1 crore is 10,000,000 - return "₹ ${(numValue / 10000000).toStringAsFixed(0)} Crores"; + return "₹ ${(numValue / 10000000).toStringAsFixed(2)} Crores"; } else if (numValue >= 100000) { - // 1 lakh is 100,000 - return "₹ ${(numValue / 100000).toStringAsFixed(0)} Lakhs"; + return "₹ ${(numValue / 100000).toStringAsFixed(2)} Lakhs"; } else if (numValue >= 1000) { - // 1 thousand is 1,000 - return "₹ ${(numValue / 1000).toStringAsFixed(0)} Thousands"; + return "₹ ${(numValue / 1000).toStringAsFixed(2)} Thousands"; } else { - return "₹ $numValue"; // This handles the case where value is less than 1 thousand + return "₹ $numValue"; } } + // String formatToCroresLakhsAndThousands(String value) { + // double numValue = double.parse(value); + // + // if (numValue >= 10000000) { + // // 1 crore is 10,000,000 + // return "₹ ${(numValue / 10000000).toStringAsFixed(0)} Crores"; + // } else if (numValue >= 100000) { + // // 1 lakh is 100,000 + // return "₹ ${(numValue / 100000).toStringAsFixed(0)} Lakhs"; + // } else if (numValue >= 1000) { + // // 1 thousand is 1,000 + // return "₹ ${(numValue / 1000).toStringAsFixed(0)} Thousands"; + // } else { + // return "₹ $numValue"; // This handles the case where value is less than 1 thousand + // } + // } + String generateSessionId([int length = 15]) { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; @@ -288,14 +334,114 @@ class _HomeState extends State { .join(); } + void _showExitConfirmation(BuildContext context) { + double myheight = MediaQuery.of(context).size.height; + showDialog( + context: context, + barrierDismissible: false, // User must tap a button to dismiss dialog + builder: (dialogContext) => AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), // Rounded corners + ), + backgroundColor: Colors.white, + contentPadding: EdgeInsets.zero, + title: Text( + 'Log Out Confirmation', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + content: Padding( + padding: const EdgeInsets.all(20.0), + child: Text( + 'Are you sure you want to log out?', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 18, + color: Color(0xFF898C81), + ), + ), + ), + actions: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, // Space buttons evenly + children: [ + SizedBox( + width: + MediaQuery.of(context).size.width * 0.3, // Set button width + child: TextButton( + onPressed: () => Navigator.pop(dialogContext), + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + side: BorderSide( + color: Color(0xFFE26728), // Border color + width: 1, + ), + ), + child: Text( + 'Cancel', + style: GoogleFonts.poppins( + color: Color(0xFFE26728), + fontSize: 16, + ), + ), + ), + ), + SizedBox( + width: + MediaQuery.of(context).size.width * 0.3, // Set button width + child: TextButton( + onPressed: () => TokenService().logout(context), + style: TextButton.styleFrom( + backgroundColor: Color(0xFFE26728), // Background color + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + ), + child: FittedBox( + fit: BoxFit + .scaleDown, // Prevents wrapping while adjusting text size + child: Text( + 'Log Out', + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: 16, + ), + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + SizedBox(height: 10), // Add spacing below buttons + ], + ), + ); + } + @override Widget build(BuildContext context) { + if (!Responsive.isDesktop(context)) SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( statusBarColor: Color(0xFFFFFBDE), // Status bar color statusBarIconBrightness: Brightness.dark, // Light icons for status bar )); - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + _showExitConfirmation(context); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -407,8 +553,7 @@ class _HomeState extends State { ElevatedButton( onPressed: isTokenAvailable ? () { - Navigator.pushNamed( - context, 'empDetails'); + context.go('/empDetails'); } : null, child: Text('View Details'), @@ -433,9 +578,7 @@ class _HomeState extends State { flex: 12, child: Container( alignment: Alignment.centerLeft, - child: isLoading - ? Center(child: CircularProgressIndicator()) - : advertisementImages.isEmpty + child: advertisementImages.isEmpty ? Center(child: Text("No images available")) : Container( child: Row( @@ -829,32 +972,41 @@ class _HomeState extends State { floatingActionButton: Responsive.isDesktop(context) ? null : FloatingActionButton( - // onPressed: () => push(chatbot()), - onPressed: () => { - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => MyWebViewPage( - // url: 'https://venbait.in/nhance/dev/chatbot?employee_id=${empPrimaryId}&emp_code=${empCodeString}&origin=mob&name=${empName}&client_id=${client_id}&client_branch_id=${client_branch_id}', - // ), - // ), - // ) - - Navigator.push( - context, - // MaterialPageRoute(builder: (context) => const BotmanChatPage()), - MaterialPageRoute( - builder: (context) => ChatbotWebViewPage( - client_branch_id: client_branch_id, - empCodeString: empCodeString, - empName: empName, - empPrimaryId: empPrimaryId, - client_id: client_id, - )), - ) - }, - child: Icon(Icons.chat), - ), + // onPressed: () => push(chatbot()), + onPressed: () => { + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => MyWebViewPage( + // url: 'https://venbait.in/nhance/dev/chatbot?employee_id=${empPrimaryId}&emp_code=${empCodeString}&origin=mob&name=${empName}&client_id=${client_id}&client_branch_id=${client_branch_id}', + // ), + // ), + // ) + // context.go( + // '/chatbot', + // extra: { + // 'client_branch_id': client_branch_id, + // 'empCodeString': empCodeString, + // 'empName': empName, + // 'empPrimaryId': empPrimaryId, + // 'client_id': client_id, + // }, + // ) + Navigator.push( + context, + // MaterialPageRoute(builder: (context) => const BotmanChatPage()), + MaterialPageRoute( + builder: (context) => ChatbotWebViewPage( + client_branch_id: client_branch_id, + empCodeString: empCodeString, + empName: empName, + empPrimaryId: empPrimaryId, + client_id: client_id, + )), + ) + }, + child: Icon(Icons.chat), + ), floatingActionButtonLocation: Responsive.isDesktop(context) ? null : FloatingActionButtonLocation.miniEndFloat, @@ -865,15 +1017,20 @@ class _HomeState extends State { // Add your navigation logic here // repositionBotman(); if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.push('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.push('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.push('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.push('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -883,9 +1040,10 @@ class _HomeState extends State { Icons.headset_mic_outlined, Icons.health_and_safety_outlined, ], - labels: ["Home", "Claim", "Profile", "Help", "Wellness"], + labels: ["Home", "Claims", "Profile", "Help", "Wellness"], initialIndex: 0, // Initial index of the bottom navigation bar ), + ) ); } @@ -926,7 +1084,10 @@ class _HomeState extends State { return GestureDetector( onTap: () { - Navigator.pushNamed(context, 'policies', arguments: item); + context.go( + '/policies', + extra: item, // 👈 pass arguments here + ); }, child: MouseRegion( cursor: SystemMouseCursors.click, diff --git a/lib/pages/postEnrollment/planclaimsform.dart b/lib/pages/postEnrollment/planclaimsform.dart index 173b98f..8bee409 100755 --- a/lib/pages/postEnrollment/planclaimsform.dart +++ b/lib/pages/postEnrollment/planclaimsform.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:jwt_decode/jwt_decode.dart'; @@ -20,8 +21,13 @@ import 'package:http/http.dart' as http; import '../../models/environment.dart'; import 'package:file_picker/file_picker.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; +import '../service/popup_helper.dart'; + class planclaimsform extends StatefulWidget { - const planclaimsform({Key? key}) : super(key: key); + final Map? details; + const planclaimsform({Key? key, this.details}) : super(key: key); @override State createState() => _planclaimsformState(); @@ -110,6 +116,8 @@ class _planclaimsformState extends State { bool isAccidentDateValid = true; bool isIntimationDateValid = true; + final session = SessionManager(); + @override void initState() { @@ -156,7 +164,8 @@ class _planclaimsformState extends State { void didChangeDependencies() { print('didChangeDependencies'); super.didChangeDependencies(); - dynamic arguments = ModalRoute.of(context)!.settings.arguments; + // dynamic arguments = ModalRoute.of(context)!.settings.arguments; + dynamic arguments = widget.details; if (arguments != null && arguments is Map) { argumentsData = arguments; claimsDetails = argumentsData['claimsDetails']; @@ -219,29 +228,21 @@ class _planclaimsformState extends State { Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); // Decode the JWT token received from the API response - decodedToken = Jwt.parseJwt(token); + Map? decodedToken = Jwt.parseJwt(token); print(decodedToken); - mobileNo = decodedToken['mobile']; - client_branch_id = decodedToken['client_branch_id']; - empCodeString = prefs.getString('empCode'); + mobileNo = session.mobileNo; + client_branch_id = session.empClientBranchId; + empCodeString = session.empCodeString; print(empCodeString); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - client_id = prefs.getString('client_id'); + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; print(client_id); getActiveAndInactivePolicyDetails(); fetchDepartmentList(); getSelfEmployeeProfile(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } @@ -413,7 +414,7 @@ class _planclaimsformState extends State { }); policyTypeCondition = filteredPolicies[0]['ticket_type_id']; - // client_policy_id = filteredPolicies[0]['client_policy_id']; + client_policy_id = filteredPolicies[0]['client_policy_id']; print('Output : $policyTypeCondition'); // Output: GMC }); } else { @@ -541,8 +542,8 @@ class _planclaimsformState extends State { }); final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? emp_id = prefs.getString('empPrimaryId'); - // print('Check One'); + final String? emp_id = session.empPrimaryId; + print('Check One $client_policy_id'); // print(employeePolicyList[0]['name']); // print('Help $filteredPoliciesList'); try { @@ -557,14 +558,10 @@ class _planclaimsformState extends State { // 'policy_id': fromClaimsPage == 0 // ? claimsDetails['client_policy_id'] // : policyNumberId, - 'emp_code': - decodedToken['emp_code'] != null ? decodedToken['emp_code'] : '', - 'mobile_number': - decodedToken['mobile'] != null ? decodedToken['mobile'] : '', - 'email': decodedToken['email_corporate'] != null - ? decodedToken['email_corporate'] - : '', - 'fullname': decodedToken['name'] != null ? decodedToken['name'] : '', + 'emp_code': empCodeString ?? ' ', + 'mobile_number': mobileNo ?? '', + 'email': session.empEmailCorporate ?? '', + 'fullname': session.gpaEmpName ?? '', 'client_id': selfDetails['client_id'], 'relationship': selfDetails['relationship'], 'gender': selfDetails['gender'], @@ -646,6 +643,7 @@ class _planclaimsformState extends State { // filename: uploadedFile!.name, // )); // } + _token = await TokenService.getPostToken(); final request = http.MultipartRequest('POST', Uri.parse('${Environment.apiUrl}/initiateClaim')); request.headers['Authorization'] = 'Bearer $_token'; @@ -688,7 +686,7 @@ class _planclaimsformState extends State { setState(() { isLoading = false; }); - Navigator.pushNamed(context, 'claims'); + context.go('/claims', extra: 2); print('Form data submitted successfully'); fileService.clearAll(); } else { @@ -785,7 +783,14 @@ class _planclaimsformState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + final route = fromClaimsPage == 0 ? 'claims' : 'help'; + context.go('/$route'); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -860,11 +865,8 @@ class _planclaimsformState extends State { flex: 1, child: InkWell( onTap: () { - Navigator.pushNamed( - context, - fromClaimsPage == 0 - ? 'claims' - : 'help'); + final route = fromClaimsPage == 0 ? 'claims' : 'help'; + context.go('/$route'); }, child: Icon( Icons @@ -1218,9 +1220,9 @@ SizedBox(height: 15), SizedBox(height: 15), if (serviceId == 1) ...[ - buildTextField('Claim Amount', claimAmountController, TextInputType.number), + buildTextField('Claims Amount', claimAmountController, TextInputType.number), if (!isClaimAmountValid) - Text('Please enter the Claim Amount', style: TextStyle(color: Colors.red)), + Text('Please enter the Claims Amount', style: TextStyle(color: Colors.red)), ], SizedBox(height: 15), @@ -1343,16 +1345,20 @@ SizedBox(height: 15), onTabChanged: (index) { // repositionBotman(); if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.go('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); - // Navigator.pushNamed(context, 'help'); + context.go('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -1364,13 +1370,14 @@ SizedBox(height: 15), ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", ], initialIndex: 1,// Initial index of the bottom navigation bar ), + ) ); } diff --git a/lib/pages/postEnrollment/policies.dart b/lib/pages/postEnrollment/policies.dart index 2b0aa96..9d118f0 100755 --- a/lib/pages/postEnrollment/policies.dart +++ b/lib/pages/postEnrollment/policies.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:jwt_decode/jwt_decode.dart'; @@ -16,8 +17,13 @@ import '../../customAppBar/toastHelper.dart'; import 'package:http/http.dart' as http; import 'package:flutter_svg/flutter_svg.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; +import '../service/popup_helper.dart'; + class policies extends StatefulWidget { - const policies({Key? key}) : super(key: key); + final Map? arguments; + const policies({super.key, this.arguments}); @override State createState() => _policiesState(); @@ -25,6 +31,7 @@ class policies extends StatefulWidget { class _policiesState extends State { late ApiService apiService; + final session = SessionManager(); int _currentIndex = 0; bool isActive = true; dynamic _token; @@ -64,16 +71,11 @@ class _policiesState extends State { super.dispose(); } - - Future _loadToken() async { print('_loadToken'); + final String? token = await TokenService.getPostToken(); final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); - if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); + if (token != null && token.isNotEmpty) { // Decode the JWT token received from the API response Map? decodedToken = Jwt.parseJwt(token); print(decodedToken); @@ -82,12 +84,9 @@ class _policiesState extends State { empPrimaryId = prefs.getString('empPrimaryId'); client_id = prefs.getString('client_id'); print(client_id); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); - } } + } + String convertDateFormat(String date) { // Define input and output date formats @@ -103,6 +102,15 @@ class _policiesState extends State { return formattedDate; } + String formatDob(String dob) { + try { + final date = DateTime.parse(dob); // input format: yyyy-MM-dd + return DateFormat("d MMM yyyy").format(date); // output: 18 Jul 1988 + } catch (e) { + return dob; // fallback in case of error + } + } + // Function to open URL in the default browser Future _launchURL(String url) async { final Uri uri = Uri.parse(url); // Parse the URL properly @@ -128,7 +136,8 @@ class _policiesState extends State { @override Widget build(BuildContext context) { - dynamic arguments = ModalRoute.of(context)!.settings.arguments; + // dynamic arguments = ModalRoute.of(context)!.settings.arguments; + final arguments = widget.arguments; print('arguments'); print(arguments); if (arguments != null && arguments is Map) { @@ -142,13 +151,21 @@ class _policiesState extends State { // Extract name and relationship and add to employeeDetails array String name = employee['name']; String relationship = employee['relationship']; - employeeDetails.add({'name': name, 'relationship': relationship}); + String dob = employee['dob']; + String gender = employee['gender']; + employeeDetails.add({'name': name, 'relationship': relationship,'dob':dob,'gender':gender}); }); } print('employeeDetails'); print(employeeDetails); } - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/home'); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -185,7 +202,7 @@ class _policiesState extends State { flex: 1, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'home'); + context.go('/home'); }, child: Icon( Icons @@ -315,8 +332,7 @@ class _policiesState extends State { : 180, child: TextButton( onPressed: () { - Navigator.pushNamed( - context, 'claims'); + context.push('/claims'); }, style: TextButton.styleFrom( padding: @@ -345,7 +361,7 @@ class _policiesState extends State { width: 8), // Adjust space between icon and text Text( - 'Initiate a Claim', + 'Initiate a Claims', style: GoogleFonts.poppins( fontSize: Responsive.isDesktop( context) @@ -465,7 +481,7 @@ class _policiesState extends State { CrossAxisAlignment.center, children: [ Expanded( - flex: 6, + flex: 8, child: Container( alignment: Alignment.centerLeft, padding: Responsive.isDesktop(context) @@ -479,22 +495,57 @@ class _policiesState extends State { bottom: 15, left: 7, right: 7), - child: Text( - detail['name']!, - textAlign: TextAlign.start, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) - ? 16 - : 14, - color: Color(0xFF000000), - fontWeight: FontWeight.w400, - ), - ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + // 👇 SVG icon based on gender + if (detail['gender'] == 'M') + SvgPicture.string( + SvgService.getSvg('personMale'), + width: 25, + height: 25, + ) + else if (detail['gender'] == 'F') + SvgPicture.string( + SvgService.getSvg('personFemale'), + width: 25, + height: 25, + ), + + const SizedBox(width: 6), + + // Name text + Text( + detail['name']!, + textAlign: TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 16 : 14, + color: const Color(0xFF000000), + fontWeight: FontWeight.w400, + ), + ), + ], + ), + + const SizedBox(height: 4), + + // DOB text + Text( + "DOB: ${formatDob(detail['dob']!) ?? '-'}", + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 14 : 12, + color: const Color(0xFF606060), + fontWeight: FontWeight.w300, + ), + ), + ], + ) ), ), Expanded( - flex: 6, + flex: 4, child: Container( alignment: Alignment.centerRight, child: Text( @@ -589,107 +640,141 @@ class _policiesState extends State { ), ), if (_isExpanded) - Container( - decoration: BoxDecoration( - color: Colors.white, - ), - padding: Responsive.isDesktop(context) - ? EdgeInsets.all(30) - : EdgeInsets.symmetric( - vertical: 15, horizontal: 20), - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: argumentsData['policy_terms'] - .entries - .where((entry) => entry.value is String) - .toList() - .asMap() - .entries - .map((entry) { - int index = entry.key; - MapEntry value = entry.value; - bool isLast = index == - argumentsData['policy_terms'].length - 1; - return Container( - width: double.infinity, - decoration: BoxDecoration( - border: isLast - ? null - : Border( - bottom: BorderSide( - color: Color(0xFFD9D9D9), - width: 1.0, + Builder( + builder: (context) { + final terms = argumentsData['policy_terms']; + + if (terms == null || (terms is List && terms.isEmpty) || (terms is Map && terms.isEmpty)) { + // ✅ Show toast once + WidgetsBinding.instance.addPostFrameCallback((_) { + ToastHelper.showInfoToast(context, 'No policy terms available'); + }); + return const SizedBox(); // Don't render container + } + + return Container( + decoration: const BoxDecoration( + color: Colors.white, + ), + padding: Responsive.isDesktop(context) + ? const EdgeInsets.all(30) + : const EdgeInsets.symmetric(vertical: 15, horizontal: 20), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: (() { + if (terms is Map) { + // ✅ Case 1: Map + return terms.entries + .where((entry) => entry.value is String) + .toList() + .asMap() + .entries + .map((entry) { + int index = entry.key; + MapEntry value = entry.value; + bool isLast = index == terms.length - 1; + + return Container( + width: double.infinity, + decoration: BoxDecoration( + border: isLast + ? null + : const Border( + bottom: BorderSide( + color: Color(0xFFD9D9D9), + width: 1.0, + ), + ), ), - ), - ), - child: Padding( - padding: - EdgeInsets.symmetric(vertical: 8.0), - child: Responsive.isDesktop(context) - ? Row( - children: [ - Expanded( - flex: 6, - child: Text( - value.key, - style: GoogleFonts.poppins( - fontSize: 14, - fontWeight: FontWeight.w600, - color: Color(0xFF777777), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Responsive.isDesktop(context) + ? Row( + children: [ + Expanded( + flex: 6, + child: Text( + value.key, + style: GoogleFonts.poppins( + fontSize: 14, + fontWeight: FontWeight.w600, + color: const Color(0xFF777777), + ), + ), ), - ), - ), - Expanded( - flex: 6, - child: Text( - value.value, - textAlign: TextAlign.end, - style: GoogleFonts.poppins( - fontSize: 16, - fontWeight: FontWeight.w400, - color: Color(0xFF000000), + Expanded( + flex: 6, + child: Text( + value.value, + textAlign: TextAlign.end, + style: GoogleFonts.poppins( + fontSize: 16, + fontWeight: FontWeight.w400, + color: const Color(0xFF000000), + ), + ), ), - ), + ], + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + value.key, + style: GoogleFonts.poppins( + fontSize: 14, + fontWeight: FontWeight.w600, + color: const Color(0xFF777777), + ), + ), + const SizedBox(height: 4), + Text( + value.value, + style: GoogleFonts.poppins( + fontSize: 16, + fontWeight: FontWeight.w400, + color: const Color(0xFF000000), + ), + ), + ], ), - ], - ) - : Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - value.key, - style: GoogleFonts.poppins( - fontSize: 14, - fontWeight: FontWeight.w600, - color: Color(0xFF777777), - ), + ), + ); + }).toList(); + } else if (terms is List) { + // ✅ Case 2: List + return terms.map((item) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 6.0), + child: Text( + item.toString(), + style: GoogleFonts.poppins( + fontSize: 16, + fontWeight: FontWeight.w400, + color: const Color(0xFF000000), ), - SizedBox(height: 4), - Text( - value.value, - style: GoogleFonts.poppins( - fontSize: 16, - fontWeight: FontWeight.w400, - color: Color(0xFF000000), - ), - ), - ], - ), + ), + ); + }).toList(); + } else { + return [const SizedBox()]; + } + })(), ), - ); - }).toList(), - )), + ), + ); + }, ), + + ])), SizedBox(height: 10), MouseRegion( cursor: SystemMouseCursors.click, child: GestureDetector( onTap: () => { - Navigator.pushNamed( - context, 'generalExclusionsDeductibles') + context.push('/generalExclusionsDeductibles') }, child: Card( elevation: 0, @@ -798,7 +883,7 @@ class _policiesState extends State { cursor: SystemMouseCursors.click, child: GestureDetector( onTap: () { - Navigator.pushNamed(context, 'help'); + context.push('/help'); }, child: Container( alignment: Alignment.center, @@ -838,8 +923,7 @@ class _policiesState extends State { cursor: SystemMouseCursors.click, child: GestureDetector( onTap: () { - Navigator.pushNamed(context, 'claims', - arguments: 0); + context.push('/claims', extra: 0); }, child: Container( alignment: Alignment.center, @@ -857,7 +941,7 @@ class _policiesState extends State { ), SizedBox(height: 10), Text( - 'Claim history', + 'Claims history', textAlign: TextAlign.center, style: GoogleFonts.poppins( fontSize: @@ -1000,15 +1084,20 @@ class _policiesState extends State { : CustomBottomNavigationBar( onTabChanged: (index) { if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.go('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.go('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -1020,12 +1109,13 @@ class _policiesState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", ], // Initial index of the bottom navigation bar ), + ) ); } diff --git a/lib/pages/postEnrollment/privacypolicy.dart b/lib/pages/postEnrollment/privacypolicy.dart index 3535975..d48d757 100755 --- a/lib/pages/postEnrollment/privacypolicy.dart +++ b/lib/pages/postEnrollment/privacypolicy.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import '../../customAppBar/customFooter.dart'; import '../../customAppBar/responsive.dart'; @@ -24,7 +25,13 @@ class _privacypolicyState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/claims'); + }, + child: Scaffold( backgroundColor: Colors.white, body: Stack( children: [ @@ -53,7 +60,7 @@ class _privacypolicyState extends State { flex: 12, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -127,7 +134,7 @@ class _privacypolicyState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'What is a Cashless Claim?', + 'What is a Cashless Claims?', style: GoogleFonts.poppins( fontSize: Responsive.isDesktop(context) ? 18 : 16, @@ -154,7 +161,7 @@ class _privacypolicyState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Steps to File a Cashless Claim', + 'Steps to File a Cashless Claims', style: GoogleFonts.poppins( fontSize: Responsive.isDesktop(context) ? 18 : 16, @@ -726,7 +733,7 @@ class _privacypolicyState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Tips for a Smooth Cashless Claim Process', + 'Tips for a Smooth Cashless Claims Process', style: GoogleFonts.poppins( fontSize: Responsive.isDesktop(context) ? 18 : 16, @@ -947,6 +954,7 @@ class _privacypolicyState extends State { ), ], ), + ) ); } } diff --git a/lib/pages/postEnrollment/profile.dart b/lib/pages/postEnrollment/profile.dart index 4dbacf6..b2d5ecd 100755 --- a/lib/pages/postEnrollment/profile.dart +++ b/lib/pages/postEnrollment/profile.dart @@ -1,11 +1,14 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:jwt_decode/jwt_decode.dart'; import 'package:nhance_app_pwa/customAppBar/customAppBar.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; +import 'package:nhance_app_pwa/pages/service/SessionManager.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../customAppBar/customFooter.dart'; @@ -13,9 +16,13 @@ import '../../customAppBar/responsive.dart'; import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; import 'package:http/http.dart' as http; +import '../../models/environment.dart'; import '../../models/platform_helper_mobile.dart' if (dart.library.html) '../../models/platform_helper_other.dart'; +import '../service/TokenService.dart'; +import '../service/data_manager.dart'; +import '../service/popup_helper.dart'; import '../session/authenticationService.dart'; class profile extends StatefulWidget { @@ -55,6 +62,8 @@ class _profileState extends State { dynamic selfFamilyFloaterKey; dynamic selfEmpStatus; dynamic client_branch_id; + final dataManager = DataManager(); + final session = SessionManager(); void _onTabChanged(int index) { setState(() { @@ -89,27 +98,18 @@ class _profileState extends State { Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); // Decode the JWT token received from the API response Map? decodedToken = Jwt.parseJwt(token); print(decodedToken); - client_branch_id = decodedToken['client_branch_id']; - empCodeString = prefs.getString('empCode'); + client_branch_id = session.empClientBranchId; + empCodeString = session.empCodeString; print(empCodeString); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - client_id = prefs.getString('client_id'); + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; print(client_id); getSelfEmployeeProfile(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - // For now, let's navigate to the login screen - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } @@ -120,50 +120,110 @@ class _profileState extends State { } Future getSelfEmployeeProfile() async { - print(getSelfEmployeeProfile); - if (client_id == null || empCodeString == null) { - return; - } - setState(() { - isLoading = true; - }); - print('check 1'); - final response = await apiService.getSelfEmployeeProfileDetails( - client_id!, empCodeString!, client_branch_id!); - print('check 1'); - if (response['status'] == 'success') { - if (response.containsKey('data')) { + + final selfDetails = dataManager.selfProfile; + print('profile'); + print(profile); + // if (client_id == null || empCodeString == null) { + // return; + // } + // setState(() { + // isLoading = true; + // }); + // print('check 1'); + // final response = await apiService.getSelfEmployeeProfileDetails( + // client_id!, empCodeString!, client_branch_id!); + // print('check 1'); + // if (response['status'] == 'success') { + // if (response.containsKey('data')) { setState(() { - dynamic selfDetails = response['data']; + // dynamic selfDetails = response['data']; + // print(selfDetails); - selfRelationship = selfDetails['relationship']; - selfName = selfDetails['name']; - selfMobile = selfDetails['mobile']; - selfDesignation = selfDetails['designation']; - selfDob = convertDate(selfDetails['dob']); - selfDoj = convertDate(selfDetails['doj']); - selfGender = selfDetails['gender']; - selfEmailCorporate = selfDetails['email_corporate']; - selfEmailPersonal = selfDetails['email_personal']; - selfEmpCode = selfDetails['emp_code']; - selfFamilyFloaterKey = selfDetails['family_floater_key']; + selfRelationship = selfDetails?['relationship']; + selfName = selfDetails?['name']; + selfMobile = selfDetails?['mobile']; + selfDesignation = selfDetails?['designation']; + selfDob = convertDate(selfDetails?['dob']); + selfDoj = convertDate(selfDetails?['doj']); + selfGender = selfDetails?['gender']; + selfEmailCorporate = selfDetails?['email_corporate']; + selfEmailPersonal = selfDetails?['email_personal']; + selfEmpCode = selfDetails?['emp_code']; + selfFamilyFloaterKey = selfDetails?['family_floater_key']; // print(clientDetails); - selfEmpStatus = selfDetails['emp_status']; - isLoading = false; + selfEmpStatus = selfDetails?['emp_status']; + // isLoading = false; }); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('selfEmpStatus', selfEmpStatus); - } else { - // Handle other status messages if needed - // ToastHelper.showErrorToast( - // context, 'API request failed with status: ${data['status']}'); - print('API request failed with status: ${response['status']}'); - } - } else { - print('API request failed with status: ${response['status']}'); - } + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('selfEmpStatus', selfEmpStatus); + // } else { + // // Handle other status messages if needed + // // ToastHelper.showErrorToast( + // // context, 'API request failed with status: ${data['status']}'); + // print('API request failed with status: ${response['status']}'); + // } + // } else { + // print('API request failed with status: ${response['status']}'); + // } } + Future checkLoginPin() async { + print('checkLoginPin'); + try { + final SharedPreferences prefs = await SharedPreferences.getInstance(); + final empMobileNo = prefs.getString('empMobileNo'); + final empEmailid = prefs.getString('empEmailid'); + print('empMobileNo $empMobileNo'); + print('empEmailid $empEmailid'); + + var params = {}; + if (empMobileNo != null && empMobileNo.isNotEmpty) { + params = {'mobile_number': empMobileNo}; + } else if (empEmailid != null && empEmailid.isNotEmpty) { + params = {'email_id': empEmailid}; + } + + print('params $params'); + + final response = await http.post( + Uri.parse(Environment.apiUrlEnrollment + 'checkMpin'), + body: json.encode(params), + headers: { + HttpHeaders.contentTypeHeader: 'application/json', + }, + ); + + if (response.statusCode == 200) { + Map data = json.decode(response.body); + + if (data['status'] == 'success') { + if (data['data'] != null) { + prefs.setString('mpinText', data['data']); + } + if (data['Mpin'] != null) { + prefs.setString('mpin', data['Mpin']); + } + if (data['is_biometric_enabled'] != null) { + prefs.setString('is_biometric_enabled', data['is_biometric_enabled']); + } + if (data['is_mpin_skipped'] != null) { + prefs.setString('is_mpin_skipped', data['is_mpin_skipped']); + return data['is_mpin_skipped'].toString(); + } + } + } else { + print('❌ API failed: ${response.statusCode}'); + return null; + } + } catch (e) { + print('❌ Error: $e'); + return null; + } + return null; + } + + Future logout(BuildContext context) async { // if (isMobilePlatform()) { final SharedPreferences prefs = await SharedPreferences.getInstance(); @@ -172,13 +232,14 @@ class _profileState extends State { String? mobileNumber = prefs.getString('empMobileNo'); String? mailID = prefs.getString('empEmailid'); - final isMpinSkipped = prefs.getString('is_mpin_skipped'); - + final isMpinSkipped = await checkLoginPin(); + print('isMpinSkipped $isMpinSkipped'); // bool? biometricStatus = prefs.getBool('biometricStatus') ?? false; // int? skipStatus = prefs.getInt('skipStatus') ?? 1; // Clear all keys - await prefs.clear(); + await SessionManager().clear(); + // await prefs.clear(); print('Local Storage Clear'); // html.window.localStorage.clear(); @@ -186,25 +247,33 @@ class _profileState extends State { if (isMobilePlatform()) { if (mobileNumber != null) { await prefs.setString('empMobileNo', mobileNumber); + print('empMobileNo $mobileNumber'); // await prefs.setBool('biometricStatus', biometricStatus!); // await prefs.setInt('skipStatus', skipStatus!); } if (mailID != null) { await prefs.setString('empEmailid', mailID); + print('empEmailid $mailID'); // await prefs.setBool('biometricStatus', biometricStatus!); // await prefs.setInt('skipStatus', skipStatus!); } - await prefs.setString('is_mpin_skipped', isMpinSkipped!); - print('isMpinSkipped $isMpinSkipped'); + if (isMpinSkipped != null) { + await prefs.setString('is_mpin_skipped', isMpinSkipped!); + print('isMpinSkipped $isMpinSkipped'); + } if (isMpinSkipped != null && isMpinSkipped == '0') { - Navigator.pushReplacementNamed(context, 'pinPage'); + print('pinPage'); + // return; + context.go('/pinPage'); } else { - Navigator.pushReplacementNamed(context, 'login'); + print('login'); + context.go('/login'); } } else { + await prefs.clear(); ToastHelper.showSuccessToast(context, 'logout'); // Navigate to login page - Navigator.pushNamed(context, 'login'); + context.go('/login'); } @@ -217,7 +286,13 @@ class _profileState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.pop(); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -245,7 +320,7 @@ class _profileState extends State { flex: 1, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'home'); + context.pop(); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -606,7 +681,7 @@ class _profileState extends State { ) ])), SizedBox(height: 12), - if(Responsive.isMobile(context)) + if(Responsive.isMobile(context) || Responsive.isTablet(context)) Container( child: Row( children: [ @@ -618,8 +693,8 @@ class _profileState extends State { alignment: Alignment.center, child: ElevatedButton( onPressed: () { - Navigator.pushReplacementNamed( - context, 'changePin'); + print('changePin'); + context.go('/changePin'); }, child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -756,15 +831,20 @@ class _profileState extends State { : CustomBottomNavigationBar( onTabChanged: (index) { if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.push('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.push('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.push('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.push('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -776,13 +856,14 @@ class _profileState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", ], initialIndex: 2, // Initial index of the bottom navigation bar ), + ) ); } } diff --git a/lib/pages/postEnrollment/raisedTicketList.dart b/lib/pages/postEnrollment/raisedTicketList.dart index 687307d..7681aa2 100644 --- a/lib/pages/postEnrollment/raisedTicketList.dart +++ b/lib/pages/postEnrollment/raisedTicketList.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:jwt_decode/jwt_decode.dart'; @@ -8,6 +9,7 @@ import 'package:nhance_app_pwa/customAppBar/customAppBar.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/svg_service.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/tickettracklist.dart'; +import 'package:nhance_app_pwa/pages/service/SessionManager.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:http/http.dart' as http; @@ -15,6 +17,8 @@ import '../../customAppBar/customFooter.dart'; import '../../customAppBar/responsive.dart'; import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; +import '../service/TokenService.dart'; +import '../service/popup_helper.dart'; class raisedTicketHistory extends StatefulWidget { const raisedTicketHistory({Key? key}) : super(key: key); @@ -53,6 +57,8 @@ class _raisedTicketHistoryState extends State { List ticketList = []; + final session = SessionManager(); + final Map statusColors = { 'Open': Colors.green, 'In Progress': Colors.blue, @@ -76,30 +82,21 @@ class _raisedTicketHistoryState extends State { Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); // Decode the JWT token received from the API response - decodedToken = Jwt.parseJwt(token); + Map? decodedToken = Jwt.parseJwt(token); print(decodedToken); - mobileNo = decodedToken['mobile']; - client_branch_id = decodedToken['client_branch_id']; - empMobileNo = decodedToken['mobile']; - empName = decodedToken['name']; - empCodeString = prefs.getString('empCode'); + empMobileNo = session.mobileNo; + client_branch_id = session.empClientBranchId; + empCodeString = session.empCodeString; + empName = session.gpaEmpName; print(empCodeString); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - client_id = prefs.getString('client_id'); + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; + print(client_id); print(client_id); getTicketList(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - // For now, let's navigate to the login screen - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } @@ -180,7 +177,13 @@ class _raisedTicketHistoryState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/help'); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -207,7 +210,7 @@ class _raisedTicketHistoryState extends State { flex: 12, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'help'); + context.go('/help'); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -305,15 +308,20 @@ class _raisedTicketHistoryState extends State { // Add your navigation logic here // For example: if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.go('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.go('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -325,13 +333,14 @@ class _raisedTicketHistoryState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", ], initialIndex: 3, // Initial index of the bottom navigation bar ), + ) ); } @@ -389,20 +398,7 @@ class _raisedTicketHistoryState extends State { return GestureDetector( onTap: () { print("Navigating with thz_id: ${item['thz_id']}"); - - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - tickettracklist(ticketID: item['thz_id']), - ), - ); - - // Navigator.pushNamed( - // context, - // 'claimtracklist', - // arguments: item['thz_id'], - // ); + context.go('/tickettracklist', extra: item['thz_id']); }, child: MouseRegion( cursor: SystemMouseCursors.click, diff --git a/lib/pages/postEnrollment/service/api_service.dart b/lib/pages/postEnrollment/service/api_service.dart index d29c417..7fa9408 100755 --- a/lib/pages/postEnrollment/service/api_service.dart +++ b/lib/pages/postEnrollment/service/api_service.dart @@ -1,21 +1,22 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:nhance_app_pwa/customAppBar/toastHelper.dart'; import 'package:nhance_app_pwa/models/environment.dart'; +import 'package:nhance_app_pwa/pages/service/TokenService.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'dart:convert'; class ApiService { final BuildContext context; - String? _token; + String? _postToken; ApiService(this.context) { _initializeToken(); } Future _initializeToken() async { - final prefs = await SharedPreferences.getInstance(); - _token = prefs.getString('_postToken') ?? ''; + _postToken = await TokenService.getPostToken(); } Future> getActiveAndInactivePolicyDetails( @@ -24,14 +25,14 @@ class ApiService { String status, String branchID, String mobileNo) async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}getEmployeeActiveOrInactivePolicy?client_id=$clientId&emp_code=$empCode&type=$status&client_branch_id=$branchID&mobile_no=$mobileNo'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; @@ -44,33 +45,33 @@ class ApiService { Uri.parse('${Environment.apiUrl}claimView?ticket_id=$ticket_type_id'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getAdvertisementImageToApi() async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}getAdvertisementImage'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getCashlessAndReimbursementToApi() async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}getFEContent'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; @@ -78,36 +79,36 @@ class ApiService { Future> getSelfEmployeeProfileDetails( String clientId, String empCode, String branchID) async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}getEmployeeProfile?emp_code=$empCode&client_id=$clientId&client_branch_id=$branchID'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getTrackClaimsList(String empPrimaryId) async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}/get_ticket_data?emp_id=$empPrimaryId'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getTicketListByMobile(String empMobileNo) async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } @@ -116,15 +117,15 @@ class ApiService { final url1 = Uri.parse('${Environment.apiUrl}ticketList?mobile=1234567890'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getTicketConverList(String thz_id) async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } @@ -133,33 +134,33 @@ class ApiService { final url = Uri.parse('${Environment.apiUrl}ticketConversationList?thz_id=$thz_id'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } - Future> getWellnessLink() async { - print(_token); - if (_token == null) { + Future> getWellnessLink(empPrimaryId) async { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } - final url = Uri.parse('${Environment.apiUrl}getWellnessURL'); + final url = Uri.parse('${Environment.apiUrl}getWellnessURL?emp_id=$empPrimaryId'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> fetchDepartmentList(String clientId, String empCode) async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}/get_ticket_type?client_id=$clientId&emp_code=$empCode'); final headers = { - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; @@ -167,8 +168,8 @@ class ApiService { Future> sendTicketFormDataToApi( Map formData) async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}ticketSave'); @@ -177,15 +178,15 @@ class ApiService { formData.map((key, value) => MapEntry(key, value.toString())); final response = await _makePostRequest(url, stringFormData, { 'Content-Type': 'application/x-www-form-urlencoded', - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }); return response; } Future> sendClaimsFormDataToApi( Map formData) async { - print(_token); - if (_token == null) { + print(_postToken); + if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}/initiateClaim'); @@ -194,7 +195,7 @@ class ApiService { formData.map((key, value) => MapEntry(key, value.toString())); final response = await _makePostRequest(url, stringFormData, { 'Content-Type': 'application/x-www-form-urlencoded', - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }); return response; } @@ -210,7 +211,7 @@ class ApiService { formData.map((key, value) => MapEntry(key, value.toString())); final response = await _makePostRequest(url, stringFormData, { 'Content-Type': 'application/x-www-form-urlencoded', - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }); return response; } @@ -220,12 +221,13 @@ class ApiService { await prefs.clear(); // Assuming you have access to the context ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushNamed(context, 'login'); + context.go('/login'); + // Navigator.pushNamed(context, 'login'); } Future> getBotDetails( Map formData) async { - if (_token == null) { + if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}getChatResponse'); @@ -235,7 +237,7 @@ class ApiService { print(url); final response = await _makePostRequest(url, stringFormData, { 'Content-Type': 'application/x-www-form-urlencoded', - 'Authorization': 'Bearer $_token' ?? '', + 'Authorization': 'Bearer $_postToken' ?? '', }); return response; } @@ -248,7 +250,7 @@ class ApiService { // print('returnMessage: $returnMessage'); // print('mobileNo: $mobileNo'); // print('policyID: $policyID'); - // if (_token == null) { + // if (_postToken == null) { // await _initializeToken(); // } // final url; @@ -262,7 +264,7 @@ class ApiService { // print(url); // // final headers = { - // 'Authorization': 'Bearer $_token' ?? '', + // 'Authorization': 'Bearer $_postToken' ?? '', // }; // final response = await _makeGetRequest(url, headers); // return response; diff --git a/lib/pages/postEnrollment/service/svg_service.dart b/lib/pages/postEnrollment/service/svg_service.dart index 4c7baf1..33be40d 100755 --- a/lib/pages/postEnrollment/service/svg_service.dart +++ b/lib/pages/postEnrollment/service/svg_service.dart @@ -181,6 +181,81 @@ class SvgService { '''; + static const String female = ''' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '''; + + static const String male = ''' + + + + + + + + + + + + + + + + + + + + + + + + + '''; + static const String mpin = ''' @@ -366,6 +441,10 @@ class SvgService { return smartphone; case 'mpin': return mpin; + case 'personMale': + return male; + case 'personFemale': + return female; // Add more cases here for additional SVGs default: return ''; diff --git a/lib/pages/postEnrollment/termsofuse.dart b/lib/pages/postEnrollment/termsofuse.dart index 21d86a7..16a1ee3 100755 --- a/lib/pages/postEnrollment/termsofuse.dart +++ b/lib/pages/postEnrollment/termsofuse.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import '../../customAppBar/customFooter.dart'; import '../../customAppBar/responsive.dart'; @@ -23,7 +24,13 @@ class _termsofuseState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/claims'); + }, + child: Scaffold( backgroundColor: Colors.white, body: Stack( children: [ @@ -52,7 +59,7 @@ class _termsofuseState extends State { flex: 12, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -126,7 +133,7 @@ class _termsofuseState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'What is a Cashless Claim?', + 'What is a Cashless Claims?', style: GoogleFonts.poppins( fontSize: Responsive.isDesktop(context) ? 18 : 16, @@ -153,7 +160,7 @@ class _termsofuseState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Steps to File a Cashless Claim', + 'Steps to File a Cashless Claims', style: GoogleFonts.poppins( fontSize: Responsive.isDesktop(context) ? 18 : 16, @@ -725,7 +732,7 @@ class _termsofuseState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Tips for a Smooth Cashless Claim Process', + 'Tips for a Smooth Cashless Claims Process', style: GoogleFonts.poppins( fontSize: Responsive.isDesktop(context) ? 18 : 16, @@ -946,6 +953,7 @@ class _termsofuseState extends State { ), ], ), + ) ); } } diff --git a/lib/pages/postEnrollment/tickets.dart b/lib/pages/postEnrollment/tickets.dart index 979259d..2da9a61 100644 --- a/lib/pages/postEnrollment/tickets.dart +++ b/lib/pages/postEnrollment/tickets.dart @@ -1,10 +1,12 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:jwt_decode/jwt_decode.dart'; import 'package:nhance_app_pwa/customAppBar/customAppBar.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; +import 'package:nhance_app_pwa/pages/service/SessionManager.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../customAppBar/customFooter.dart'; import '../../customAppBar/responsive.dart'; @@ -12,6 +14,9 @@ import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; import 'package:http/http.dart' as http; +import '../service/TokenService.dart'; +import '../service/popup_helper.dart'; + class tickets extends StatefulWidget { const tickets({Key? key}) : super(key: key); @@ -29,7 +34,7 @@ class _ticketsState extends State { List> policyList = []; dynamic policyDataIsEmpty = 1; int? fromClaimsPage; - dynamic decodedToken; + Map? decodedToken; List> departmentList = []; List> policyNumberList = []; dynamic serviceId; @@ -63,6 +68,8 @@ class _ticketsState extends State { bool isSubjectValid = true; bool isMessageValid = true; + final session = SessionManager(); + @override void initState() { super.initState(); @@ -82,8 +89,7 @@ class _ticketsState extends State { Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { setState(() { _token = token; @@ -91,22 +97,19 @@ class _ticketsState extends State { // Decode the JWT token received from the API response decodedToken = Jwt.parseJwt(token); print(decodedToken); - mobileNo = decodedToken['mobile']; - client_branch_id = decodedToken['client_branch_id']; - empCodeString = prefs.getString('empCode'); + mobileNo = session.mobileNo; + client_branch_id = session.empClientBranchId; + empCodeString = session.empCodeString; print(empCodeString); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - client_id = prefs.getString('client_id'); + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; print(client_id); getActiveAndInactivePolicyDetails(); getSelfEmployeeProfile(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } + Future getActiveAndInactivePolicyDetails() async { if (client_id == null || empCodeString == null) { return; @@ -209,14 +212,12 @@ class _ticketsState extends State { try { print('Check One'); Map formData = { - 'email': decodedToken['email_corporate'] != null - ? decodedToken['email_corporate'] - : '', + 'email': decodedToken?['email_corporate'], 'empcode': - decodedToken['emp_code'] != null ? decodedToken['emp_code'] : '', + decodedToken?['emp_code'], 'message': messageController.text, - 'mobile': decodedToken['mobile'] != null ? decodedToken['mobile'] : '', - 'name': decodedToken['name'] != null ? decodedToken['name'] : '', + 'mobile': decodedToken?['mobile'], + 'name': decodedToken?['name'], 'policy_no': policyNumberId, 'subject': subjectController.text, 'ticket_type': selectedServiceName, @@ -248,12 +249,7 @@ class _ticketsState extends State { setState(() { isLoading = false; }); - // Navigator.pushNamed(context, 'help'); - Navigator.pushNamed( - context, - 'raisedTicketHistory', - arguments: {'ticketTabSelected': 0}, - ); + context.go('/raisedTicketHistory'); print('Form data submitted successfully'); } else { print('Failed to submit form data: ${response['status']}'); @@ -265,7 +261,13 @@ class _ticketsState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/help'); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -340,8 +342,7 @@ class _ticketsState extends State { flex: 1, child: InkWell( onTap: () { - Navigator.pushNamed( - context, 'help'); + context.go('/help'); }, child: Icon( Icons @@ -592,16 +593,20 @@ class _ticketsState extends State { onTabChanged: (index) { // repositionBotman(); if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.go('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); - // Navigator.pushNamed(context, 'help'); + context.go('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -613,12 +618,14 @@ class _ticketsState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", - ], // Initial index of the bottom navigation bar + ], + initialIndex: 3, // Initial index of the bottom navigation bar ), + ) ); } diff --git a/lib/pages/postEnrollment/tickettracklist.dart b/lib/pages/postEnrollment/tickettracklist.dart index 496f2e5..5a5f0c6 100755 --- a/lib/pages/postEnrollment/tickettracklist.dart +++ b/lib/pages/postEnrollment/tickettracklist.dart @@ -1,11 +1,13 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import 'package:jwt_decode/jwt_decode.dart'; import 'package:nhance_app_pwa/customAppBar/customAppBar.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; +import 'package:nhance_app_pwa/pages/service/SessionManager.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:http/http.dart' as http; @@ -13,6 +15,8 @@ import '../../customAppBar/customFooter.dart'; import '../../customAppBar/responsive.dart'; import '../../customAppBar/tabs.dart'; import '../../customAppBar/toastHelper.dart'; +import '../service/TokenService.dart'; +import '../service/popup_helper.dart'; class tickettracklist extends StatefulWidget { final String ticketID; @@ -72,6 +76,8 @@ class _tickettracklistState extends State { // Create a unique form key for each accordion section final GlobalKey formKey = GlobalKey(); + final session = SessionManager(); + @override void initState() { super.initState(); @@ -102,28 +108,17 @@ class _tickettracklistState extends State { Future _loadToken() async { print('_loadToken'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? token = prefs.getString('_postToken'); + final String? token = await TokenService.getPostToken(); if (token != null && token.isNotEmpty) { - setState(() { - _token = token; - }); // Decode the JWT token received from the API response - decodedToken = Jwt.parseJwt(token); + Map? decodedToken = Jwt.parseJwt(token); print(decodedToken); - empName = decodedToken['name']; - empCodeString = prefs.getString('empCode'); - print('empCodeString - $empCodeString'); // Check if emp_code is correct - empPrimaryId = prefs.getString('empPrimaryId'); - print('empPrimaryId- $empPrimaryId'); - client_id = prefs.getString('client_id'); - print('client_id- $client_id'); + empCodeString = session.empCodeString; + print(empCodeString); // Check if emp_code is correct + empPrimaryId = session.empPrimaryId; + client_id = session.client_id; + print(client_id); getTicketConvoList(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - // For now, let's navigate to the login screen - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'login'); } } @@ -232,7 +227,13 @@ class _tickettracklistState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.go('/raisedTicketHistory'); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -308,11 +309,8 @@ class _tickettracklistState extends State { flex: 1, child: InkWell( onTap: () { - - Navigator.pushNamed( - context, - 'raisedTicketHistory', - ); + context.go( + '/raisedTicketHistory'); }, child: Icon( Icons @@ -679,15 +677,20 @@ class _tickettracklistState extends State { : CustomBottomNavigationBar( onTabChanged: (index) { if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.go('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.go('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.go('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.go('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + // Wellness tab clicked → show popup + PopupHelper.showRedirectPopup( + context: context, + apiService: apiService, + empPrimaryId: session.empPrimaryId, + ); } }, icons: [ @@ -699,12 +702,14 @@ class _tickettracklistState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", - ], // Initial index of the bottom navigation bar + ], + initialIndex: 3, // Initial index of the bottom navigation bar ), + ) ); } diff --git a/lib/pages/postEnrollment/wellness.dart b/lib/pages/postEnrollment/wellness.dart index 81a1fc4..1720edb 100755 --- a/lib/pages/postEnrollment/wellness.dart +++ b/lib/pages/postEnrollment/wellness.dart @@ -1,10 +1,12 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:nhance_app_pwa/customAppBar/customAppBar.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/svg_service.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../customAppBar/customFooter.dart'; @@ -38,7 +40,10 @@ class _wellnessState extends State { Future getWellnessLink() async { - final response = await apiService.getWellnessLink(); + final SharedPreferences prefs = await SharedPreferences.getInstance(); + final String? empPrimaryId = prefs.getString('empPrimaryId'); + + final response = await apiService.getWellnessLink(empPrimaryId); print('check 1'); if (response['status'] == 'success') { wellnessURL = response['data']; @@ -67,7 +72,13 @@ class _wellnessState extends State { @override Widget build(BuildContext context) { - return Scaffold( + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + if (didPop) return; + context.pop(); + }, + child: Scaffold( backgroundColor: Colors.white, appBar: CustomAppBar(), body: Stack(children: [ @@ -90,7 +101,7 @@ class _wellnessState extends State { flex: 12, child: InkWell( onTap: () { - Navigator.pushNamed(context, 'home'); + context.pop(); }, child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -137,7 +148,7 @@ class _wellnessState extends State { color: Colors.white, // Set background color for the container ), padding: Responsive.isDesktop(context) - ? EdgeInsets.only(top: 10, bottom: 10, left: 10, right: 10) + ? EdgeInsets.symmetric(horizontal: 400,vertical: 10) : EdgeInsets.only(top: 5, bottom: 5, left: 10, right: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.center, @@ -148,22 +159,30 @@ class _wellnessState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - 'Nhance Account Manager Contact\nWellness is the active pursuit of activities and lifestyle choices that contribute to holistic physical, mental, and emotional well-being. It involves balancing various aspects of health to achieve a fulfilling and healthy life.', - textAlign: - TextAlign.center, // Center align the text + 'You are being redirected out of this app.', + textAlign: TextAlign.center, style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop(context) ? 16 : 12, + fontSize: Responsive.isDesktop(context) ? 16 : 12, fontWeight: FontWeight.w400, - color: Color(0xFF777777), + color: const Color(0xFF777777), ), - ) + ), + SizedBox(height: 4), // spacing between lines + Text( + 'Click Proceed to Continue', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: Responsive.isDesktop(context) ? 16 : 12, + fontWeight: FontWeight.w400, + color: const Color(0xFF777777), + ), + ), ], - ), + ) ), ]), ), - SizedBox(height: 20), // Space between text and button + SizedBox(height: 15), // Space between text and button ElevatedButton( onPressed: () { print('wellnessURL $wellnessURL'); @@ -174,7 +193,7 @@ class _wellnessState extends State { } }, child: Text( - 'Wellness', + 'Proceed', style: GoogleFonts.poppins(color: Colors.white), ), style: ElevatedButton.styleFrom( @@ -214,15 +233,15 @@ class _wellnessState extends State { // Add your navigation logic here // For example: if (index == 0) { - Navigator.pushNamed(context, 'home'); + context.push('/home'); } else if (index == 1) { - Navigator.pushNamed(context, 'claims'); + context.push('/claims'); } else if (index == 2) { - Navigator.pushNamed(context, 'profile'); + context.push('/profile'); } else if (index == 3) { - Navigator.pushNamed(context, 'help'); + context.push('/help'); } else if (index == 4) { - Navigator.pushNamed(context, 'wellness'); + context.push('/wellness'); } }, icons: [ @@ -234,13 +253,14 @@ class _wellnessState extends State { ], labels: [ "Home", - "Claim", + "Claims", "Profile", "Help", "Wellness", ], initialIndex: 4, // Initial index of the bottom navigation bar ), + ) ); } } diff --git a/lib/pages/service/SessionManager.dart b/lib/pages/service/SessionManager.dart new file mode 100644 index 0000000..e39fde5 --- /dev/null +++ b/lib/pages/service/SessionManager.dart @@ -0,0 +1,274 @@ +// import 'dart:async'; +// import 'package:flutter/foundation.dart'; +// import 'package:shared_preferences/shared_preferences.dart'; +// import 'package:jwt_decode/jwt_decode.dart'; +// import 'TokenService.dart'; +// +// class SessionManager { +// static final SessionManager _instance = SessionManager._internal(); +// factory SessionManager() => _instance; +// SessionManager._internal(); +// +// SharedPreferences? prefs; +// final StreamController _sessionController = StreamController.broadcast(); +// +// Stream get sessionStream => _sessionController.stream; +// +// bool sessionReady = false; +// +// /// ===== Post Enrollment Fields ===== +// String? mobileNo; +// String? empClientBranchId; +// String? empCodeString; +// String? gpaEmpName; +// String? empPrimaryId; +// String? client_id; +// String? emp_status; +// +// /// ===== Pre Enrollment Fields ===== +// String? enrollmentEmpClientBranchId; +// String? enrollmentEmpCodeString; +// String? enrollmentEmpPrimaryId; +// String? enrollmentGpaEmpName; +// String? enrollmentClient_id; +// String? enrollmentEmp_status; +// +// /// Save Post Enrollment Token +// Future initializeFromPostToken(String token) async { +// Map decoded = Jwt.parseJwt(token); +// +// final prefs = await SharedPreferences.getInstance(); +// +// mobileNo = decoded['mobile']; +// empClientBranchId = decoded['client_branch_id']; +// empCodeString = decoded['emp_code']?.toString(); +// gpaEmpName = decoded['name']?.toString(); +// empPrimaryId = decoded['id']?.toString(); +// client_id = decoded['client_id']?.toString(); +// emp_status = decoded['emp_status']?.toString(); +// +// // persist +// prefs.setString('mobileNo', mobileNo ?? ''); +// prefs.setString('empCodeString', empCodeString ?? ''); +// prefs.setString('gpaEmpName', gpaEmpName ?? ''); +// prefs.setString('empPrimaryId', empPrimaryId ?? ''); +// prefs.setString('client_id', client_id ?? ''); +// prefs.setString('empClientBranchId', empClientBranchId ?? ''); +// prefs.setString('emp_status', emp_status ?? ''); +// +// debugPrint('Post Session initialized: $decoded'); +// } +// +// /// Save Pre Enrollment Token +// Future initializeFromPreToken(String token) async { +// Map decoded = Jwt.parseJwt(token); +// +// final prefs = await SharedPreferences.getInstance(); +// +// enrollmentEmpClientBranchId = decoded['client_branch_id']; +// enrollmentEmpCodeString = decoded['emp_code']?.toString(); +// enrollmentEmpPrimaryId = decoded['id']?.toString(); +// enrollmentGpaEmpName = decoded['name']?.toString(); +// enrollmentClient_id = decoded['client_id']?.toString(); +// enrollmentEmp_status = decoded['emp_status']?.toString(); +// +// // persist +// prefs.setString('enrollmentEmpClientBranchId', enrollmentEmpClientBranchId ?? ''); +// prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString ?? ''); +// prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId ?? ''); +// prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName ?? ''); +// prefs.setString('enrollmentClient_id', enrollmentClient_id ?? ''); +// prefs.setString('enrollmentEmp_status', enrollmentEmp_status ?? ''); +// +// debugPrint('Pre Session initialized: $decoded'); +// } +// +// /// Restore session from tokens +// Future restoreSession() async { +// prefs = await SharedPreferences.getInstance(); +// +// final postToken = await TokenService.getPostToken(); +// final preToken = await TokenService.getPreToken(); +// +// if (postToken != null && postToken.isNotEmpty) { +// Map decoded = Jwt.parseJwt(postToken); +// mobileNo = decoded['mobile']; +// empClientBranchId = decoded['client_branch_id']; +// empCodeString = decoded['emp_code']?.toString(); +// gpaEmpName = decoded['name']?.toString(); +// empPrimaryId = decoded['id']?.toString(); +// client_id = decoded['client_id']?.toString(); +// emp_status = decoded['emp_status']?.toString(); +// } +// +// if (preToken != null && preToken.isNotEmpty) { +// Map decoded = Jwt.parseJwt(preToken); +// enrollmentEmpClientBranchId = decoded['client_branch_id']; +// enrollmentEmpCodeString = decoded['emp_code']?.toString(); +// enrollmentEmpPrimaryId = decoded['id']?.toString(); +// enrollmentGpaEmpName = decoded['name']?.toString(); +// enrollmentClient_id = decoded['client_id']?.toString(); +// enrollmentEmp_status = decoded['emp_status']?.toString(); +// } +// +// sessionReady = (postToken?.isNotEmpty ?? false) || (preToken?.isNotEmpty ?? false); +// _sessionController.add(null); // notify GoRouter +// } +// +// bool hasValidTokenSync() => sessionReady; +// +// Future clear() async { +// mobileNo = null; +// empClientBranchId = null; +// empCodeString = null; +// gpaEmpName = null; +// empPrimaryId = null; +// client_id = null; +// emp_status = null; +// +// enrollmentEmpClientBranchId = null; +// enrollmentEmpCodeString = null; +// enrollmentEmpPrimaryId = null; +// enrollmentGpaEmpName = null; +// enrollmentClient_id = null; +// enrollmentEmp_status = null; +// +// await prefs?.clear(); +// await TokenService.clearTokens(); +// sessionReady = false; +// _sessionController.add(null); +// } +// +// } + +import 'package:flutter/foundation.dart'; +import 'package:jwt_decode/jwt_decode.dart'; +import 'package:nhance_app_pwa/pages/service/data_manager.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +import 'TokenService.dart'; + +class SessionManager { + static final SessionManager _instance = SessionManager._internal(); + factory SessionManager() => _instance; + SessionManager._internal(); + + bool isReady = false; + + // ===== Post Enrollment Fields ===== + String? mobileNo; + String? empClientBranchId; + String? empCodeString; + String? gpaEmpName; + String? empPrimaryId; + String? client_id; + String? emp_status; + String? empEmailCorporate; + + // ===== Pre Enrollment Fields ===== + String? enrollmentEmpClientBranchId; + String? enrollmentEmpCodeString; + String? enrollmentEmpPrimaryId; + String? enrollmentGpaEmpName; + String? enrollmentClient_id; + String? enrollmentEmp_status; + + /// Save Post Enrollment Token + Future initializeFromPostToken(String token) async { + Map decoded = Jwt.parseJwt(token); + + final prefs = await SharedPreferences.getInstance(); + + mobileNo = decoded['mobile']; + empClientBranchId = decoded['client_branch_id']; + empCodeString = decoded['emp_code']?.toString(); + gpaEmpName = decoded['name']?.toString(); + empPrimaryId = decoded['id']?.toString(); + client_id = decoded['client_id']?.toString(); + emp_status = decoded['emp_status']?.toString(); + empEmailCorporate = decoded['email_corporate']?.toString(); + + // persist + prefs.setString('mobileNo', mobileNo ?? ''); + prefs.setString('empCodeString', empCodeString ?? ''); + prefs.setString('gpaEmpName', gpaEmpName ?? ''); + prefs.setString('empPrimaryId', empPrimaryId ?? ''); + prefs.setString('client_id', client_id ?? ''); + prefs.setString('empClientBranchId', empClientBranchId ?? ''); + prefs.setString('emp_status', emp_status ?? ''); + prefs.setString('empEmailCorporate', empEmailCorporate ?? ''); + + debugPrint('Post Session initialized: $decoded'); + } + + /// Save Pre Enrollment Token + Future initializeFromPreToken(String token) async { + Map decoded = Jwt.parseJwt(token); + + final prefs = await SharedPreferences.getInstance(); + + enrollmentEmpClientBranchId = decoded['client_branch_id']; + enrollmentEmpCodeString = decoded['emp_code']?.toString(); + enrollmentEmpPrimaryId = decoded['id']?.toString(); + enrollmentGpaEmpName = decoded['name']?.toString(); + enrollmentClient_id = decoded['client_id']?.toString(); + enrollmentEmp_status = decoded['emp_status']?.toString(); + + // persist + prefs.setString('enrollmentEmpClientBranchId', enrollmentEmpClientBranchId ?? ''); + prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString ?? ''); + prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId ?? ''); + prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName ?? ''); + prefs.setString('enrollmentClient_id', enrollmentClient_id ?? ''); + prefs.setString('enrollmentEmp_status', enrollmentEmp_status ?? ''); + + debugPrint('Pre Session initialized: $decoded'); + } + + /// Restore session at startup + Future restoreSession() async { + final postToken = await TokenService.getPostToken(); + final preToken = await TokenService.getPreToken(); + + if (postToken != null && postToken.isNotEmpty) { + await initializeFromPostToken(postToken); + } + + if (preToken != null && preToken.isNotEmpty) { + await initializeFromPreToken(preToken); + } + + + // 🔴 If both tokens are null/empty → clear session + if ((postToken == null || postToken.isEmpty) && + (preToken == null || preToken.isEmpty)) { + await clear(); + } + } + + + /// Clear all session values + Future clear() async { + mobileNo = null; + empClientBranchId = null; + empCodeString = null; + gpaEmpName = null; + empPrimaryId = null; + client_id = null; + emp_status = null; + empEmailCorporate = null; + + enrollmentEmpClientBranchId = null; + enrollmentEmpCodeString = null; + enrollmentEmpPrimaryId = null; + enrollmentGpaEmpName = null; + enrollmentClient_id = null; + enrollmentEmp_status = null; + + final prefs = await SharedPreferences.getInstance(); + await prefs.clear(); + await DataManager().clearData(); + await TokenService.clearTokens(); + } +} diff --git a/lib/pages/service/TokenService.dart b/lib/pages/service/TokenService.dart new file mode 100644 index 0000000..89f4e68 --- /dev/null +++ b/lib/pages/service/TokenService.dart @@ -0,0 +1,195 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:go_router/go_router.dart'; +import 'package:http/http.dart' as http; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../../customAppBar/toastHelper.dart'; +import '../../models/environment.dart'; +import '../../models/platform_helper_mobile.dart'; +import 'SessionManager.dart'; + +class TokenService { + static const postTokenKey = 'post_token'; + static const preTokenKey = 'pre_token'; + + static final _secureStorage = FlutterSecureStorage(); + + static Future saveTokens({String? postToken, String? preToken}) async { + if (kIsWeb) { + final prefs = await SharedPreferences.getInstance(); + if (postToken != null) await prefs.setString(postTokenKey, postToken); + if (preToken != null) await prefs.setString(preTokenKey, preToken); + } else { + if (postToken != null) await _secureStorage.write(key: postTokenKey, value: postToken); + if (preToken != null) await _secureStorage.write(key: preTokenKey, value: preToken); + } + } + + static Future getPostToken() async { + if (kIsWeb) { + final prefs = await SharedPreferences.getInstance(); + final token = prefs.getString(postTokenKey); + print('Web getPostToken: $token'); + return token; + } else { + return _secureStorage.read(key: postTokenKey); + } + } + + static Future getPreToken() async { + if (kIsWeb) { + final prefs = await SharedPreferences.getInstance(); + final token = prefs.getString(preTokenKey); + print('Web getPreToken: $token'); + return token; + } else { + return _secureStorage.read(key: preTokenKey); + } + } + + static Future clearTokens() async { + if (kIsWeb) { + final prefs = await SharedPreferences.getInstance(); + await prefs.remove(postTokenKey); + await prefs.remove(preTokenKey); + } else { + await _secureStorage.delete(key: postTokenKey); + await _secureStorage.delete(key: preTokenKey); + } + } + + static Future hasValidToken() async { + print('hasToken123'); + final post = await getPostToken(); + final pre = await getPreToken(); + print('hasToken'); + print('postToken: $post, preToken: $pre'); + + return (post != null && post.isNotEmpty) || (pre != null && pre.isNotEmpty); + } + + Future checkLoginPin() async { + print('checkLoginPin'); + try { + final SharedPreferences prefs = await SharedPreferences.getInstance(); + final empMobileNo = prefs.getString('empMobileNo'); + final empEmailid = prefs.getString('empEmailid'); + print('empMobileNo $empMobileNo'); + print('empEmailid $empEmailid'); + + var params = {}; + if (empMobileNo != null && empMobileNo.isNotEmpty) { + params = {'mobile_number': empMobileNo}; + } else if (empEmailid != null && empEmailid.isNotEmpty) { + params = {'email_id': empEmailid}; + } + + print('params $params'); + + final response = await http.post( + Uri.parse(Environment.apiUrlEnrollment + 'checkMpin'), + body: json.encode(params), + headers: { + HttpHeaders.contentTypeHeader: 'application/json', + }, + ); + + if (response.statusCode == 200) { + Map data = json.decode(response.body); + + if (data['status'] == 'success') { + if (data['data'] != null) { + prefs.setString('mpinText', data['data']); + } + if (data['Mpin'] != null) { + prefs.setString('mpin', data['Mpin']); + } + if (data['is_biometric_enabled'] != null) { + prefs.setString('is_biometric_enabled', data['is_biometric_enabled']); + } + if (data['is_mpin_skipped'] != null) { + prefs.setString('is_mpin_skipped', data['is_mpin_skipped']); + return data['is_mpin_skipped'].toString(); + } + } + } else { + print('❌ API failed: ${response.statusCode}'); + return null; + } + } catch (e) { + print('❌ Error: $e'); + return null; + } + return null; + } + + Future logout(BuildContext context) async { + // if (isMobilePlatform()) { + final SharedPreferences prefs = await SharedPreferences.getInstance(); + + // Get the value of the mobile_number key + + String? mobileNumber = prefs.getString('empMobileNo'); + String? mailID = prefs.getString('empEmailid'); + final isMpinSkipped = await checkLoginPin(); + print('isMpinSkipped $isMpinSkipped'); + // bool? biometricStatus = prefs.getBool('biometricStatus') ?? false; + // int? skipStatus = prefs.getInt('skipStatus') ?? 1; + + // Clear all keys + await SessionManager().clear(); + // await prefs.clear(); + print('Local Storage Clear'); + + // html.window.localStorage.clear(); + // Re-set the mobile_number key + if (isMobilePlatform()) { + if (mobileNumber != null) { + await prefs.setString('empMobileNo', mobileNumber); + print('empMobileNo $mobileNumber'); + // await prefs.setBool('biometricStatus', biometricStatus!); + // await prefs.setInt('skipStatus', skipStatus!); + } + if (mailID != null) { + await prefs.setString('empEmailid', mailID); + print('empEmailid $mailID'); + // await prefs.setBool('biometricStatus', biometricStatus!); + // await prefs.setInt('skipStatus', skipStatus!); + } + if (isMpinSkipped != null) { + await prefs.setString('is_mpin_skipped', isMpinSkipped!); + print('isMpinSkipped $isMpinSkipped'); + } + if (isMpinSkipped != null && isMpinSkipped == '0') { + print('pinPage'); + // return; + context.go('/pinPage'); + } else { + print('login'); + context.go('/login'); + } + } else { + await prefs.clear(); + ToastHelper.showSuccessToast(context, 'logout'); + // Navigate to login page + context.go('/login'); + } + + + // } else { + // final prefs = await SharedPreferences.getInstance(); + // await prefs.clear(); + // Navigator.pushNamed(context, 'login'); + // } + } + +} + + + + diff --git a/lib/pages/service/data_manager.dart b/lib/pages/service/data_manager.dart new file mode 100644 index 0000000..3ae069f --- /dev/null +++ b/lib/pages/service/data_manager.dart @@ -0,0 +1,187 @@ +import 'package:flutter/foundation.dart'; +import '../postEnrollment/service/api_service.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class DataManager extends ChangeNotifier { + static final DataManager _instance = DataManager._internal(); + factory DataManager() => _instance; + DataManager._internal(); + + late ApiService _apiService; + + // === Advertisement === + List _advertisementImages = []; + bool _adsLoaded = false; + + // === Policies === + List _policyList = []; + bool _policyLoaded = false; + String? _empName; + int _prePolicyCount = 0; + + // === Self Employee Profile === + Map? _selfProfile; + Map? _accountManagerDetails; + bool _selfProfileLoaded = false; + + // Getters + List get advertisementImages => _advertisementImages; + bool get adsLoaded => _adsLoaded; + + List get policyList => _policyList; + bool get policyLoaded => _policyLoaded; + String? get empName => _empName; + int get prePolicyCount => _prePolicyCount; + + Map? get selfProfile => _selfProfile; + Map? get accountManagerDetails => _accountManagerDetails; + bool get selfProfileLoaded => _selfProfileLoaded; + + /// Inject ApiService (with context) once + void init(ApiService apiService) { + _apiService = apiService; + } + + /// Load Ads once + Future loadAdvertisementImages() async { + if (_adsLoaded) return; + + final response = await _apiService.getAdvertisementImageToApi(); + if (response['status'] == 'success') { + _advertisementImages = List.from(response['data']); + _adsLoaded = true; + notifyListeners(); + debugPrint("✅ Advertisement images loaded: $_advertisementImages"); + } + } + + /// Load Policies (first time or refresh) + Future loadPolicies({ + required String? clientId, + required String? empCode, + required String status, + required String? clientBranchId, + required String? mobileNo, + bool forceRefresh = false, + }) async { + if (clientId == null || empCode == null) return; // guard clause + + final response = await _apiService.getActiveAndInactivePolicyDetails( + clientId, + empCode, + status, + clientBranchId!, + mobileNo!, + ); + + if (response['status'] == 'success') { + _policyList = response['data']; + _empName = response['emp_name']; + _prePolicyCount = response['pre_policy_count'] ?? 0; + _policyLoaded = true; + notifyListeners(); + debugPrint("✅ Policy list loaded: $_policyList"); + } else { + debugPrint("❌ Failed to load policies: ${response['status']}"); + } + } + + /// Load Self Employee Profile (first time or refresh) + Future loadSelfEmployeeProfile({ + required String clientId, + required String empCode, + required String clientBranchId, + bool forceRefresh = false, + }) async { + if (_selfProfileLoaded && !forceRefresh) return; + + final response = await _apiService.getSelfEmployeeProfileDetails( + clientId, + empCode, + clientBranchId, + ); + + if (response['status'] == 'success' && response.containsKey('data')) { + _selfProfile = Map.from(response['data']); + _accountManagerDetails = + Map.from(response['AccountManagerDetails']); + _selfProfileLoaded = true; + + // Store selfEmpStatus in SharedPreferences + final prefs = await SharedPreferences.getInstance(); + if (_selfProfile?['emp_status'] != null) { + prefs.setString('selfEmpStatus', _selfProfile!['emp_status']); + } + + notifyListeners(); + debugPrint("✅ Self Employee Profile loaded: $_selfProfile"); + } else { + debugPrint("❌ Failed to load self profile: ${response['status']}"); + } + } + + /// Clear all cached data on logout + Future clearData() async { + _advertisementImages = []; + _adsLoaded = false; + + _policyList = []; + _policyLoaded = false; + _empName = null; + _prePolicyCount = 0; + + _selfProfile = null; + _accountManagerDetails = null; + _selfProfileLoaded = false; + + notifyListeners(); + } +} + + + +// import 'package:flutter/foundation.dart'; +// import '../postEnrollment/service/api_service.dart'; +// import 'package:flutter/material.dart'; +// +// class DataManager extends ChangeNotifier { +// static final DataManager _instance = DataManager._internal(); +// factory DataManager() => _instance; +// DataManager._internal(); +// +// late ApiService _apiService; +// +// List _advertisementImages = []; +// bool _isLoaded = false; +// +// List get advertisementImages => _advertisementImages; +// bool get isLoaded => _isLoaded; +// +// /// Inject ApiService (with context) once +// void init(ApiService apiService) { +// _apiService = apiService; +// } +// +// /// Load only once +// Future loadAdvertisementImages() async { +// if (_isLoaded) return; +// +// final response = await _apiService.getAdvertisementImageToApi(); +// if (response['status'] == 'success') { +// _advertisementImages = List.from(response['data']); +// debugPrint("✅ Advertisement images loaded: ${_advertisementImages}"); +// _isLoaded = true; +// notifyListeners(); +// } else { +// debugPrint("❌ Failed to load advertisement images: ${response['message']}"); +// } +// } +// +// /// Clear on logout +// Future clearData() async { +// _advertisementImages = []; +// _isLoaded = false; +// notifyListeners(); +// } +// } diff --git a/lib/pages/service/popup_helper.dart b/lib/pages/service/popup_helper.dart new file mode 100644 index 0000000..f5067d5 --- /dev/null +++ b/lib/pages/service/popup_helper.dart @@ -0,0 +1,209 @@ +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../../customAppBar/toastHelper.dart'; +import '../postEnrollment/service/api_service.dart'; + +class PopupHelper { + /// 🔹 Launch URL safely + static Future launchURL(String url, BuildContext context) async { + final uri = Uri.tryParse(url); + if (uri != null && await canLaunchUrl(uri)) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Could not launch URL')), + ); + } + } + + /// 🔹 Show redirect popup + static Future showRedirectPopup({ + required BuildContext context, + required ApiService apiService, + required String? empPrimaryId, + }) async { + String? wellnessURL; + String wellnessMessage = ''; + + // 🔹 Fetch link using API + final response = await apiService.getWellnessLink(empPrimaryId); + + if (response['status'] == 'success') { + wellnessURL = response['data']; + } else if (response['status'] == 'failed') { + wellnessMessage = response['message']; + } else { + wellnessMessage = '⚠️ Unknown response format'; + } + + final bool isMobile = MediaQuery.of(context).size.width < 600; + + // 🔹 If failed → show message dialog instead of redirect popup + if (response['status'] == 'failed') { + _showMessageDialog(context, wellnessMessage, isMobile); + return; + } + + // 🔹 Otherwise show redirect popup + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext dialogContext) { + final double dialogWidth = + isMobile ? MediaQuery.of(context).size.width * 0.85 : 400; + final double dialogHeight = + isMobile ? MediaQuery.of(context).size.height * 0.17 : 150; + + return Dialog( + insetPadding: EdgeInsets.symmetric(horizontal: isMobile ? 40 : 0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + backgroundColor: Colors.white, + child: Container( + width: dialogWidth, + height: dialogHeight, + padding: const EdgeInsets.all(20), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'You are being redirected out of this app. Click Proceed to Continue', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: isMobile ? 14 : 16, + fontWeight: FontWeight.w400, + color: const Color(0xFF777777), + ), + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: OutlinedButton( + onPressed: () => Navigator.pop(dialogContext), + style: OutlinedButton.styleFrom( + side: const BorderSide(color: Color(0xFFE26728)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + child: FittedBox( + fit: BoxFit.scaleDown, + child: Text( + 'Cancel', + style: GoogleFonts.poppins( + color: const Color(0xFFE26728), + fontSize: isMobile ? 14 : 16, + ), + ), + ), + ), + ), + const SizedBox(width: 15), + Expanded( + child: ElevatedButton( + onPressed: () { + Navigator.of(dialogContext).pop(); + if (wellnessURL != null) { + launchURL(wellnessURL, context); + } else { + ToastHelper.showInfoToast( + context, 'Invalid link or unavailable'); + } + }, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFFE26728), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + child: FittedBox( + fit: BoxFit.scaleDown, + child: Text( + 'Proceed', + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: isMobile ? 14 : 16, + ), + ), + ), + ), + ), + ], + ), + ], + ), + ), + ); + }, + ); + } + + /// 🔹 Message dialog (for "failed" API response) + static void _showMessageDialog( + BuildContext context, String message, bool isMobile) { + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext dialogContext) { + final double dialogWidth = + isMobile ? MediaQuery.of(context).size.width * 0.8 : 400; + final double dialogHeight = + isMobile ? MediaQuery.of(context).size.height * 0.15 : 130; + + return Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + backgroundColor: Colors.white, + child: Container( + width: dialogWidth, + height: dialogHeight, + padding: const EdgeInsets.all(20), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + message, + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: isMobile ? 14 : 16, + fontWeight: FontWeight.w400, + color: const Color(0xFF444444), + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: ElevatedButton( + onPressed: () => Navigator.of(dialogContext).pop(), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFFE26728), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + padding: const EdgeInsets.symmetric( + vertical: 10, horizontal: 30), + ), + child: Text( + 'OK', + style: GoogleFonts.poppins( + color: Colors.white, + fontSize: isMobile ? 14 : 16, + ), + ), + ), + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/pages/session/SetPinBiometric.dart b/lib/pages/session/SetPinBiometric.dart index 4e91093..298ad80 100755 --- a/lib/pages/session/SetPinBiometric.dart +++ b/lib/pages/session/SetPinBiometric.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -11,6 +12,8 @@ import 'package:shared_preferences/shared_preferences.dart'; import '../../customAppBar/responsive.dart'; import '../../models/environment.dart'; import '../postEnrollment/service/svg_service.dart'; +import '../service/SessionManager.dart'; +import '../service/TokenService.dart'; import 'authenticationService.dart'; class pinPage extends StatefulWidget { @@ -47,6 +50,7 @@ class _pinPageState extends State { dynamic bioMetricMpin; dynamic biometricStatus; dynamic isMpinSkippedStatus; + late SessionManager session; @override void initState() { @@ -62,7 +66,65 @@ class _pinPageState extends State { super.dispose(); } + Future checkLoginPin(BuildContext context) async { + print('checkLoginPin'); + try { + final SharedPreferences prefs = await SharedPreferences.getInstance(); + empMobileNo = prefs.getString('empMobileNo'); + empEmailid = prefs.getString('empEmailid'); + print('empMobileNo $empMobileNo'); + print('empEmailid $empEmailid'); + // _preToken = prefs.getString('token'); + var params = {}; + if (empMobileNo != null && empMobileNo.isNotEmpty) { + params = {'mobile_number': empMobileNo}; + } else if (empEmailid != null && empEmailid.isNotEmpty) { + params = {'email_id': empEmailid}; + } + + final response = await http.post( + Uri.parse(Environment.apiUrlEnrollment + 'checkMpin'), + body: json.encode(params), + headers: { + HttpHeaders.contentTypeHeader: 'application/json', + }, + ); + + if (response.statusCode == 200) { + print('checkLoginPin response'); + Map data = json.decode(response.body); + if (data['status'] == 'success') { + print('checkLoginPin success'); + if (data['data'] != null) { + prefs.setString('mpinText', data['data']); + } + + if (data['Mpin'] != null) { + prefs.setString('mpin', data['Mpin']); + } + + if (data['is_biometric_enabled'] != null) { + prefs.setString( + 'is_biometric_enabled', data['is_biometric_enabled']); + } + + if (data['is_mpin_skipped'] != null) { + prefs.setString('is_mpin_skipped', data['is_mpin_skipped']); + } + } + } else { + print('checkLoginPin Something went wrong'); + ToastHelper.showErrorToast(context, 'Something went wrong'); + throw Exception('Failed to verify pin number'); + } + } catch (e) { + ToastHelper.showErrorToast(context, 'Something went wrong'); + print('Error: $e'); + } + } + Future _checkBiometricAuthentication() async { + await checkLoginPin(context); final SharedPreferences prefs = await SharedPreferences.getInstance(); bioMetricMpin = prefs.getString('mpin'); biometricStatus = prefs.getString('is_biometric_enabled'); @@ -124,6 +186,10 @@ class _pinPageState extends State { _postToken = post['data']; String postStatus = post['status']; + // Save tokens + await TokenService.saveTokens(preToken: _token, postToken: _postToken); + print('Tokens saved → preToken: $_token, postToken: $_postToken'); + if (postStatus == 'success') { postSuccessData(post, data); } else if (status == 'success') { @@ -147,24 +213,27 @@ class _pinPageState extends State { String postStatus = post['status']; if (postStatus == 'success') { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('_postToken', post['data']); + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('_postToken', post['data']); + await SessionManager().initializeFromPostToken(post['data']); + + session = await SessionManager(); // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(post['data']); - print('postdecodedToken : $decodedToken'); - empClientBranchId = decodedToken['client_branch_id']; - prefs.setString('empClientBranchId', empClientBranchId); - empCodeString = decodedToken['emp_code'].toString(); - prefs.setString('empCode', empCodeString); - empPrimaryId = decodedToken['id']; - prefs.setString('empPrimaryId', empPrimaryId); - gpaEmpName = decodedToken['name'].toString(); - prefs.setString('gpaEmpName', gpaEmpName); - client_id = decodedToken['client_id']; - prefs.setString('client_id', client_id); - emp_status = decodedToken['emp_status']; - prefs.setString('emp_status', emp_status); + // Map? decodedToken = Jwt.parseJwt(post['data']); + // print('postdecodedToken : $decodedToken'); + // empClientBranchId = decodedToken['client_branch_id']; + // prefs.setString('empClientBranchId', empClientBranchId); + // empCodeString = decodedToken['emp_code'].toString(); + // prefs.setString('empCode', empCodeString); + // empPrimaryId = decodedToken['id']; + // prefs.setString('empPrimaryId', empPrimaryId); + // gpaEmpName = decodedToken['name'].toString(); + // prefs.setString('gpaEmpName', gpaEmpName); + // client_id = decodedToken['client_id']; + // prefs.setString('client_id', client_id); + // emp_status = decodedToken['emp_status']; + // prefs.setString('emp_status', emp_status); // getClientLogoAndDetails(); print('Successfully Login'); @@ -173,36 +242,41 @@ class _pinPageState extends State { } if (status == 'success') { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('enrollToken', data['data']); - - // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(data['data']); - print('enrolldecodedToken : $decodedToken'); - enrollmentEmpClientBranchId = decodedToken['client_branch_id']; - prefs.setString( - 'enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); - enrollmentEmpCodeString = decodedToken['emp_code'].toString(); - prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); - enrollmentEmpPrimaryId = decodedToken['id']; - prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); - enrollmentGpaEmpName = decodedToken['name'].toString(); - prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); - enrollmentClient_id = decodedToken['client_id']; - prefs.setString('enrollmentClient_id', enrollmentClient_id); - enrollmentEmp_status = decodedToken['emp_status']; - prefs.setString('enrollmentEmp_status', enrollmentEmp_status); + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('enrollToken', data['data']); + await SessionManager().initializeFromPreToken(data['data']); + // // Decode the JWT token received from the API response + // Map? decodedToken = Jwt.parseJwt(data['data']); + // print('enrolldecodedToken : $decodedToken'); + // enrollmentEmpClientBranchId = decodedToken['client_branch_id']; + // prefs.setString( + // 'enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); + // enrollmentEmpCodeString = decodedToken['emp_code'].toString(); + // prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); + // enrollmentEmpPrimaryId = decodedToken['id']; + // prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); + // enrollmentGpaEmpName = decodedToken['name'].toString(); + // prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); + // enrollmentClient_id = decodedToken['client_id']; + // prefs.setString('enrollmentClient_id', enrollmentClient_id); + // enrollmentEmp_status = decodedToken['emp_status']; + // prefs.setString('enrollmentEmp_status', enrollmentEmp_status); getClientLogoAndDetails(); } - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final token = prefs.getString('_postToken'); - print(token); - if (token != null && token.isNotEmpty) { + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + + print(_postToken); + if (_postToken != null && _postToken.isNotEmpty) { ToastHelper.showSuccessToast(context, 'Successfully Login'); // if (enrollmentEmp_status == 'enrolled' || // enrollmentEmp_status == 'active') { - Navigator.pushReplacementNamed(context, 'home'); + print('Token12345: ${await TokenService.getPostToken()}'); + print('Token00000'); + // if (context.mounted) { + context.go('/home'); + // } + // Navigator.pushReplacementNamed(context, 'home'); // } else { // Navigator.pushReplacementNamed(context, 'empDetails'); // } @@ -210,37 +284,39 @@ class _pinPageState extends State { } void enrollmentSuccessData(data) async { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('enrollToken', data['data']); + await SessionManager().initializeFromPreToken(data['data']); + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('enrollToken', data['data']); - // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(data['data']); - print('decodedToken : $decodedToken'); - enrollmentEmpClientBranchId = decodedToken['client_branch_id']; - prefs.setString('enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); - enrollmentEmpCodeString = decodedToken['emp_code'].toString(); - prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); - enrollmentEmpPrimaryId = decodedToken['id']; - prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); - enrollmentGpaEmpName = decodedToken['name'].toString(); - prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); - enrollmentClient_id = decodedToken['client_id']; - prefs.setString('enrollmentClient_id', enrollmentClient_id); - enrollmentEmp_status = decodedToken['emp_status']; - prefs.setString('enrollmentEmp_status', enrollmentEmp_status); + // // Decode the JWT token received from the API response + // Map? decodedToken = Jwt.parseJwt(data['data']); + // print('decodedToken : $decodedToken'); + // enrollmentEmpClientBranchId = decodedToken['client_branch_id']; + // prefs.setString('enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); + // enrollmentEmpCodeString = decodedToken['emp_code'].toString(); + // prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); + // enrollmentEmpPrimaryId = decodedToken['id']; + // prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); + // enrollmentGpaEmpName = decodedToken['name'].toString(); + // prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); + // enrollmentClient_id = decodedToken['client_id']; + // prefs.setString('enrollmentClient_id', enrollmentClient_id); + // enrollmentEmp_status = decodedToken['emp_status']; + // prefs.setString('enrollmentEmp_status', enrollmentEmp_status); getClientLogoAndDetails(); print('Successfully Login'); // Redirect to another page - final token = prefs.getString('enrollToken'); + final token = await TokenService.getPreToken(); if (token != null && token.isNotEmpty) { ToastHelper.showSuccessToast(context, 'Successfully Login'); // if (enrollmentEmp_status == 'enrolled' || // enrollmentEmp_status == 'active') { // Navigator.pushReplacementNamed(context, 'home'); // } else { - Navigator.pushReplacementNamed(context, 'empDetails'); + context.go('/empDetails'); + // Navigator.pushReplacementNamed(context, 'empDetails'); // } } } @@ -298,7 +374,10 @@ class _pinPageState extends State { if (data['status'] == 'success') { final prefs = await SharedPreferences.getInstance(); await prefs.clear(); - Navigator.pushNamed(context, 'login'); + await SessionManager().clear(); + // await SessionManager().mobileSessionClear(); + context.go('/login'); + // Navigator.pushNamed(context, 'login'); // print('data'); // prefs.setString('mpinText', data['data']); // prefs.setString('mpin', data['Mpin']); @@ -322,8 +401,9 @@ class _pinPageState extends State { Future getClientLogoAndDetails() async { + session = await SessionManager(); var url = Uri.parse(Environment.apiUrlEnrollment + - 'getClientDetails?client_id=$enrollmentClient_id&emp_code=$enrollmentEmpCodeString'); + 'getClientDetails?post_client_id=${session.client_id}&post_branch_id=${session.empClientBranchId}&pre_client_id=${session.enrollmentClient_id}&pre_branch_id=${session.enrollmentEmpClientBranchId}'); try { var response = await http.get( url, diff --git a/lib/pages/session/changePin.dart b/lib/pages/session/changePin.dart index 6ac64de..5274847 100755 --- a/lib/pages/session/changePin.dart +++ b/lib/pages/session/changePin.dart @@ -1,9 +1,11 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; +import 'package:nhance_app_pwa/pages/service/TokenService.dart'; import 'package:pinput/pinput.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../customAppBar/responsive.dart'; @@ -41,6 +43,8 @@ class _changePinState extends State { final SharedPreferences prefs = await SharedPreferences.getInstance(); empMobileNo = prefs.getString('empMobileNo'); empEmailid = prefs.getString('empEmailid'); + print('empMobileNo: $empMobileNo'); + print('empEmailid: $empEmailid'); } @override @@ -52,9 +56,10 @@ class _changePinState extends State { try { if (_formKey.currentState!.validate()) { final SharedPreferences prefs = await SharedPreferences.getInstance(); - _token = prefs.getString('_postToken'); - empMobileNo = prefs.getString('empMobileNo'); - empEmailid = prefs.getString('empEmailid'); + _token = await TokenService.getPostToken(); + print(_token); + // empMobileNo = prefs.getString('empMobileNo'); + // empEmailid = 'surendar.m@venbainfotech.com'; var params = {}; if (empMobileNo != null && empMobileNo.isNotEmpty) { params = {'mobile_number': empMobileNo, @@ -75,20 +80,22 @@ class _changePinState extends State { 'Authorization': 'Bearer $_token', }, ); - + print('response $response'); if (response.statusCode == 200) { Map data = json.decode(response.body); bool pinVerification = data['data']['mpin_verification']; String message = data['data']['message']; if (pinVerification) { ToastHelper.showSuccessToast(context, message); - Navigator.pushReplacementNamed(context, 'profile'); + context.go('/profile'); } else { ToastHelper.showErrorToast(context, message); print('Invalid Pin Number'); } } else { - ToastHelper.showErrorToast(context, 'Something went wrong'); + Map data = json.decode(response.body); + String message = data['data']['message']; + ToastHelper.showErrorToast(context, message); throw Exception('Failed to verify mobile number'); } } diff --git a/lib/pages/session/settingUpPinAndBiometric.dart b/lib/pages/session/settingUpPinAndBiometric.dart index 834ed3e..5876596 100755 --- a/lib/pages/session/settingUpPinAndBiometric.dart +++ b/lib/pages/session/settingUpPinAndBiometric.dart @@ -1,15 +1,18 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:nhance_app_pwa/pages/service/TokenService.dart'; import 'package:pinput/pinput.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../customAppBar/responsive.dart'; import '../../customAppBar/toastHelper.dart'; import '../../models/environment.dart'; import '../postEnrollment/service/svg_service.dart'; +import '../service/SessionManager.dart'; import 'authenticationService.dart'; class pinSettingPage extends StatefulWidget { @@ -31,6 +34,7 @@ class _pinSettingPageState extends State { dynamic enrollToken; dynamic _postToken; dynamic emp_status; + final session = SessionManager(); @override void initState() { @@ -46,17 +50,22 @@ class _pinSettingPageState extends State { Future setLoginPin(skipOrNot) async { try { + print('setLoginPin'); // ✅ Only validate if not skipping if (skipOrNot != 1 && !_formKey.currentState!.validate()) { return; } + // if (_formKey.currentState!.validate()) { final SharedPreferences prefs = await SharedPreferences.getInstance(); empMobileNo = prefs.getString('empMobileNo'); empEmailid = prefs.getString('empEmailid'); - emp_status = prefs.getString('emp_status'); - enrollToken = prefs.getString('enrollToken'); - _postToken = prefs.getString('_postToken'); + print('setLoginPin112233 $skipOrNot'); + prefs.setString('is_mpin_skipped', skipOrNot.toString()); + print('setLoginPin112233'); + emp_status = session.emp_status; + enrollToken = await TokenService.getPreToken(); + _postToken = await TokenService.getPostToken(); String pin = _pinController.text; await _authService.savePin(pin); // await _authService.saveSkipStatus(0); @@ -122,9 +131,11 @@ class _pinSettingPageState extends State { await _authService.authenticateWithBiometrics(); if (biometricEnabled) { if (_postToken != null && _postToken.isNotEmpty) { - Navigator.pushReplacementNamed(context, 'home'); + context.go('/home'); + // Navigator.pushReplacementNamed(context, 'home'); } else { - Navigator.pushReplacementNamed(context, 'empDetails'); + context.go('/empDetails'); + // Navigator.pushReplacementNamed(context, 'empDetails'); } } else { ToastHelper.showErrorToast( @@ -132,9 +143,11 @@ class _pinSettingPageState extends State { } } else { if (_postToken != null && _postToken.isNotEmpty) { - Navigator.pushReplacementNamed(context, 'home'); + context.go('/home'); + // Navigator.pushReplacementNamed(context, 'home'); } else { - Navigator.pushReplacementNamed(context, 'empDetails'); + context.go('/empDetails'); + // Navigator.pushReplacementNamed(context, 'empDetails'); } } } else { @@ -182,9 +195,11 @@ class _pinSettingPageState extends State { await _authService.saveSkipStatus(0); if (_postToken != null && _postToken.isNotEmpty) { - Navigator.pushReplacementNamed(context, 'home'); + context.go('/home'); + // Navigator.pushReplacementNamed(context, 'home'); } else { - Navigator.pushReplacementNamed(context, 'empDetails'); + context.go('/empDetails'); + // Navigator.pushReplacementNamed(context, 'empDetails'); } } diff --git a/lib/pages/verify.dart b/lib/pages/verify.dart index 6be83eb..e042c5a 100755 --- a/lib/pages/verify.dart +++ b/lib/pages/verify.dart @@ -2,8 +2,11 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; +import 'package:nhance_app_pwa/pages/service/SessionManager.dart'; +import 'package:nhance_app_pwa/pages/service/TokenService.dart'; import 'package:pinput/pinput.dart'; import 'dart:async'; import 'package:flutter/gestures.dart'; @@ -66,12 +69,13 @@ class _MyVerifyState extends State { dynamic client_id; dynamic emp_status; - dynamic _token; + dynamic _preToken; dynamic _postToken; dynamic clientName; dynamic clientLogo; - dynamic fCMToken; + String? fcmToken; + String? apnsToken; late String verificationId; late String mobileNumber; final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; @@ -79,6 +83,7 @@ class _MyVerifyState extends State { bool _isLoading = false; dynamic empMobileNo; dynamic empEmailid; + late SessionManager session; late String _verificationId; @@ -94,7 +99,8 @@ class _MyVerifyState extends State { print('Received mobileNumber: $mobileNumber'); if (verificationId.isEmpty) { // Handle the case where verificationId is not provided - Navigator.pop(context); + // Navigator.pop(context); + context.pop(); } startTimer(); // Equivalent to componentDidMount @@ -117,59 +123,72 @@ class _MyVerifyState extends State { super.dispose(); } + Future initNotification() async { try { - // await _firebaseMessaging.requestPermission(); - fCMToken = await FirebaseMessaging.instance.getToken(); - print('Token : $fCMToken'); + // Request permission + NotificationSettings settings = + await _firebaseMessaging.requestPermission( + alert: true, + badge: true, + sound: true, + ); + print('🔔 Permission: ${settings.authorizationStatus}'); - if (fCMToken != null) { - await sendDeviceToken(fCMToken); + if (Platform.isIOS || Platform.isMacOS) { + // Get APNS token + apnsToken = await _firebaseMessaging.getAPNSToken(); + print('📱 APNS Token (iOS): $apnsToken'); - // Automatically copy to clipboard - // Clipboard.setData(ClipboardData(text: token)); + // Retry if null + if (apnsToken == null) { + await Future.delayed(const Duration(seconds: 3)); + apnsToken = await _firebaseMessaging.getAPNSToken(); + print('🔁 Retried APNS Token: $apnsToken'); + } - // Show token in Alert Dialog - // if (context.mounted) { - // showDialog( - // context: context, - // builder: (context) { - // return AlertDialog( - // title: Text("FCM Token"), - // content: Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // SelectableText(token), // Allows manual selection - // SizedBox(height: 10), - // Text( - // "Token copied to clipboard ✅", - // style: TextStyle(color: Colors.green), - // ), - // ], - // ), - // actions: [ - // TextButton( - // onPressed: () => Navigator.pop(context), - // child: Text("OK"), - // ), - // ], - // ); - // }, - // ); - // } + if (apnsToken != null) { + await sendDeviceToken(apnsToken!); + } + } else if (Platform.isAndroid) { + // Get FCM token + fcmToken = await _firebaseMessaging.getToken(); + print('🔥 FCM Token (Android): $fcmToken'); + + if (fcmToken != null) { + await sendDeviceToken(fcmToken!); + } } - } catch (e) { - print("Error getting FCM Token: $e"); - } - // await _firebaseMessaging.requestPermission(); - // fCMToken = await _firebaseMessaging.getToken(); - // fCMToken = await FirebaseMessaging.instance.getToken(); - // print('Token : $fCMToken'); - // sendDeviceToken(fCMToken); - // FirebaseMessaging.onBackgroundMessage(handleBackgroundMessage); + // Background handler + FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); + + // Foreground listener + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + print('💬 Message: ${message.notification?.title}'); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(message.notification?.title ?? 'New Notification')), + ); + }); + } catch (e) { + print('❌ Notification init error: $e'); + } } + // Future initNotification() async { + // try { + // // await _firebaseMessaging.requestPermission(); + // fCMToken = await FirebaseMessaging.instance.getToken(); + // print('Token : $fCMToken'); + // + // if (fCMToken != null) { + // await sendDeviceToken(fCMToken); + // } + // } catch (e) { + // print("Error getting FCM Token: $e"); + // } + // } + // Future handleBackgroundMessage(RemoteMessage message) async { // print('Title ${message.notification?.title}'); // print('Body ${message.notification?.body}'); @@ -186,7 +205,7 @@ class _MyVerifyState extends State { .encode({'mobile': mobileNumber, 'firebase_token': deviceToken}), headers: { HttpHeaders.contentTypeHeader: 'application/json', - 'Authorization': 'Bearer $_token', + 'Authorization': 'Bearer $_preToken', }, ); @@ -241,14 +260,30 @@ class _MyVerifyState extends State { }); Map data = json.decode(response.body); print('data: $data'); - _token = data['data']; + + // --- Extract tokens safely --- + String? preToken; + if (data['data'] is String) { + preToken = data['data']; + } + + String? postToken; + if (data['post_enrollment'] != null && data['post_enrollment']['data'] is String) { + postToken = data['post_enrollment']['data']; + } + + // Save tokens + await TokenService.saveTokens(preToken: preToken, postToken: postToken); + print('Tokens saved → preToken: $preToken, postToken: $postToken'); + + _preToken = preToken; String status = data['status']; // Directly access the post_enrollment data Map post = data['post_enrollment']; print('post: $post'); - _postToken = post['data']; + _postToken = postToken; String postStatus = post['status']; if (postStatus == 'success') { @@ -294,11 +329,11 @@ class _MyVerifyState extends State { } void loginUser({ - required String gpaEmpName, - required String empPrimaryId, - required String empCodeString, - required String client_id, - required String empClientBranchId, + required dynamic gpaEmpName, + required dynamic empPrimaryId, + required dynamic empCodeString, + required dynamic client_id, + required dynamic empClientBranchId, }) { HtmlHelper.saveLoginData({ 'gpaEmpName': gpaEmpName, @@ -307,7 +342,6 @@ class _MyVerifyState extends State { 'client_id': client_id, 'empClientBranchId': empClientBranchId, }); - print('Successfully Login'); } @@ -316,32 +350,34 @@ class _MyVerifyState extends State { String postStatus = post['status']; if (postStatus == 'success') { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('_postToken', post['data']); + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('_postToken', post['data']); - // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(post['data']); - print('decodedToken : $decodedToken'); - empClientBranchId = decodedToken['client_branch_id']; - prefs.setString('empClientBranchId', empClientBranchId); - empCodeString = decodedToken['emp_code'].toString(); - prefs.setString('empCode', empCodeString); - empPrimaryId = decodedToken['id']; - prefs.setString('empPrimaryId', empPrimaryId); - gpaEmpName = decodedToken['name'].toString(); - prefs.setString('gpaEmpName', gpaEmpName); - client_id = decodedToken['client_id']; - prefs.setString('client_id', client_id); - emp_status = decodedToken['emp_status']; - prefs.setString('emp_status', emp_status); + await SessionManager().initializeFromPostToken(post['data']); + session = await SessionManager(); + // // Decode the JWT token received from the API response + // Map? decodedToken = Jwt.parseJwt(post['data']); + // print('decodedToken : $decodedToken'); + // empClientBranchId = decodedToken['client_branch_id']; + // prefs.setString('empClientBranchId', empClientBranchId); + // empCodeString = decodedToken['emp_code'].toString(); + // prefs.setString('empCode', empCodeString); + // empPrimaryId = decodedToken['id']; + // prefs.setString('empPrimaryId', empPrimaryId); + // gpaEmpName = decodedToken['name'].toString(); + // prefs.setString('gpaEmpName', gpaEmpName); + // client_id = decodedToken['client_id']; + // prefs.setString('client_id', client_id); + // emp_status = decodedToken['emp_status']; + // prefs.setString('emp_status', emp_status); // getClientLogoAndDetails(); loginUser( - gpaEmpName: gpaEmpName, - empPrimaryId: empPrimaryId, - empCodeString: empCodeString, - client_id: client_id, - empClientBranchId: empClientBranchId, + gpaEmpName: session.gpaEmpName, + empPrimaryId: session.empPrimaryId, + empCodeString: session.empCodeString, + client_id: session.client_id, + empClientBranchId: session.empClientBranchId, ); // if (kIsWeb) { @@ -366,33 +402,33 @@ class _MyVerifyState extends State { } if (status == 'success') { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('enrollToken', data['data']); - - // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(data['data']); - print('decodedToken : $decodedToken'); - enrollmentEmpClientBranchId = decodedToken['client_branch_id']; - prefs.setString( - 'enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); - enrollmentEmpCodeString = decodedToken['emp_code'].toString(); - prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); - enrollmentEmpPrimaryId = decodedToken['id']; - prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); - enrollmentGpaEmpName = decodedToken['name'].toString(); - prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); - enrollmentClient_id = decodedToken['client_id']; - prefs.setString('enrollmentClient_id', enrollmentClient_id); - enrollmentEmp_status = decodedToken['emp_status']; - prefs.setString('enrollmentEmp_status', enrollmentEmp_status); + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('enrollToken', data['data']); + await SessionManager().initializeFromPreToken(data['data']); + // // Decode the JWT token received from the API response + // Map? decodedToken = Jwt.parseJwt(data['data']); + // print('decodedToken : $decodedToken'); + // enrollmentEmpClientBranchId = decodedToken['client_branch_id']; + // prefs.setString( + // 'enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); + // enrollmentEmpCodeString = decodedToken['emp_code'].toString(); + // prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); + // enrollmentEmpPrimaryId = decodedToken['id']; + // prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); + // enrollmentGpaEmpName = decodedToken['name'].toString(); + // prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); + // enrollmentClient_id = decodedToken['client_id']; + // prefs.setString('enrollmentClient_id', enrollmentClient_id); + // enrollmentEmp_status = decodedToken['emp_status']; + // prefs.setString('enrollmentEmp_status', enrollmentEmp_status); getClientLogoAndDetails(); } - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final _postToken = prefs.getString('_postToken'); + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // final _postToken = prefs.getString('_postToken'); // int skipStatus = prefs.getInt('skipStatus') ?? 1; // final mpinText = prefs.getString('mpinText'); - print(isMobilePlatform()); + // print(isMobilePlatform()); if (isMobilePlatform()) { // if (prefs.containsKey('mpin') && mpinText == 'Mpin - exist') { if (_postToken != null && _postToken.isNotEmpty) { @@ -406,7 +442,8 @@ class _MyVerifyState extends State { if (_postToken != null && _postToken.isNotEmpty) { ToastHelper.showSuccessToast(context, 'Successfully Login'); // if (emp_status == 'enrolled' || emp_status == 'active') { - Navigator.pushReplacementNamed(context, 'home'); + context.go('/home'); + // Navigator.pushReplacementNamed(context, 'home'); // } else { // Navigator.pushReplacementNamed(context, 'empDetails'); // } @@ -415,36 +452,38 @@ class _MyVerifyState extends State { } void enrollmentSuccessData(data) async { - final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString('enrollToken', data['data']); + // final SharedPreferences prefs = await SharedPreferences.getInstance(); + // prefs.setString('enrollToken', data['data']); - // Decode the JWT token received from the API response - Map? decodedToken = Jwt.parseJwt(data['data']); - print('decodedToken : $decodedToken'); - enrollmentEmpClientBranchId = decodedToken['client_branch_id']; - prefs.setString('enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); - enrollmentEmpCodeString = decodedToken['emp_code'].toString(); - prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); - enrollmentEmpPrimaryId = decodedToken['id']; - prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); - enrollmentGpaEmpName = decodedToken['name'].toString(); - prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); - enrollmentClient_id = decodedToken['client_id']; - prefs.setString('enrollmentClient_id', enrollmentClient_id); - enrollmentEmp_status = decodedToken['emp_status']; - prefs.setString('enrollmentEmp_status', enrollmentEmp_status); + await SessionManager().initializeFromPreToken(data['data']); + + // // Decode the JWT token received from the API response + // Map? decodedToken = Jwt.parseJwt(data['data']); + // print('decodedToken : $decodedToken'); + // enrollmentEmpClientBranchId = decodedToken['client_branch_id']; + // prefs.setString('enrollmentEmpClientBranchId', enrollmentEmpClientBranchId); + // enrollmentEmpCodeString = decodedToken['emp_code'].toString(); + // prefs.setString('enrollmentEmpCodeString', enrollmentEmpCodeString); + // enrollmentEmpPrimaryId = decodedToken['id']; + // prefs.setString('enrollmentEmpPrimaryId', enrollmentEmpPrimaryId); + // enrollmentGpaEmpName = decodedToken['name'].toString(); + // prefs.setString('enrollmentGpaEmpName', enrollmentGpaEmpName); + // enrollmentClient_id = decodedToken['client_id']; + // prefs.setString('enrollmentClient_id', enrollmentClient_id); + // enrollmentEmp_status = decodedToken['emp_status']; + // prefs.setString('enrollmentEmp_status', enrollmentEmp_status); getClientLogoAndDetails(); print('Successfully Login'); // Redirect to another page - final enrollToken = prefs.getString('enrollToken'); + // final enrollToken = prefs.getString('enrollToken'); // int skipStatus = prefs.getInt('skipStatus') ?? 1; // final mpinText = prefs.getString('mpinText'); print(isMobilePlatform()); if (isMobilePlatform()) { // if (prefs.containsKey('mpin') && mpinText == 'Mpin - exist') { - if (enrollToken != null && enrollToken.isNotEmpty) { + if (_preToken != null && _preToken.isNotEmpty) { final SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString('empMobileNo', widget.mobileNumber); await initNotification(); @@ -452,12 +491,13 @@ class _MyVerifyState extends State { } // } } else { - if (enrollToken != null && enrollToken.isNotEmpty) { + if (_preToken != null && _preToken.isNotEmpty) { ToastHelper.showSuccessToast(context, 'Successfully Login'); // if (emp_status == 'enrolled' || emp_status == 'active') { // Navigator.pushReplacementNamed(context, 'home'); // } else { - Navigator.pushReplacementNamed(context, 'empDetails'); + context.go('/empDetails'); + // Navigator.pushReplacementNamed(context, 'empDetails'); // } } } @@ -567,7 +607,7 @@ class _MyVerifyState extends State { empEmailid = prefs.getString('empEmailid'); print('empMobileNo $empMobileNo'); print('empEmailid $empEmailid'); - // _token = prefs.getString('token'); + // _preToken = prefs.getString('token'); var params = {}; if (empMobileNo != null && empMobileNo.isNotEmpty) { params = {'mobile_number': empMobileNo}; @@ -584,7 +624,7 @@ class _MyVerifyState extends State { ); if (response.statusCode == 200) { - print('checkLoginPin response'); + print('checkLoginPin $response'); Map data = json.decode(response.body); if (data['status'] == 'success') { print('checkLoginPin success'); @@ -605,19 +645,32 @@ class _MyVerifyState extends State { prefs.setString('is_mpin_skipped', data['is_mpin_skipped']); } - if (data['is_mpin_skipped'] != null && - data['is_mpin_skipped'] == '0') { - Navigator.pushReplacementNamed(context, 'pinPage'); + if (_postToken != null && _postToken.isNotEmpty) { + ToastHelper.showSuccessToast(context, 'Successfully Login'); + context.go('/home'); + // Navigator.pushReplacementNamed(context, 'home'); } else { - if (_postToken != null && _postToken.isNotEmpty) { - ToastHelper.showSuccessToast(context, 'Successfully Login'); - Navigator.pushReplacementNamed(context, 'home'); - } else { - Navigator.pushReplacementNamed(context, 'empDetails'); - } + context.go('/empDetails'); + // Navigator.pushReplacementNamed(context, 'empDetails'); } + + // if (data['is_mpin_skipped'] != null && + // data['is_mpin_skipped'] == '0') { + // context.go('/pinPage'); + // // Navigator.pushReplacementNamed(context, 'pinPage'); + // } else { + // if (_postToken != null && _postToken.isNotEmpty) { + // ToastHelper.showSuccessToast(context, 'Successfully Login'); + // context.go('/home'); + // // Navigator.pushReplacementNamed(context, 'home'); + // } else { + // context.go('/empDetails'); + // // Navigator.pushReplacementNamed(context, 'empDetails'); + // } + // } } else { - Navigator.pushReplacementNamed(context, 'pinSettingPage'); + context.go('/pinSettingPage'); + // Navigator.pushReplacementNamed(context, 'pinSettingPage'); } } else { print('checkLoginPin Something went wrong'); @@ -633,13 +686,14 @@ class _MyVerifyState extends State { Future getClientLogoAndDetails() async { print('getClientLogoAndDetails'); var url = Uri.parse(Environment.apiUrlEnrollment + - 'getClientDetails?client_id=$enrollmentClient_id&emp_code=$enrollmentEmpCodeString&client_branch_id=$enrollmentEmpClientBranchId'); + 'getClientDetails?client_id=${session.enrollmentClient_id}&emp_code=${session.enrollmentEmpCodeString}&client_branch_id=${ + session.enrollmentEmpClientBranchId}'); try { var response = await http.get( url, headers: { 'Authorization': - 'Bearer $_token', // Add token to the Authorization header + 'Bearer $_preToken', // Add token to the Authorization header }, ); if (response.statusCode == 200) { @@ -736,7 +790,8 @@ class _MyVerifyState extends State { return WillPopScope( onWillPop: () async { - Navigator.pushReplacementNamed(context, 'login'); + context.go('/login'); + // Navigator.pushReplacementNamed(context, 'login'); return false; }, child: Scaffold( @@ -792,10 +847,9 @@ class _MyVerifyState extends State { cursor: SystemMouseCursors.click, child: GestureDetector( onTap: () { - // Add your navigation logic here - // For example, you can use Navigator.push to navigate to another page - Navigator.pushNamed( - context, 'hrLogin'); + context.go('/hrLogin'); + // Navigator.pushNamed( + // context, 'hrLogin'); }, child: Row( mainAxisAlignment: MainAxisAlignment @@ -934,9 +988,9 @@ class _MyVerifyState extends State { recognizer: TapGestureRecognizer() ..onTap = () { - // Navigate to the page where the user can change the phone number - Navigator.pushNamed( - context, 'login'); + context.go('/login'); + // Navigator.pushNamed( + // context, 'login'); }, ), ], @@ -1221,4 +1275,13 @@ class _MyVerifyState extends State { )), ))); } +} + +// ✅ Must be outside any class — this fixes your error +@pragma('vm:entry-point') +Future firebaseMessagingBackgroundHandler(RemoteMessage message) async { + print('📨 Handling background message: ${message.messageId}'); + print('Title: ${message.notification?.title}'); + print('Body: ${message.notification?.body}'); + print('Data: ${message.data}'); } \ No newline at end of file diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 7299b5c..3ccd551 100755 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,12 +7,16 @@ #include "generated_plugin_registrant.h" #include +#include #include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 786ff5c..9ce94c4 100755 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_linux + flutter_secure_storage_linux url_launcher_linux ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 0c3e8b1..b4b39ca 100755 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -12,6 +12,7 @@ import firebase_auth import firebase_core import firebase_messaging import flutter_inappwebview_macos +import flutter_secure_storage_macos import google_sign_in_ios import local_auth_darwin import package_info_plus @@ -30,6 +31,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) diff --git a/pubspec.yaml b/pubspec.yaml index 6ac5390..17eaab6 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,8 +16,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -#version: 1.0.24+24 -version: 1.0.13+14 +#version: 1.0.27+27 +version: 1.0.18+19 environment: sdk: '>=3.3.3 <4.0.0' @@ -64,6 +64,8 @@ dependencies: file_picker: ^10.3.2 file_selector: ^1.0.3 universal_html: ^2.2.4 + go_router: ^16.2.2 + flutter_secure_storage: ^9.2.4 dev_dependencies: flutter_test: diff --git a/web/index.html b/web/index.html index 9a956a1..a5f832d 100755 --- a/web/index.html +++ b/web/index.html @@ -66,6 +66,21 @@ body.show-botman #botmanWidgetRoot { } +