import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:get_it/get_it.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/route_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/blood_donation/blood_donation_view_model.dart'; import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/ui_models/hmg_services_component_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/blood_donation/blood_donation_page.dart'; import 'package:hmg_patient_app_new/presentation/contact_us/contact_us.dart'; import 'package:hmg_patient_app_new/presentation/emergency_services/emergency_services_page.dart'; import 'package:hmg_patient_app_new/presentation/habib_wallet/habib_wallet_page.dart'; import 'package:hmg_patient_app_new/presentation/habib_wallet/recharge_wallet_page.dart'; import 'package:hmg_patient_app_new/presentation/hmg_services/services_view.dart'; import 'package:hmg_patient_app_new/presentation/home/data/landing_page_data.dart'; import 'package:hmg_patient_app_new/presentation/home/widgets/large_service_card.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import '../../core/dependencies.dart' show getIt; class ServicesPage extends StatelessWidget { ServicesPage({super.key}); late BloodDonationViewModel bloodDonationViewModel; late MedicalFileViewModel medicalFileViewModel; late final List hmgServices = [ HmgServicesComponentModel( 11, "Emergency Services".needTranslation, "".needTranslation, AppAssets.emergency_services_icon, bgColor: AppColors.primaryRedColor, true, route: null, onTap: () { getIt.get().flushData(); getIt.get().getTransportationOrders( showLoader: false, ); getIt.get().getRRTOrders( showLoader: false, ); Navigator.of(GetIt.instance().navigatorKey.currentContext!).push( CustomPageRoute( page: EmergencyServicesPage(), settings: const RouteSettings(name: '/EmergencyServicesPage'), ), ); }), HmgServicesComponentModel( 11, "Book\nAppointment".needTranslation, "".needTranslation, AppAssets.appointment_calendar_icon, bgColor: AppColors.bookAppointment, true, route: AppRoutes.bookAppointmentPage, ), HmgServicesComponentModel( 5, "Complete Checkup".needTranslation, "".needTranslation, AppAssets.comprehensiveCheckup, bgColor: AppColors.bgGreenColor, true, route: AppRoutes.comprehensiveCheckupPage, ), HmgServicesComponentModel( 11, "E-Referral Services".needTranslation, "".needTranslation, AppAssets.eReferral, bgColor: AppColors.eReferralCardColor, true, route: AppRoutes.eReferralPage, ), HmgServicesComponentModel( 3, "Blood Donation".needTranslation, "".needTranslation, AppAssets.blood_donation_icon, bgColor: AppColors.bloodDonationCardColor, true, route: null, onTap: () async { LoaderBottomSheet.showLoader(loadingText: "Fetching Data..."); await bloodDonationViewModel.getRegionSelectedClinics(onSuccess: (val) async { // await bloodDonationViewModel.getPatientBloodGroupDetails(onSuccess: (val) { LoaderBottomSheet.hideLoader(); Navigator.of(GetIt.instance().navigatorKey.currentContext!).push( CustomPageRoute( page: BloodDonationPage(), ), ); // }, onError: (err) { // LoaderBottomSheet.hideLoader(); // }); }, onError: (err) { LoaderBottomSheet.hideLoader(); }); }), // HmgServicesComponentModel( // 11, // "Covid 19 Test".needTranslation, // "".needTranslation, // AppAssets.covid19icon, // bgColor: AppColors.covid29Color, // true, // route: AppRoutes.covid19Test, // ), // HmgServicesComponentModel( // 11, // "Vital Sign".needTranslation, // "".needTranslation, // AppAssets.covid19icon, // bgColor: AppColors.covid29Color, // true, // route: AppRoutes.vitalSign, // ) // HmgServicesComponentModel( // 3, // "Home Health Care".needTranslation, // "".needTranslation, // AppAssets.homeBottom, // bgColor: AppColors.primaryRedColor, // true, // route: AppRoutes.homeHealthCarePage, // ), // HmgServicesComponentModel( // 11, // "Virtual Tour".needTranslation, // "".needTranslation, // AppAssets.my_address, // bgColor: AppColors.quickLoginColor, // true, // route: null, // onTap:(){ // Utils.openWebView( // url: 'https://hmgwebservices.com/vt_mobile/html/index.html', // ); // }, // ) ]; late final List hmgHealthToolServices = [ HmgServicesComponentModel( 11, "Daily Water Monitor".needTranslation, "".needTranslation, AppAssets.daily_water_monitor_icon, bgColor: AppColors.whiteColor, true, route: null, // Set to null since we handle navigation in onTap onTap: () async { LoaderBottomSheet.showLoader(loadingText: "Fetching your water intake details.".needTranslation); final waterMonitorVM = getIt.get(); final context = getIt.get().navigatorKey.currentContext!; await waterMonitorVM.fetchUserDetailsForMonitoring( onSuccess: (userDetail) { LoaderBottomSheet.hideLoader(); if (userDetail == null) { waterMonitorVM.populateFromAuthenticatedUser(); context.navigateWithName(AppRoutes.waterMonitorSettingsScreen); } else { context.navigateWithName(AppRoutes.waterConsumptionScreen); } }, onError: (error) { LoaderBottomSheet.hideLoader(); context.navigateWithName(AppRoutes.waterConsumptionScreen); }, ); }, ), HmgServicesComponentModel( 11, "Health\nCalculators".needTranslation, "".needTranslation, AppAssets.health_calculators_services_icon, bgColor: AppColors.whiteColor, true, route: AppRoutes.healthCalculatorsPage, ), HmgServicesComponentModel( 5, "Health\nConverters".needTranslation, "".needTranslation, AppAssets.health_converters_icon, bgColor: AppColors.whiteColor, true, route: AppRoutes.healthConvertersPage, ), HmgServicesComponentModel( 11, "Smart\nWatches".needTranslation, "".needTranslation, AppAssets.smartwatch_icon, bgColor: AppColors.whiteColor, true, route: AppRoutes.smartWatches, // route: AppRoutes.huaweiHealthExample, ), ]; @override Widget build(BuildContext context) { bloodDonationViewModel = Provider.of(context); medicalFileViewModel = Provider.of(context); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( title: "Explore Services".needTranslation, isLeading: false, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 16.h), "Medical & Care Services".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0), SizedBox(height: 16.h), GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: (isFoldable || isTablet) ? 6 : 4, // 4 icons per row crossAxisSpacing: 12.w, mainAxisSpacing: 18.h, childAspectRatio: 0.8, ), physics: NeverScrollableScrollPhysics(), shrinkWrap: true, itemCount: hmgServices.length, padding: EdgeInsets.zero, itemBuilder: (BuildContext context, int index) { return ServiceGridViewItem(hmgServices[index], index, false, isHealthToolIcon: false); }, ).paddingSymmetrical(24.w, 0), SizedBox(height: 24.h), "HMG Services".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0), SizedBox(height: 16.h), SizedBox( height: 350.h, child: ListView.separated( scrollDirection: Axis.horizontal, itemCount: LandingPageData.getServiceCardsList.length, shrinkWrap: true, padding: EdgeInsets.symmetric(horizontal: 24.w), itemBuilder: (context, index) { return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 1000), child: SlideAnimation( horizontalOffset: 100.0, child: FadeInAnimation( child: LargeServiceCard( serviceCardData: LandingPageData.getServiceCardsList[index], image: LandingPageData.getServiceCardsList[index].icon, title: LandingPageData.getServiceCardsList[index].title, subtitle: LandingPageData.getServiceCardsList[index].subtitle, icon: LandingPageData.getServiceCardsList[index].largeCardIcon, ), ), ), ); }, separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 16.w), ), ), SizedBox(height: 24.h), "Personal Services".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0), SizedBox(height: 16.h), Row( children: [ Expanded( child: Container( height: 170.h, padding: EdgeInsets.all(16.w), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 20.r, hasShadow: false, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( spacing: 8.w, crossAxisAlignment: CrossAxisAlignment.center, children: [ Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 30.w, height: 30.h), "Habib Wallet".needTranslation.toText14(weight: FontWeight.w600, maxlines: 2).expanded, Utils.buildSvgWithAssets(icon: AppAssets.arrow_forward), ], ), Spacer(), Consumer(builder: (context, habibWalletVM, child) { return Utils.getPaymentAmountWithSymbol2(habibWalletVM.habibWalletAmount, isExpanded: false) .toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.r, width: 80.w, height: 24.h); }), Spacer(), CustomButton( height: 40.h, icon: AppAssets.recharge_icon, iconSize: 16.w, iconColor: AppColors.infoColor, textColor: AppColors.infoColor, text: "Recharge".needTranslation, borderWidth: 0.w, fontWeight: FontWeight.w500, borderColor: Colors.transparent, backgroundColor: Color(0xff45A2F8).withValues(alpha: 0.08), padding: EdgeInsets.all(8.w), fontSize: 12.f, onPressed: () { Navigator.of(context).push(CustomPageRoute(page: RechargeWalletPage())); }, ), ], ).onPress(() { Navigator.of(context).push(CustomPageRoute(page: HabibWalletPage())); }), ), ), SizedBox(width: 16.w), Expanded( child: Container( height: 170.h, padding: EdgeInsets.all(16.w), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 20.r, hasShadow: false, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( spacing: 8.w, crossAxisAlignment: CrossAxisAlignment.center, children: [ Utils.buildSvgWithAssets(icon: AppAssets.services_medical_file_icon, width: 30.w, height: 30.h), "Medical Files".needTranslation.toText14(weight: FontWeight.w600, maxlines: 2).expanded, Utils.buildSvgWithAssets(icon: AppAssets.arrow_forward), ], ), Spacer(), Wrap( spacing: -8.h, // runSpacing: 0.h, children: [ Utils.buildImgWithAssets( icon: AppAssets.babyGirlImg, height: 28.h, width: 28.w, border: 1, fit: BoxFit.contain, borderRadius: 50.r, ), Utils.buildImgWithAssets( icon: AppAssets.femaleImg, height: 28.h, width: 28.w, border: 1, borderRadius: 50.r, fit: BoxFit.contain, ), Utils.buildImgWithAssets( icon: AppAssets.maleImg, height: 28.h, width: 28.w, border: 1, borderRadius: 50.r, fit: BoxFit.contain, ), ], ), Spacer(), CustomButton( height: 40.h, icon: AppAssets.add_icon, iconSize: 16.w, iconColor: AppColors.primaryRedColor, textColor: AppColors.primaryRedColor, text: "Add Member".needTranslation, borderWidth: 0.w, fontWeight: FontWeight.w500, borderColor: Colors.transparent, backgroundColor: AppColors.primaryRedColor.withValues(alpha: 0.08), padding: EdgeInsets.all(8.w), fontSize: 12.f, onPressed: () { DialogService dialogService = getIt.get(); medicalFileViewModel.clearAuthValues(); dialogService.showAddFamilyFileSheet( label: "Add Family Member".needTranslation, message: "Please fill the below field to add a new family member to your profile".needTranslation, onVerificationPress: () { medicalFileViewModel.addFamilyFile(otpTypeEnum: OTPTypeEnum.sms); }); }, ), ], ).onPress(() { Navigator.of(context).push( CustomPageRoute( page: MedicalFilePage(), ), ); }), ), ), ], ).paddingSymmetrical(24.w, 0), SizedBox(height: 24.h), "Health Tools".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0), SizedBox(height: 16.h), GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: (isFoldable || isTablet) ? 6 : 4, // 4 icons per row crossAxisSpacing: 12.w, mainAxisSpacing: 18.h, childAspectRatio: 0.8, ), physics: NeverScrollableScrollPhysics(), shrinkWrap: true, itemCount: hmgHealthToolServices.length, padding: EdgeInsets.zero, itemBuilder: (BuildContext context, int index) { return ServiceGridViewItem( hmgHealthToolServices[index], index, false, isHealthToolIcon: true, ); }, ).paddingSymmetrical(24.w, 0), SizedBox(height: 24.h), "Support Services".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0), SizedBox(height: 16.h), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 12.h, hasShadow: false, ), child: Padding( padding: EdgeInsets.all(16.h), child: Row( children: [ Utils.buildSvgWithAssets( icon: AppAssets.virtual_tour_icon, width: 32.w, height: 32.h, fit: BoxFit.contain, ), SizedBox(width: 8.w), "Virtual Tour".needTranslation.toText12(fontWeight: FontWeight.w500) ], ), ), ).onPress(() { Utils.openWebView( url: 'https://hmgwebservices.com/vt_mobile/html/index.html', ); }), ), SizedBox(width: 16.w), Expanded( child: Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 12.h, hasShadow: false, ), child: Padding( padding: EdgeInsets.all(16.h), child: Row( children: [ Utils.buildSvgWithAssets( icon: AppAssets.car_parking_icon, width: 32.w, height: 32.h, fit: BoxFit.contain, ), SizedBox(width: 8.w), "Car Parking".needTranslation.toText12(fontWeight: FontWeight.w500) ], ), ), ), ), ], ), SizedBox(height: 16.h), Row( children: [ Expanded( child: Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 12.h, hasShadow: false, ), child: Padding( padding: EdgeInsets.all(16.h), child: Row( children: [ Utils.buildSvgWithAssets( icon: AppAssets.latest_news_icon, width: 32.w, height: 32.h, fit: BoxFit.contain, ), SizedBox(width: 8.w), "Latest News".needTranslation.toText12(fontWeight: FontWeight.w500) ], ), ), ).onPress(() { Utils.openWebView( url: 'https://x.com/HMG', ); }), ), SizedBox(width: 16.w), Expanded( child: Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 12.h, hasShadow: false, ), child: Padding( padding: EdgeInsets.all(16.h), child: Row( children: [ Utils.buildSvgWithAssets( icon: AppAssets.hmg_contact_icon, width: 32.w, height: 32.h, fit: BoxFit.contain, ), SizedBox(width: 8.w), "HMG Contact".needTranslation.toText12(fontWeight: FontWeight.w500) ], ), ), ).onPress(() { showCommonBottomSheetWithoutHeight( context, title: LocaleKeys.contactUs.tr(), child: ContactUs(), callBackFunc: () {}, isFullScreen: false, ); }), ) ], ) ], ).paddingSymmetrical(24.w, 0), SizedBox(height: 24.h), ], ), ), ); } }