Go router changes done and otp

This commit is contained in:
Surendiran 2025-10-17 09:53:04 +05:30
parent 6641314af0
commit 54aa875dcb
56 changed files with 7500 additions and 5195 deletions

12
.env
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,10 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>be.tramckrijte.workmanager.backgroundtask</string>
</array>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>be.tramckrijte.workmanager.backgroundtask</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
@ -26,15 +26,6 @@
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UIBackgroundModes</key>
<array>
<string>processing</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
@ -58,14 +49,23 @@
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>FirebaseAppDelegateProxyEnabled</key>
<false/>
<key>ITSEncryptionExportComplianceCode</key>
<false/>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>tel</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSFaceIDUsageDescription</key>
<string>We use Face ID to protect your data in the app.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app requires photo library access to let you select and upload photos.</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
@ -79,16 +79,10 @@
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UTExportedTypeDeclarations</key>
<array>

View File

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

View File

@ -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<CustomAppBar> {
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<CustomAppBar> {
});
}
Future<String?> 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<String, dynamic> 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<void> logout(BuildContext context) async {
// final prefs = await SharedPreferences.getInstance();
// final String? token = prefs.getString('token');
@ -52,35 +119,56 @@ class _CustomAppBarState extends State<CustomAppBar> {
// 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<CustomAppBar> {
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');
},
),
],

View File

@ -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<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState() {
super.initState();
_navigate();
}
Future<void> _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<String?> 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<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
@ -50,20 +136,16 @@ Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
}
Future<void> 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<void> 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<void> 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<String, dynamic>?;
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<String, dynamic>?;
// 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<String, dynamic>;
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<String, dynamic>?; // 👈 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<String, dynamic>?;
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<MyApp> createState() => _MyAppState();
}
// Lightweight splash screen to show during app startup
class SplashScreen extends StatelessWidget {
class _MyAppState extends State<MyApp> {
@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(),
// ),
// ],
// ),
// );
// }
// }

View File

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

View File

@ -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();
// });
// }
// }

View File

@ -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<String, dynamic>;
// 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<String, dynamic>;
// // 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(),
// // ),
// // ],
// // );
// // }
// // }
// //

View File

@ -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<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState() {
super.initState();
_navigate();
}
Future<void> _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),
),
);
}
}

View File

@ -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<MyEmailVerify> createState() => _MyEmailVerifyState();
@ -57,12 +58,13 @@ class _MyEmailVerifyState extends State<MyEmailVerify> {
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<MyEmailVerify> {
late String _verificationId;
dynamic empMobileNo;
dynamic empEmailid;
late SessionManager session;
@override
void initState() {
@ -86,30 +89,81 @@ class _MyEmailVerifyState extends State<MyEmailVerify> {
}
Future<void> 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<void> handleBackgroundMessage(RemoteMessage message) async {
print('Title ${message.notification?.title}');
print('Body ${message.notification?.body}');
print('Playload ${message.data}');
}
// Future<void> initNotification() async {
// await _firebaseMessaging.requestPermission();
// fCMToken = await _firebaseMessaging.getToken();
// print('Token : $fCMToken');
// sendDeviceToken(fCMToken);
// FirebaseMessaging.onBackgroundMessage(handleBackgroundMessage);
// }
//
// Future<void> handleBackgroundMessage(RemoteMessage message) async {
// print('Title ${message.notification?.title}');
// print('Body ${message.notification?.body}');
// print('Playload ${message.data}');
// }
void sendDeviceToken(deviceToken) async {
Future<void> 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<MyEmailVerify> {
void verifyOTP(String otp) async {
try {
print('EMAIL PARAMS : ${widget.email} - OTP : $otp');
// print('EMAIL PARAMS : ${widget.email} - OTP : $otp');
final Map<String, dynamic> 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<MyEmailVerify> {
});
Map<String, dynamic> 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<String, dynamic> 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<MyEmailVerify> {
}
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<MyEmailVerify> {
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<String, dynamic>? 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<String, dynamic>? 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<MyEmailVerify> {
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<String, dynamic>? 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<String, dynamic>? 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<MyEmailVerify> {
// 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<MyEmailVerify> {
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<String, dynamic>? 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<String, dynamic>? 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<MyEmailVerify> {
void _resendOTP() {
setState(() {
_otpController.text = '';
_secondsRemaining = 60;
_isTimerRunning = true;
});
@ -416,9 +520,17 @@ class _MyEmailVerifyState extends State<MyEmailVerify> {
Future<void> verifyMobileAndEmailNumber() async {
try {
// var enteredMobileNumber = mobileController.text;
final Map<String, dynamic> 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<MyEmailVerify> {
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<MyEmailVerify> {
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<MyEmailVerify> {
}
Future<void> 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<MyEmailVerify> {
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<MyEmailVerify> {
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<MyEmailVerify> {
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<MyEmailVerify> {
)),
)));
}
}
// Must be outside any class this fixes your error
@pragma('vm:entry-point')
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
print('📨 Handling background message: ${message.messageId}');
print('Title: ${message.notification?.title}');
print('Body: ${message.notification?.body}');
print('Data: ${message.data}');
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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<void> _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<Map<String, dynamic>> getClientLogoAndDetailsToApi(
@ -394,35 +391,35 @@ class ApiService {
//HR API STARTS
Future<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> getTrackClaimsList(
// String empMobileNo, String empCode) async {

View File

@ -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<login> {
}
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<login> {
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<login> {
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<login> {
}
}
Future<void> _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<void> _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<login> {
.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<login> {
.click,
child: GestureDetector(
onTap: () {
Navigator.pushNamed(
context,
'termsofuse');
context.go('/termsofuse');
// Navigator.pushNamed(
// context,
// 'termsofuse');
},
child: Text(
'terms of use',

View File

@ -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<ChatbotWebViewPage> {
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<ChatbotWebViewPage> {
..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<void> _launchInExternalBrowser(Uri url) async {
if (await canLaunchUrl(url)) {
await launchUrl(url, mode: LaunchMode.externalApplication);
@ -73,4 +95,4 @@ class _ChatbotWebViewPageState extends State<ChatbotWebViewPage> {
body: WebViewWidget(controller: _controller),
);
}
}
}

View File

@ -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<MyWebViewPage> {
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;
},
),
);
}
}

View File

@ -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<BotmanWidget> createState() => _BotmanWidgetState();
}
class _BotmanWidgetState extends State<BotmanWidget> {
late final WebViewController _controller;
@override
void initState() {
super.initState();
_controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..loadHtmlString(_htmlWithBotman);
}
void openBotman() {
_controller.runJavaScript("openBotmanFromFlutter();");
}
final String _htmlWithBotman = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
#botmanWidgetRoot {
display: none !important;
}
body.show-botman #botmanWidgetRoot {
display: block !important;
}
#botmanWidgetRoot > div {
bottom: 80px !important;
right: 10px !important;
z-index: 9999 !important;
min-width: 80px !important;
min-height: 100px !important;
}
.content {
width: 10%;
height: 10vh;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
}
</style>
<script src='https://cdn.jsdelivr.net/npm/botman-web-widget@0/build/js/widget.js'></script>
</head>
<body></body>
<script>
var emp_name = 'Kumar';
var uid = Math.floor(100000 + Math.random() * 900000);
console.log('CURRENT_USER: ' + uid);
const APIENDPOINT = 'https://venbait.in/nhance/dev';
const APIAPIENDPOINT = 'https://venbait.in/nhance/dev';
window.botmanWidget = {
chatServer: APIENDPOINT + '/chat',
frameEndpoint: APIAPIENDPOINT + '/widget',
title: "Ask ILA",
introMessage: "",
bubbleBackground: "#007bff",
mainColor: "#007bff",
placeholderText: "Type your message here...",
aboutText: "Insurance Assistant ILA",
enableAttachments: false,
parameters: {
employee_id: '12288',
session_id: "XYZ789",
origin: "mobile",
emp_code: "HTL-007",
client_id: 159,
client_branch_id: 125
}
};
// Function that Flutter will call
function openBotmanFromFlutter() {
let tryCount = 0;
const maxTries = 10;
const interval = setInterval(() => {
if (typeof botmanChatWidget !== "undefined" && botmanChatWidget.open) {
botmanChatWidget.open();
setTimeout(() => {
botmanChatWidget.sayAsBot('Hi ' + emp_name + ', This is ILA your Insurance Assistant. Please choose the following options.');
botmanChatWidget.whisper('Hi');
}, 2000);
clearInterval(interval);
} else {
tryCount++;
if (tryCount >= maxTries) {
console.error("❌ Botman widget not available after waiting.");
clearInterval(interval);
}
}
}, 500); // retry every 500ms
}
</script>
</html>
''';
@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),
),
)
],
);
}
}

View File

@ -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<ChatPage> createState() => _ChatPageState();
// }
//
// class _ChatPageState extends State<ChatPage> {
// 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<void> _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<void> _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<ChatPage> createState() => _ChatPageState();
// }
//
// class _ChatPageState extends State<ChatPage> {
// 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<void> _loadHtmlWithBase64Injection() async {
// String html = await rootBundle.loadString('assets/botman_chat.html');
//
// final sessionId = generateSessionId();
// final empName = widget.empName.replaceAll("'", "\\'");
// final injectedJS = '''
// <script>
// 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: '$empName'
// });
// </script>
// </body>
// </html>
// ''';
//
// html = html.replaceFirst('</body>\n</html>', injectedJS); // inject just before </body>
//
// 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<BotmanChatScreen> createState() => _BotmanChatScreenState();
}
class _BotmanChatScreenState extends State<BotmanChatScreen> {
late final WebViewController _controller;
String getInjectedHTML() {
final uid = Random().nextInt(900000) + 100000;
return '''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<style>
#botmanWidgetRoot svg {
display: none !important;
}
</style>
<script>
const APIENDPOINT = 'https://venbait.in/nhance/chatbot';
var emp_name = '${widget.empName}';
var uid = Math.floor(Math.random() * 900000) + 100000;
window.botmanWidget = {
chatServer: APIENDPOINT + '/chat',
frameEndpoint: APIENDPOINT + '/widget',
title: 'Nhance Insurance Assistant',
introMessage: 'Hai ',
bubbleBackground: '#007bff',
mainColor: '#007bff',
placeholderText: 'Type your message here...',
aboutText: 'Insurance Assistant ILA',
enableAttachments: false,
parameters: {
employee_id: '${widget.employeeId}',
session_id: '${widget.sessionId}',
origin: 'mobile',
emp_code: '${widget.empCode}',
client_id: '${widget.clientId}',
client_branch_id: '${widget.clientBranchId}'
},
};
document.addEventListener("DOMContentLoaded", function () {
if (typeof botmanChatWidget !== "undefined") {
botmanChatWidget.open();
}
});
setTimeout(() => {
if (typeof botmanChatWidget !== "undefined") {
botmanChatWidget.open();
}
}, 3000);
</script>
<script defer src="https://cdn.jsdelivr.net/npm/botman-web-widget@0/build/js/widget.js"></script>
// <script>
// const APIENDPOINT = 'https://venbait.in/nhance/dev';
// const APIAPIENDPOINT = 'https://venbait.in/nhance/dev';
//
// var emp_name = '${widget.empName}';
// var uid = ${uid};
// console.log('CURRENT_USER: ' + uid);
//
// window.botmanWidget = {
// chatServer: APIENDPOINT + '/chat',
// frameEndpoint: APIAPIENDPOINT + '/widget',
// title: 'Nhance Insurance Assistant',
// introMessage: 'Hai ',
// bubbleBackground: '#007bff',
// mainColor: '#007bff',
// placeholderText: 'Type your message here...',
// aboutText: 'Insurance Assistant ILA',
// enableAttachments: false,
// parameters: {
// employee_id: '${widget.employeeId}',
// session_id: '${widget.sessionId}',
// origin: 'mobile',
// emp_code: '${widget.empCode}',
// client_id: ${widget.clientId},
// client_branch_id: ${widget.clientBranchId}
// },
// };
//
//
// window.addEventListener("load", function () {
// if (typeof botmanChatWidget !== "undefined") {
// botmanChatWidget.open(); // 🔥 Force open
// }
// });
// </script>
// <script src="https://cdn.jsdelivr.net/npm/botman-web-widget@0/build/js/widget.js"></script>
</head>
<body></body>
</html>
''';
}
@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),
);
}
}

View File

@ -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<claimprocess> {
dynamic reimbursementHeading;
late Map<String, String> reimbursementContent;
late Map<String, String> reimbursementNotes;
final session = SessionManager();
@override
void initState() {
@ -54,28 +59,22 @@ class _claimprocessState extends State<claimprocess> {
Future<void> _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<String, dynamic>? 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<void> getCashlessAndReimbursement() async {
final response = await apiService.getCashlessAndReimbursementToApi();
print('check 1');
@ -123,7 +122,13 @@ class _claimprocessState extends State<claimprocess> {
@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<claimprocess> {
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<claimprocess> {
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<claimprocess> {
: 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<claimprocess> {
],
labels: [
"Home",
"Claim",
"Claims",
"Profile",
"Help",
"Wellness",
],
),
)
);
}
}

View File

@ -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<claims> createState() => _claimsState();
@ -50,6 +56,7 @@ class _claimsState extends State<claims> {
int? serviceId;
dynamic client_branch_id;
dynamic mobileNo;
final session = SessionManager();
List<DropdownMenuItem<int>> getDepartmentItems() {
return [
@ -77,33 +84,40 @@ class _claimsState extends State<claims> {
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<void> _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<claims> {
@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<claims> {
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<claims> {
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<claims> {
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<claims> {
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<claims> {
// 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<claims> {
],
labels: [
"Home",
"Claim",
"Claims",
"Profile",
"Help",
"Wellness",
],
initialIndex: 1, // Initial index of the bottom navigation bar
),
)
);
}
@ -739,8 +774,7 @@ class _claimsState extends State<claims> {
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,

View File

@ -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<ClaimHistoryPopup> {
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<ClaimHistoryPopup> {
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<ClaimHistoryPopup> {
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<ClaimHistoryPopup> {
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<ClaimHistoryPopup> {
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<ClaimHistoryPopup> {
],
),
),
)
);
}

View File

@ -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<String, String> type7Content;
final session = SessionManager();
@override
void initState() {
super.initState();
@ -75,28 +82,22 @@ class _generalExclusionsDeductiblesState
Future<void> _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<String, dynamic>? 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<void> 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",
],
),
)
);
}
}

View File

@ -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<help> {
List<dynamic> reversedTicketList = [];
List<dynamic> reversedClaimsClosedList = [];
List<dynamic> trackClaimsClosedList = [];
final Map<String, Color> statusColors = {
'Open': Colors.green,
'In Progress': Colors.blue,
@ -63,6 +69,8 @@ class _helpState extends State<help> {
'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<help> {
Future<void> _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<String, dynamic>? 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<void> 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<help> {
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<void> getTrackClaimsList() async {
@ -303,7 +302,13 @@ class _helpState extends State<help> {
@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<help> {
flex: 12,
child: InkWell(
onTap: () {
Navigator.pop(context);
context.pop();
// Navigator.pushNamed(context, 'home');
},
child: Row(
@ -525,7 +530,7 @@ class _helpState extends State<help> {
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<help> {
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<help> {
: 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<help> {
],
labels: [
"Home",
"Claim",
"Claims",
"Profile",
"Help",
"Wellness",
],
initialIndex: 3, // Initial index of the bottom navigation bar
),
)
);
}
@ -1344,6 +1355,7 @@ class _helpState extends State<help> {
return GestureDetector(
onTap: () {
// context.go('/tickettracklist', extra: item);
Navigator.pushNamed(context, 'tickettracklist', arguments: item);
},
child: MouseRegion(
@ -1547,13 +1559,8 @@ class _helpState extends State<help> {
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,

View File

@ -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<Home> {
dynamic empPrimaryId;
dynamic client_id;
dynamic policyList;
dynamic activePoliciesDetails;
dynamic policyDataIsEmpty = 1;
dynamic policyHeading;
dynamic policyName;
@ -71,6 +75,8 @@ class _HomeState extends State<Home> {
});
}
final session = SessionManager();
final dataManager = DataManager();
late final WebViewController _controller;
@override
@ -80,6 +86,38 @@ class _HomeState extends State<Home> {
_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<Home> {
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<Home> {
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<Home> {
void _logoutAndRedirect() {
// Clear session if any
// Navigate to login page
Navigator.pushReplacementNamed(context, 'login');
context.go('/login');
}
Future<void> 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<Home> {
Future<void> _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<String, dynamic>? 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<String, dynamic>? 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<Home> {
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<Home> {
.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<Home> {
ElevatedButton(
onPressed: isTokenAvailable
? () {
Navigator.pushNamed(
context, 'empDetails');
context.go('/empDetails');
}
: null,
child: Text('View Details'),
@ -433,9 +578,7 @@ class _HomeState extends State<Home> {
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<Home> {
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<Home> {
// 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<Home> {
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<Home> {
return GestureDetector(
onTap: () {
Navigator.pushNamed(context, 'policies', arguments: item);
context.go(
'/policies',
extra: item, // 👈 pass arguments here
);
},
child: MouseRegion(
cursor: SystemMouseCursors.click,

View File

@ -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<String, dynamic>? details;
const planclaimsform({Key? key, this.details}) : super(key: key);
@override
State<planclaimsform> createState() => _planclaimsformState();
@ -110,6 +116,8 @@ class _planclaimsformState extends State<planclaimsform> {
bool isAccidentDateValid = true;
bool isIntimationDateValid = true;
final session = SessionManager();
@override
void initState() {
@ -156,7 +164,8 @@ class _planclaimsformState extends State<planclaimsform> {
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<String, dynamic>) {
argumentsData = arguments;
claimsDetails = argumentsData['claimsDetails'];
@ -219,29 +228,21 @@ class _planclaimsformState extends State<planclaimsform> {
Future<void> _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<String, dynamic>? 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<planclaimsform> {
});
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<planclaimsform> {
});
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<planclaimsform> {
// '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<planclaimsform> {
// 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<planclaimsform> {
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<planclaimsform> {
@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<planclaimsform> {
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
),
)
);
}

View File

@ -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<String, dynamic>? arguments;
const policies({super.key, this.arguments});
@override
State<policies> createState() => _policiesState();
@ -25,6 +31,7 @@ class policies extends StatefulWidget {
class _policiesState extends State<policies> {
late ApiService apiService;
final session = SessionManager();
int _currentIndex = 0;
bool isActive = true;
dynamic _token;
@ -64,16 +71,11 @@ class _policiesState extends State<policies> {
super.dispose();
}
Future<void> _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<String, dynamic>? decodedToken = Jwt.parseJwt(token);
print(decodedToken);
@ -82,12 +84,9 @@ class _policiesState extends State<policies> {
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<policies> {
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<void> _launchURL(String url) async {
final Uri uri = Uri.parse(url); // Parse the URL properly
@ -128,7 +136,8 @@ class _policiesState extends State<policies> {
@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<String, dynamic>) {
@ -142,13 +151,21 @@ class _policiesState extends State<policies> {
// 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<policies> {
flex: 1,
child: InkWell(
onTap: () {
Navigator.pushNamed(context, 'home');
context.go('/home');
},
child: Icon(
Icons
@ -315,8 +332,7 @@ class _policiesState extends State<policies> {
: 180,
child: TextButton(
onPressed: () {
Navigator.pushNamed(
context, 'claims');
context.push('/claims');
},
style: TextButton.styleFrom(
padding:
@ -345,7 +361,7 @@ class _policiesState extends State<policies> {
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<policies> {
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<policies> {
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<policies> {
),
),
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<Widget>((entry) {
int index = entry.key;
MapEntry<String, dynamic> 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<String, dynamic>
return terms.entries
.where((entry) => entry.value is String)
.toList()
.asMap()
.entries
.map<Widget>((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<Widget>((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<policies> {
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<policies> {
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<policies> {
),
SizedBox(height: 10),
Text(
'Claim history',
'Claims history',
textAlign: TextAlign.center,
style: GoogleFonts.poppins(
fontSize:
@ -1000,15 +1084,20 @@ class _policiesState extends State<policies> {
: 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<policies> {
],
labels: [
"Home",
"Claim",
"Claims",
"Profile",
"Help",
"Wellness",
], // Initial index of the bottom navigation bar
),
)
);
}

View File

@ -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<privacypolicy> {
@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<privacypolicy> {
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<privacypolicy> {
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<privacypolicy> {
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<privacypolicy> {
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<privacypolicy> {
),
],
),
)
);
}
}

View File

@ -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<profile> {
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<profile> {
Future<void> _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<String, dynamic>? 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<profile> {
}
Future<void> 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<String?> 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<String, dynamic> 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<void> logout(BuildContext context) async {
// if (isMobilePlatform()) {
final SharedPreferences prefs = await SharedPreferences.getInstance();
@ -172,13 +232,14 @@ class _profileState extends State<profile> {
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<profile> {
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<profile> {
@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<profile> {
flex: 1,
child: InkWell(
onTap: () {
Navigator.pushNamed(context, 'home');
context.pop();
},
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
@ -606,7 +681,7 @@ class _profileState extends State<profile> {
)
])),
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<profile> {
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<profile> {
: 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<profile> {
],
labels: [
"Home",
"Claim",
"Claims",
"Profile",
"Help",
"Wellness",
],
initialIndex: 2, // Initial index of the bottom navigation bar
),
)
);
}
}

View File

@ -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<raisedTicketHistory> {
List<dynamic> ticketList = [];
final session = SessionManager();
final Map<String, Color> statusColors = {
'Open': Colors.green,
'In Progress': Colors.blue,
@ -76,30 +82,21 @@ class _raisedTicketHistoryState extends State<raisedTicketHistory> {
Future<void> _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<String, dynamic>? 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<raisedTicketHistory> {
@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<raisedTicketHistory> {
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<raisedTicketHistory> {
// 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<raisedTicketHistory> {
],
labels: [
"Home",
"Claim",
"Claims",
"Profile",
"Help",
"Wellness",
],
initialIndex: 3, // Initial index of the bottom navigation bar
),
)
);
}
@ -389,20 +398,7 @@ class _raisedTicketHistoryState extends State<raisedTicketHistory> {
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,

View File

@ -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<void> _initializeToken() async {
final prefs = await SharedPreferences.getInstance();
_token = prefs.getString('_postToken') ?? '';
_postToken = await TokenService.getPostToken();
}
Future<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> getWellnessLink() async {
print(_token);
if (_token == null) {
Future<Map<String, dynamic>> 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<Map<String, dynamic>> 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<Map<String, dynamic>> sendTicketFormDataToApi(
Map<String, dynamic> 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<Map<String, dynamic>> sendClaimsFormDataToApi(
Map<String, dynamic> 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<Map<String, dynamic>> getBotDetails(
Map<String, dynamic> 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;

View File

@ -181,6 +181,81 @@ class SvgService {
</svg>
''';
static const String female = '''
<svg width="35" height="35" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M247.162 70H265.838L276.8 71.338L286.544 74.014L297.1 78.474L304.814 82.488L313.746 88.732L318.212 91.854L322.678 95.868L323.084 97.206L324.708 98.098L333.234 107.464V108.356L334.858 109.248L339.324 115.492L342.166 120.844L347.038 129.318L350.692 137.792L354.346 148.496L356.782 159.2L358 171.242V191.758L356.782 203.8L354.346 214.504L350.286 226.1L346.226 235.466L343.79 239.48L340.542 244.832L338.512 248.846L334.046 254.644L321.46 268.47L315.37 273.376L311.716 275.606L304.002 280.958L296.288 284.972L286.544 288.986L276.8 291.662L265.838 293H247.162L236.2 291.662L226.456 288.986L215.9 284.526L208.186 280.512L199.254 274.268L194.788 271.146L190.322 267.132L179.766 255.536V254.644L178.142 253.752L173.676 247.508L170.834 242.156L165.962 233.682L162.308 225.208L158.654 214.058L156.218 203.8L155 191.758V171.242L155.812 161.876L157.842 152.064L159.872 144.928L163.932 133.778L167.18 127.088L172.052 118.614L174.894 113.708L178.548 108.802L191.134 94.976L196.412 90.516L201.284 87.394L207.78 82.934L214.276 79.366L221.99 75.798L229.298 73.122L238.636 70.892L247.162 70Z" fill="#F6CEA2"/>
<path d="M116.736 338.944H125.952L136.192 348.16L148.48 357.376L158.72 363.52L168.96 367.616L181.248 372.736L200.704 378.88L221.184 382.976L239.616 385.024H269.312L295.936 381.952L317.44 376.832L327.68 373.76L339.968 368.64L356.352 360.448L370.688 352.256L384 339.968L386.048 338.944H393.216L404.48 343.04L413.696 350.208L420.864 357.376L428.032 369.664L433.152 386.048L434.176 392.192V441.344L419.84 455.68L404.48 466.944L395.264 472.064L375.808 484.352L356.352 493.568L331.776 502.784L307.2 508.928L279.552 512H232.448L204.8 508.928L180.224 502.784L153.6 492.544L134.144 483.328L111.616 468.992L100.352 461.824L89.0882 452.608L77.8242 441.344V391.168L81.9202 374.784L90.1122 358.4L97.2802 351.232L101.376 347.136L110.592 340.992L116.736 338.944Z" fill="#886C60"/>
<path d="M237.568 54.272H275.456L289.792 57.344L309.248 64.512V66.56L315.392 68.608L326.656 77.824L333.824 84.992L344.064 100.352L351.232 114.688L355.328 129.024L358.4 142.336L359.424 148.48L360.448 224.256L366.592 251.904L370.688 262.144L377.856 273.408L384 280.576L381.952 284.672L368.64 293.888L354.304 300.032L340.992 303.104L333.824 304.128H320.512L303.104 301.056L299.008 296.96L293.888 284.672V274.432L306.176 263.168L316.416 249.856L320.512 242.688L322 240.5L323.584 237.568L332.8 217.088C332.8 217.088 338.826 215.302 342.016 212.992C345.459 210.499 346.854 208.355 349.184 204.8C351.145 201.808 351.991 199.944 353.28 196.608C355.203 191.631 356.352 183.296 356.352 183.296L357.376 173.056H327.68L305.152 169.984L284.672 163.84L267.264 155.648L258.048 149.504L245.76 138.24L237.568 129.024L227.328 109.568L225.28 100.352L217.088 107.52L207.872 120.832L202.752 133.12L200.704 141.312L198.656 153.6L194.56 164.864L188.416 174.08L183.296 179.2L175.104 185.344L166.912 188.416L156.672 189.44C156.672 189.44 158.498 197.207 160.768 201.728C162.709 205.594 163.864 207.874 166.912 210.944C168.716 212.761 169.772 213.836 172.032 215.04C174.602 216.409 179.2 217.088 179.2 217.088L188.416 237.568L190 240L191.488 242.688L200.704 257.024L214.016 271.36L218.112 274.432V284.672L212.992 296.96L208.896 301.056L190.464 304.128H176.128L159.744 301.056L146.432 295.936L135.168 288.768L128 282.624L130.048 277.504L137.216 269.312L144.384 254.976L149.504 237.568L151.552 228.352L152.576 151.552L154.624 136.192L158.72 120.832L165.888 104.448L173.056 92.16L182.272 80.896L189.44 73.728L199.68 66.56L208.896 61.44L216.064 58.368L237.568 54.272Z" fill="#353944"/>
<path d="M292.864 274.432H293.888L294.912 284.672L300.032 296.96L306.176 306.176L316.416 316.416L324.608 321.536L327.68 322.56V324.608L337.92 327.68L355.328 333.824L370.688 336.896L389.12 337.92L386.048 339.968L377.856 347.136L368.64 354.304L353.28 363.52L335.872 371.712L327.68 374.784L309.248 379.904L295.936 382.976L269.312 386.048H239.616L214.016 382.976L196.608 378.88L178.176 372.736L163.84 366.592L153.6 361.472L141.312 353.28L130.048 344.064L125.952 339.968L120.832 338.944V337.92L138.24 336.896L158.72 332.8L174.08 327.68L193.536 317.44L205.824 306.176L211.968 296.96L217.088 284.672L218.112 275.456L227.328 280.576L237.568 284.672L246.784 286.72H266.24L282.624 281.6L292.864 274.432Z" fill="#F0B87C"/>
<path d="M116.736 338.944H125.952L136.192 348.16L148.48 357.376L158.72 363.52L168.96 367.616L181.248 372.736L200.704 378.88L221.184 382.976L239.616 385.024H269.312L295.936 381.952L317.44 376.832L327.68 373.76L339.968 368.64L356.352 360.448L370.688 352.256L384 339.968L386.048 338.944H393.216L404.48 343.04V346.112L400.384 353.28L393.216 360.448L376.832 372.736L361.472 381.952L340.992 391.168L326.656 396.288L317.44 397.312V399.36L292.864 404.48L273.408 405.504H227.328L201.728 401.408L177.152 394.24L157.696 386.048L138.24 375.808L133.12 371.712L128 368.64L114.688 357.376L107.52 349.184L104.448 345.088L110.592 340.992L116.736 338.944Z" fill="#B65F63"/>
<path d="M116.736 338.944H125.952L136.192 348.16L137.216 353.28L130.048 362.496L131.072 366.592V369.664L123.904 365.568L110.592 353.28L106.496 347.136L104.448 345.088L110.592 340.992L116.736 338.944Z" fill="#B85E64"/>
<path d="M242.688 386.048H259.072V403.456H253.952V405.504H236.544V404.48L243.712 403.456L242.688 402.432V386.048Z" fill="#B65D63"/>
<path d="M137.216 350.208L144.384 354.304L160.768 364.544L158.72 366.592L156.672 372.736H154.624L152.576 378.88L147.456 377.856L148.48 372.736L154.624 362.496H149.504L145.408 370.688L143.36 373.76L139.264 372.736L138.24 369.664L144.384 359.424L143.36 356.352L140.288 357.376L133.12 367.616L129.024 365.568L130.048 360.448L136.192 353.28L137.216 350.208Z" fill="#8E6B60"/>
<path d="M340.992 173.056H351.232V183.296L347.136 196.608L340.992 205.824L337.92 208.896H335.872L337.92 196.608L339.968 184.32L340.992 173.056Z" fill="#F0BA7E"/>
<path d="M313.344 377.856H319.488L322.56 387.072V394.24L320.512 395.264L322.56 397.312H317.44V399.36H311.296L307.2 397.312L305.152 379.904L313.344 377.856Z" fill="#B26264"/>
<path d="M162.816 366.592L168.96 367.616L178.176 371.712L177.152 377.856L173.056 388.096L167.936 387.072L168.96 381.952L172.032 371.712L167.936 370.688L165.888 376.832L162.816 384L158.72 382.976L157.696 378.88L161.792 370.688L162.816 366.592Z" fill="#8E6C60"/>
<path d="M169.74 187.5H170.764L172.812 199.788L174.86 210.028L170.764 207.98L166.668 202.86L161.548 192.62V190.572L159.5 189.5L169.74 187.5Z" fill="#EFB87D"/>
<path d="M197.632 379.904H201.728L200.704 388.096L199.68 396.288L201.728 397.312H199.68V399.36L191.488 398.336L188.416 396.288V394.24H193.536L195.584 382.976H197.632V379.904Z" fill="#B55D63"/>
<path d="M217.088 384H222.208L221.184 400.384V402.432H210.944V399.36H214.016L216.064 385.024L217.088 384Z" fill="#B75D63"/>
<path d="M358.4 359.424L361.472 360.448L367.616 370.688V373.76L369.664 374.784L370.688 376.832L363.52 380.928H361.472V378.88L358.4 377.856L363.52 376.832L357.376 364.544V362.496L355.328 361.472L358.4 359.424Z" fill="#B75F64"/>
<path d="M237.568 386.048H242.688L243.712 402.432L247.808 404.48H232.448V402.432L236.544 401.408L237.568 386.048Z" fill="#B75C63"/>
<path d="M259.072 386.048H264.192V403.456L266.24 404.48L253.952 405.504V403.456H259.072V386.048Z" fill="#B95C63"/>
<path d="M302.08 380.928H305.152L307.2 390.144V397.312H312.32L311.296 400.384H303.104L300.032 385.024V381.952L302.08 380.928Z" fill="#B65D63"/>
<path d="M130.048 344.064L135.168 347.136L137.216 350.208L132.096 351.232L124.928 359.424L120.832 357.376V353.28L130.048 344.064Z" fill="#8D6B60"/>
<path d="M252.928 386.048H259.072V402.432H252.928V386.048Z" fill="#8D6960"/>
<path d="M232.448 385.024H239.616L237.568 386.048V401.408H231.424L232.448 385.024Z" fill="#8F6A60"/>
<path d="M222.208 384H228.352L225.28 400.384H220.16V393.216L222.208 384Z" fill="#8D6A60"/>
<path d="M264.192 386.048H269.312L270.336 402.432H264.192V386.048Z" fill="#8C6A60"/>
<path d="M211.968 381.952L221.184 382.976L217.088 385.024L214.016 399.36H208.896L209.92 390.144L211.968 381.952Z" fill="#8D6A60"/>
<path d="M183.296 374.784L188.416 375.808L185.344 386.048L183.296 391.168L178.176 390.144L181.248 378.88L183.296 374.784Z" fill="#8E6A60"/>
<path d="M380.928 345.088L384 346.112L391.168 354.304L390.144 358.4L387.072 360.448L377.856 349.184V347.136L380.928 345.088Z" fill="#8C6A60"/>
<path d="M284.672 384H289.792L291.84 393.216V400.384H286.72L284.672 384Z" fill="#8B6A60"/>
<path d="M201.728 379.904L206.848 380.928L204.8 397.312L199.68 396.288V388.096L201.728 379.904Z" fill="#8E6A60"/>
<path d="M371.712 351.232L375.808 353.28L381.952 361.472L380.928 365.568H376.832L369.664 355.328L371.712 351.232Z" fill="#8C6B60"/>
<path d="M335.872 370.688H338.944L344.064 385.024L338.944 387.072L333.824 374.784V371.712L335.872 370.688Z" fill="#8C6B60"/>
<path d="M347.136 366.592L351.232 371.712L354.304 377.856L353.28 381.952L349.184 382.976L343.04 368.64L347.136 366.592Z" fill="#8C6A60"/>
<path d="M364.544 357.376L368.64 361.472L372.736 368.64L370.688 372.736H367.616L360.448 360.448V358.4L364.544 357.376Z" fill="#8D6B60"/>
<path d="M242.688 386.048H247.808V402.432H242.688V386.048Z" fill="#8B6A60"/>
<path d="M297.984 381.952H300.032L303.104 395.264V399.36H297.984L295.936 390.144V384L297.984 381.952Z" fill="#8C6A60"/>
<path d="M353.28 362.496H357.376L363.52 373.76V376.832L358.4 377.856L352.256 365.568L353.28 362.496Z" fill="#8F6B60"/>
<path d="M273.408 385.024H279.552L280.576 401.408H275.456L273.408 385.024Z" fill="#8C6B60"/>
<path d="M192.512 377.856L200.704 378.88L197.632 379.904V382.976H195.584L194.56 392.192L193.536 394.24H189.44L190.464 386.048L192.512 377.856Z" fill="#8D6B60"/>
<path d="M325.632 374.784L329.728 375.808L332.8 385.024L331.776 390.144H327.68L323.584 377.856V375.808L325.632 374.784Z" fill="#8E6A60"/>
<path d="M305.152 380.928H310.272L312.32 388.096V396.288L307.2 395.264L305.152 380.928Z" fill="#8C6A60"/>
<path d="M317.44 377.856H319.488L322.56 387.072V394.24H317.44L315.392 380.928L317.44 377.856Z" fill="#8D6A60"/>
<path d="M122.88 338.944H125.952L123.904 343.04L115.712 351.232L113.664 350.208L115.712 346.112L122.88 338.944Z" fill="#8F6960"/>
<path d="M386.048 338.944L390.144 340.992L397.312 348.16V351.232L393.216 349.184L385.024 340.992L386.048 338.944Z" fill="#8D6A60"/>
<path d="M223.232 100.352H225.28L227.328 105.472L226.304 109.568L223.232 104.448L215.04 112.64L212.992 111.616L222.208 101.376L223.232 100.352Z" fill="#CFAF8F"/>
</svg>
''';
static const String male = '''
<svg width="35" height="35" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3338_2243)">
<path d="M176.128 280.576H180.224L184.32 288.768L187.392 299.008L196.608 313.344L205.824 322.56L215.04 327.68L231.424 333.824L241.664 335.872H271.36L285.696 332.8L301.056 326.656L313.344 318.464L321.536 308.224L328.704 293.888L331.776 283.648L332.8 281.6H339.968L370.688 292.864L400.384 303.104L420.864 311.296L434.176 318.464L443.392 325.632L450.56 331.776L459.776 343.04L465.92 352.256L473.088 367.616L476.16 376.832L478.208 386.048L467.968 401.408L462.848 410.624L451.584 423.936L419.84 455.68L404.48 466.944L395.264 472.064L375.808 484.352L356.352 493.568L331.776 502.784L307.2 508.928L288.768 510.976L279.552 512H232.448L204.8 508.928L184.32 503.808L168.96 498.688L144.384 488.448L125.952 478.208L110.592 467.968L101.376 462.848L88.0638 451.584V449.536L83.9678 447.488L62.4638 425.984V423.936L58.3678 421.888L47.1038 407.552L39.9358 395.264L35.8398 389.12V377.856L40.9598 363.52L48.1278 349.184L58.3678 335.872L70.6558 323.584L82.9438 315.392L93.1838 310.272L103.424 306.176L113.664 303.104L123.904 299.008L174.08 281.6L176.128 280.576Z" fill="#5E86C3"/>
<path d="M239.616 23.5518H262.144L283.648 25.5998L305.152 30.7198L317.44 35.8398L331.776 44.0318L344.064 55.2958L350.208 62.4638L358.4 78.8478L359.424 82.9438V106.496L356.352 115.712L352.256 125.952L349.184 136.192V142.336L354.304 147.456L357.376 154.624V172.032L354.304 182.272L348.16 191.488L340.992 197.632L336.896 198.656L332.8 214.016L326.656 230.4L322.56 236.544L321.536 243.712V279.552L318.464 291.84L312.32 301.056L309.248 306.176L299.008 315.392L293.888 318.464L276.48 323.584L269.312 324.608H244.736L233.472 322.56L228.352 320.512L220.16 318.464L208.896 311.296L200.704 301.056L196.608 292.864L192.512 279.552L191.488 239.616L184.32 229.376L179.2 216.064L175.104 199.68V197.632L168.96 196.608L162.816 191.488L157.696 183.296L154.624 173.056V153.6L158.72 145.408L159.744 141.312L154.624 124.928L153.6 116.736V93.1838L156.672 82.9438L162.816 74.7518L167.936 69.6318H171.008L172.032 64.5118L178.176 52.2238L189.44 40.9598L200.704 33.7918L211.968 28.6718L221.184 25.5998L239.616 23.5518Z" fill="#F7CEA2"/>
<path d="M239.616 23.5518H262.144L283.648 25.5998L305.152 30.7198L317.44 35.8398L331.776 44.0318L344.064 55.2958L350.208 62.4638L358.4 78.8478L359.424 82.9438V106.496L356.352 115.712L352.256 125.952L347.136 145.408L345.088 157.696L344.064 168.96L339.968 169.984L336.896 159.744L334.848 146.432V121.856L332.8 122.88L309.248 124.928H276.48L253.952 122.88L240.64 119.808L225.28 115.712L215.04 112.64L212.992 110.592L203.776 107.52L201.728 106.496V104.448L196.608 103.424L188.416 97.2798L185.344 98.3038L179.2 112.64L175.104 131.072L173.056 144.384L171.008 169.984H168.96L164.864 154.624L157.696 136.192L154.624 124.928L153.6 116.736V93.1838L156.672 82.9438L162.816 74.7518L167.936 69.6318H171.008L172.032 64.5118L178.176 52.2238L189.44 40.9598L200.704 33.7918L211.968 28.6718L221.184 25.5998L239.616 23.5518Z" fill="#4E535F"/>
<path d="M320.512 237.568H321.536V279.552L318.464 291.84L312.32 301.056L309.248 306.176L299.008 315.392L293.888 318.464L276.48 323.584L269.312 324.608H244.736L233.472 322.56L228.352 320.512L220.16 318.464L208.896 311.296L200.704 301.056L196.608 292.864L192.512 279.552L193.536 242.688L200.704 248.832L211.968 259.072L226.304 268.288L236.544 272.384L240.64 273.408H270.336L276.48 271.36L287.744 267.264L299.008 259.072L309.248 249.856L318.464 240.64L320.512 237.568Z" fill="#F0B97C"/>
<path d="M247.808 38.9121H268.288L288.768 43.0081L304.128 49.1521L318.464 56.3201L333.824 67.5841L340.992 75.7761L343.04 78.8481L338.944 76.8001L331.776 69.6321L335.872 74.7521L340.992 79.8721L339.968 81.9201L328.704 71.6801L314.368 62.4641L322.56 68.6081L332.8 77.8241L343.04 89.0881L342.016 91.1361L334.848 83.9681L340.992 92.1601L343.04 97.2801L337.92 92.1601L328.704 81.9201L317.44 73.7281V75.7761L322.56 77.8241L329.728 84.9921V87.0401H331.776L333.824 92.1601L325.632 86.0161L326.656 88.0641L322.56 86.0161L311.296 77.8241L318.464 83.9681L328.704 95.2321L329.728 100.352H326.656L318.464 92.1601L309.248 86.0161L319.488 95.2321L322.56 100.352L318.464 99.3281L314.368 95.2321V93.1841L309.248 91.1361L299.008 83.9681L283.648 76.8001L267.264 72.7041H244.736L231.424 74.7521L232.448 72.7041L237.568 70.6561L250.88 68.6081H241.664L231.424 70.6561L227.328 69.6321L229.376 68.6081L225.28 66.5601L227.328 64.5121L237.568 61.4401L223.232 62.4641L225.28 58.3681L232.448 56.3201L231.424 54.2721H226.304L225.28 51.2001L233.472 48.1281L222.208 50.1761L215.04 52.2241L210.944 51.2001L222.208 47.1041H217.088L221.184 44.0321L237.568 39.9361L247.808 38.9121Z" fill="#525862"/>
<path d="M323.584 276.48L332.8 279.552L331.776 285.696L328.704 295.936L322.56 308.224L313.344 319.488L299.008 328.704L282.624 334.848L271.36 336.896H241.664L227.328 333.824L215.04 328.704L205.824 323.584L194.56 312.32L186.368 299.008L181.248 283.648V279.552L191.488 277.504V279.552H193.536L198.656 294.912L204.8 305.152L208.896 310.272L220.16 317.44L236.544 322.56L244.736 323.584H269.312L281.6 321.536L295.936 316.416L306.176 308.224L310.272 304.128L316.416 292.864L321.536 280.576L323.584 276.48Z" fill="#E4E4E4"/>
<path d="M387.072 429.056H388.096V476.16L380.928 481.28H374.784V483.328H372.736L373.76 475.136L385.024 435.2L387.072 429.056Z" fill="#4E5DA7"/>
<path d="M124.928 431.104L126.976 434.176L139.264 477.184L140.288 483.328H137.216V481.28H131.072L124.928 477.184V431.104Z" fill="#4E5EA7"/>
<path d="M346.112 145.408L349.184 149.504L352.256 156.672V169.984L349.184 180.224L343.04 189.44L338.944 191.488L340.992 177.152L343.04 168.96L345.088 151.552L346.112 145.408Z" fill="#EFB97E"/>
<path d="M162.816 149.504L164.864 152.576L166.912 156.672L173.056 189.44L172.032 192.512L166.912 188.416L161.792 178.176L159.744 169.984V155.648L160.768 152.576H162.816V149.504Z" fill="#EEB87E"/>
<path d="M387.072 429.056H388.096V476.16L386.048 477.184L385.024 442.368L384 439.296L387.072 429.056Z" fill="#5166AC"/>
<path d="M333.824 498.688H339.968L336.896 500.736L320.512 505.856L313.344 506.88V504.832L333.824 498.688Z" fill="#8CA6CD"/>
<path d="M415.744 454.656L418.816 455.68L407.552 464.896L404.48 466.944L401.408 465.92L410.624 458.752H412.672V456.704L415.744 454.656Z" fill="#8BA5CB"/>
<path d="M455.68 414.72L458.752 415.744L447.488 428.032V424.96L453.632 416.768H455.68V414.72Z" fill="#849FCC"/>
<path d="M368.64 484.352L372.736 485.376L360.448 491.52H358.4V489.472L364.544 486.4H368.64V484.352Z" fill="#87A1C9"/>
</g>
<defs>
<clipPath id="clip0_3338_2243">
<rect width="512" height="512" fill="white"/>
</clipPath>
</defs>
</svg>
''';
static const String mpin = '''
<svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="50" fill="white"/>
@ -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 '';

View File

@ -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<termsofuse> {
@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<termsofuse> {
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<termsofuse> {
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<termsofuse> {
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<termsofuse> {
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<termsofuse> {
),
],
),
)
);
}
}

View File

@ -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<tickets> {
List<Map<String, dynamic>> policyList = [];
dynamic policyDataIsEmpty = 1;
int? fromClaimsPage;
dynamic decodedToken;
Map<String, dynamic>? decodedToken;
List<Map<String, dynamic>> departmentList = [];
List<Map<String, dynamic>> policyNumberList = [];
dynamic serviceId;
@ -63,6 +68,8 @@ class _ticketsState extends State<tickets> {
bool isSubjectValid = true;
bool isMessageValid = true;
final session = SessionManager();
@override
void initState() {
super.initState();
@ -82,8 +89,7 @@ class _ticketsState extends State<tickets> {
Future<void> _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<tickets> {
// 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<void> getActiveAndInactivePolicyDetails() async {
if (client_id == null || empCodeString == null) {
return;
@ -209,14 +212,12 @@ class _ticketsState extends State<tickets> {
try {
print('Check One');
Map<String, dynamic> 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<tickets> {
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<tickets> {
@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<tickets> {
flex: 1,
child: InkWell(
onTap: () {
Navigator.pushNamed(
context, 'help');
context.go('/help');
},
child: Icon(
Icons
@ -592,16 +593,20 @@ class _ticketsState extends State<tickets> {
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<tickets> {
],
labels: [
"Home",
"Claim",
"Claims",
"Profile",
"Help",
"Wellness",
], // Initial index of the bottom navigation bar
],
initialIndex: 3, // Initial index of the bottom navigation bar
),
)
);
}

View File

@ -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<tickettracklist> {
// Create a unique form key for each accordion section
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
final session = SessionManager();
@override
void initState() {
super.initState();
@ -102,28 +108,17 @@ class _tickettracklistState extends State<tickettracklist> {
Future<void> _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<String, dynamic>? 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<tickettracklist> {
@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<tickettracklist> {
flex: 1,
child: InkWell(
onTap: () {
Navigator.pushNamed(
context,
'raisedTicketHistory',
);
context.go(
'/raisedTicketHistory');
},
child: Icon(
Icons
@ -679,15 +677,20 @@ class _tickettracklistState extends State<tickettracklist> {
: 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<tickettracklist> {
],
labels: [
"Home",
"Claim",
"Claims",
"Profile",
"Help",
"Wellness",
], // Initial index of the bottom navigation bar
],
initialIndex: 3, // Initial index of the bottom navigation bar
),
)
);
}

View File

@ -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<wellness> {
Future<void> 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<wellness> {
@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<wellness> {
flex: 12,
child: InkWell(
onTap: () {
Navigator.pushNamed(context, 'home');
context.pop();
},
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
@ -137,7 +148,7 @@ class _wellnessState extends State<wellness> {
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<wellness> {
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<wellness> {
}
},
child: Text(
'Wellness',
'Proceed',
style: GoogleFonts.poppins(color: Colors.white),
),
style: ElevatedButton.styleFrom(
@ -214,15 +233,15 @@ class _wellnessState extends State<wellness> {
// 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<wellness> {
],
labels: [
"Home",
"Claim",
"Claims",
"Profile",
"Help",
"Wellness",
],
initialIndex: 4, // Initial index of the bottom navigation bar
),
)
);
}
}

View File

@ -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<void> _sessionController = StreamController.broadcast();
//
// Stream<void> 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<void> initializeFromPostToken(String token) async {
// Map<String, dynamic> 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<void> initializeFromPreToken(String token) async {
// Map<String, dynamic> 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<void> restoreSession() async {
// prefs = await SharedPreferences.getInstance();
//
// final postToken = await TokenService.getPostToken();
// final preToken = await TokenService.getPreToken();
//
// if (postToken != null && postToken.isNotEmpty) {
// Map<String, dynamic> 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<String, dynamic> 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<void> 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<void> initializeFromPostToken(String token) async {
Map<String, dynamic> 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<void> initializeFromPreToken(String token) async {
Map<String, dynamic> 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<void> 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<void> 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();
}
}

View File

@ -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<void> 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<String?> 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<String?> 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<void> 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<bool> 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<String?> 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<String, dynamic> 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<void> 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');
// }
}
}

View File

@ -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<String> _advertisementImages = [];
bool _adsLoaded = false;
// === Policies ===
List<dynamic> _policyList = [];
bool _policyLoaded = false;
String? _empName;
int _prePolicyCount = 0;
// === Self Employee Profile ===
Map<String, dynamic>? _selfProfile;
Map<String, dynamic>? _accountManagerDetails;
bool _selfProfileLoaded = false;
// Getters
List<String> get advertisementImages => _advertisementImages;
bool get adsLoaded => _adsLoaded;
List<dynamic> get policyList => _policyList;
bool get policyLoaded => _policyLoaded;
String? get empName => _empName;
int get prePolicyCount => _prePolicyCount;
Map<String, dynamic>? get selfProfile => _selfProfile;
Map<String, dynamic>? get accountManagerDetails => _accountManagerDetails;
bool get selfProfileLoaded => _selfProfileLoaded;
/// Inject ApiService (with context) once
void init(ApiService apiService) {
_apiService = apiService;
}
/// Load Ads once
Future<void> loadAdvertisementImages() async {
if (_adsLoaded) return;
final response = await _apiService.getAdvertisementImageToApi();
if (response['status'] == 'success') {
_advertisementImages = List<String>.from(response['data']);
_adsLoaded = true;
notifyListeners();
debugPrint("✅ Advertisement images loaded: $_advertisementImages");
}
}
/// Load Policies (first time or refresh)
Future<void> 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<void> 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<String, dynamic>.from(response['data']);
_accountManagerDetails =
Map<String, dynamic>.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<void> 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<String> _advertisementImages = [];
// bool _isLoaded = false;
//
// List<String> get advertisementImages => _advertisementImages;
// bool get isLoaded => _isLoaded;
//
// /// Inject ApiService (with context) once
// void init(ApiService apiService) {
// _apiService = apiService;
// }
//
// /// Load only once
// Future<void> loadAdvertisementImages() async {
// if (_isLoaded) return;
//
// final response = await _apiService.getAdvertisementImageToApi();
// if (response['status'] == 'success') {
// _advertisementImages = List<String>.from(response['data']);
// debugPrint("✅ Advertisement images loaded: ${_advertisementImages}");
// _isLoaded = true;
// notifyListeners();
// } else {
// debugPrint("❌ Failed to load advertisement images: ${response['message']}");
// }
// }
//
// /// Clear on logout
// Future<void> clearData() async {
// _advertisementImages = [];
// _isLoaded = false;
// notifyListeners();
// }
// }

View File

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

View File

@ -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<pinPage> {
dynamic bioMetricMpin;
dynamic biometricStatus;
dynamic isMpinSkippedStatus;
late SessionManager session;
@override
void initState() {
@ -62,7 +66,65 @@ class _pinPageState extends State<pinPage> {
super.dispose();
}
Future<void> 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<String, dynamic> 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<void> _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<pinPage> {
_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<pinPage> {
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<String, dynamic>? 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<String, dynamic>? 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<pinPage> {
}
if (status == 'success') {
final SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('enrollToken', data['data']);
// Decode the JWT token received from the API response
Map<String, dynamic>? 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<String, dynamic>? 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<pinPage> {
}
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<String, dynamic>? 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<String, dynamic>? 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<pinPage> {
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<pinPage> {
Future<void> 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,

View File

@ -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<changePin> {
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<changePin> {
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<changePin> {
'Authorization': 'Bearer $_token',
},
);
print('response $response');
if (response.statusCode == 200) {
Map<String, dynamic> 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<String, dynamic> data = json.decode(response.body);
String message = data['data']['message'];
ToastHelper.showErrorToast(context, message);
throw Exception('Failed to verify mobile number');
}
}

View File

@ -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<pinSettingPage> {
dynamic enrollToken;
dynamic _postToken;
dynamic emp_status;
final session = SessionManager();
@override
void initState() {
@ -46,17 +50,22 @@ class _pinSettingPageState extends State<pinSettingPage> {
Future<void> 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<pinSettingPage> {
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<pinSettingPage> {
}
} 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<pinSettingPage> {
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');
}
}

View File

@ -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<MyVerify> {
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<MyVerify> {
bool _isLoading = false;
dynamic empMobileNo;
dynamic empEmailid;
late SessionManager session;
late String _verificationId;
@ -94,7 +99,8 @@ class _MyVerifyState extends State<MyVerify> {
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<MyVerify> {
super.dispose();
}
Future<void> 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<void> 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<void> handleBackgroundMessage(RemoteMessage message) async {
// print('Title ${message.notification?.title}');
// print('Body ${message.notification?.body}');
@ -186,7 +205,7 @@ class _MyVerifyState extends State<MyVerify> {
.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<MyVerify> {
});
Map<String, dynamic> 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<String, dynamic> 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<MyVerify> {
}
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<MyVerify> {
'client_id': client_id,
'empClientBranchId': empClientBranchId,
});
print('Successfully Login');
}
@ -316,32 +350,34 @@ class _MyVerifyState extends State<MyVerify> {
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<String, dynamic>? 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<String, dynamic>? 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<MyVerify> {
}
if (status == 'success') {
final SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('enrollToken', data['data']);
// Decode the JWT token received from the API response
Map<String, dynamic>? 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<String, dynamic>? 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<MyVerify> {
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<MyVerify> {
}
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<String, dynamic>? 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<String, dynamic>? 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<MyVerify> {
}
// }
} 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<MyVerify> {
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<MyVerify> {
);
if (response.statusCode == 200) {
print('checkLoginPin response');
print('checkLoginPin $response');
Map<String, dynamic> data = json.decode(response.body);
if (data['status'] == 'success') {
print('checkLoginPin success');
@ -605,19 +645,32 @@ class _MyVerifyState extends State<MyVerify> {
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<MyVerify> {
Future<void> 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<MyVerify> {
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<MyVerify> {
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<MyVerify> {
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<MyVerify> {
)),
)));
}
}
// Must be outside any class this fixes your error
@pragma('vm:entry-point')
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
print('📨 Handling background message: ${message.messageId}');
print('Title: ${message.notification?.title}');
print('Body: ${message.notification?.body}');
print('Data: ${message.data}');
}

View File

@ -7,12 +7,16 @@
#include "generated_plugin_registrant.h"
#include <file_selector_linux/file_selector_plugin.h>
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
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);

View File

@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST
file_selector_linux
flutter_secure_storage_linux
url_launcher_linux
)

View File

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

View File

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

View File

@ -66,6 +66,21 @@ body.show-botman #botmanWidgetRoot {
}
</style>
<script>
// This script runs before the Flutter app initializes.
// Check if the current URL has the unwanted fragment
if (window.location.hash === '#login') {
// Construct the clean URL (origin + path)
const cleanUrl = window.location.origin + window.location.pathname;
// Replace the current history state to clear the fragment and
// immediately navigate to the target URL (https://app.nhanceindia.in/app)
// without creating an extra history entry.
window.location.replace(cleanUrl);
}
</script>
<script>
const hiddenRoutes = ['/#login'];

View File

@ -10,6 +10,7 @@
#include <firebase_auth/firebase_auth_plugin_c_api.h>
#include <firebase_core/firebase_core_plugin_c_api.h>
#include <flutter_inappwebview_windows/flutter_inappwebview_windows_plugin_c_api.h>
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
#include <local_auth_windows/local_auth_plugin.h>
#include <url_launcher_windows/url_launcher_windows.h>
@ -22,6 +23,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
FlutterInappwebviewWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterInappwebviewWindowsPluginCApi"));
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin"));
LocalAuthPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("LocalAuthPlugin"));
UrlLauncherWindowsRegisterWithRegistrar(

View File

@ -7,6 +7,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
firebase_auth
firebase_core
flutter_inappwebview_windows
flutter_secure_storage_windows
local_auth_windows
url_launcher_windows
)