381 lines
13 KiB
Dart
Executable File
381 lines
13 KiB
Dart
Executable File
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';
|
|
import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
import 'package:http/http.dart' as http;
|
|
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 'package:nhance_app_pwa/logger.dart';
|
|
|
|
class generalExclusionsDeductibles extends StatefulWidget {
|
|
const generalExclusionsDeductibles({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
State<generalExclusionsDeductibles> createState() =>
|
|
_generalExclusionsDeductiblesState();
|
|
}
|
|
|
|
class _generalExclusionsDeductiblesState
|
|
extends State<generalExclusionsDeductibles> {
|
|
late ApiService apiService;
|
|
int _currentIndex = 0;
|
|
bool isActive = true;
|
|
bool isLoading = false;
|
|
dynamic _token;
|
|
dynamic empCodeString;
|
|
dynamic empPrimaryId;
|
|
dynamic client_id;
|
|
dynamic generalExclusionsDetails;
|
|
dynamic reimbursementClaimsDetails;
|
|
dynamic generalSectionName;
|
|
dynamic generalHeading;
|
|
late Map<String, String> generalContent;
|
|
late Map<String, String> generalNotes;
|
|
|
|
// Headings
|
|
String? type3SectionName, type3Heading;
|
|
String? type4SectionName, type4Heading;
|
|
String? type5Heading;
|
|
String? type6Heading;
|
|
String? type7Heading;
|
|
|
|
// Content lists
|
|
List<String> type3Content = [];
|
|
List<String> type4Content = [];
|
|
List<String> type5Content = [];
|
|
List<String> type6Content = [];
|
|
List<String> type7Content = [];
|
|
|
|
final session = SessionManager();
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
apiService = ApiService(context); // Initialize ApiService here
|
|
_loadToken();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
}
|
|
|
|
Future<void> _loadToken() async {
|
|
logDebug('_loadToken');
|
|
final String? token = await TokenService.getPostToken();
|
|
if (token != null && token.isNotEmpty) {
|
|
// Decode the JWT token received from the API response
|
|
Map<String, dynamic>? decodedToken = Jwt.parseJwt(token);
|
|
logDebug(decodedToken);
|
|
empCodeString = session.empCodeString;
|
|
logDebug(empCodeString); // Check if emp_code is correct
|
|
empPrimaryId = session.empPrimaryId;
|
|
client_id = session.client_id;
|
|
logDebug(client_id);
|
|
getCashlessAndReimbursement();
|
|
}
|
|
}
|
|
|
|
/// 🔥 Extract <li> text from HTML
|
|
List<String> extractListItems(String html) {
|
|
final regex = RegExp(r'<li>(.*?)<\/li>', dotAll: true);
|
|
return regex
|
|
.allMatches(html)
|
|
.map((m) => m.group(1)!.replaceAll(RegExp(r'<[^>]*>'), '').trim())
|
|
.toList();
|
|
}
|
|
|
|
Future<void> getCashlessAndReimbursement() async {
|
|
setState(() => isLoading = true);
|
|
|
|
try {
|
|
final response = await apiService.getCashlessAndReimbursementToApi();
|
|
|
|
if (response['status'] != 'success') {
|
|
setState(() => isLoading = false);
|
|
return;
|
|
}
|
|
|
|
final List data = response['data'];
|
|
|
|
final filtered =
|
|
data.where((e) => e['content_section'] != 'Video').toList();
|
|
|
|
Map<String, dynamic>? findType(String type) {
|
|
try {
|
|
return filtered.firstWhere((e) => e['type'] == type);
|
|
} catch (_) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
final t3 = findType('3');
|
|
final t4 = findType('4');
|
|
final t5 = findType('5');
|
|
final t6 = findType('6');
|
|
final t7 = findType('7');
|
|
|
|
setState(() {
|
|
if (t3 != null) {
|
|
type3SectionName = t3['content_section'];
|
|
type3Heading = t3['heading'];
|
|
type3Content = extractListItems(t3['content']);
|
|
}
|
|
|
|
if (t4 != null) {
|
|
type4Heading = t4['heading'];
|
|
type4Content = extractListItems(t4['content']);
|
|
}
|
|
|
|
if (t5 != null) {
|
|
type5Heading = t5['heading'];
|
|
type5Content = extractListItems(t5['content']);
|
|
}
|
|
|
|
if (t6 != null) {
|
|
type6Heading = t6['heading'];
|
|
type6Content = extractListItems(t6['content']);
|
|
}
|
|
|
|
if (t7 != null) {
|
|
type7Heading = t7['heading'];
|
|
type7Content = extractListItems(t7['content']);
|
|
}
|
|
|
|
isLoading = false;
|
|
});
|
|
} catch (e) {
|
|
logDebug('API ERROR: $e');
|
|
setState(() => isLoading = false);
|
|
}
|
|
}
|
|
|
|
|
|
ThemeData _buildPageTheme(BuildContext context) {
|
|
final isDesktop = Responsive.isDesktop(context);
|
|
final baseTheme = Theme.of(context);
|
|
|
|
return baseTheme.copyWith(
|
|
textTheme: GoogleFonts.poppinsTextTheme(baseTheme.textTheme).copyWith(
|
|
titleLarge: GoogleFonts.poppins(
|
|
fontSize: isDesktop ? 18 : 16,
|
|
fontWeight: FontWeight.w600,
|
|
color: const Color(0xFF000000),
|
|
),
|
|
titleMedium: GoogleFonts.poppins(
|
|
fontSize: isDesktop ? 18 : 16,
|
|
fontWeight: FontWeight.w500,
|
|
color: const Color(0xFF000000),
|
|
),
|
|
bodyLarge: GoogleFonts.poppins(
|
|
fontSize: isDesktop ? 16 : 14,
|
|
fontWeight: FontWeight.w400,
|
|
color: const Color(0xFF000000),
|
|
height: 1.5,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return PopScope(
|
|
canPop: false,
|
|
onPopInvokedWithResult: (didPop, result) {
|
|
if (didPop) return;
|
|
context.pop();
|
|
},
|
|
child: Scaffold(
|
|
appBar: CustomAppBar(),
|
|
backgroundColor: Colors.white,
|
|
body: Theme(
|
|
data: _buildPageTheme(context),
|
|
child: isLoading
|
|
? 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
|
|
),
|
|
)
|
|
: SingleChildScrollView(
|
|
padding: Responsive.isDesktop(context)
|
|
? EdgeInsets.symmetric(
|
|
horizontal: MediaQuery.of(context).size.width * 0.2,
|
|
vertical: MediaQuery.of(context).size.height * 0.03,
|
|
)
|
|
: EdgeInsets.all(10),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
children: [
|
|
Expanded(
|
|
flex: 12,
|
|
child: InkWell(
|
|
onTap: () {
|
|
context.go('/home');
|
|
},
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
children: [
|
|
Icon(
|
|
Icons.chevron_left,
|
|
color: Color(0xFF000000),
|
|
size: 30,
|
|
),
|
|
SizedBox(
|
|
width: Responsive.isDesktop(context)
|
|
? 0
|
|
: 5),
|
|
Column(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.center,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'General Exclusions & Deductibles',
|
|
textAlign: TextAlign.start,
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.titleLarge,
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
const SizedBox(height: 20),
|
|
if (type3Content.isNotEmpty) ...[
|
|
Text(
|
|
type3SectionName ?? '',
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
),
|
|
const SizedBox(height: 10),
|
|
buildBulletList(context, type3Content),
|
|
],
|
|
if (type4Content.isNotEmpty) ...[
|
|
const SizedBox(height: 20),
|
|
Text(
|
|
type4Heading ?? '',
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
),
|
|
buildBulletList(context, type4Content),
|
|
],
|
|
if (type5Content.isNotEmpty) ...[
|
|
const SizedBox(height: 20),
|
|
Text(
|
|
type5Heading ?? '',
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
),
|
|
buildBulletList(context, type5Content),
|
|
],
|
|
if (type6Content.isNotEmpty) ...[
|
|
const SizedBox(height: 20),
|
|
Text(
|
|
type6Heading ?? '',
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
),
|
|
buildBulletList(context, type6Content),
|
|
],
|
|
if (type7Content.isNotEmpty) ...[
|
|
const SizedBox(height: 20),
|
|
Text(
|
|
type7Heading ?? '',
|
|
style: Theme.of(context).textTheme.titleMedium,
|
|
),
|
|
buildBulletList(context, type7Content),
|
|
],
|
|
],
|
|
),
|
|
),
|
|
),
|
|
|
|
bottomNavigationBar: Responsive.isDesktop(context)
|
|
? SizedBox(
|
|
height: 40, // 👈 FIXED HEIGHT (adjust if needed)
|
|
width: double.infinity,
|
|
child: CustomFooter(),
|
|
)
|
|
: CustomBottomNavigationBar(
|
|
initialIndex: 0,
|
|
labels: const ["Home", "Claims", "FAQs", "Profile", "Help"],
|
|
icons: const [
|
|
Icons.home_outlined,
|
|
Icons.sticky_note_2_outlined,
|
|
Icons.question_answer_outlined,
|
|
Icons.person_outline_outlined,
|
|
Icons.headset_mic_outlined,
|
|
],
|
|
onTabChanged: (index) {
|
|
if (index == 0) context.push('/home');
|
|
if (index == 1) context.push('/claims');
|
|
if (index == 2) context.push('/faqs');
|
|
if (index == 3) context.push('/profile');
|
|
if (index == 4) context.push('/help');
|
|
},
|
|
),
|
|
));
|
|
}
|
|
|
|
Widget buildBulletList(BuildContext context, List<String> items) {
|
|
if (items.isEmpty) return const SizedBox.shrink();
|
|
|
|
final bodyStyle = Theme.of(context).textTheme.bodyLarge;
|
|
final bulletSize = bodyStyle?.fontSize ?? 14;
|
|
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: items.map((text) {
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: 6),
|
|
child: Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Padding(
|
|
padding: const EdgeInsets.only(top: 2),
|
|
child: Text(
|
|
'•',
|
|
style: bodyStyle?.copyWith(
|
|
fontSize: bulletSize + 2,
|
|
fontWeight: FontWeight.w600,
|
|
color: const Color(0xFFE26728),
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(width: 8),
|
|
Expanded(
|
|
child: Text(
|
|
text,
|
|
style: bodyStyle,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}).toList(),
|
|
);
|
|
}
|
|
|
|
|
|
}
|